diff --git a/.gitattributes b/.gitattributes index 5d9e0e8d96..99dc26a967 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1344,8 +1344,15 @@ components/sqlite/tsqlite3dataset.png -text components/sqlite/tsqlitedataset.png -text components/synedit/allsyneditunits.pp svneol=native#text/pascal components/synedit/design/README.txt svneol=native#text/plain +components/synedit/design/syndesignstringconstants.pas svneol=native#text/plain +components/synedit/design/syneditdesign.lpk svneol=native#text/plain +components/synedit/design/syneditdesign.pas svneol=native#text/plain +components/synedit/design/syneditdesignregister.pas svneol=native#text/plain components/synedit/design/syneditlazdsgn.bat svneol=native#text/plain components/synedit/design/syneditlazdsgn.txt svneol=native#text/plain +components/synedit/design/synpropertyeditobjectlist.lfm svneol=native#text/plain +components/synedit/design/synpropertyeditobjectlist.lrs svneol=native#text/plain +components/synedit/design/synpropertyeditobjectlist.pas svneol=native#text/plain components/synedit/design/tsynanysyn.png -text svneol=unset#image/png components/synedit/design/tsynautocomplete.png -text svneol=unset#image/png components/synedit/design/tsyncppsyn.png -text svneol=unset#image/png diff --git a/components/synedit/design/syndesignstringconstants.pas b/components/synedit/design/syndesignstringconstants.pas new file mode 100644 index 0000000000..146f875fe9 --- /dev/null +++ b/components/synedit/design/syndesignstringconstants.pas @@ -0,0 +1,21 @@ +unit SynDesignStringConstants; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils; + +resourcestring + syndsLineNumbers = 'Line Numbers'; + syndsCodeFolding = 'Code fFolding'; + syndsChangeMarker = 'Change Marker'; + syndsBookmarks = 'Bookmarks'; + syndsSeparator = 'Separator'; + + +implementation + +end. + diff --git a/components/synedit/design/syneditdesign.lpk b/components/synedit/design/syneditdesign.lpk new file mode 100644 index 0000000000..ac2d666bee --- /dev/null +++ b/components/synedit/design/syneditdesign.lpk @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/components/synedit/design/syneditdesign.pas b/components/synedit/design/syneditdesign.pas new file mode 100644 index 0000000000..098fb655ec --- /dev/null +++ b/components/synedit/design/syneditdesign.pas @@ -0,0 +1,21 @@ +{ This file was automatically created by Lazarus. do not edit ! + This source is only used to compile and install the package. + } + +unit SynEditDesign; + +interface + +uses +SynPropertyEditObjectList, SynEditDesignRegister, SynDesignStringConstants, LazarusPackageIntf; + +implementation + +procedure Register; +begin + RegisterUnit('SynEditDesignRegister', @SynEditDesignRegister.Register); +end; + +initialization + RegisterPackage('SynEditDesign', @Register); +end. diff --git a/components/synedit/design/syneditdesignregister.pas b/components/synedit/design/syneditdesignregister.pas new file mode 100644 index 0000000000..27560ae331 --- /dev/null +++ b/components/synedit/design/syneditdesignregister.pas @@ -0,0 +1,30 @@ +unit SynEditDesignRegister; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, + SynGutter, SynGutterChanges,SynGutterCodeFolding, SynGutterLineNumber, + SynGutterMarks, SynPropertyEditObjectList, SynEdit, SynDesignStringConstants, + LazarusPackageIntf, LResources, PropEdits; + +procedure Register; + +implementation + +procedure Register; +begin + RegisterPropertyEditor(ClassTypeInfo(TSynGutterPartList), nil, + '', TSynPropertyEditGutterPartList); + + RegisterGutterPartClass(TSynGutterLineNumber, syndsLineNumbers); + RegisterGutterPartClass(TSynGutterCodeFolding, syndsCodeFolding); + RegisterGutterPartClass(TSynGutterChanges, syndsChangeMarker); + RegisterGutterPartClass(TSynGutterMarks, syndsBookmarks); + RegisterGutterPartClass(TSynGutterSeparator, syndsSeparator); +end; + +end. + diff --git a/components/synedit/design/synpropertyeditobjectlist.lfm b/components/synedit/design/synpropertyeditobjectlist.lfm new file mode 100644 index 0000000000..1b81ee006e --- /dev/null +++ b/components/synedit/design/synpropertyeditobjectlist.lfm @@ -0,0 +1,89 @@ +object SynObjectPartListPropertyEditorForm: TSynObjectPartListPropertyEditorForm + Left = 207 + Height = 300 + Top = 207 + Width = 190 + ActiveControl = SynObjectPartsListBox + BorderStyle = bsSizeToolWin + Caption = 'SynObjectPartListPropertyEditorForm' + ClientHeight = 300 + ClientWidth = 190 + Constraints.MinHeight = 100 + Constraints.MinWidth = 190 + OnCreate = FormCreate + OnDestroy = FormDestroy + Position = poDefaultPosOnly + LCLVersion = '0.9.27' + object ToolBar1: TToolBar + AnchorSideTop.Control = ClassComboBox + AnchorSideTop.Side = asrBottom + Left = 0 + Height = 42 + Top = 0 + Width = 190 + AutoSize = True + ButtonHeight = 40 + ButtonWidth = 44 + Caption = 'ToolBar1' + Ctl3D = False + ShowCaptions = True + TabOrder = 0 + object AddButton: TToolButton + Left = 1 + Top = 2 + Caption = 'Add' + OnClick = AddButtonClick + end + object DeleteButton: TToolButton + Left = 45 + Top = 2 + Caption = 'Delete' + OnClick = DeleteButtonClick + end + object ToolButton3: TToolButton + Left = 89 + Top = 2 + Width = 10 + Caption = 'ToolButton3' + Style = tbsSeparator + end + object MoveUpButton: TToolButton + Left = 99 + Top = 2 + Caption = 'Up' + OnClick = MoveUpButtonClick + end + object MoveDownButton: TToolButton + Left = 143 + Top = 2 + Caption = 'Down' + OnClick = MoveDownButtonClick + end + end + object SynObjectPartsListBox: TListBox + Left = 0 + Height = 237 + Top = 63 + Width = 190 + Align = alClient + ItemHeight = 0 + OnClick = SynObjectPartsListBoxClick + TabOrder = 1 + end + object ClassComboBox: TComboBox + AnchorSideTop.Control = ToolBar1 + AnchorSideTop.Side = asrBottom + Left = 0 + Height = 21 + Top = 42 + Width = 190 + Align = alTop + Anchors = [] + AutoComplete = False + Ctl3D = False + ItemHeight = 13 + ItemWidth = 0 + Style = csDropDownList + TabOrder = 2 + end +end diff --git a/components/synedit/design/synpropertyeditobjectlist.lrs b/components/synedit/design/synpropertyeditobjectlist.lrs new file mode 100644 index 0000000000..79e4f30a65 --- /dev/null +++ b/components/synedit/design/synpropertyeditobjectlist.lrs @@ -0,0 +1,30 @@ +{ This is an automatically generated lazarus resource file } + +LazarusResources.Add('TSynObjectPartListPropertyEditorForm','FORMDATA',[ + 'TPF0$TSynObjectPartListPropertyEditorForm#SynObjectPartListPropertyEditorFor' + +'m'#4'Left'#3#207#0#6'Height'#3','#1#3'Top'#3#207#0#5'Width'#3#190#0#13'Acti' + +'veControl'#7#21'SynObjectPartsListBox'#11'BorderStyle'#7#13'bsSizeToolWin'#7 + +'Caption'#6'#SynObjectPartListPropertyEditorForm'#12'ClientHeight'#3','#1#11 + +'ClientWidth'#3#190#0#21'Constraints.MinHeight'#2'd'#20'Constraints.MinWidth' + +#3#190#0#8'OnCreate'#7#10'FormCreate'#9'OnDestroy'#7#11'FormDestroy'#8'Posit' + +'ion'#7#16'poDefaultPosOnly'#10'LCLVersion'#6#6'0.9.27'#0#8'TToolBar'#8'Tool' + +'Bar1'#21'AnchorSideTop.Control'#7#13'ClassComboBox'#18'AnchorSideTop.Side'#7 + +#9'asrBottom'#4'Left'#2#0#6'Height'#2'*'#3'Top'#2#0#5'Width'#3#190#0#8'AutoS' + +'ize'#9#12'ButtonHeight'#2'('#11'ButtonWidth'#2','#7'Caption'#6#8'ToolBar1'#5 + +'Ctl3D'#8#12'ShowCaptions'#9#8'TabOrder'#2#0#0#11'TToolButton'#9'AddButton'#4 + +'Left'#2#1#3'Top'#2#2#7'Caption'#6#3'Add'#7'OnClick'#7#14'AddButtonClick'#0#0 + +#11'TToolButton'#12'DeleteButton'#4'Left'#2'-'#3'Top'#2#2#7'Caption'#6#6'Del' + +'ete'#7'OnClick'#7#17'DeleteButtonClick'#0#0#11'TToolButton'#11'ToolButton3' + +#4'Left'#2'Y'#3'Top'#2#2#5'Width'#2#10#7'Caption'#6#11'ToolButton3'#5'Style' + +#7#12'tbsSeparator'#0#0#11'TToolButton'#12'MoveUpButton'#4'Left'#2'c'#3'Top' + +#2#2#7'Caption'#6#2'Up'#7'OnClick'#7#17'MoveUpButtonClick'#0#0#11'TToolButto' + +'n'#14'MoveDownButton'#4'Left'#3#143#0#3'Top'#2#2#7'Caption'#6#4'Down'#7'OnC' + +'lick'#7#19'MoveDownButtonClick'#0#0#0#8'TListBox'#21'SynObjectPartsListBox' + +#4'Left'#2#0#6'Height'#3#237#0#3'Top'#2'?'#5'Width'#3#190#0#5'Align'#7#8'alC' + +'lient'#10'ItemHeight'#2#0#7'OnClick'#7#26'SynObjectPartsListBoxClick'#8'Tab' + +'Order'#2#1#0#0#9'TComboBox'#13'ClassComboBox'#21'AnchorSideTop.Control'#7#8 + +'ToolBar1'#18'AnchorSideTop.Side'#7#9'asrBottom'#4'Left'#2#0#6'Height'#2#21#3 + +'Top'#2'*'#5'Width'#3#190#0#5'Align'#7#5'alTop'#7'Anchors'#11#0#12'AutoCompl' + +'ete'#8#5'Ctl3D'#8#10'ItemHeight'#2#13#9'ItemWidth'#2#0#5'Style'#7#14'csDrop' + +'DownList'#8'TabOrder'#2#2#0#0#0 +]); diff --git a/components/synedit/design/synpropertyeditobjectlist.pas b/components/synedit/design/synpropertyeditobjectlist.pas new file mode 100644 index 0000000000..38c6b5b781 --- /dev/null +++ b/components/synedit/design/synpropertyeditobjectlist.pas @@ -0,0 +1,477 @@ +{ PropertyEditor + + Copyright (C) + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library 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 Library General Public License + for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +} +unit SynPropertyEditObjectList; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, LCLProc, + SynGutter, SynEditMiscClasses, + LResources, PropEdits, Forms, StdCtrls, ComCtrls, Dialogs, + ObjInspStrConsts, Controls, IDEImagesIntf, typinfo; + +type + + { TSynPropertEditClassList } + + TSynPropertyEditObjectList = class(TListPropertyEditor) + protected + function ReadElementCount: integer; override; + function ReadElement(Index: integer): TPersistent; override; + function ClassList: TStringList; virtual; abstract; + public + function GetAttributes: TPropertyAttributes; override; + procedure Edit; override; + class function ShowClassListEditor(AClassList: TSynObjectList; + OwnerPersistent: TPersistent; const PropName: String): TCustomForm; + end; + + { TSynPropertyEditGutterPartList } + + TSynPropertyEditGutterPartList = class(TSynPropertyEditObjectList) + protected + function ClassList: TStringList; override; + end; + + { TSynObjectPartListPropertyEditorForm } + + TSynObjectPartListPropertyEditorForm = class(TForm) + SynObjectPartsListBox: TListBox; + ToolBar1: TToolBar; + AddButton: TToolButton; + ClassComboBox: TComboBox; + DeleteButton: TToolButton; + ToolButton3: TToolButton; + MoveUpButton: TToolButton; + MoveDownButton: TToolButton; + procedure AddButtonClick(Sender: TObject); + procedure SynObjectPartsListBoxClick(Sender: TObject); + procedure DeleteButtonClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure FormDestroy(Sender: TObject); + procedure MoveDownButtonClick(Sender: TObject); + procedure MoveUpButtonClick(Sender: TObject); + private + FSynObjectPartList: TSynObjectList; + FOwnerPersistent: TPersistent; + FPropertyName: String; + FClassesList: TStringList; + protected + procedure UpdateCaption; + procedure UpdateButtons; + procedure ComponentRenamed(AComponent: TComponent); + procedure PersistentDeleting(APersistent: TPersistent); + procedure RefreshPropertyValues; + public + procedure FillSynObjectPartsListBox; + procedure SelectInObjectInspector(UnselectAll: Boolean); + procedure SetSynObjectPartList(NewSynObjectPartList: TSynObjectList; + NewClassesList: TStringList; + NewOwnerPersistent: TPersistent; const NewPropName: String); + procedure Modified; + public + property SynObjectPartList: TSynObjectList read FSynObjectPartList; + property OwnerPersistent: TPersistent read FOwnerPersistent; + property PropertyName: String read FPropertyName; + end; + + procedure RegisterGutterPartClass(AClass: TSynGutterPartBaseClass; AName: String); +implementation + +const + SynObjectPartListForm: TSynObjectPartListPropertyEditorForm = nil; + KnownSynGutterPartClasses: TStringList = nil; + +procedure RegisterGutterPartClass(AClass: TSynGutterPartBaseClass; AName: String); +begin + if KnownSynGutterPartClasses = nil then + KnownSynGutterPartClasses := TStringList.Create; + KnownSynGutterPartClasses.AddObject(AName, TObject(Pointer(AClass))); +end; + +{ TSynObjectPartListPropertyEditorForm } + +procedure TSynObjectPartListPropertyEditorForm.AddButtonClick(Sender: TObject); +var + i: Integer; +begin + if (SynObjectPartList = nil) or (FClassesList = nil) then Exit; + + i := ClassComboBox.ItemIndex; + if (i < 0) or (i >= FClassesList.Count) then + exit; + TSynObjectListItemClass(Pointer(FClassesList.Objects[i])).Create(SynObjectPartList); + + FillSynObjectPartsListBox; + if SynObjectPartsListBox.Items.Count > 0 then + SynObjectPartsListBox.ItemIndex := SynObjectPartsListBox.Items.Count - 1; + SelectInObjectInspector(False); + UpdateButtons; + UpdateCaption; + Modified; +end; + +procedure TSynObjectPartListPropertyEditorForm.SynObjectPartsListBoxClick(Sender: TObject); +begin + UpdateButtons; + UpdateCaption; + SelectInObjectInspector(False); +end; + +procedure TSynObjectPartListPropertyEditorForm.DeleteButtonClick(Sender: TObject); +var + I : Integer; + NewItemIndex: Integer; +begin + if SynObjectPartList = nil then Exit; + + I := SynObjectPartsListBox.ItemIndex; + if (I >= 0) and (I < SynObjectPartList.Count) then + begin + if MessageDlg(oisConfirmDelete, + Format(oisDeleteItem, ['"', SynObjectPartList.BaseItems[I].DisplayName, '"']), + mtConfirmation, [mbYes, mbNo], 0) = mrYes then + begin + // select other item, or unselect + NewItemIndex := I + 1; + while (NewItemIndex < SynObjectPartsListBox.Items.Count) + and (SynObjectPartsListBox.Selected[NewItemIndex]) do Inc(NewItemIndex); + + if NewItemIndex = SynObjectPartsListBox.Items.Count then + begin + NewItemIndex := 0; + while (NewItemIndex < Pred(I)) + and not (SynObjectPartsListBox.Selected[NewItemIndex]) do Inc(NewItemIndex); + + if NewItemIndex = I then NewItemIndex := -1; + end; + + SynObjectPartsListBox.ItemIndex := -1; + + if NewItemIndex > I then Dec(NewItemIndex); + // unselect all items in OI + SelectInObjectInspector(True); + // now delete + SynObjectPartList.BaseItems[I].Free; + // update listbox after whatever happened + FillSynObjectPartsListBox; + // set NewItemIndex + if NewItemIndex < SynObjectPartsListBox.Items.Count then + begin + SynObjectPartsListBox.ItemIndex := NewItemIndex; + SelectInObjectInspector(False); + end; + Modified; + end; + end; + UpdateButtons; + UpdateCaption; +end; + +procedure TSynObjectPartListPropertyEditorForm.FormCreate(Sender: TObject); +begin + ToolBar1.Images := IDEImages.Images_16; + AddButton.Caption := oiColEditAdd; + DeleteButton.Caption := oiColEditDelete; + MoveUpButton.Caption := oiColEditUp; + MoveDownButton.Caption := oiColEditDown; + AddButton.ImageIndex := IDEImages.LoadImage(16, 'laz_add'); + DeleteButton.ImageIndex := IDEImages.LoadImage(16, 'laz_delete'); + MoveUpButton.ImageIndex := IDEImages.LoadImage(16, 'arrow_up'); + MoveDownButton.ImageIndex := IDEImages.LoadImage(16, 'arrow_down'); +end; + +procedure TSynObjectPartListPropertyEditorForm.FormDestroy(Sender: TObject); +begin + if GlobalDesignHook <> nil then + GlobalDesignHook.RemoveAllHandlersForObject(Self); +end; + +procedure TSynObjectPartListPropertyEditorForm.MoveDownButtonClick(Sender: TObject); +var + I: Integer; +begin + if SynObjectPartList = nil then Exit; + + I := SynObjectPartsListBox.ItemIndex; + if I >= SynObjectPartList.Count - 1 then Exit; + + SynObjectPartList.BaseItems[I].Index := I + 1; + SynObjectPartsListBox.ItemIndex := I + 1; + + FillSynObjectPartsListBox; + SelectInObjectInspector(False); + Modified; +end; + +procedure TSynObjectPartListPropertyEditorForm.MoveUpButtonClick(Sender: TObject); +var + I: Integer; +begin + if SynObjectPartList = nil then Exit; + + I := SynObjectPartsListBox.ItemIndex; + if I < 0 then Exit; + + SynObjectPartList.BaseItems[I].Index := I - 1; + SynObjectPartsListBox.ItemIndex := I - 1; + + FillSynObjectPartsListBox; + SelectInObjectInspector(False); + Modified; +end; + +procedure TSynObjectPartListPropertyEditorForm.UpdateCaption; +var + NewCaption: String; +begin + //"Editing ComponentName.PropertyName[Index]" + if OwnerPersistent is TComponent then + NewCaption := TComponent(OwnerPersistent).Name + else + if OwnerPersistent <> nil then + NewCaption := OwnerPersistent.GetNamePath + else + NewCaption := ''; + + if NewCaption <> '' then NewCaption := NewCaption + '.'; + NewCaption := oiColEditEditing + ' ' + NewCaption + PropertyName; + + if SynObjectPartsListBox.ItemIndex > -1 then + NewCaption := NewCaption + '[' + IntToStr(SynObjectPartsListBox.ItemIndex) + ']'; + Caption := NewCaption; +end; + +procedure TSynObjectPartListPropertyEditorForm.UpdateButtons; +var + I: Integer; +begin + I := SynObjectPartsListBox.ItemIndex; + AddButton.Enabled := SynObjectPartList <> nil; + DeleteButton.Enabled := I > -1; + MoveUpButton.Enabled := I > 0; + MoveDownButton.Enabled := (I >= 0) and (I < SynObjectPartList.Count - 1); +end; + +procedure TSynObjectPartListPropertyEditorForm.ComponentRenamed(AComponent: TComponent); +begin + if AComponent = OwnerPersistent then UpdateCaption; +end; + +procedure TSynObjectPartListPropertyEditorForm.PersistentDeleting(APersistent: TPersistent); +var + OldSynObjectPartList: TSynObjectList; +begin + debugln(['TSynObjectPartListPropertyEditorForm.PersistentDeleting ']); + if APersistent = OwnerPersistent then + begin + debugln('xxxxxxx'); + OldSynObjectPartList := SynObjectPartList; + SetSynObjectPartList(nil, nil, nil, ''); + SelectInObjectInspector(True); + GlobalDesignHook.Unselect(OldSynObjectPartList); // XXX unselect all the individual parts + if GlobalDesignHook.LookupRoot = OldSynObjectPartList then + GlobalDesignHook.LookupRoot := nil; + Hide; + end; +end; + + +procedure TSynObjectPartListPropertyEditorForm.RefreshPropertyValues; +begin + FillSynObjectPartsListBox; + Modified; +end; + +procedure TSynObjectPartListPropertyEditorForm.FillSynObjectPartsListBox; +var + I: Integer; + CurItem: String; + Cnt: Integer; +begin + SynObjectPartsListBox.Items.BeginUpdate; + try + if SynObjectPartList <> nil then Cnt := SynObjectPartList.Count + else Cnt := 0; + + // add or replace list items + for I := 0 to Cnt - 1 do + begin + CurItem := IntToStr(I) + ' - ' + SynObjectPartList.BaseItems[I].DisplayName; + if I >= SynObjectPartsListBox.Items.Count then + SynObjectPartsListBox.Items.Add(CurItem) + else + SynObjectPartsListBox.Items[I] := CurItem; + end; + + // delete unneeded list items + if Cnt > 0 then + begin + while SynObjectPartsListBox.Items.Count > Cnt do + begin + SynObjectPartsListBox.Items.Delete(SynObjectPartsListBox.Items.Count - 1); + end; + end + else + begin + SynObjectPartsListBox.Items.Clear; + end; + finally + SynObjectPartsListBox.Items.EndUpdate; + UpdateButtons; + UpdateCaption; + end; +end; + +procedure TSynObjectPartListPropertyEditorForm.SelectInObjectInspector(UnselectAll: Boolean); +var + I: Integer; + NewSelection: TPersistentSelectionList; +begin + if SynObjectPartList = nil then Exit; + // select in OI + NewSelection := TPersistentSelectionList.Create; + try + if not UnselectAll then + begin + for I := 0 to SynObjectPartsListBox.Items.Count - 1 do + if SynObjectPartsListBox.Selected[I] then + NewSelection.Add(SynObjectPartList.BaseItems[I]); + end; + GlobalDesignHook.SetSelection(NewSelection); + GlobalDesignHook.LookupRoot := GetLookupRootForComponent(OwnerPersistent); + finally + NewSelection.Free; + end; +end; + +procedure TSynObjectPartListPropertyEditorForm.SetSynObjectPartList + (NewSynObjectPartList: TSynObjectList; NewClassesList: TStringList; + NewOwnerPersistent: TPersistent; const NewPropName: String); +begin + if (FSynObjectPartList = NewSynObjectPartList) + and (FClassesList = NewClassesList) + and (FOwnerPersistent = NewOwnerPersistent) + and (FPropertyName = NewPropName) then Exit; + + FSynObjectPartList := NewSynObjectPartList; + FClassesList := NewClassesList; + if assigned(FClassesList) then + ClassComboBox.Items.Assign(FClassesList) + else + ClassComboBox.Clear; + if ClassComboBox.Items.Count >0 then + ClassComboBox.ItemIndex := 0; + + if (assigned(NewOwnerPersistent)) and (NewOwnerPersistent is TSynObjectList) then + FOwnerPersistent := (NewOwnerPersistent as TSynObjectList).Owner + else + FOwnerPersistent := NewOwnerPersistent; + FPropertyName := NewPropName; + //debugln('TSynObjectPartListPropertyEditorForm.SetSynObjectPartList A SynObjectPartList=',dbgsName(FSynObjectPartList),' OwnerPersistent=',dbgsName(OwnerPersistent),' PropName=',PropertyName); + if GlobalDesignHook <> nil then + begin + if FOwnerPersistent <> nil then + begin + GlobalDesignHook.AddHandlerComponentRenamed(@ComponentRenamed); + GlobalDesignHook.AddHandlerPersistentDeleting(@PersistentDeleting); + GlobalDesignHook.AddHandlerRefreshPropertyValues(@RefreshPropertyValues); + end + else + begin + GlobalDesignHook.RemoveAllHandlersForObject(Self); + end; + end; + + FillSynObjectPartsListBox; + UpdateCaption; +end; + +procedure TSynObjectPartListPropertyEditorForm.Modified; +begin + GlobalDesignHook.Modified(Self); + //SelectInObjectInspector(False); +end; + +{ TSynPropertyEditObjectList } + +function TSynPropertyEditObjectList.ReadElementCount: integer; +var + SynObjectList: TSynObjectList; +begin + SynObjectList := TSynObjectList(GetObjectValue); + if (SynObjectList <> nil) and (SynObjectList is TSynObjectList) then + Result:=SynObjectList.Count + else + Result:=0; +end; + +function TSynPropertyEditObjectList.ReadElement(Index: integer): TPersistent; +var + SynObjectList: TSynObjectList; +begin + SynObjectList := TSynObjectList(GetObjectValue); + Result := SynObjectList.BaseItems[Index]; +end; + +function TSynPropertyEditObjectList.GetAttributes: TPropertyAttributes; +begin + Result := [paDialog, paReadOnly]; +end; + +procedure TSynPropertyEditObjectList.Edit; +var + TheSynObjectList: TSynObjectList; +begin + TheSynObjectList := TSynObjectList(GetObjectValue); + if TheSynObjectList = nil then + raise Exception.Create('ObjectPartList=nil'); + ShowClassListEditor(TheSynObjectList, GetComponent(0), GetName); +end; + +class function TSynPropertyEditObjectList.ShowClassListEditor(AClassList: TSynObjectList; + OwnerPersistent: TPersistent; const PropName: String): TCustomForm; +begin + if SynObjectPartListForm = nil then + SynObjectPartListForm := TSynObjectPartListPropertyEditorForm.Create(Application); + SynObjectPartListForm.SetSynObjectPartList(AClassList, ClassList, OwnerPersistent, PropName); + SynObjectPartListForm.EnsureVisible; + Result := SynObjectPartListForm; +end; + +{ TSynPropertyEditGutterPartList } + +function TSynPropertyEditGutterPartList.ClassList: TStringList; +begin + Result := KnownSynGutterPartClasses; +end; + +initialization + {$I synpropertyeditobjectlist.lrs} + + if KnownSynGutterPartClasses = nil then + KnownSynGutterPartClasses := TStringList.Create; + +finalization + FreeAndNil(KnownSynGutterPartClasses); + +end. +