diff --git a/lazproj/coedit.lpi b/lazproj/coedit.lpi
index 1059579c..012c5c5f 100644
--- a/lazproj/coedit.lpi
+++ b/lazproj/coedit.lpi
@@ -140,7 +140,7 @@
-
+
@@ -348,6 +348,14 @@
+
+
+
+
+
+
+
+
diff --git a/src/ce_main.pas b/src/ce_main.pas
index f9702a5c..0912558b 100644
--- a/src/ce_main.pas
+++ b/src/ce_main.pas
@@ -11,7 +11,8 @@ uses
ce_common, ce_dmdwrap, ce_project, ce_dcd, ce_plugin, ce_synmemo, ce_widget,
ce_messages, ce_interfaces, ce_editor, ce_projinspect, ce_projconf, ce_search,
ce_staticexplorer, ce_miniexplorer, ce_libman, ce_libmaneditor, ce_todolist,
- ce_observer, ce_writableComponent, ce_toolseditor, ce_procinput, ce_cdbcmd;
+ ce_observer, ce_writableComponent, ce_toolseditor, ce_procinput, ce_optionseditor,
+ ce_cdbcmd;
type
@@ -195,6 +196,7 @@ type
fTlsEdWidg: TCEToolsEditorWidget;
fPrInpWidg: TCEProcInputWidget;
fTodolWidg: TCETodoListWidget;
+ fOptEdWidg: TCEOptionEditorWidget;
//fResWidg: TCEResmanWidget;
{$IFDEF WIN32}
fCdbWidg: TCECdbWidget;
@@ -407,6 +409,7 @@ begin
fTlsEdWidg:= TCEToolsEditorWidget.create(self);
fPrInpWidg:= TCEProcInputWidget.create(self);
fTodolWidg:= TCETodoListWidget.create(self);
+ fOptEdWidg:= TCEOptionEditorWidget.create(self);
//fResWidg := TCEResmanWidget.create(self);
getMessageDisplay(fMsgs);
@@ -426,6 +429,7 @@ begin
fWidgList.addWidget(@fTlsEdWidg);
fWidgList.addWidget(@fPrInpWidg);
fWidgList.addWidget(@fTodolWidg);
+ fWidgList.addWidget(@fOptEdWidg);
//fWidgList.addWidget(@fResWidg);
{$IFDEF WIN32}
diff --git a/src/ce_messages.pas b/src/ce_messages.pas
index 92ccb67c..9dba2b4c 100644
--- a/src/ce_messages.pas
+++ b/src/ce_messages.pas
@@ -20,7 +20,16 @@ type
data: Pointer;
end;
- TCEMessagesWidget = class(TCEWidget, ICEMultiDocObserver, ICEProjectObserver, ICEMessagesDisplay)
+ TCEMessagesOptions = class(TPersistent)
+ private
+ fMaxCount: Integer;
+ fAutoSelect: boolean;
+ published
+ property maxMessageCount: integer read fMaxCount write fMaxCount;
+ property autoSelect: boolean read fAutoSelect write fAutoSelect;
+ end;
+
+ TCEMessagesWidget = class(TCEWidget, ICEEditableOptions, ICEMultiDocObserver, ICEProjectObserver, ICEMessagesDisplay)
btnClearCat: TBitBtn;
imgList: TImageList;
List: TTreeView;
@@ -49,6 +58,7 @@ type
fDoc: TCESynMemo;
fCtxt: TCEAppMessageCtxt;
fAutoSelect: boolean;
+ fEditableOptions: TCEMessagesOptions;
fBtns: array[TCEAppMessageCtxt] of TToolButton;
procedure filterMessages(aCtxt: TCEAppMessageCtxt);
procedure clearOutOfRangeMessg;
@@ -79,6 +89,11 @@ type
procedure docFocused(aDoc: TCESynMemo);
procedure docChanged(aDoc: TCESynMemo);
//
+ function optionedWantCategory(): string;
+ function optionedWantEditorKind: TOptionEditorKind;
+ function optionedWantContainer: TPersistent;
+ procedure optionedEvent(anEvent: TOptionEditorEvent);
+ //
function singleServiceName: string;
procedure message(const aValue: string; aData: Pointer; aCtxt: TCEAppMessageCtxt; aKind: TCEAppMessageKind);
procedure clearbyContext(aCtxt: TCEAppMessageCtxt);
@@ -134,6 +149,7 @@ begin
//
inherited;
//
+ fEditableOptions := TCEMessagesOptions.Create;
List.PopupMenu := contextMenu;
List.OnDeletion := @ListDeletion;
//
@@ -157,6 +173,7 @@ end;
destructor TCEMessagesWidget.destroy;
begin
EntitiesConnector.removeObserver(self);
+ fEditableOptions.Free;
Inherited;
end;
@@ -209,6 +226,34 @@ begin
end;
{$ENDREGION}
+{$REGION ICEEditableOptions ----------------------------------------------------}
+function TCEMessagesWidget.optionedWantCategory(): string;
+begin
+ exit('Messages');
+end;
+
+function TCEMessagesWidget.optionedWantEditorKind: TOptionEditorKind;
+begin
+ exit(oekAbstract);
+end;
+
+function TCEMessagesWidget.optionedWantContainer: TPersistent;
+begin
+ fEditableOptions.maxMessageCount:= fMaxMessCnt;
+ fEditableOptions.autoSelect:= fActAutoSel.Checked;
+ exit(fEditableOptions);
+end;
+
+procedure TCEMessagesWidget.optionedEvent(anEvent: TOptionEditorEvent);
+begin
+ if anEvent = oeeAccept then
+ begin
+ fMaxMessCnt := fEditableOptions.maxMessageCount;
+ fActAutoSel.Checked := fEditableOptions.autoSelect;
+ end;
+end;
+{$ENDREGION}
+
{$REGION ICESessionOptionsObserver ---------------------------------------------}
procedure TCEMessagesWidget.setMaxMessageCount(aValue: Integer);
begin
diff --git a/src/ce_optionseditor.lfm b/src/ce_optionseditor.lfm
new file mode 100644
index 00000000..b23540ad
--- /dev/null
+++ b/src/ce_optionseditor.lfm
@@ -0,0 +1,111 @@
+inherited CEOptionEditorWidget: TCEOptionEditorWidget
+ Left = 626
+ Height = 377
+ Top = 270
+ Width = 548
+ Caption = 'Options editor'
+ ClientHeight = 377
+ ClientWidth = 548
+ inherited Back: TPanel
+ Height = 377
+ Width = 548
+ ClientHeight = 377
+ ClientWidth = 548
+ inherited Content: TPanel
+ Height = 377
+ Width = 548
+ ClientHeight = 377
+ ClientWidth = 548
+ object pnlBody: TPanel[0]
+ Left = 4
+ Height = 335
+ Top = 4
+ Width = 540
+ Align = alClient
+ BorderSpacing.Around = 4
+ BevelOuter = bvNone
+ ClientHeight = 335
+ ClientWidth = 540
+ TabOrder = 0
+ object selCat: TTreeView
+ Left = 0
+ Height = 335
+ Top = 0
+ Width = 193
+ Align = alLeft
+ DefaultItemHeight = 18
+ ScrollBars = ssAutoBoth
+ TabOrder = 0
+ OnDeletion = selCatDeletion
+ OnSelectionChanged = selCatSelectionChanged
+ end
+ object pnlEd: TPanel
+ Left = 199
+ Height = 335
+ Top = 0
+ Width = 341
+ Align = alClient
+ BevelOuter = bvNone
+ ClientHeight = 335
+ ClientWidth = 341
+ TabOrder = 1
+ object inspector: TTIPropertyGrid
+ Left = 0
+ Height = 335
+ Top = 0
+ Width = 341
+ Align = alClient
+ DefaultValueFont.Color = clWindowText
+ Filter = [tkInteger, tkChar, tkEnumeration, tkFloat, tkSet, tkMethod, tkSString, tkLString, tkAString, tkWString, tkVariant, tkArray, tkRecord, tkInterface, tkClass, tkObject, tkWChar, tkBool, tkInt64, tkQWord, tkDynArray, tkInterfaceRaw, tkProcVar, tkUString, tkUChar, tkHelper]
+ Indent = 16
+ NameFont.Color = clWindowText
+ OnModified = inspectorModified
+ ValueFont.Color = clMaroon
+ end
+ end
+ object Splitter1: TSplitter
+ Left = 193
+ Height = 335
+ Top = 0
+ Width = 6
+ end
+ end
+ object pnlFooter: TPanel[1]
+ Left = 4
+ Height = 30
+ Top = 343
+ Width = 540
+ Align = alBottom
+ BorderSpacing.Around = 4
+ BevelOuter = bvLowered
+ ClientHeight = 30
+ ClientWidth = 540
+ TabOrder = 1
+ object btnCancel: TSpeedButton
+ Left = 333
+ Height = 24
+ Top = 3
+ Width = 100
+ Align = alRight
+ BorderSpacing.Left = 2
+ BorderSpacing.Around = 2
+ OnClick = btnCancelClick
+ end
+ object btnAccept: TSpeedButton
+ Left = 437
+ Height = 24
+ Top = 3
+ Width = 100
+ Align = alRight
+ BorderSpacing.Left = 2
+ BorderSpacing.Around = 2
+ OnClick = btnAcceptClick
+ end
+ end
+ end
+ end
+ inherited contextMenu: TPopupMenu
+ left = 144
+ top = 24
+ end
+end
diff --git a/src/ce_optionseditor.pas b/src/ce_optionseditor.pas
new file mode 100644
index 00000000..cf3ed2ff
--- /dev/null
+++ b/src/ce_optionseditor.pas
@@ -0,0 +1,167 @@
+unit ce_optionseditor;
+
+{$I ce_defines.inc}
+
+interface
+
+uses
+ Classes, SysUtils, FileUtil, RTTIGrids, Forms, Controls, Graphics, ExtCtrls,
+ Menus, ComCtrls, StdCtrls, Buttons, ce_common, ce_widget, ce_interfaces,
+ ce_observer;
+
+type
+
+ PCategoryData = ^TCategoryData;
+ TCategoryData = record
+ kind: TOptionEditorKind;
+ container: TPersistent;
+ observer: ICEEditableOptions;
+ end;
+
+ TCEOptionEditorWidget = class(TCEWidget)
+ btnCancel: TSpeedButton;
+ btnAccept: TSpeedButton;
+ pnlEd: TPanel;
+ pnlBody: TPanel;
+ pnlFooter: TPanel;
+ Splitter1: TSplitter;
+ inspector: TTIPropertyGrid;
+ selCat: TTreeView;
+ procedure btnAcceptClick(Sender: TObject);
+ procedure btnCancelClick(Sender: TObject);
+ procedure inspectorModified(Sender: TObject);
+ procedure selCatDeletion(Sender: TObject; Node: TTreeNode);
+ procedure selCatSelectionChanged(Sender: TObject);
+ protected
+ procedure UpdateShowing; override;
+ private
+ fEdOptsSubj: TCEEditableOptionsSubject;
+ procedure updateCategories;
+ public
+ constructor create(aOwner: TComponent); override;
+ destructor destroy; override;
+ end;
+
+implementation
+{$R *.lfm}
+
+{$REGION Standard Comp/Obj------------------------------------------------------}
+constructor TCEOptionEditorWidget.create(aOwner: TComponent);
+var
+ png: TPortableNetworkGraphic;
+begin
+ inherited;
+ fEdOptsSubj := TCEEditableOptionsSubject.create;
+ //
+ png := TPortableNetworkGraphic.Create;
+ try
+ png.LoadFromLazarusResource('cancel');
+ btnCancel.Glyph.Assign(png);
+ png.LoadFromLazarusResource('accept');
+ btnAccept.Glyph.Assign(png);
+ finally
+ png.Free;
+ end;
+end;
+
+destructor TCEOptionEditorWidget.destroy;
+begin
+ fEdOptsSubj.Free;
+ inherited;
+end;
+
+procedure TCEOptionEditorWidget.UpdateShowing;
+begin
+ inherited;
+ if Visible then updateCategories;
+end;
+{$ENDREGION}
+
+{$REGION Option editor things --------------------------------------------------}
+procedure TCEOptionEditorWidget.updateCategories;
+var
+ i: Integer;
+ dt: PCategoryData;
+ ed: ICEEditableOptions;
+begin
+ inspector.TIObject := nil;
+ selCat.Items.Clear;
+ for i:= 0 to fEdOptsSubj.observersCount-1 do
+ begin
+ dt := new(PCategoryData);
+ ed := fEdOptsSubj.observers[i] as ICEEditableOptions;
+ selCat.Items.AddObject(nil, ed.optionedWantCategory, dt);
+ dt^.container := ed.optionedWantContainer;
+ dt^.kind := ed.optionedWantEditorKind;
+ dt^.observer := ed;
+ end;
+end;
+
+procedure TCEOptionEditorWidget.selCatDeletion(Sender: TObject; Node: TTreeNode);
+begin
+ if node.Data <> nil then
+ Dispose(PCategoryData(node.Data));
+end;
+
+procedure TCEOptionEditorWidget.selCatSelectionChanged(Sender: TObject);
+var
+ dt: PCategoryData;
+begin
+ inspector.TIObject := nil;
+ if pnlEd.ControlCount > 0 then
+ pnlEd.Controls[0].Parent := nil;
+ if selCat.Selected = nil then exit;
+ if selCat.Selected.Data = nil then exit;
+ //
+ dt := PCategoryData(selCat.Selected.Data);
+ if dt^.container = nil then exit;
+ case dt^.kind of
+ oekForm:
+ begin
+ TForm(dt^.container).Parent := pnlEd;
+ TForm(dt^.container).Align := alClient;
+ TForm(dt^.container).BorderStyle:= bsNone;
+ end;
+ oekAbstract:
+ begin
+ inspector.Parent := pnlEd;
+ inspector.Align := alClient;
+ inspector.TIObject := dt^.container;
+ end;
+ end;
+end;
+
+procedure TCEOptionEditorWidget.inspectorModified(Sender: TObject);
+begin
+ if selCat.Selected = nil then exit;
+ if selcat.Selected.Data = nil then exit;
+ //
+ PCategoryData(selCat.Selected.Data)^
+ .observer
+ .optionedEvent(oeeChange);
+end;
+
+procedure TCEOptionEditorWidget.btnCancelClick(Sender: TObject);
+begin
+ if selCat.Selected = nil then exit;
+ if selcat.Selected.Data = nil then exit;
+ //
+ PCategoryData(selCat.Selected.Data)^
+ .observer
+ .optionedEvent(oeeCancel);
+end;
+
+procedure TCEOptionEditorWidget.btnAcceptClick(Sender: TObject);
+begin
+ if selCat.Selected = nil then exit;
+ if selcat.Selected.Data = nil then exit;
+ //
+ PCategoryData(selCat.Selected.Data)^
+ .observer
+ .optionedEvent(oeeAccept);
+end;
+
+{$ENDREGION}
+
+end.
+