1
{ $Id: componentreg.pas 42732 2013-09-11 06:21:29Z juha $ }
3
/***************************************************************************
7
***************************************************************************/
9
*****************************************************************************
10
See the file COPYING.modifiedLGPL.txt, included in this distribution,
11
for details about the license.
12
*****************************************************************************
14
Author: Mattias Gaertner
17
Interface to the component palette and the registered component classes.
26
Classes, SysUtils, typinfo, Controls, ComCtrls, LazarusPackageIntf,
27
LazConfigStorage, LCLProc;
30
TComponentPriorityCategory = (
32
cpUser, // User has changed the order using options GUI.
38
TComponentPriority = record
39
Category: TComponentPriorityCategory;
40
Level: integer; // higher level means higher priority (range: -1000 to 1000)
44
ComponentPriorityNormal: TComponentPriority = (Category: cpNormal; Level: 0);
46
LCLCompPriority: TComponentPriority = (Category: cpBase; Level: 10);
47
FCLCompPriority: TComponentPriority = (Category: cpBase; Level: 9);
48
IDEIntfCompPriority: TComponentPriority = (Category: cpBase; Level: 8);
51
TBaseComponentPage = class;
52
TBaseComponentPalette = class;
53
TOnGetCreationClass = procedure(Sender: TObject;
54
var NewComponentClass: TComponentClass) of object;
56
{ TCompPaletteOptions }
58
TCompPaletteOptions = class
60
FConfigStore: TConfigStorage;
61
// Pages reordered by user.
62
FPageNames: TStringList;
63
// Pages removed or renamed. They must be hidden in the palette.
64
FHiddenPageNames: TStringList;
65
// List of page names with changed component contents.
66
// Object holds another StringList for the component names.
67
FComponentPages: TStringList;
70
destructor Destroy; override;
71
procedure ClearComponentPages;
72
procedure AssignComponentPages(aPageName: string; aList: TStringList);
73
function Load: boolean;
74
function Save: boolean;
76
property ConfigStore: TConfigStorage read FConfigStore write FConfigStore;
77
property PageNames: TStringList read FPageNames;
78
property HiddenPageNames: TStringList read FHiddenPageNames;
79
property ComponentPages: TStringList read FComponentPages;
83
{ TRegisteredComponent }
85
TRegisteredComponent = class
88
FComponentClass: TComponentClass;
89
FOnGetCreationClass: TOnGetCreationClass;
90
FPage: TBaseComponentPage;
94
procedure SetVisible(const AValue: boolean); virtual;
97
constructor Create(TheComponentClass: TComponentClass; const ThePageName: string);
98
destructor Destroy; override;
99
procedure ConsistencyCheck; virtual;
100
function GetUnitName: string; virtual; abstract;
101
function GetPriority: TComponentPriority; virtual;
102
procedure AddToPalette; virtual;
103
function CanBeCreatedInDesigner: boolean; virtual;
104
function GetCreationClass: TComponentClass; virtual;
105
function IsTControl: boolean;
107
property ComponentClass: TComponentClass read FComponentClass;
108
property OnGetCreationClass: TOnGetCreationClass read FOnGetCreationClass
109
write FOnGetCreationClass;
110
property PageName: string read FPageName;
111
property Page: TBaseComponentPage read FPage write FPage;
112
property Button: TComponent read FButton write FButton;
113
property Visible: boolean read FVisible write SetVisible;
115
TRegisteredComponentClass = class of TRegisteredComponent;
118
{ TBaseComponentPage }
120
TBaseComponentPage = class
122
FComps: TList; // list of TRegisteredComponent
123
FPageComponent: TCustomPage;
125
FPalette: TBaseComponentPalette;
126
FPriority: TComponentPriority;
127
FSelectButton: TComponent;
129
function GetItems(Index: integer): TRegisteredComponent;
131
procedure SetVisible(const AValue: boolean); virtual;
132
procedure OnComponentVisibleChanged(AComponent: TRegisteredComponent); virtual;
134
constructor Create(const ThePageName: string);
135
destructor Destroy; override;
137
procedure ClearButtons;
138
procedure ConsistencyCheck;
139
function Count: integer;
140
procedure Add(NewComponent: TRegisteredComponent);
141
procedure Remove(AComponent: TRegisteredComponent);
142
function FindComponent(const CompClassName: string): TRegisteredComponent;
143
function FindButton(Button: TComponent): TRegisteredComponent;
144
procedure UpdateVisible;
145
function GetMaxComponentPriority: TComponentPriority;
147
property Comps[Index: integer]: TRegisteredComponent read GetItems; default;
148
property PageName: string read FPageName;
149
property Palette: TBaseComponentPalette read FPalette;
150
property Priority: TComponentPriority read FPriority write FPriority;
151
property PageComponent: TCustomPage read FPageComponent write FPageComponent;
152
property SelectButton: TComponent read FSelectButton write FSelectButton;
153
property Visible: boolean read FVisible write SetVisible;
155
TBaseComponentPageClass = class of TBaseComponentPage;
158
{ TBaseComponentPalette }
160
TComponentPaletteHandlerType = (
161
cphtUpdateVisible, // visibility of component palette icons is recomputed
162
cphtComponentAdded // Typically selection is changed after component was added.
165
TEndUpdatePaletteEvent = procedure(Sender: TObject; PaletteChanged: boolean) of object;
166
TGetComponentClassEvent = procedure(const AClass: TComponentClass) of object;
167
TUpdateCompVisibleEvent = procedure(AComponent: TRegisteredComponent;
168
var VoteVisible: integer { Visible>0 } ) of object;
169
TComponentAddedEvent = procedure of object;
170
RegisterUnitComponentProc = procedure(const Page, UnitName: ShortString;
171
ComponentClass: TComponentClass);
173
TBaseComponentPalette = class
175
FPages: TList; // list of TBaseComponentPage
176
FHandlers: array[TComponentPaletteHandlerType] of TMethodList;
177
FBaseComponentPageClass: TBaseComponentPageClass;
178
FRegisteredComponentClass: TRegisteredComponentClass;
179
FOnBeginUpdate: TNotifyEvent;
180
FOnEndUpdate: TEndUpdatePaletteEvent;
181
FHideControls: boolean;
182
FUpdateLock: integer;
184
function GetPages(Index: integer): TBaseComponentPage;
185
procedure AddHandler(HandlerType: TComponentPaletteHandlerType;
186
const AMethod: TMethod; AsLast: boolean = false);
187
procedure RemoveHandler(HandlerType: TComponentPaletteHandlerType;
188
const AMethod: TMethod);
189
procedure SetHideControls(const AValue: boolean);
191
fPagesDefaultOrder: TList; // Pages list ordered by package priorities
192
// Pages ordered by user. Contains page name + another StringList
193
// for component names, just like TCompPaletteOptions.ComponentPages.
194
fPagesUserOrder: TStringList;
195
procedure DoChange; virtual;
196
procedure DoBeginUpdate; virtual;
197
procedure DoEndUpdate(Changed: boolean); virtual;
198
procedure OnPageAddedComponent(Component: TRegisteredComponent); virtual;
199
procedure OnPageRemovedComponent(Page: TBaseComponentPage;
200
Component: TRegisteredComponent); virtual;
201
procedure OnComponentVisibleChanged(AComponent: TRegisteredComponent); virtual;
202
procedure OnPageVisibleChanged(APage: TBaseComponentPage); virtual;
203
procedure Update; virtual;
204
procedure UpdateVisible(AComponent: TRegisteredComponent); virtual;
205
function GetSelected: TRegisteredComponent; virtual;
206
procedure SetBaseComponentPageClass(const AValue: TBaseComponentPageClass); virtual;
207
procedure SetRegisteredComponentClass(const AValue: TRegisteredComponentClass); virtual;
208
procedure SetSelected(const AValue: TRegisteredComponent); virtual;
209
function SortPagesDefaultOrder: Boolean;
212
destructor Destroy; override;
214
procedure ClearButtons; virtual;
215
procedure BeginUpdate(Change: boolean);
217
function IsUpdateLocked: boolean;
218
procedure DoAfterComponentAdded; virtual;
219
procedure ConsistencyCheck;
220
function Count: integer;
221
function GetPage(const APageName: string; aCaseSens: Boolean = False): TBaseComponentPage;
222
function IndexOfPageName(const APageName: string): integer;
223
function IndexOfPageWithName(const APageName: string): integer;
224
procedure AddComponent(NewComponent: TRegisteredComponent);
225
function CreateNewPage(const NewPageName: string;
226
const Priority: TComponentPriority): TBaseComponentPage;
227
function FindComponent(const CompClassName: string): TRegisteredComponent; virtual;
228
function FindButton(Button: TComponent): TRegisteredComponent;
229
function CreateNewClassName(const Prefix: string): string;
230
function IndexOfPageComponent(AComponent: TComponent): integer;
231
procedure UpdateVisible; virtual;
232
procedure IterateRegisteredClasses(Proc: TGetComponentClassEvent);
233
procedure RegisterCustomIDEComponents(
234
const RegisterProc: RegisterUnitComponentProc); virtual;
235
procedure RemoveAllHandlersOfObject(AnObject: TObject);
236
procedure AddHandlerUpdateVisible(
237
const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent;
238
AsLast: boolean = false);
239
procedure RemoveHandlerUpdateVisible(
240
const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent);
241
procedure AddHandlerComponentAdded(
242
const OnComponentAddedEvent: TComponentAddedEvent);
243
procedure RemoveHandlerComponentAdded(
244
const OnComponentAddedEvent: TComponentAddedEvent);
246
property Pages[Index: integer]: TBaseComponentPage read GetPages; default;
247
property BaseComponentPageClass: TBaseComponentPageClass
248
read FBaseComponentPageClass;
249
property RegisteredComponentClass: TRegisteredComponentClass
250
read FRegisteredComponentClass;
251
property UpdateLock: integer read FUpdateLock;
252
property OnBeginUpdate: TNotifyEvent read FOnBeginUpdate
253
write FOnBeginUpdate;
254
property OnEndUpdate: TEndUpdatePaletteEvent read FOnEndUpdate
256
property HideControls: boolean read FHideControls write SetHideControls;
257
property Selected: TRegisteredComponent read GetSelected write SetSelected;
258
property PagesDefaultOrder: TList read fPagesDefaultOrder;
259
property PagesUserOrder: TStringList read fPagesUserOrder;
264
IDEComponentPalette: TBaseComponentPalette = nil;
266
function ComponentPriority(Category: TComponentPriorityCategory; Level: integer): TComponentPriority;
267
function ComparePriority(const p1,p2: TComponentPriority): integer;
268
function CompareIDEComponentByClassName(Data1, Data2: pointer): integer;
269
function dbgs(const c: TComponentPriorityCategory): string; overload;
270
function dbgs(const p: TComponentPriority): string; overload;
274
procedure RaiseException(const Msg: string);
276
raise Exception.Create(Msg);
279
function ComponentPriority(Category: TComponentPriorityCategory; Level: integer
280
): TComponentPriority;
282
Result.Category:=Category;
286
function ComparePriority(const p1, p2: TComponentPriority): integer;
288
// lower category is better
289
Result:=ord(p2.Category)-ord(p1.Category);
290
if Result<>0 then exit;
291
// higher level is better
292
Result:=p1.Level-p2.Level;
295
function CompareIDEComponentByClassName(Data1, Data2: pointer): integer;
297
Comp1: TRegisteredComponent;
298
Comp2: TRegisteredComponent;
300
Comp1:=TRegisteredComponent(Data1);
301
Comp2:=TRegisteredComponent(Data2);
302
Result:=AnsiCompareText(Comp1.ComponentClass.Classname,
303
Comp2.ComponentClass.Classname);
306
function dbgs(const c: TComponentPriorityCategory): string;
308
Result:=GetEnumName(TypeInfo(TComponentPriorityCategory),ord(c));
311
function dbgs(const p: TComponentPriority): string;
313
Result:='Cat='+dbgs(p.Category)+',Lvl='+IntToStr(p.Level);
316
{ TCompPaletteOptions }
318
constructor TCompPaletteOptions.Create;
321
FPageNames := TStringList.Create;
322
FHiddenPageNames := TStringList.Create;
323
FComponentPages := TStringList.Create;
326
destructor TCompPaletteOptions.Destroy;
331
FComponentPages.Free;
332
FHiddenPageNames.Free;
337
procedure TCompPaletteOptions.ClearComponentPages;
341
for i:=0 to FComponentPages.Count-1 do
342
FComponentPages.Objects[i].Free; // Free also the contained StringList.
343
FComponentPages.Clear;
346
procedure TCompPaletteOptions.AssignComponentPages(aPageName: string; aList: TStringList);
350
sl := TStringList.Create;
352
FComponentPages.AddObject(aPageName, sl);
355
function TCompPaletteOptions.Load: boolean;
357
CompList: TStringList;
358
Path, SubPath, CompPath: String;
359
PageName, CompName: String;
360
PageCount, CompCount: Integer;
364
if ConfigStore=nil then exit;
366
Path:='ComponentPaletteOptions/';
367
//FileVersion := ConfigStore.GetValue(Path+'Version/Value',0);
370
SubPath:=Path+'Pages/';
371
PageCount:=ConfigStore.GetValue(SubPath+'Count', 0);
372
for i:=1 to PageCount do begin
373
PageName:=ConfigStore.GetValue(SubPath+'Item'+IntToStr(i)+'/Value', '');
374
FPageNames.Add(PageName);
377
FHiddenPageNames.Clear;
378
SubPath:=Path+'HiddenPages/';
379
PageCount:=ConfigStore.GetValue(SubPath+'Count', 0);
380
for i:=1 to PageCount do begin
381
PageName:=ConfigStore.GetValue(SubPath+'Item'+IntToStr(i)+'/Value', '');
382
FHiddenPageNames.Add(PageName);
386
SubPath:=Path+'ComponentPages/';
387
PageCount:=ConfigStore.GetValue(SubPath+'Count', 0);
388
for i:=1 to PageCount do begin
389
CompPath:=SubPath+'Page'+IntToStr(i+1)+'/';
390
PageName:=ConfigStore.GetValue(CompPath+'Value', '');
391
CompList:=TStringList.Create;
392
CompCount:=ConfigStore.GetValue(CompPath+'Components/Count', 0);
393
for j:=1 to CompCount do begin
394
CompName:=ConfigStore.GetValue(CompPath+'Components/Item'+IntToStr(j)+'/Value', '');
395
CompList.Add(CompName);
397
FComponentPages.AddObject(PageName, CompList); // CompList is owned by FComponentPages
400
on E: Exception do begin
401
DebugLn('ERROR: TOIOptions.Load: ',E.Message);
408
function TCompPaletteOptions.Save: boolean;
410
CompList: TStringList;
411
Path, SubPath, CompPath, ss: String;
412
PageCount, CompCount: Integer;
416
if ConfigStore=nil then exit;
418
Path:='ComponentPaletteOptions/';
420
SubPath:=Path+'Pages/';
421
ConfigStore.SetDeleteValue(SubPath+'Count', FPageNames.Count, 0);
422
for i:=0 to FPageNames.Count-1 do
423
ConfigStore.SetDeleteValue(SubPath+'Item'+IntToStr(i+1)+'/Value', FPageNames[i], '');
425
SubPath:=Path+'HiddenPages/';
426
ConfigStore.SetDeleteValue(SubPath+'Count', FHiddenPageNames.Count, 0);
427
for i:=0 to FHiddenPageNames.Count-1 do
428
ConfigStore.SetDeleteValue(SubPath+'Item'+IntToStr(i+1)+'/Value', FHiddenPageNames[i], '');
430
SubPath:=Path+'ComponentPages/';
431
ConfigStore.SetDeleteValue(SubPath+'Count', FComponentPages.Count, 0);
432
for i:=0 to FComponentPages.Count-1 do begin
433
CompList:=FComponentPages.Objects[i] as TStringList;
434
CompPath:=SubPath+'Page'+IntToStr(i+1)+'/';
435
ConfigStore.SetDeleteValue(CompPath+'Value', FComponentPages[i], '');
436
ConfigStore.SetDeleteValue(CompPath+'Components/Count', CompList.Count, 0);
437
for j:=0 to CompList.Count-1 do
438
ConfigStore.SetDeleteValue(CompPath+'Components/Item'+IntToStr(j+1)+'/Value', CompList[j], '');
441
on E: Exception do begin
442
DebugLn('ERROR: TOIOptions.Save: ',E.Message);
449
{ TRegisteredComponent }
451
procedure TRegisteredComponent.SetVisible(const AValue: boolean);
453
if FVisible=AValue then exit;
456
FPage.OnComponentVisibleChanged(Self);
459
procedure TRegisteredComponent.FreeButton;
465
constructor TRegisteredComponent.Create(TheComponentClass: TComponentClass;
466
const ThePageName: string);
468
FComponentClass:=TheComponentClass;
469
FPageName:=ThePageName;
473
destructor TRegisteredComponent.Destroy;
481
procedure TRegisteredComponent.ConsistencyCheck;
483
if (FComponentClass=nil) then
484
RaiseException('TRegisteredComponent.ConsistencyCheck FComponentClass=nil');
485
if not IsValidIdent(FComponentClass.ClassName) then
486
RaiseException('TRegisteredComponent.ConsistencyCheck not IsValidIdent(FComponentClass.ClassName)');
489
function TRegisteredComponent.GetPriority: TComponentPriority;
491
Result:=ComponentPriorityNormal;
494
procedure TRegisteredComponent.AddToPalette;
496
IDEComponentPalette.AddComponent(Self);
499
function TRegisteredComponent.CanBeCreatedInDesigner: boolean;
504
function TRegisteredComponent.GetCreationClass: TComponentClass;
506
Result:=FComponentClass;
507
if Assigned(OnGetCreationClass) then
508
OnGetCreationClass(Self,Result);
511
function TRegisteredComponent.IsTControl: boolean;
513
Result:=ComponentClass.InheritsFrom(TControl);
516
{ TBaseComponentPage }
518
function TBaseComponentPage.GetItems(Index: integer): TRegisteredComponent;
520
Result:=TRegisteredComponent(FComps[Index]);
523
procedure TBaseComponentPage.SetVisible(const AValue: boolean);
525
if FVisible=AValue then exit;
527
if (FPalette<>nil) then
528
FPalette.OnPageVisibleChanged(Self);
531
procedure TBaseComponentPage.OnComponentVisibleChanged(AComponent: TRegisteredComponent);
533
if FPalette<>nil then
534
FPalette.OnComponentVisibleChanged(AComponent);
537
constructor TBaseComponentPage.Create(const ThePageName: string);
539
FPageName:=ThePageName;
540
FComps:=TList.Create;
541
FVisible:=FPageName<>'';
544
destructor TBaseComponentPage.Destroy;
547
FreeAndNil(FPageComponent);
548
FreeAndNil(FSelectButton);
553
procedure TBaseComponentPage.Clear;
558
for i:=0 to FComps.Count-1 do
563
procedure TBaseComponentPage.ClearButtons;
570
FreeAndNil(FSelectButton);
573
procedure TBaseComponentPage.ConsistencyCheck;
578
function TBaseComponentPage.Count: integer;
580
Result:=FComps.Count;
583
procedure TBaseComponentPage.Add(NewComponent: TRegisteredComponent);
585
InsertIndex: Integer;
586
NewPriority: TComponentPriority;
588
NewPriority:=NewComponent.GetPriority;
590
while (InsertIndex<Count)
591
and (ComparePriority(NewPriority,Comps[InsertIndex].GetPriority)<=0) do
593
FComps.Insert(InsertIndex,NewComponent);
594
NewComponent.Page:=Self;
595
if FPalette<>nil then
596
FPalette.OnPageAddedComponent(NewComponent);
599
procedure TBaseComponentPage.Remove(AComponent: TRegisteredComponent);
601
FComps.Remove(AComponent);
602
AComponent.Page:=nil;
603
if FPalette<>nil then
604
FPalette.OnPageRemovedComponent(Self,AComponent);
607
function TBaseComponentPage.FindComponent(const CompClassName: string): TRegisteredComponent;
611
for i:=0 to Count-1 do begin
613
if CompareText(Result.ComponentClass.ClassName,CompClassName)=0 then
619
function TBaseComponentPage.FindButton(Button: TComponent): TRegisteredComponent;
623
for i:=0 to Count-1 do begin
625
if Result.Button=Button then exit;
630
procedure TBaseComponentPage.UpdateVisible;
633
HasVisibleComponents: Boolean;
635
if Palette<>nil then begin
636
HasVisibleComponents:=false;
637
for i:=0 to Count-1 do begin
638
Palette.UpdateVisible(Comps[i]);
639
if Comps[i].Visible then HasVisibleComponents:=true;
641
Visible:=HasVisibleComponents and (PageName<>'');
645
function TBaseComponentPage.GetMaxComponentPriority: TComponentPriority;
650
Result:=ComponentPriorityNormal
652
Result:=Comps[0].GetPriority;
653
for i:=1 to Count-1 do
654
if ComparePriority(Comps[i].GetPriority,Result)>0 then
655
Result:=Comps[i].GetPriority;
659
{ TBaseComponentPalette }
661
function TBaseComponentPalette.GetPages(Index: integer): TBaseComponentPage;
663
Result:=TBaseComponentPage(FPages[Index]);
666
procedure TBaseComponentPalette.AddHandler(HandlerType: TComponentPaletteHandlerType;
667
const AMethod: TMethod; AsLast: boolean);
669
if FHandlers[HandlerType]=nil then
670
FHandlers[HandlerType]:=TMethodList.Create;
671
FHandlers[HandlerType].Add(AMethod);
674
function TBaseComponentPalette.GetSelected: TRegisteredComponent;
679
procedure TBaseComponentPalette.RemoveHandler(HandlerType: TComponentPaletteHandlerType;
680
const AMethod: TMethod);
682
FHandlers[HandlerType].Remove(AMethod);
685
procedure TBaseComponentPalette.SetHideControls(const AValue: boolean);
687
if FHideControls=AValue then exit;
688
FHideControls:=AValue;
692
procedure TBaseComponentPalette.SetSelected(const AValue: TRegisteredComponent);
697
procedure TBaseComponentPalette.DoChange;
699
if FUpdateLock>0 then
705
procedure TBaseComponentPalette.DoBeginUpdate;
710
procedure TBaseComponentPalette.DoEndUpdate(Changed: boolean);
712
if Assigned(OnEndUpdate) then OnEndUpdate(Self,Changed);
715
procedure TBaseComponentPalette.OnPageAddedComponent(Component: TRegisteredComponent);
720
procedure TBaseComponentPalette.OnPageRemovedComponent(
721
Page: TBaseComponentPage; Component: TRegisteredComponent);
726
procedure TBaseComponentPalette.OnComponentVisibleChanged(AComponent: TRegisteredComponent);
731
procedure TBaseComponentPalette.OnPageVisibleChanged(APage: TBaseComponentPage);
736
procedure TBaseComponentPalette.Update;
741
procedure TBaseComponentPalette.UpdateVisible(AComponent: TRegisteredComponent);
746
if HideControls and AComponent.IsTControl then
748
i:=FHandlers[cphtUpdateVisible].Count;
749
while FHandlers[cphtUpdateVisible].NextDownIndex(i) do
750
TUpdateCompVisibleEvent(FHandlers[cphtUpdateVisible][i])(AComponent,Vote);
751
AComponent.Visible:=Vote>0;
754
procedure TBaseComponentPalette.SetBaseComponentPageClass(
755
const AValue: TBaseComponentPageClass);
757
FBaseComponentPageClass:=AValue;
760
procedure TBaseComponentPalette.SetRegisteredComponentClass(
761
const AValue: TRegisteredComponentClass);
763
FRegisteredComponentClass:=AValue;
766
constructor TBaseComponentPalette.Create;
768
FPages:=TList.Create;
769
fPagesDefaultOrder:=TList.Create;
770
fPagesUserOrder:=TStringList.Create;
773
destructor TBaseComponentPalette.Destroy;
775
HandlerType: TComponentPaletteHandlerType;
779
for i := 0 to fPagesUserOrder.Count-1 do
780
fPagesUserOrder.Objects[i].Free; // Free also contained StringLists.
781
FreeAndNil(fPagesUserOrder);
782
FreeAndNil(fPagesDefaultOrder);
784
for HandlerType:=Low(HandlerType) to High(HandlerType) do
785
FHandlers[HandlerType].Free;
789
procedure TBaseComponentPalette.Clear;
793
for i:=0 to FPages.Count-1 do
798
procedure TBaseComponentPalette.ClearButtons;
805
Pages[i].ClearButtons;
808
procedure TBaseComponentPalette.BeginUpdate(Change: boolean);
811
if FUpdateLock=1 then begin
814
if Assigned(OnBeginUpdate) then OnBeginUpdate(Self);
816
fChanged:=fChanged or Change;
819
procedure TBaseComponentPalette.EndUpdate;
821
if FUpdateLock<=0 then RaiseException('TBaseComponentPalette.EndUpdate');
823
if FUpdateLock=0 then DoEndUpdate(fChanged);
826
function TBaseComponentPalette.IsUpdateLocked: boolean;
828
Result:=FUpdateLock>0;
831
procedure TBaseComponentPalette.DoAfterComponentAdded;
835
i:=FHandlers[cphtComponentAdded].Count;
836
while FHandlers[cphtComponentAdded].NextDownIndex(i) do
837
TComponentAddedEvent(FHandlers[cphtComponentAdded][i])();
840
procedure TBaseComponentPalette.ConsistencyCheck;
845
function TBaseComponentPalette.Count: integer;
847
Result:=FPages.Count;
850
function TBaseComponentPalette.GetPage(const APageName: string;
851
aCaseSens: Boolean = False): TBaseComponentPage;
856
i:=IndexOfPageName(APageName)
858
i:=IndexOfPageWithName(APageName);
865
function TBaseComponentPalette.IndexOfPageName(const APageName: string): integer;
867
Result:=Count-1; // Case sensitive search
868
while (Result>=0) and (Pages[Result].PageName <> APageName) do
872
function TBaseComponentPalette.IndexOfPageWithName(const APageName: string): integer;
874
Result:=Count-1; // Case in-sensitive search
875
while (Result>=0) and (AnsiCompareText(Pages[Result].PageName,APageName)<>0) do
879
procedure TBaseComponentPalette.AddComponent(NewComponent: TRegisteredComponent);
881
CurPage: TBaseComponentPage;
883
CurPage:=GetPage(NewComponent.PageName);
885
CurPage:=CreateNewPage(NewComponent.PageName,NewComponent.GetPriority);
886
CurPage.Add(NewComponent);
889
function TBaseComponentPalette.CreateNewPage(const NewPageName: string;
890
const Priority: TComponentPriority): TBaseComponentPage;
892
InsertIndex: Integer;
894
Result:=TBaseComponentPage.Create(NewPageName);
895
Result.Priority:=Priority;
897
while (InsertIndex<Count)
898
and (ComparePriority(Priority,Pages[InsertIndex].Priority)<=0) do
900
FPages.Insert(InsertIndex,Result);
901
Result.FPalette:=Self;
902
if CompareText(NewPageName,'Hidden')=0 then
903
Result.Visible:=false;
906
function TBaseComponentPalette.FindComponent(const CompClassName: string): TRegisteredComponent;
910
for i:=0 to Count-1 do begin
911
Result:=Pages[i].FindComponent(CompClassName);
912
if Result<>nil then exit;
917
function TBaseComponentPalette.FindButton(Button: TComponent): TRegisteredComponent;
921
for i:=0 to Count-1 do begin
922
Result:=Pages[i].FindButton(Button);
923
if Result<>nil then exit;
928
function TBaseComponentPalette.CreateNewClassName(const Prefix: string): string;
932
if FindComponent(Prefix)=nil then begin
937
Result:=Prefix+IntToStr(i);
939
until FindComponent(Result)=nil;
943
function TBaseComponentPalette.IndexOfPageComponent(AComponent: TComponent): integer;
945
if AComponent<>nil then begin
947
while (Result>=0) and (Pages[Result].PageComponent<>AComponent) do
953
function TBaseComponentPalette.SortPagesDefaultOrder: Boolean;
954
// Calculate default page order by using component priorities (without user config).
955
// Note: components inside a page are already ordered when they are added.
957
CurPrio, ListPrio: TComponentPriority;
961
for PageCnt:=0 to Count-1 do
963
i := fPagesDefaultOrder.Count-1;
964
while (i >= 0) do begin
965
CurPrio := Pages[PageCnt].GetMaxComponentPriority;
966
ListPrio := TBaseComponentPage(fPagesDefaultOrder[i]).GetMaxComponentPriority;
967
if ComparePriority(CurPrio, ListPrio) <= 0 then Break;
970
fPagesDefaultOrder.Insert(i+1, Pages[PageCnt]);
974
procedure TBaseComponentPalette.UpdateVisible;
979
for i:=0 to Count-1 do
980
Pages[i].UpdateVisible;
984
procedure TBaseComponentPalette.IterateRegisteredClasses(Proc: TGetComponentClassEvent);
987
APage: TBaseComponentPage;
989
for i:=0 to Count-1 do begin
991
for j:=0 to APage.Count-1 do
992
Proc(APage[j].ComponentClass);
996
procedure TBaseComponentPalette.RegisterCustomIDEComponents(
997
const RegisterProc: RegisterUnitComponentProc);
1002
procedure TBaseComponentPalette.RemoveAllHandlersOfObject(AnObject: TObject);
1004
HandlerType: TComponentPaletteHandlerType;
1006
for HandlerType:=Low(HandlerType) to High(HandlerType) do
1007
FHandlers[HandlerType].RemoveAllMethodsOfObject(AnObject);
1010
procedure TBaseComponentPalette.AddHandlerUpdateVisible(
1011
const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent; AsLast: boolean);
1013
AddHandler(cphtUpdateVisible,TMethod(OnUpdateCompVisibleEvent));
1016
procedure TBaseComponentPalette.RemoveHandlerUpdateVisible(
1017
const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent);
1019
RemoveHandler(cphtUpdateVisible,TMethod(OnUpdateCompVisibleEvent));
1022
procedure TBaseComponentPalette.AddHandlerComponentAdded(
1023
const OnComponentAddedEvent: TComponentAddedEvent);
1025
AddHandler(cphtComponentAdded,TMethod(OnComponentAddedEvent));
1028
procedure TBaseComponentPalette.RemoveHandlerComponentAdded(
1029
const OnComponentAddedEvent: TComponentAddedEvent);
1031
RemoveHandler(cphtComponentAdded,TMethod(OnComponentAddedEvent));