From 76602fb2f47f1c9644a4b028f368fef88bf89268 Mon Sep 17 00:00:00 2001 From: juha Date: Thu, 27 Nov 2014 20:31:36 +0000 Subject: [PATCH] IDE: Cache also user ordered pages in component palette, use it in UpdateVisible method. git-svn-id: trunk@47005 - --- components/ideintf/componentreg.pas | 23 ++++++++-- ide/componentpalette.pas | 61 +++++++++++++++++-------- ide/frames/componentpalette_options.pas | 7 +-- 3 files changed, 61 insertions(+), 30 deletions(-) diff --git a/components/ideintf/componentreg.pas b/components/ideintf/componentreg.pas index fdb905528a..29cfcbec1a 100644 --- a/components/ideintf/componentreg.pas +++ b/components/ideintf/componentreg.pas @@ -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; diff --git a/ide/componentpalette.pas b/ide/componentpalette.pas index ef3ad4ad21..26b83dec9a 100644 --- a/ide/componentpalette.pas +++ b/ide/componentpalette.pas @@ -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; diff --git a/ide/frames/componentpalette_options.pas b/ide/frames/componentpalette_options.pas index 61f21eb017..b449857000 100644 --- a/ide/frames/componentpalette_options.pas +++ b/ide/frames/componentpalette_options.pas @@ -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