IDE: In component palette, cache original component names by page name.

git-svn-id: trunk@47000 -
This commit is contained in:
juha 2014-11-27 20:31:28 +00:00
parent d9b6126447
commit 4ccb281acd
2 changed files with 77 additions and 34 deletions

View File

@ -25,7 +25,7 @@ interface
uses uses
Classes, SysUtils, typinfo, Controls, ComCtrls, Forms, Classes, SysUtils, typinfo, Controls, ComCtrls, Forms,
LazarusPackageIntf, LazConfigStorage, LCLProc, fgl; LazConfigStorage, LCLProc, fgl;
type type
TComponentPriorityCategory = ( TComponentPriorityCategory = (
@ -199,6 +199,7 @@ type
fComps: TRegisteredComponentList; fComps: TRegisteredComponentList;
// New pages added and their priorities, ordered by priority. // New pages added and their priorities, ordered by priority.
fOrigPagePriorities: TPagePriorityList; fOrigPagePriorities: TPagePriorityList;
procedure AssignCompsForPage(DestComps: TStringList; PageName: string); virtual; abstract;
procedure DoChange; virtual; procedure DoChange; virtual;
procedure DoBeginUpdate; virtual; procedure DoBeginUpdate; virtual;
procedure DoEndUpdate(Changed: boolean); virtual; procedure DoEndUpdate(Changed: boolean); virtual;

View File

@ -38,14 +38,12 @@ unit ComponentPalette;
interface interface
uses uses
Classes, SysUtils, Controls, Forms, Graphics, ComCtrls, Buttons, FileUtil, Classes, SysUtils, Controls, Forms, Graphics, ComCtrls, Buttons, Menus, ExtCtrls,
LazFileCache, Menus, LResources, AVL_Tree, PropEdits, FormEditingIntf, FileUtil, LazFileCache, AVL_Tree, PropEdits, FormEditingIntf, LazIDEIntf,
LazIDEIntf, IDEProcs, LCLProc, ExtCtrls, LCLIntf,
{$IFDEF CustomIDEComps} {$IFDEF CustomIDEComps}
CustomIDEComps, CustomIDEComps,
{$ENDIF} {$ENDIF}
LazarusIDEStrConsts, ComponentReg, IDEWindowIntf, ExtendedTabControls, LazarusIDEStrConsts, ComponentReg, DesignerProcs, PackageDefs, EnvironmentOpts;
DesignerProcs, PackageDefs, EnvironmentOpts;
type type
TComponentSelectionMode = ( TComponentSelectionMode = (
@ -53,13 +51,15 @@ type
csmMulty // don't reset selection on component add csmMulty // don't reset selection on component add
); );
TComponentPalette = class;
{ TCompPaletteUserOrder } { TCompPaletteUserOrder }
// Like TCompPaletteOptions but collects all pages and components, // Like TCompPaletteOptions but collects all pages and components,
// including the original ones. The palette is later synchronized with this. // including the original ones. The palette is later synchronized with this.
TCompPaletteUserOrder = class(TBaseCompPaletteOptions) TCompPaletteUserOrder = class(TBaseCompPaletteOptions)
private private
fPalette: TBaseComponentPalette; fPalette: TComponentPalette;
// Reference to either EnvironmentOptions.ComponentPaletteOptions or a copy of it. // Reference to either EnvironmentOptions.ComponentPaletteOptions or a copy of it.
fOptions: TCompPaletteOptions; fOptions: TCompPaletteOptions;
public public
@ -87,7 +87,9 @@ type
procedure PopupMenuPopup(Sender: TObject); procedure PopupMenuPopup(Sender: TObject);
private private
// Tree of TRegisteredComponent sorted for componentclass // Tree of TRegisteredComponent sorted for componentclass
fComponents: TAVLTree; fComponentCache: TAVLTree;
// List of original page names. Object holds another StringList for component names.
fComponentPageCache: TStringList;
FPageControl: TPageControl; FPageControl: TPageControl;
fNoteBookNeedsUpdate: boolean; fNoteBookNeedsUpdate: boolean;
FOnOpenPackage: TNotifyEvent; FOnOpenPackage: TNotifyEvent;
@ -100,6 +102,7 @@ type
fUpdatingPageControl: boolean; fUpdatingPageControl: boolean;
// User ordered + original pages and components. // User ordered + original pages and components.
fUserOrder: TCompPaletteUserOrder; fUserOrder: TCompPaletteUserOrder;
procedure CacheComponentPages;
procedure SetPageControl(const AValue: TPageControl); procedure SetPageControl(const AValue: TPageControl);
procedure SelectionToolClick(Sender: TObject); procedure SelectionToolClick(Sender: TObject);
procedure ComponentBtnMouseDown(Sender: TObject; Button: TMouseButton; procedure ComponentBtnMouseDown(Sender: TObject; Button: TMouseButton;
@ -112,6 +115,7 @@ type
procedure CreatePopupMenu; procedure CreatePopupMenu;
procedure UnselectAllButtons; procedure UnselectAllButtons;
protected protected
procedure AssignCompsForPage(DestComps: TStringList; PageName: string); override;
procedure DoBeginUpdate; override; procedure DoBeginUpdate; override;
procedure DoEndUpdate(Changed: boolean); override; procedure DoEndUpdate(Changed: boolean); override;
procedure OnPageAddedComponent(Component: TRegisteredComponent); override; procedure OnPageAddedComponent(Component: TRegisteredComponent); override;
@ -138,8 +142,7 @@ type
procedure UpdateNoteBookButtons; procedure UpdateNoteBookButtons;
procedure OnGetNonVisualCompIcon(Sender: TObject; procedure OnGetNonVisualCompIcon(Sender: TObject;
AComponent: TComponent; var Icon: TCustomBitmap); AComponent: TComponent; var Icon: TCustomBitmap);
function FindComponent(const CompClassName: string function FindComponent(const CompClassName: string): TRegisteredComponent; override;
): TRegisteredComponent; override;
procedure RegisterCustomIDEComponents( procedure RegisterCustomIDEComponents(
const RegisterProc: RegisterUnitComponentProc); override; const RegisterProc: RegisterUnitComponentProc); override;
procedure UpdateVisible; override; procedure UpdateVisible; override;
@ -204,7 +207,7 @@ end;
constructor TCompPaletteUserOrder.Create(aPalette: TBaseComponentPalette); constructor TCompPaletteUserOrder.Create(aPalette: TBaseComponentPalette);
begin begin
inherited Create; inherited Create;
fPalette:=aPalette; fPalette:=TComponentPalette(aPalette);
end; end;
destructor TCompPaletteUserOrder.Destroy; destructor TCompPaletteUserOrder.Destroy;
@ -222,40 +225,34 @@ function TCompPaletteUserOrder.SortPagesAndCompsUserOrder: Boolean;
// Calculate page order using user config and default order. User config takes priority. // Calculate page order using user config and default order. User config takes priority.
// This order will finally be shown in the palette. // This order will finally be shown in the palette.
var var
Comp: TRegisteredComponent;
DstComps: TStringList; DstComps: TStringList;
i, j: Integer; PageI, i: Integer;
PgName: String; PgName: String;
begin begin
Result:=True; Result:=True;
Clear; Clear;
fPalette.CacheComponentPages;
// First add user defined page order from EnvironmentOptions, // First add user defined page order from EnvironmentOptions,
FComponentPages.Assign(fOptions.PageNames); FComponentPages.Assign(fOptions.PageNames);
// then add other pages which don't have user configuration // then add other pages which don't have user configuration
for i := 0 to fPalette.OrigPagePriorities.Count-1 do for PageI := 0 to fPalette.OrigPagePriorities.Count-1 do
begin begin
PgName:=fPalette.OrigPagePriorities.Keys[i]; PgName:=fPalette.OrigPagePriorities.Keys[PageI];
if (FComponentPages.IndexOf(PgName) = -1) if (FComponentPages.IndexOf(PgName) = -1)
and (fOptions.HiddenPageNames.IndexOf(PgName) = -1) then and (fOptions.HiddenPageNames.IndexOf(PgName) = -1) then
FComponentPages.Add(PgName); FComponentPages.Add(PgName);
end; end;
// Map components with their pages // Map components with their pages
for i := 0 to FComponentPages.Count-1 do for PageI := 0 to FComponentPages.Count-1 do
begin begin
PgName := FComponentPages[i]; PgName := FComponentPages[PageI];
DstComps := TStringList.Create; DstComps := TStringList.Create;
FComponentPages.Objects[i] := DstComps; FComponentPages.Objects[PageI] := DstComps;
j := fOptions.ComponentPages.IndexOf(PgName); i := fOptions.ComponentPages.IndexOf(PgName);
if j >= 0 then if i >= 0 then // Add components reordered by user.
// Add components that were reordered by user DstComps.Assign(fOptions.ComponentPages.Objects[i] as TStringList)
DstComps.Assign(fOptions.ComponentPages.Objects[j] as TStringList) else // Add components that were not reordered.
else fPalette.AssignCompsForPage(DstComps, PgName);
// Add components that were not reordered.
for j := 0 to fPalette.Comps.Count-1 do begin
Comp := fPalette.Comps[j];
if SameText(Comp.OrigPageName, PgName) then
DstComps.Add(Comp.ComponentClass.ClassName);
end;
end; end;
end; end;
@ -538,17 +535,55 @@ end;
procedure TComponentPalette.OnPageAddedComponent(Component: TRegisteredComponent); procedure TComponentPalette.OnPageAddedComponent(Component: TRegisteredComponent);
begin begin
fComponents.Add(Component); fComponentCache.Add(Component);
inherited OnPageAddedComponent(Component); inherited OnPageAddedComponent(Component);
end; end;
procedure TComponentPalette.OnPageRemovedComponent(Page: TBaseComponentPage; procedure TComponentPalette.OnPageRemovedComponent(Page: TBaseComponentPage;
Component: TRegisteredComponent); Component: TRegisteredComponent);
begin begin
fComponents.Remove(Component); fComponentCache.Remove(Component);
inherited OnPageRemovedComponent(Page, Component); inherited OnPageRemovedComponent(Page, Component);
end; end;
procedure TComponentPalette.CacheComponentPages;
var
sl: TStringList;
PageI, CompI: Integer;
PgName: string;
Comp: TRegisteredComponent;
begin
if fComponentPageCache.Count > 0 then Exit; // Cache only once.
for PageI := 0 to fOrigPagePriorities.Count-1 do
begin
PgName:=fOrigPagePriorities.Keys[PageI];
Assert((PgName <> '') and not fComponentPageCache.Find(PgName, CompI),
Format('CacheComponentPages: %s already cached.', [PgName]));
// Add a cache StringList for this page name.
sl := TStringList.Create;
fComponentPageCache.AddObject(PgName, sl);
// Find all components for this page and add them to cache.
for CompI := 0 to fComps.Count-1 do begin
Comp := fComps[CompI];
if Comp.OrigPageName = PgName then //if SameText(Comp.OrigPageName, PgName) then
sl.Add(Comp.ComponentClass.ClassName);
end;
end;
end;
procedure TComponentPalette.AssignCompsForPage(DestComps: TStringList; PageName: string);
var
sl: TStringList;
i: Integer;
begin
if fComponentPageCache.Find(PageName, i) then begin
sl := fComponentPageCache.Objects[i] as TStringList;
DestComps.Assign(sl);
end
else
raise Exception.Create(Format('AssignCompsFromCache: %s not found in cache.', [PageName]));
end;
procedure TComponentPalette.Update; procedure TComponentPalette.Update;
begin begin
inherited Update; inherited Update;
@ -576,16 +611,23 @@ begin
FSelectionMode:=csmSingle; FSelectionMode:=csmSingle;
fUserOrder:=TCompPaletteUserOrder.Create(Self); fUserOrder:=TCompPaletteUserOrder.Create(Self);
fUserOrder.Options:=EnvironmentOptions.ComponentPaletteOptions; fUserOrder.Options:=EnvironmentOptions.ComponentPaletteOptions;
fComponents:=TAVLTree.Create(@CompareRegisteredComponents); fComponentCache:=TAVLTree.Create(@CompareRegisteredComponents);
fComponentPageCache:=TStringList.Create;
fComponentPageCache.Sorted:=True;
OnComponentIsInvisible:=@CheckComponentDesignerVisible; OnComponentIsInvisible:=@CheckComponentDesignerVisible;
end; end;
destructor TComponentPalette.Destroy; destructor TComponentPalette.Destroy;
var
i: Integer;
begin begin
if OnComponentIsInvisible=@CheckComponentDesignerVisible then if OnComponentIsInvisible=@CheckComponentDesignerVisible then
OnComponentIsInvisible:=nil; OnComponentIsInvisible:=nil;
PageControl:=nil; PageControl:=nil;
FreeAndNil(fComponents); for i := 0 to fComponentPageCache.Count-1 do
fComponentPageCache.Objects[i].Free; // Free also the contained StringList.
FreeAndNil(fComponentPageCache);
FreeAndNil(fComponentCache);
FreeAndNil(fUserOrder); FreeAndNil(fUserOrder);
FreeAndNil(fUnregisteredIcon); FreeAndNil(fUnregisteredIcon);
FreeAndNil(fSelectButtonIcon); FreeAndNil(fSelectButtonIcon);
@ -1008,7 +1050,7 @@ function TComponentPalette.FindComponent(const CompClassName: string): TRegister
var var
ANode: TAVLTreeNode; ANode: TAVLTreeNode;
begin begin
ANode:=fComponents.FindKey(Pointer(CompClassName), ANode:=fComponentCache.FindKey(Pointer(CompClassName),
@CompareClassNameWithRegisteredComponent); @CompareClassNameWithRegisteredComponent);
if ANode<>nil then if ANode<>nil then
Result:=TRegisteredComponent(ANode.Data) Result:=TRegisteredComponent(ANode.Data)