From 7b3dc5290663d37f48dd9c51442c911fd31d63de Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Wed, 18 Feb 2015 13:58:05 +0100 Subject: [PATCH] dev option editor - 1 --- lazproj/coedit.lpi | 10 ++- src/ce_main.pas | 6 +- src/ce_messages.pas | 47 ++++++++++- src/ce_optionseditor.lfm | 111 ++++++++++++++++++++++++++ src/ce_optionseditor.pas | 167 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 338 insertions(+), 3 deletions(-) create mode 100644 src/ce_optionseditor.lfm create mode 100644 src/ce_optionseditor.pas 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. +