mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-26 19:40:26 +02:00
IDE: Fix component palette configuration when a component is installed or uninstalled after the user configuration.
(cherry picked from commit 8e1fc0cf60
)
This commit is contained in:
parent
4c726899a3
commit
6b7cc9b72f
@ -91,6 +91,7 @@ type
|
|||||||
// Pages removed or renamed. They must be hidden in the palette.
|
// Pages removed or renamed. They must be hidden in the palette.
|
||||||
FHiddenPageNames: TStringList;
|
FHiddenPageNames: TStringList;
|
||||||
FVisible: boolean;
|
FVisible: boolean;
|
||||||
|
procedure AddPageCompName(aPageName, aCompName: string);
|
||||||
public
|
public
|
||||||
constructor Create;
|
constructor Create;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
@ -118,16 +119,18 @@ type
|
|||||||
private
|
private
|
||||||
fPalette: TBaseComponentPalette;
|
fPalette: TBaseComponentPalette;
|
||||||
// List of page names with component contents.
|
// List of page names with component contents.
|
||||||
// Object holds TRegisteredComponentList for the components.
|
// Object holds TRegisteredCompList for the components.
|
||||||
FComponentPages: TStringList;
|
FComponentPages: TStringList;
|
||||||
// Reference to either EnvironmentOptions.ComponentPaletteOptions or a copy of it.
|
// Reference to either EnvironmentOptions.ComponentPaletteOptions or a copy of it.
|
||||||
fOptions: TCompPaletteOptions;
|
fOptions: TCompPaletteOptions;
|
||||||
|
procedure AddRecentlyInstalledComps;
|
||||||
|
function FindComp(aCompClassName: string): TRegisteredComponent;
|
||||||
public
|
public
|
||||||
constructor Create(aPalette: TBaseComponentPalette);
|
constructor Create(aPalette: TBaseComponentPalette);
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
procedure Clear;
|
|
||||||
procedure Assign(Source: TCompPaletteUserOrder);
|
procedure Assign(Source: TCompPaletteUserOrder);
|
||||||
procedure AssignCompPage(aPageName: string; aList: TRegisteredCompList);
|
procedure AssignCompPage(aPageName: string; aList: TRegisteredCompList);
|
||||||
|
procedure Clear;
|
||||||
function Equals(Obj: TObject): boolean; override;
|
function Equals(Obj: TObject): boolean; override;
|
||||||
function SortPagesAndCompsUserOrder: Boolean;
|
function SortPagesAndCompsUserOrder: Boolean;
|
||||||
public
|
public
|
||||||
@ -312,10 +315,6 @@ type
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
{$IFDEF VerboseComponentPalette}
|
|
||||||
const
|
|
||||||
CompPalVerbPgName = 'Dialogs'; //'Standard';
|
|
||||||
{$ENDIF}
|
|
||||||
var
|
var
|
||||||
IDEComponentPalette: TBaseComponentPalette = nil;
|
IDEComponentPalette: TBaseComponentPalette = nil;
|
||||||
|
|
||||||
@ -452,6 +451,20 @@ begin
|
|||||||
FHiddenPageNames.Clear;
|
FHiddenPageNames.Clear;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCompPaletteOptions.AddPageCompName(aPageName, aCompName: string);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
sl: TStringList;
|
||||||
|
begin
|
||||||
|
i := FPageNamesCompNames.IndexOf(aPageName);
|
||||||
|
if i >= 0 then begin
|
||||||
|
sl := TStringList(FPageNamesCompNames.Objects[i]);
|
||||||
|
sl.Add(aCompName);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
DebugLn(['TCompPaletteOptions.AddPageCompName: Page "',aPageName,'" not found.']);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TCompPaletteOptions.Assign(Source: TCompPaletteOptions);
|
procedure TCompPaletteOptions.Assign(Source: TCompPaletteOptions);
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
@ -617,10 +630,38 @@ begin
|
|||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCompPaletteUserOrder.Clear;
|
procedure TCompPaletteUserOrder.AddRecentlyInstalledComps;
|
||||||
|
// Add comps that are not found in user config for any page
|
||||||
|
// but are found in original config for a certain page.
|
||||||
|
// They are components that a user installed after configuring the palette.
|
||||||
|
var
|
||||||
|
PageI, i: Integer;
|
||||||
|
PgName, CompName: String;
|
||||||
|
PalComps, UserComps: TRegisteredCompList;
|
||||||
|
RegComp: TRegisteredComponent;
|
||||||
begin
|
begin
|
||||||
inherited Clear;
|
for PageI := 0 to FComponentPages.Count-1 do
|
||||||
FComponentPages.Clear;
|
begin
|
||||||
|
PgName := FComponentPages[PageI];
|
||||||
|
UserComps := TRegisteredCompList(FComponentPages.Objects[PageI]);
|
||||||
|
if fPalette.fOrigComponentPageCache.Find(PgName, i) then begin
|
||||||
|
PalComps := TRegisteredCompList(fPalette.fOrigComponentPageCache.Objects[i]);
|
||||||
|
for i := PalComps.Count-1 downto 0 do // Iterate backwards.
|
||||||
|
begin
|
||||||
|
CompName := PalComps[i].ComponentClass.ClassName;
|
||||||
|
if FindComp(CompName)<>Nil then // New installed components are always at
|
||||||
|
Break // the end of the list -> OK to skip rest.
|
||||||
|
else begin
|
||||||
|
// Not in user config.
|
||||||
|
RegComp := fPalette.FindRegComponent(CompName);
|
||||||
|
DebugLn(['Adding recently installed component "',
|
||||||
|
RegComp.ComponentClass.ClassName,'" to user config.']);
|
||||||
|
UserComps.Add(RegComp);
|
||||||
|
fOptions.AddPageCompName(PgName, CompName);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCompPaletteUserOrder.Assign(Source: TCompPaletteUserOrder);
|
procedure TCompPaletteUserOrder.Assign(Source: TCompPaletteUserOrder);
|
||||||
@ -648,6 +689,12 @@ begin
|
|||||||
FComponentPages.AddObject(aPageName, rcl);
|
FComponentPages.AddObject(aPageName, rcl);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TCompPaletteUserOrder.Clear;
|
||||||
|
begin
|
||||||
|
inherited Clear;
|
||||||
|
FComponentPages.Clear;
|
||||||
|
end;
|
||||||
|
|
||||||
function TCompPaletteUserOrder.Equals(Obj: TObject): boolean;
|
function TCompPaletteUserOrder.Equals(Obj: TObject): boolean;
|
||||||
var
|
var
|
||||||
Source: TCompPaletteUserOrder;
|
Source: TCompPaletteUserOrder;
|
||||||
@ -670,6 +717,26 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TCompPaletteUserOrder.FindComp(aCompClassName: string): TRegisteredComponent;
|
||||||
|
var
|
||||||
|
i, j: Integer;
|
||||||
|
CompList: TRegisteredCompList;
|
||||||
|
begin
|
||||||
|
for i := 0 to FComponentPages.Count-1 do
|
||||||
|
begin
|
||||||
|
//PgName := FComponentPages[i];
|
||||||
|
CompList := TRegisteredCompList(FComponentPages.Objects[i]);
|
||||||
|
Assert(Assigned(CompList), 'TCompPaletteUserOrder.FindComp: CompList=Nil.');
|
||||||
|
for j := 0 to CompList.Count-1 do
|
||||||
|
begin
|
||||||
|
Result := CompList[j];
|
||||||
|
if Result.ComponentClass.ClassName = aCompClassName then
|
||||||
|
Exit; // Found
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Result := Nil;
|
||||||
|
end;
|
||||||
|
|
||||||
function TCompPaletteUserOrder.SortPagesAndCompsUserOrder: Boolean;
|
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.
|
||||||
@ -678,7 +745,7 @@ var
|
|||||||
RegComp: TRegisteredComponent;
|
RegComp: TRegisteredComponent;
|
||||||
sl: TStringList;
|
sl: TStringList;
|
||||||
PgName: String;
|
PgName: String;
|
||||||
PageI, i, j: Integer;
|
PageI, i: Integer;
|
||||||
begin
|
begin
|
||||||
Result:=True;
|
Result:=True;
|
||||||
Clear;
|
Clear;
|
||||||
@ -702,13 +769,18 @@ begin
|
|||||||
i := fOptions.FPageNamesCompNames.IndexOf(PgName);
|
i := fOptions.FPageNamesCompNames.IndexOf(PgName);
|
||||||
if i >= 0 then begin // Add components reordered by user.
|
if i >= 0 then begin // Add components reordered by user.
|
||||||
sl := TStringList(fOptions.FPageNamesCompNames.Objects[i]);
|
sl := TStringList(fOptions.FPageNamesCompNames.Objects[i]);
|
||||||
for j := 0 to sl.Count-1 do
|
for i := 0 to sl.Count-1 do
|
||||||
begin
|
begin
|
||||||
RegComp := fPalette.FindRegComponent(sl[j]);
|
RegComp := fPalette.FindRegComponent(sl[i]);
|
||||||
DstComps.Add(RegComp);
|
if Assigned(RegComp) then
|
||||||
|
DstComps.Add(RegComp)
|
||||||
|
else begin // Component can be uninstalled, not found
|
||||||
|
DebugLn(['TCompPaletteUserOrder.SortPagesAndCompsUserOrder: Not found "',sl[i],'". Removing.']);
|
||||||
|
sl.Delete(i); // Delete from configuration.
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end
|
end
|
||||||
else // Add components that were not reordered.
|
else // Add components that were not reordered.
|
||||||
fPalette.AssignOrigCompsForPage(PgName, DstComps);
|
fPalette.AssignOrigCompsForPage(PgName, DstComps);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -885,20 +957,13 @@ begin
|
|||||||
CurPgInd := IndexOfPageName(PgName, True);
|
CurPgInd := IndexOfPageName(PgName, True);
|
||||||
if CurPgInd = -1 then begin
|
if CurPgInd = -1 then begin
|
||||||
// Create a new page
|
// Create a new page
|
||||||
{$IFDEF VerboseComponentPalette}
|
|
||||||
DebugLn(['TComponentPalette.CreatePagesFromUserOrder, page ', PgName, ' index ',UserPageI]);
|
|
||||||
{$ENDIF}
|
|
||||||
Pg := ComponentPageClass.Create(PgName);
|
Pg := ComponentPageClass.Create(PgName);
|
||||||
fPages.Insert(UserPageI, Pg);
|
fPages.Insert(UserPageI, Pg);
|
||||||
Pg.Palette := Self;
|
Pg.Palette := Self;
|
||||||
end
|
end
|
||||||
else if CurPgInd <> UserPageI then begin
|
else if CurPgInd <> UserPageI then
|
||||||
{$IFDEF VerboseComponentPalette}
|
|
||||||
DebugLn(['TComponentPalette.CreatePagesFromUserOrder, move ', PgName, ' from ',CurPgInd, ' to ',UserPageI]);
|
|
||||||
{$ENDIF}
|
|
||||||
fPages.Move(CurPgInd, UserPageI); // Move page to right place.
|
fPages.Move(CurPgInd, UserPageI); // Move page to right place.
|
||||||
end;
|
Pg := fPages[UserPageI];
|
||||||
Pg := Pages[UserPageI];
|
|
||||||
Pg.FIndex := UserPageI;
|
Pg.FIndex := UserPageI;
|
||||||
Assert(PgName = Pg.PageName,
|
Assert(PgName = Pg.PageName,
|
||||||
Format('TComponentPalette.CreatePagesFromUserOrder: Page names differ, "%s" and "%s".',
|
Format('TComponentPalette.CreatePagesFromUserOrder: Page names differ, "%s" and "%s".',
|
||||||
@ -918,19 +983,11 @@ begin
|
|||||||
if VoteCompVisibility(RegComp) then
|
if VoteCompVisibility(RegComp) then
|
||||||
inc(aVisibleCompCnt);
|
inc(aVisibleCompCnt);
|
||||||
end;
|
end;
|
||||||
{$IFDEF VerboseComponentPalette}
|
|
||||||
if PgName=CompPalVerbPgName then
|
|
||||||
debugln(['TComponentPalette.CreatePagesFromUserOrder HideControls=',HideControls,' aVisibleCompCnt=',aVisibleCompCnt]);
|
|
||||||
{$ENDIF}
|
|
||||||
Pg.Visible := (CompareText(PgName,'Hidden')<>0) and (aVisibleCompCnt>0);
|
Pg.Visible := (CompareText(PgName,'Hidden')<>0) and (aVisibleCompCnt>0);
|
||||||
end;
|
end;
|
||||||
// Remove left-over pages.
|
// Remove left-over pages.
|
||||||
while fPages.Count > fUserOrder.ComponentPages.Count do begin
|
while fPages.Count > fUserOrder.ComponentPages.Count do begin
|
||||||
Pg := fPages[fPages.Count-1];
|
Pg := fPages[fPages.Count-1];
|
||||||
{$IFDEF VerboseComponentPalette}
|
|
||||||
DebugLn(['TComponentPalette.CreatePagesFromUserOrder: Deleting left-over page=',
|
|
||||||
Pg.PageName, ', Index=', fPages.Count-1]);
|
|
||||||
{$ENDIF}
|
|
||||||
fPages.Delete(fPages.Count-1);
|
fPages.Delete(fPages.Count-1);
|
||||||
Pg.Free;
|
Pg.Free;
|
||||||
end;
|
end;
|
||||||
@ -966,7 +1023,7 @@ begin
|
|||||||
rcl := TRegisteredCompList(fOrigComponentPageCache.Objects[i]);
|
rcl := TRegisteredCompList(fOrigComponentPageCache.Objects[i]);
|
||||||
for i := 0 to rcl.Count-1 do
|
for i := 0 to rcl.Count-1 do
|
||||||
if rcl[i].Visible then
|
if rcl[i].Visible then
|
||||||
DestCompNames.Add(rcl[i].GetFullClassName);
|
DestCompNames.Add(rcl[i].ComponentClass.ClassName);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TBaseComponentPalette.RefUserCompsForPage(PageName: string): TRegisteredCompList;
|
function TBaseComponentPalette.RefUserCompsForPage(PageName: string): TRegisteredCompList;
|
||||||
@ -1086,7 +1143,7 @@ begin
|
|||||||
CurClassName:=NewComponent.ComponentClass.ClassName;
|
CurClassName:=NewComponent.ComponentClass.ClassName;
|
||||||
for i:=0 to fComps.Count-1 do
|
for i:=0 to fComps.Count-1 do
|
||||||
begin
|
begin
|
||||||
OtherComp:=TRegisteredComponent(fComps[i]);
|
OtherComp:=fComps[i];
|
||||||
if SameText(OtherComp.ComponentClass.ClassName,CurClassName) then
|
if SameText(OtherComp.ComponentClass.ClassName,CurClassName) then
|
||||||
begin
|
begin
|
||||||
while OtherComp.NextSameName<>nil do
|
while OtherComp.NextSameName<>nil do
|
||||||
@ -1199,6 +1256,7 @@ procedure TBaseComponentPalette.Update(ForceUpdateAll: Boolean);
|
|||||||
begin
|
begin
|
||||||
fUserOrder.SortPagesAndCompsUserOrder;
|
fUserOrder.SortPagesAndCompsUserOrder;
|
||||||
CreatePagesFromUserOrder;
|
CreatePagesFromUserOrder;
|
||||||
|
fUserOrder.AddRecentlyInstalledComps;
|
||||||
DoAfterUpdate;
|
DoAfterUpdate;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user