diff --git a/components/ideintf/componentreg.pas b/components/ideintf/componentreg.pas index fecc074a0f..d1e164d994 100644 --- a/components/ideintf/componentreg.pas +++ b/components/ideintf/componentreg.pas @@ -199,7 +199,6 @@ type fComps: TRegisteredComponentList; // New pages added and their priorities, ordered by priority. fOrigPagePriorities: TPagePriorityList; - procedure AssignCompsForPage(DestComps: TStringList; PageName: string); virtual; abstract; procedure DoChange; virtual; procedure DoBeginUpdate; virtual; procedure DoEndUpdate(Changed: boolean); virtual; @@ -218,6 +217,8 @@ type constructor Create; destructor Destroy; override; procedure Clear; + procedure AssignCompsForPage(DestComps: TStringList; PageName: string); virtual; abstract; + function RefCompsForPage(PageName: string): TStringList; virtual; abstract; procedure BeginUpdate(Change: boolean); procedure EndUpdate; function IsUpdateLocked: boolean; diff --git a/ide/componentpalette.pas b/ide/componentpalette.pas index 09fb9fbbae..239d3a7686 100644 --- a/ide/componentpalette.pas +++ b/ide/componentpalette.pas @@ -116,6 +116,7 @@ type procedure UnselectAllButtons; protected procedure AssignCompsForPage(DestComps: TStringList; PageName: string); override; + function RefCompsForPage(PageName: string): TStringList; override; procedure DoBeginUpdate; override; procedure DoEndUpdate(Changed: boolean); override; procedure OnPageAddedComponent(Component: TRegisteredComponent); override; @@ -584,6 +585,16 @@ begin raise Exception.Create(Format('AssignCompsFromCache: %s not found in cache.', [PageName])); end; +function TComponentPalette.RefCompsForPage(PageName: string): TStringList; +var + i: Integer; +begin + if fComponentPageCache.Find(PageName, i) then + Result := fComponentPageCache.Objects[i] as TStringList + else + Result := Nil; +end; + procedure TComponentPalette.Update; begin inherited Update; diff --git a/ide/frames/componentpalette_options.pas b/ide/frames/componentpalette_options.pas index 87072b4871..9b77a7680d 100644 --- a/ide/frames/componentpalette_options.pas +++ b/ide/frames/componentpalette_options.pas @@ -211,36 +211,27 @@ procedure TCompPaletteOptionsFrame.WriteComponents(cpo: TCompPaletteOptions); var UserComps, OrigComps: TStringList; Pg: TBaseComponentPage; - Comp: TRegisteredComponent; - i, CompCnt: Integer; PgName: String; + i: Integer; begin - OrigComps := TStringList.Create; - try - cpo.ClearComponentPages; - for i := 1 to PagesListBox.Count-1 do // Skip all components page + cpo.ClearComponentPages; + for i := 1 to PagesListBox.Count-1 do // Skip all components page + begin + PgName := PagesListBox.Items[i]; + UserComps := PagesListBox.Items.Objects[i] as TStringList; + Assert(Assigned(UserComps), 'TCompPaletteOptionsFrame.WriteComponents: UserComps not assigned'); + Pg := IDEComponentPalette.GetPage(PgName); + if Assigned(Pg) then // Can be Nil if this page was added or renamed. begin - PgName := PagesListBox.Items[i]; - UserComps := PagesListBox.Items.Objects[i] as TStringList; - Assert(Assigned(UserComps), 'TCompPaletteOptionsFrame.WriteComponents: UserComps not assigned'); - OrigComps.Clear; - 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 - for CompCnt := 0 to IDEComponentPalette.Comps.Count-1 do - begin - Comp := IDEComponentPalette.Comps[CompCnt]; - if Comp.OrigPageName = PgName then - OrigComps.Add(Comp.ComponentClass.ClassName); - end; - end; - // Differs from original order -> add configuration for components - if not OrigComps.Equals(UserComps) then - cpo.AssignComponentPage(PgName, UserComps); - end; - finally - OrigComps.Free; + // Collect original components from this page + OrigComps := IDEComponentPalette.RefCompsForPage(PgName); + Assert(Assigned(OrigComps), 'TCompPaletteOptionsFrame.WriteComponents: OrigComps not assigned'); + end + else + OrigComps := Nil; + // Differs from original order -> add configuration for components + if (OrigComps=Nil) or not OrigComps.Equals(UserComps) then + cpo.AssignComponentPage(PgName, UserComps); end; end;