diff options
author | George Hazan <ghazan@miranda.im> | 2019-09-18 20:49:45 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2019-09-18 20:49:45 +0300 |
commit | b4d51bb6ad3872b22d3ea52949d4cc5842c26da3 (patch) | |
tree | 63a38f3cebec9349356245b465955db4899dd371 /plugins/HistoryPlusPlus | |
parent | a781184281f8e75f69754380bce1cf832ea476cf (diff) |
- more shit cleared from C++ code;
- Pascal code partially restored till the full container log implementation
Diffstat (limited to 'plugins/HistoryPlusPlus')
-rw-r--r-- | plugins/HistoryPlusPlus/historypp.dpr | 7 | ||||
-rw-r--r-- | plugins/HistoryPlusPlus/hpp_external.pas | 371 | ||||
-rw-r--r-- | plugins/HistoryPlusPlus/hpp_externalgrid.pas | 5 | ||||
-rw-r--r-- | plugins/HistoryPlusPlus/hpp_forms.pas | 6 | ||||
-rw-r--r-- | plugins/HistoryPlusPlus/hpp_opt_dialog.pas | 24 | ||||
-rw-r--r-- | plugins/HistoryPlusPlus/hpp_opt_dialog.rc | 6 |
6 files changed, 415 insertions, 4 deletions
diff --git a/plugins/HistoryPlusPlus/historypp.dpr b/plugins/HistoryPlusPlus/historypp.dpr index 76ffa71c01..a9843a5d2a 100644 --- a/plugins/HistoryPlusPlus/historypp.dpr +++ b/plugins/HistoryPlusPlus/historypp.dpr @@ -60,6 +60,7 @@ uses hpp_mescatcher in 'hpp_mescatcher.pas',
CustomizeFiltersForm in 'CustomizeFiltersForm.pas' {fmCustomizeFilters},
CustomizeToolbar in 'CustomizeToolbar.pas' {fmCustomizeToolbar},
+ hpp_external in 'hpp_external.pas',
hpp_externalgrid in 'hpp_externalgrid.pas',
hpp_richedit in 'hpp_richedit.pas',
hpp_olesmileys in 'hpp_olesmileys.pas',
@@ -153,6 +154,9 @@ begin HookModulesLoad := HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoad);
HookOptInit := HookEvent(ME_OPT_INITIALISE, OnOptInit);
hppRegisterServices;
+{$IFNDEF NO_EXTERNALGRID}
+ RegisterExtGridServices;
+{$ENDIF}
hppRegisterMainWindow;
Result := 0;
end;
@@ -183,6 +187,9 @@ begin try
// destroy hidden main window
hppUnregisterMainWindow;
+ {$IFNDEF NO_EXTERNALGRID}
+ UnregisterExtGridServices;
+ {$ENDIF}
// unregistering events
hppUnregisterServices;
// unregister bookmarks
diff --git a/plugins/HistoryPlusPlus/hpp_external.pas b/plugins/HistoryPlusPlus/hpp_external.pas new file mode 100644 index 0000000000..cac074543f --- /dev/null +++ b/plugins/HistoryPlusPlus/hpp_external.pas @@ -0,0 +1,371 @@ +(*
+ History++ plugin for Miranda IM: the free IM client for Microsoft* Windows*
+
+ Copyright (C) 2006-2009 theMIROn, 2003-2006 Art Fedorov.
+ History+ parts (C) 2001 Christian Kastner
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*)
+
+unit hpp_external;
+
+interface
+
+uses
+ Classes, Windows,
+ m_api,
+ hpp_externalgrid;
+
+type
+ TExternalGrids = class(TObject)
+ private
+ FGrids: array[TExGridMode] of TList;
+ procedure SetGroupLinked(Value: Boolean);
+ public
+ constructor Create;
+ destructor Destroy; override;
+ procedure Add(const ExtGrid: TExternalGrid; GridMode: TExGridMode);
+ function Find(Handle: HWND; GridMode: TExGridMode): TExternalGrid;
+ function Delete(Handle: HWND; GridMode: TExGridMode): Boolean;
+ function Clear(GridMode: TExGridMode): Boolean;
+ procedure Perform(Msg: Cardinal; wParam: WPARAM; lParam: LPARAM);
+ property GroupLinked: Boolean write SetGroupLinked;
+ end;
+
+
+const
+ MS_HPP_EG_WINDOW = 'History++/ExtGrid/NewWindow';
+ MS_HPP_EG_EVENT = 'History++/ExtGrid/Event';
+ MS_HPP_EG_NAVIGATE = 'History++/ExtGrid/Navigate';
+ ME_HPP_EG_OPTIONSCHANGED = 'History++/ExtGrid/OptionsChanged';
+
+var
+ ImitateIEView: boolean;
+ ExternalGrids: TExternalGrids;
+
+procedure RegisterExtGridServices;
+procedure UnregisterExtGridServices;
+
+implementation
+
+uses
+ hpp_global, hpp_database;
+
+{$include m_ieview.inc}
+
+var
+ hExtOptChangedIE, hExtOptChanged: THandle;
+
+function _ExtWindow(wParam:WPARAM; lParam: LPARAM; GridMode: TExGridMode): uint_ptr;
+var
+ par: PIEVIEWWINDOW;
+ ExtGrid: TExternalGrid;
+ ControlID: Cardinal;
+begin
+ Result := 0;
+ //try
+ par := PIEVIEWWINDOW(lParam);
+ Assert(par <> nil, 'Empty IEVIEWWINDOW structure');
+ case par.iType of
+ IEW_CREATE: begin
+ {$IFDEF DEBUG}
+ OutputDebugString('IEW_CREATE');
+ {$ENDIF}
+ case par.dwMode of
+ IEWM_TABSRMM: ControlID := 1006; // IDC_LOG from tabSRMM
+ IEWM_SCRIVER: ControlID := 1001; // IDC_LOG from Scriver
+ IEWM_MUCC: ControlID := 0;
+ IEWM_CHAT: ControlID := 0;
+ IEWM_HISTORY: ControlID := 0;
+ else ControlID := 0;
+ end;
+ ExtGrid := TExternalGrid.Create(par.Parent,ControlID);
+ case par.dwMode of
+ IEWM_MUCC,IEWM_CHAT: begin
+ ExtGrid.ShowHeaders := False;
+ ExtGrid.GroupLinked := False;
+ ExtGrid.ShowBookmarks := False;
+ end;
+ IEWM_HISTORY:
+ ExtGrid.GroupLinked := False;
+ end;
+ ExtGrid.SetPosition(par.x,par.y,par.cx,par.cy);
+ ExternalGrids.Add(ExtGrid,GridMode);
+ par.Hwnd := ExtGrid.GridHandle;
+ end;
+ IEW_DESTROY: begin
+ {$IFDEF DEBUG}
+ OutputDebugString('IEW_DESTROY');
+ {$ENDIF}
+ ExternalGrids.Delete(par.Hwnd,GridMode);
+ end;
+ IEW_SETPOS: begin
+ {$IFDEF DEBUG}
+ OutputDebugString('IEW_SETPOS');
+ {$ENDIF}
+ ExtGrid := ExternalGrids.Find(par.Hwnd,GridMode);
+ if ExtGrid <> nil then
+ ExtGrid.SetPosition(par.x,par.y,par.cx,par.cy);
+ end;
+ IEW_SCROLLBOTTOM: begin
+ {$IFDEF DEBUG}
+ OutputDebugString('IEW_SCROLLBOTTOM');
+ {$ENDIF}
+ ExtGrid := ExternalGrids.Find(par.Hwnd,GridMode);
+ if ExtGrid <> nil then
+ ExtGrid.ScrollToBottom;
+ end;
+ end;
+ //except
+ //end;
+end;
+
+function ExtWindowNative(wParam:WPARAM; lParam: LPARAM): uint_ptr; cdecl;
+begin
+ Result := _ExtWindow(wParam,lParam,gmNative);
+end;
+
+function ExtWindowIEView(wParam:WPARAM; lParam: LPARAM): uint_ptr; cdecl;
+begin
+ Result := _ExtWindow(wParam,lParam,gmIEView);
+end;
+
+function _ExtEvent(wParam:WPARAM; lParam: LPARAM; GridMode: TExGridMode): uint_ptr; cdecl;
+var
+ event: PIEVIEWEVENT;
+ customEvent: PIEVIEWEVENTDATA;
+ UsedCodepage: Cardinal;
+ hDBNext: THandle;
+ eventCount: Integer;
+ ExtGrid: TExternalGrid;
+ CustomItem: TExtCustomItem;
+begin
+ Result := 0;
+ //try
+ {$IFDEF DEBUG}
+ OutputDebugString('MS_IEVIEW_EVENT');
+ {$ENDIF}
+ event := PIEVIEWEVENT(lParam);
+ Assert(event <> nil, 'Empty IEVIEWEVENT structure');
+ ExtGrid := ExternalGrids.Find(event.Hwnd,GridMode);
+ if ExtGrid = nil then exit;
+ case event.iType of
+ IEE_LOG_DB_EVENTS: begin
+ UsedCodepage := event.Codepage;
+ eventCount := event.Count;
+ hDBNext := event.Event.hDBEventFirst;
+ ExtGrid.BeginUpdate;
+ while (eventCount <> 0) and (hDBNext <> 0) do
+ begin
+ ExtGrid.AddEvent(event.hContact, hDBNext, UsedCodepage,
+ boolean(event.dwFlags and IEEF_RTL),
+ not boolean(event.dwFlags and IEEF_NO_SCROLLING));
+ if eventCount > 0 then Dec(eventCount);
+ if eventCount <> 0 then
+ hDBNext := db_event_next(event.hContact,hDBNext);
+ end;
+ ExtGrid.EndUpdate;
+ end;
+ IEE_LOG_MEM_EVENTS: begin
+ UsedCodepage := event.Codepage;
+ eventCount := event.Count;
+ customEvent := event.Event.eventData;
+ ExtGrid.BeginUpdate;
+ while (eventCount <> 0) and (customEvent <> nil) do
+ begin
+ if boolean(customEvent.dwFlags and IEEDF_UNICODE_TEXT) then
+ SetString(CustomItem.Text,customEvent.Text.w,lstrlenW(customEvent.Text.w))
+ else
+ CustomItem.Text := AnsiToWideString(AnsiString(customEvent.Text.a),UsedCodepage);
+ if boolean(customEvent.dwFlags and IEEDF_UNICODE_NICK) then
+ SetString(CustomItem.Nick,customEvent.Nick.w,lstrlenW(customEvent.Nick.w))
+ else
+ CustomItem.Nick := AnsiToWideString(AnsiString(customEvent.Nick.a),UsedCodepage);
+ CustomItem.Sent := boolean(customEvent.bIsMe);
+ CustomItem.Time := customEvent.time;
+ ExtGrid.AddCustomEvent(event.hContact, CustomItem, UsedCodepage,
+ boolean(event.dwFlags and IEEF_RTL),
+ not boolean(event.dwFlags and IEEF_NO_SCROLLING));
+ if eventCount > 0 then Dec(eventCount);
+ customEvent := customEvent.next;
+ end;
+ ExtGrid.EndUpdate;
+ end;
+ IEE_CLEAR_LOG: begin
+ ExtGrid.BeginUpdate;
+ ExtGrid.Clear;
+ ExtGrid.EndUpdate;
+ end;
+ IEE_GET_SELECTION: begin
+ Result := uint_ptr(ExtGrid.GetSelection(boolean(event.dwFlags and IEEF_NO_UNICODE)));
+ end;
+ IEE_SAVE_DOCUMENT: begin
+ ExtGrid.SaveSelected;
+ end;
+ end;
+ //except
+ //end;
+end;
+
+function ExtEventNative(wParam:WPARAM; lParam: LPARAM): uint_ptr; cdecl;
+begin
+ Result := _ExtEvent(wParam,lParam,gmNative);
+end;
+
+function ExtEventIEView(wParam:WPARAM; lParam: LPARAM): uint_ptr; cdecl;
+begin
+ Result := _ExtEvent(wParam,lParam,gmIEView);
+end;
+
+function ExtNavigate(wParam:WPARAM; lParam: LPARAM): uint_ptr; cdecl;
+begin
+ Result := 0;
+ //try
+ {$IFDEF DEBUG}
+ OutputDebugString('MS_IEVIEW_NAVIGATE');
+ {$ENDIF}
+ //except
+ //end;
+end;
+
+procedure RegisterExtGridServices;
+begin
+ ExternalGrids := TExternalGrids.Create;
+ ImitateIEView := GetDBBool(hppDBName,'IEViewAPI',false);
+ if ImitateIEView then
+ begin
+ CreateServiceFunction(MS_IEVIEW_WINDOW,@ExtWindowIEView);
+ CreateServiceFunction(MS_IEVIEW_EVENT,@ExtEventIEView);
+ CreateServiceFunction(MS_IEVIEW_NAVIGATE,@ExtNavigate);
+ hExtOptChangedIE := CreateHookableEvent(ME_IEVIEW_OPTIONSCHANGED);
+ end;
+ CreateServiceFunction(MS_HPP_EG_WINDOW,@ExtWindowNative);
+ CreateServiceFunction(MS_HPP_EG_EVENT,@ExtEventNative);
+ CreateServiceFunction(MS_HPP_EG_NAVIGATE,@ExtNavigate);
+ hExtOptChanged := CreateHookableEvent(ME_HPP_EG_OPTIONSCHANGED);
+end;
+
+procedure UnregisterExtGridServices;
+begin
+ if ImitateIEView then
+ begin
+ DestroyHookableEvent(hExtOptChangedIE);
+ end;
+ DestroyHookableEvent(hExtOptChanged);
+ ExternalGrids.Destroy;
+end;
+
+constructor TExternalGrids.Create;
+var
+ GridMode: TExGridMode;
+begin
+ for GridMode := Low(TExGridMode) to High(TExGridMode) do
+ FGrids[GridMode] := TList.Create;
+end;
+
+destructor TExternalGrids.Destroy;
+var
+ GridMode: TExGridMode;
+begin
+ for GridMode := Low(TExGridMode) to High(TExGridMode) do begin
+ Clear(GridMode);
+ FGrids[GridMode].Free;
+ end;
+ inherited;
+end;
+
+procedure TExternalGrids.Add(const ExtGrid: TExternalGrid; GridMode: TExGridMode);
+begin
+ FGrids[GridMode].Add(ExtGrid);
+end;
+
+function TExternalGrids.Find(Handle: HWND; GridMode: TExGridMode): TExternalGrid;
+var
+ i: Integer;
+ ExtGrid: TExternalGrid;
+begin
+ Result := nil;
+ for i := 0 to FGrids[GridMode].Count-1 do
+ begin
+ ExtGrid := TExternalGrid(FGrids[GridMode].Items[i]);
+ if ExtGrid.GridHandle = Handle then
+ begin
+ Result := ExtGrid;
+ break;
+ end;
+ end;
+end;
+
+function TExternalGrids.Delete(Handle: HWND; GridMode: TExGridMode): Boolean;
+var
+ i: Integer;
+ ExtGrid: TExternalGrid;
+begin
+ Result := True;
+ for i := 0 to FGrids[GridMode].Count-1 do
+ begin
+ ExtGrid := TExternalGrid(FGrids[GridMode].Items[i]);
+ if ExtGrid.GridHandle = Handle then
+ begin
+ try
+ ExtGrid.Free;
+ except
+ Result := False;
+ end;
+ FGrids[GridMode].Delete(i);
+ break;
+ end;
+ end;
+end;
+
+function TExternalGrids.Clear(GridMode: TExGridMode): Boolean;
+var
+ i: Integer;
+ ExtGrid: TExternalGrid;
+begin
+ Result := True;
+ for i := 0 to FGrids[GridMode].Count-1 do
+ begin
+ ExtGrid := TExternalGrid(FGrids[GridMode].Items[i]);
+ try
+ ExtGrid.Free;
+ except
+ Result := False;
+ end;
+ end;
+ FGrids[GridMode].Clear;
+end;
+
+procedure TExternalGrids.Perform(Msg: Cardinal; wParam: WPARAM; lParam: LPARAM);
+var
+ i: Integer;
+ GridMode: TExGridMode;
+begin
+ for GridMode := Low(TExGridMode) to High(TExGridMode) do
+ for i := FGrids[GridMode].Count-1 downto 0 do
+ TExternalGrid(FGrids[GridMode].Items[i]).Perform(Msg,wParam,lParam);
+end;
+
+procedure TExternalGrids.SetGroupLinked(Value: Boolean);
+var
+ i: Integer;
+ GridMode: TExGridMode;
+begin
+ for GridMode := Low(TExGridMode) to High(TExGridMode) do
+ for i := FGrids[GridMode].Count-1 downto 0 do
+ TExternalGrid(FGrids[GridMode].Items[i]).GroupLinked := Value;
+end;
+
+end.
diff --git a/plugins/HistoryPlusPlus/hpp_externalgrid.pas b/plugins/HistoryPlusPlus/hpp_externalgrid.pas index 2a2e78a474..0c9365961c 100644 --- a/plugins/HistoryPlusPlus/hpp_externalgrid.pas +++ b/plugins/HistoryPlusPlus/hpp_externalgrid.pas @@ -29,6 +29,8 @@ uses hpp_global, HistoryGrid, RichEdit, Menus, ShellAPI;
type
+ TExGridMode = (gmNative, gmIEView);
+
PExtCustomItem = ^TExtCustomItem;
TExtCustomItem = record
@@ -83,6 +85,7 @@ type pmLink: TPopupMenu;
miEventsFilter: TMenuItem;
WasKeyPressed: Boolean;
+ FGridMode: TExGridMode;
FUseHistoryRTLMode: Boolean;
FExternalRTLMode: TRTLMode;
FUseHistoryCodepage: Boolean;
@@ -150,6 +153,7 @@ type procedure Clear;
property ParentWindow: HWND read FParentWindow;
property GridHandle: HWND read GetGridHandle;
+ property GridMode: TExGridMode read FGridMode write FGridMode;
property UseHistoryRTLMode: Boolean read FUseHistoryRTLMode write SetUseHistoryRTLMode;
property UseHistoryCodepage: Boolean read FUseHistoryCodepage write SetUseHistoryCodepage;
function Perform(Msg: Cardinal; WParam:WPARAM; LParam: LPARAM): LRESULT;
@@ -346,6 +350,7 @@ constructor TExternalGrid.Create(AParentWindow: HWND; ControlID: Cardinal = 0); begin
FParentWindow := AParentWindow;
WasKeyPressed := False;
+ FGridMode := gmNative;
FUseHistoryRTLMode := False;
FExternalRTLMode := hppRTLDefault;
FUseHistoryCodepage := False;
diff --git a/plugins/HistoryPlusPlus/hpp_forms.pas b/plugins/HistoryPlusPlus/hpp_forms.pas index 0b0ff75b43..8d4803c984 100644 --- a/plugins/HistoryPlusPlus/hpp_forms.pas +++ b/plugins/HistoryPlusPlus/hpp_forms.pas @@ -59,6 +59,7 @@ implementation uses
hpp_services, hpp_opt_dialog, hpp_database, hpp_mescatcher,
HistoryForm, GlobalSearch, m_api,
+ {$IFNDEF NO_EXTERNALGRID}hpp_external,{$ENDIF}
CustomizeFiltersForm, CustomizeToolbar;
{procedure AddMenu(M: TMenuItem; FromM,ToM: TPopupMenu; Index: integer);
@@ -214,6 +215,11 @@ begin // we are going backwards here because history forms way want to
// close themselves on the message, so we would have AVs if go from 0 to Count
+
+ {$IFNDEF NO_EXTERNALGRID}
+ ExternalGrids.Perform(Msg,wParam,lParam);
+ {$ENDIF}
+
for i := HstWindowList.Count - 1 downto 0 do
begin
if Assigned(THistoryFrm(HstWindowList[i]).EventDetailForm) then
diff --git a/plugins/HistoryPlusPlus/hpp_opt_dialog.pas b/plugins/HistoryPlusPlus/hpp_opt_dialog.pas index 8f11f03fc7..25281bed1f 100644 --- a/plugins/HistoryPlusPlus/hpp_opt_dialog.pas +++ b/plugins/HistoryPlusPlus/hpp_opt_dialog.pas @@ -39,7 +39,8 @@ implementation uses
Messages, CommCtrl,
m_api,
- hpp_global, hpp_options, hpp_services, hpp_database,
+ hpp_global, hpp_options, hpp_services, hpp_database
+ {$IFNDEF NO_EXTERNALGRID}, hpp_external{$ENDIF},
HistoryForm, GlobalSearch;
const
@@ -119,9 +120,11 @@ begin if GetChecked(IDC_RECENTONTOP) <> GetDBBool(hppDBName,'SortOrder',false) then exit;
if GetChecked(IDC_GROUPHISTITEMS) <> GetDBBool(hppDBName,'GroupHistoryItems',false) then exit;
+ {$IFNDEF NO_EXTERNALGRID}
if GetChecked(IDC_GROUPLOGITEMS) <> GetDBBool(hppDBName,'GroupLogItems',false) then exit;
if GetChecked(IDC_DISABLEBORDER) <> GetDBBool(hppDBName,'NoLogBorder',false) then exit;
if GetChecked(IDC_DISABLESCROLL) <> GetDBBool(hppDBName,'NoLogScrollBar',false) then exit;
+ {$ENDIF}
Result := False;
end;
@@ -176,6 +179,25 @@ begin THistoryFrm(HstWindowList[i]).hg.GroupLinked := Checked;
end;
+ {$IFNDEF NO_EXTERNALGRID}
+ Checked := GetChecked(IDC_GROUPLOGITEMS);
+ if Checked <> GetDBBool(hppDBName,'GroupLogItems',false) then
+ begin
+ WriteDBBool(hppDBName,'GroupLogItems',Checked);
+ ExternalGrids.GroupLinked := Checked;
+ end;
+
+ Checked := GetChecked(IDC_DISABLEBORDER);
+ if Checked <> GetDBBool(hppDBName,'NoLogBorder',false) then
+ WriteDBBool(hppDBName,'NoLogBorder',Checked);
+ //ShowRestart := ShowRestart or (Checked <> DisableLogBorder);
+
+ Checked := GetChecked(IDC_DISABLESCROLL);
+ if Checked <> GetDBBool(hppDBName,'NoLogScrollBar',false) then
+ WriteDBBool(hppDBName,'NoLogScrollBar',Checked);
+ //ShowRestart := ShowRestart or (Checked <> DisableLogScrollbar);
+ {$ENDIF}
+
if ShowRestart then
ShowWindow(GetDlgItem(hDlg,ID_NEED_RESTART),SW_SHOW)
else
diff --git a/plugins/HistoryPlusPlus/hpp_opt_dialog.rc b/plugins/HistoryPlusPlus/hpp_opt_dialog.rc index d1e946a00a..02bd0dfe50 100644 --- a/plugins/HistoryPlusPlus/hpp_opt_dialog.rc +++ b/plugins/HistoryPlusPlus/hpp_opt_dialog.rc @@ -21,9 +21,9 @@ FONT 8, "MS SHELL DLG" CONTROL "Display changed avatars", 205, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 166, 64, 140, 11
CONTROL "Message log options", 300, BUTTON, BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 160, 82, 148, 55
- CONTROL "Group messages", 302, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 166, 102, 140, 11
- CONTROL "Disable border", 303, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 166, 112, 140, 11
- CONTROL "Disable scroll bar", 304, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 166, 122, 140, 11
+ CONTROL "Group messages", 302, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 166, 92, 140, 11
+ CONTROL "Disable border", 303, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 166, 102, 140, 11
+ CONTROL "Disable scroll bar", 304, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 166, 112, 140, 11
CONTROL "History view options", 500, BUTTON, BS_GROUPBOX | WS_CHILD | WS_VISIBLE, 6, 82, 148, 55
CONTROL "Recent events on top", 501, BUTTON, BS_AUTOCHECKBOX | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 12, 92, 140, 11
|