IDE: Cache also user ordered pages in component palette, use it in UpdateVisible method.

git-svn-id: trunk@47005 -
This commit is contained in:
juha 2014-11-27 20:31:36 +00:00
parent c7486b1bf9
commit 76602fb2f4
3 changed files with 61 additions and 30 deletions

View File

@ -218,6 +218,7 @@ type
procedure AssignOrigCompsForPage(DestComps: TStringList;
PageName: string); virtual; abstract;
function RefOrigCompsForPage(PageName: string): TStringList; virtual; abstract;
function RefUserCompsForPage(PageName: string): TStringList; virtual; abstract;
procedure BeginUpdate(Change: boolean);
procedure EndUpdate;
function IsUpdateLocked: boolean;
@ -590,14 +591,26 @@ procedure TBaseComponentPage.UpdateVisible;
var
i: Integer;
HasVisibleComponents: Boolean;
sl: TStringList;
Comp: TRegisteredComponent;
begin
if Palette = nil then Exit;
if PageName = '' then begin
Visible := False;
Exit;
end;
HasVisibleComponents:=false;
for i:=0 to Palette.Comps.Count-1 do
if (Palette.Comps[i].RealPage = Self) then
if Palette.VoteCompVisibility(Palette.Comps[i]) then
HasVisibleComponents:=true;
Visible:=HasVisibleComponents and (PageName<>'');
sl := Palette.RefUserCompsForPage(FPageName);
Assert(sl.Count > 0, 'TBaseComponentPage.UpdateVisible: ComponentCount = 0');
for i:=0 to sl.Count-1 do begin
Comp := sl.Objects[i] as TRegisteredComponent;
if Palette.VoteCompVisibility(Comp) then
begin
HasVisibleComponents:=true;
Break;
end;
end;
Visible:=HasVisibleComponents;
end;
function TBaseComponentPage.GetScrollBox: TScrollBox;

View File

@ -86,10 +86,13 @@ type
procedure PalettePopupMenuPopup(Sender: TObject);
procedure PopupMenuPopup(Sender: TObject);
private
// Tree of TRegisteredComponent sorted for componentclass
// Component cache, a tree of TRegisteredComponent sorted for componentclass
fComponentCache: TAVLTree;
// List of original page names. Object holds another StringList for component names.
fComponentPageCache: TStringList;
// Two page caches, one for original pages, one for user ordered pages.
// Lists have page names. Object holds another StringList for component names.
fOrigComponentPageCache: TStringList; // Original
fUserComponentPageCache: TStringList; // User ordered
//
FPageControl: TPageControl;
fNoteBookNeedsUpdate: boolean;
FOnOpenPackage: TNotifyEvent;
@ -117,6 +120,7 @@ type
protected
procedure AssignOrigCompsForPage(DestComps: TStringList; PageName: string); override;
function RefOrigCompsForPage(PageName: string): TStringList; override;
function RefUserCompsForPage(PageName: string): TStringList; override;
procedure DoBeginUpdate; override;
procedure DoEndUpdate(Changed: boolean); override;
procedure OnPageAddedComponent(Component: TRegisteredComponent); override;
@ -552,15 +556,15 @@ var
PgName: string;
Comp: TRegisteredComponent;
begin
if fComponentPageCache.Count > 0 then Exit; // Cache only once.
if fOrigComponentPageCache.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),
Assert((PgName <> '') and not fOrigComponentPageCache.Find(PgName, CompI),
Format('CacheComponentPages: %s already cached.', [PgName]));
// Add a cache StringList for this page name.
sl := TStringList.Create;
fComponentPageCache.AddObject(PgName, sl);
fOrigComponentPageCache.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];
@ -575,8 +579,8 @@ var
sl: TStringList;
i: Integer;
begin
if fComponentPageCache.Find(PageName, i) then begin
sl := fComponentPageCache.Objects[i] as TStringList;
if fOrigComponentPageCache.Find(PageName, i) then begin
sl := fOrigComponentPageCache.Objects[i] as TStringList;
DestComps.Assign(sl);
end
else
@ -587,8 +591,18 @@ function TComponentPalette.RefOrigCompsForPage(PageName: string): TStringList;
var
i: Integer;
begin
if fComponentPageCache.Find(PageName, i) then
Result := fComponentPageCache.Objects[i] as TStringList
if fOrigComponentPageCache.Find(PageName, i) then
Result := fOrigComponentPageCache.Objects[i] as TStringList
else
Result := Nil;
end;
function TComponentPalette.RefUserCompsForPage(PageName: string): TStringList;
var
i: Integer;
begin
if fUserComponentPageCache.Find(PageName, i) then
Result := fUserComponentPageCache.Objects[i] as TStringList
else
Result := Nil;
end;
@ -621,21 +635,22 @@ begin
fUserOrder:=TCompPaletteUserOrder.Create(Self);
fUserOrder.Options:=EnvironmentOptions.ComponentPaletteOptions;
fComponentCache:=TAVLTree.Create(@CompareRegisteredComponents);
fComponentPageCache:=TStringList.Create;
fComponentPageCache.Sorted:=True;
fOrigComponentPageCache:=TStringList.Create;
fOrigComponentPageCache.OwnsObjects:=True;
fOrigComponentPageCache.Sorted:=True;
fUserComponentPageCache:=TStringList.Create;
fUserComponentPageCache.OwnsObjects:=True;
fUserComponentPageCache.Sorted:=True;
OnComponentIsInvisible:=@CheckComponentDesignerVisible;
end;
destructor TComponentPalette.Destroy;
var
i: Integer;
begin
if OnComponentIsInvisible=@CheckComponentDesignerVisible then
OnComponentIsInvisible:=nil;
PageControl:=nil;
for i := 0 to fComponentPageCache.Count-1 do
fComponentPageCache.Objects[i].Free; // Free also the contained StringList.
FreeAndNil(fComponentPageCache);
FreeAndNil(fUserComponentPageCache);
FreeAndNil(fOrigComponentPageCache);
FreeAndNil(fComponentCache);
FreeAndNil(fUserOrder);
FreeAndNil(fUnregisteredIcon);
@ -671,16 +686,20 @@ var
i, j: Integer;
PgName: String;
Pg: TBaseComponentPage;
CompNames: TStringList;
CompNames, UserComps: TStringList;
Comp: TRegisteredComponent;
begin
Result := True;
for i:=0 to fPages.Count-1 do
fPages[i].Free;
fPages.Clear;
fUserComponentPageCache.Clear;
for i := 0 to fUserOrder.ComponentPages.Count-1 do
begin
PgName := fUserOrder.ComponentPages[i];
// New cache page
UserComps := TStringList.Create;
fUserComponentPageCache.AddObject(PgName, UserComps);
// Create a new page
Pg:=TBaseComponentPage.Create(PgName);
fPages.Add(Pg);
@ -692,8 +711,10 @@ begin
for j := 0 to CompNames.Count-1 do
begin
Comp := FindComponent(CompNames[j]);
if Assigned(Comp) then
Comp.RealPage := Pg;
Assert(Assigned(Comp),
Format('TComponentPalette.CreatePagesFromUserOrder: Comp %s not found.',[CompNames[j]]));
Comp.RealPage := Pg;
UserComps.AddObject(CompNames[j], Comp);
end;
end;
end;

View File

@ -219,14 +219,11 @@ begin
begin
PgName := PagesListBox.Items[i];
UserComps := PagesListBox.Items.Objects[i] as TStringList;
Assert(Assigned(UserComps), 'TCompPaletteOptionsFrame.WriteComponents: UserComps not assigned');
Assert(Assigned(UserComps), 'TCompPaletteOptionsFrame.WriteComponents: No UserComps for '+PgName);
Pg := IDEComponentPalette.GetPage(PgName);
if Assigned(Pg) then // Can be Nil if this page was added or renamed.
begin
// Collect original components from this page
OrigComps := IDEComponentPalette.RefOrigCompsForPage(PgName);
Assert(Assigned(OrigComps), 'TCompPaletteOptionsFrame.WriteComponents: OrigComps not assigned');
end
OrigComps := IDEComponentPalette.RefOrigCompsForPage(PgName)
else
OrigComps := Nil;
// Differs from original order -> add configuration for components