IDE: Properly implement component palette reordering. Loading the user defined order does not work yet.

git-svn-id: trunk@46829 -
This commit is contained in:
juha 2014-11-12 20:35:24 +00:00
parent b2834f51cc
commit 57840d4dcb
5 changed files with 125 additions and 218 deletions

View File

@ -24,7 +24,7 @@ interface
uses uses
Classes, SysUtils, typinfo, Controls, ComCtrls, Forms, Classes, SysUtils, typinfo, Controls, ComCtrls, Forms,
LazarusPackageIntf, LazConfigStorage, LCLProc; LazarusPackageIntf, LazConfigStorage, LCLProc, fgl;
type type
TComponentPriorityCategory = ( TComponentPriorityCategory = (
@ -92,7 +92,6 @@ type
FVisible: boolean; FVisible: boolean;
protected protected
procedure SetVisible(const AValue: boolean); virtual; procedure SetVisible(const AValue: boolean); virtual;
procedure FreeButton;
public public
constructor Create(TheComponentClass: TComponentClass; const ThePageName: string); constructor Create(TheComponentClass: TComponentClass; const ThePageName: string);
destructor Destroy; override; destructor Destroy; override;
@ -119,33 +118,23 @@ type
TBaseComponentPage = class TBaseComponentPage = class
private private
FComps: TList; // list of TRegisteredComponent
FPageComponent: TCustomPage; FPageComponent: TCustomPage;
FPageName: string; FPageName: string;
FPalette: TBaseComponentPalette; FPalette: TBaseComponentPalette;
FPriority: TComponentPriority; FPriority: TComponentPriority;
FSelectButton: TComponent; FSelectButton: TComponent;
FVisible: boolean; FVisible: boolean;
function GetItems(Index: integer): TRegisteredComponent;
protected protected
procedure SetVisible(const AValue: boolean); virtual; procedure SetVisible(const AValue: boolean); virtual;
procedure OnComponentVisibleChanged(AComponent: TRegisteredComponent); virtual; procedure OnComponentVisibleChanged(AComponent: TRegisteredComponent); virtual;
public public
constructor Create(const ThePageName: string); constructor Create(const ThePageName: string);
destructor Destroy; override; destructor Destroy; override;
procedure Clear;
procedure ClearButtons;
procedure ConsistencyCheck;
function Count: integer;
procedure Add(NewComponent: TRegisteredComponent);
procedure Remove(AComponent: TRegisteredComponent);
function FindComponent(const CompClassName: string): TRegisteredComponent; function FindComponent(const CompClassName: string): TRegisteredComponent;
function FindButton(Button: TComponent): TRegisteredComponent; function FindButton(Button: TComponent): TRegisteredComponent;
procedure UpdateVisible; procedure UpdateVisible;
function GetMaxComponentPriority: TComponentPriority;
function GetScrollBox: TScrollBox; function GetScrollBox: TScrollBox;
public public
property Comps[Index: integer]: TRegisteredComponent read GetItems; default;
property PageName: string read FPageName; property PageName: string read FPageName;
property Palette: TBaseComponentPalette read FPalette; property Palette: TBaseComponentPalette read FPalette;
property Priority: TComponentPriority read FPriority write FPriority; property Priority: TComponentPriority read FPriority write FPriority;
@ -170,10 +159,12 @@ type
TComponentAddedEvent = procedure of object; TComponentAddedEvent = procedure of object;
RegisterUnitComponentProc = procedure(const Page, UnitName: ShortString; RegisterUnitComponentProc = procedure(const Page, UnitName: ShortString;
ComponentClass: TComponentClass); ComponentClass: TComponentClass);
TPagePriorityList = specialize TFPGMap<String, TComponentPriority>;
TBaseComponentPalette = class TBaseComponentPalette = class
private private
FPages: TList; // list of TBaseComponentPage FPages: TList; // list of TBaseComponentPage
FComps: TList; // list of all TRegisteredComponent in all pages
FHandlers: array[TComponentPaletteHandlerType] of TMethodList; FHandlers: array[TComponentPaletteHandlerType] of TMethodList;
FBaseComponentPageClass: TBaseComponentPageClass; FBaseComponentPageClass: TBaseComponentPageClass;
FRegisteredComponentClass: TRegisteredComponentClass; FRegisteredComponentClass: TRegisteredComponentClass;
@ -183,13 +174,15 @@ type
FUpdateLock: integer; FUpdateLock: integer;
fChanged: boolean; fChanged: boolean;
function GetPages(Index: integer): TBaseComponentPage; function GetPages(Index: integer): TBaseComponentPage;
function GetComps(Index: integer): TRegisteredComponent;
procedure AddHandler(HandlerType: TComponentPaletteHandlerType; procedure AddHandler(HandlerType: TComponentPaletteHandlerType;
const AMethod: TMethod; AsLast: boolean = false); const AMethod: TMethod; AsLast: boolean = false);
procedure RemoveHandler(HandlerType: TComponentPaletteHandlerType; procedure RemoveHandler(HandlerType: TComponentPaletteHandlerType;
const AMethod: TMethod); const AMethod: TMethod);
procedure SetHideControls(const AValue: boolean); procedure SetHideControls(const AValue: boolean);
protected protected
fPagesDefaultOrder: TList; // Pages list ordered by package priorities // New pages added and their priorities, ordered by priority.
fOrigPagePriorities: TPagePriorityList;
// Pages ordered by user. Contains page name + another StringList // Pages ordered by user. Contains page name + another StringList
// for component names, just like TCompPaletteOptions.ComponentPages. // for component names, just like TCompPaletteOptions.ComponentPages.
fPagesUserOrder: TStringList; fPagesUserOrder: TStringList;
@ -202,29 +195,29 @@ type
procedure OnComponentVisibleChanged({%H-}AComponent: TRegisteredComponent); virtual; procedure OnComponentVisibleChanged({%H-}AComponent: TRegisteredComponent); virtual;
procedure OnPageVisibleChanged({%H-}APage: TBaseComponentPage); virtual; procedure OnPageVisibleChanged({%H-}APage: TBaseComponentPage); virtual;
procedure Update; virtual; procedure Update; virtual;
procedure UpdateVisible(AComponent: TRegisteredComponent); virtual; function UpdateVisible(AComponent: TRegisteredComponent): Boolean; virtual;
function GetSelected: TRegisteredComponent; virtual; function GetSelected: TRegisteredComponent; virtual;
procedure SetBaseComponentPageClass(const AValue: TBaseComponentPageClass); virtual; procedure SetBaseComponentPageClass(const AValue: TBaseComponentPageClass); virtual;
procedure SetRegisteredComponentClass(const AValue: TRegisteredComponentClass); virtual; procedure SetRegisteredComponentClass(const AValue: TRegisteredComponentClass); virtual;
procedure SetSelected(const AValue: TRegisteredComponent); virtual; abstract; procedure SetSelected(const AValue: TRegisteredComponent); virtual; abstract;
function SortPagesDefaultOrder: Boolean;
public public
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
procedure Clear; procedure Clear;
procedure ClearButtons; virtual; procedure ClearButtons; virtual; abstract;
procedure BeginUpdate(Change: boolean); procedure BeginUpdate(Change: boolean);
procedure EndUpdate; procedure EndUpdate;
function IsUpdateLocked: boolean; function IsUpdateLocked: boolean;
procedure DoAfterComponentAdded; virtual; procedure DoAfterComponentAdded; virtual;
procedure ConsistencyCheck; function PageCount: integer;
function Count: integer;
function GetPage(const APageName: string; aCaseSens: Boolean = False): TBaseComponentPage; function GetPage(const APageName: string; aCaseSens: Boolean = False): TBaseComponentPage;
function IndexOfPageName(const APageName: string): integer; function IndexOfPageName(const APageName: string): integer;
function IndexOfPageWithName(const APageName: string): integer; function IndexOfPageWithName(const APageName: string): integer;
function CompCount: integer;
procedure AddComponent(NewComponent: TRegisteredComponent); procedure AddComponent(NewComponent: TRegisteredComponent);
function CreateNewPage(const NewPageName: string; function CreateNewPage(const NewPageName: string;
const Priority: TComponentPriority): TBaseComponentPage; const Priority: TComponentPriority): TBaseComponentPage;
procedure RemoveComponent(AComponent: TRegisteredComponent);
function FindComponent(const CompClassName: string): TRegisteredComponent; virtual; function FindComponent(const CompClassName: string): TRegisteredComponent; virtual;
function FindButton(Button: TComponent): TRegisteredComponent; function FindButton(Button: TComponent): TRegisteredComponent;
function CreateNewClassName(const Prefix: string): string; function CreateNewClassName(const Prefix: string): string;
@ -245,18 +238,15 @@ type
const OnComponentAddedEvent: TComponentAddedEvent); const OnComponentAddedEvent: TComponentAddedEvent);
public public
property Pages[Index: integer]: TBaseComponentPage read GetPages; default; property Pages[Index: integer]: TBaseComponentPage read GetPages; default;
property BaseComponentPageClass: TBaseComponentPageClass property Comps[Index: integer]: TRegisteredComponent read GetComps;
read FBaseComponentPageClass; property BaseComponentPageClass: TBaseComponentPageClass read FBaseComponentPageClass;
property RegisteredComponentClass: TRegisteredComponentClass property RegisteredComponentClass: TRegisteredComponentClass
read FRegisteredComponentClass; read FRegisteredComponentClass;
property UpdateLock: integer read FUpdateLock; property UpdateLock: integer read FUpdateLock;
property OnBeginUpdate: TNotifyEvent read FOnBeginUpdate property OnBeginUpdate: TNotifyEvent read FOnBeginUpdate write FOnBeginUpdate;
write FOnBeginUpdate; property OnEndUpdate: TEndUpdatePaletteEvent read FOnEndUpdate write FOnEndUpdate;
property OnEndUpdate: TEndUpdatePaletteEvent read FOnEndUpdate
write FOnEndUpdate;
property HideControls: boolean read FHideControls write SetHideControls; property HideControls: boolean read FHideControls write SetHideControls;
property Selected: TRegisteredComponent read GetSelected write SetSelected; property Selected: TRegisteredComponent read GetSelected write SetSelected;
property PagesDefaultOrder: TList read fPagesDefaultOrder;
property PagesUserOrder: TStringList read fPagesUserOrder; property PagesUserOrder: TStringList read fPagesUserOrder;
end; end;
@ -454,12 +444,6 @@ begin
FRealPage.OnComponentVisibleChanged(Self); FRealPage.OnComponentVisibleChanged(Self);
end; end;
procedure TRegisteredComponent.FreeButton;
begin
FButton.Free;
FButton:=nil;
end;
constructor TRegisteredComponent.Create(TheComponentClass: TComponentClass; constructor TRegisteredComponent.Create(TheComponentClass: TComponentClass;
const ThePageName: string); const ThePageName: string);
begin begin
@ -470,9 +454,9 @@ end;
destructor TRegisteredComponent.Destroy; destructor TRegisteredComponent.Destroy;
begin begin
if FRealPage<>nil then if Assigned(FRealPage) and Assigned(FRealPage.Palette) then
FRealPage.Remove(Self); FRealPage.Palette.RemoveComponent(Self);
FreeButton; FreeAndNil(FButton);
inherited Destroy; inherited Destroy;
end; end;
@ -513,11 +497,6 @@ end;
{ TBaseComponentPage } { TBaseComponentPage }
function TBaseComponentPage.GetItems(Index: integer): TRegisteredComponent;
begin
Result:=TRegisteredComponent(FComps[Index]);
end;
procedure TBaseComponentPage.SetVisible(const AValue: boolean); procedure TBaseComponentPage.SetVisible(const AValue: boolean);
begin begin
if FVisible=AValue then exit; if FVisible=AValue then exit;
@ -535,80 +514,24 @@ end;
constructor TBaseComponentPage.Create(const ThePageName: string); constructor TBaseComponentPage.Create(const ThePageName: string);
begin begin
FPageName:=ThePageName; FPageName:=ThePageName;
FComps:=TList.Create;
FVisible:=FPageName<>''; FVisible:=FPageName<>'';
end; end;
destructor TBaseComponentPage.Destroy; destructor TBaseComponentPage.Destroy;
begin begin
Clear;
FreeAndNil(FPageComponent); FreeAndNil(FPageComponent);
FreeAndNil(FSelectButton); FreeAndNil(FSelectButton);
FreeAndNil(FComps);
inherited Destroy; inherited Destroy;
end; end;
procedure TBaseComponentPage.Clear;
var
i: Integer;
begin
ClearButtons;
for i:=0 to FComps.Count-1 do
Comps[i].RealPage:=nil;
FComps.Clear;
end;
procedure TBaseComponentPage.ClearButtons;
var
i, Cnt: Integer;
begin
Cnt:=Count;
for i:=0 to Cnt-1 do
Comps[i].FreeButton;
FreeAndNil(FSelectButton);
end;
procedure TBaseComponentPage.ConsistencyCheck;
begin
end;
function TBaseComponentPage.Count: integer;
begin
Result:=FComps.Count;
end;
procedure TBaseComponentPage.Add(NewComponent: TRegisteredComponent);
var
InsertIndex: Integer;
NewPriority: TComponentPriority;
begin
NewPriority:=NewComponent.GetPriority;
InsertIndex:=0;
while (InsertIndex<Count)
and (ComparePriority(NewPriority,Comps[InsertIndex].GetPriority)<=0) do
inc(InsertIndex);
FComps.Insert(InsertIndex,NewComponent);
NewComponent.RealPage:=Self;
if FPalette<>nil then
FPalette.OnPageAddedComponent(NewComponent);
end;
procedure TBaseComponentPage.Remove(AComponent: TRegisteredComponent);
begin
FComps.Remove(AComponent);
AComponent.RealPage:=nil;
if FPalette<>nil then
FPalette.OnPageRemovedComponent(Self,AComponent);
end;
function TBaseComponentPage.FindComponent(const CompClassName: string): TRegisteredComponent; function TBaseComponentPage.FindComponent(const CompClassName: string): TRegisteredComponent;
var var
i: Integer; i: Integer;
begin begin
for i:=0 to Count-1 do begin for i:=0 to Palette.CompCount-1 do begin
Result:=Comps[i]; Result:=Palette.Comps[i];
if CompareText(Result.ComponentClass.ClassName,CompClassName)=0 then if (Result.RealPage = Self)
and (CompareText(Result.ComponentClass.ClassName,CompClassName) = 0) then
exit; exit;
end; end;
Result:=nil; Result:=nil;
@ -618,8 +541,8 @@ function TBaseComponentPage.FindButton(Button: TComponent): TRegisteredComponent
var var
i: Integer; i: Integer;
begin begin
for i:=0 to Count-1 do begin for i:=0 to Palette.CompCount-1 do begin
Result:=Comps[i]; Result:=Palette.Comps[i];
if Result.Button=Button then exit; if Result.Button=Button then exit;
end; end;
Result:=nil; Result:=nil;
@ -630,28 +553,13 @@ var
i: Integer; i: Integer;
HasVisibleComponents: Boolean; HasVisibleComponents: Boolean;
begin begin
if Palette<>nil then begin if Palette = nil then Exit;
HasVisibleComponents:=false; HasVisibleComponents:=false;
for i:=0 to Count-1 do begin for i:=0 to Palette.CompCount-1 do
Palette.UpdateVisible(Comps[i]); if (Palette.Comps[i].RealPage = Self) then
if Comps[i].Visible then HasVisibleComponents:=true; if Palette.UpdateVisible(Palette.Comps[i]) then
end; HasVisibleComponents:=true;
Visible:=HasVisibleComponents and (PageName<>''); Visible:=HasVisibleComponents and (PageName<>'');
end;
end;
function TBaseComponentPage.GetMaxComponentPriority: TComponentPriority;
var
i: Integer;
begin
if Count=0 then
Result:=ComponentPriorityNormal
else begin
Result:=Comps[0].GetPriority;
for i:=1 to Count-1 do
if ComparePriority(Comps[i].GetPriority,Result)>0 then
Result:=Comps[i].GetPriority;
end;
end; end;
function TBaseComponentPage.GetScrollBox: TScrollBox; function TBaseComponentPage.GetScrollBox: TScrollBox;
@ -670,6 +578,11 @@ begin
Result:=TBaseComponentPage(FPages[Index]); Result:=TBaseComponentPage(FPages[Index]);
end; end;
function TBaseComponentPalette.GetComps(Index: integer): TRegisteredComponent;
begin
Result:=TRegisteredComponent(FComps[Index])
end;
procedure TBaseComponentPalette.AddHandler(HandlerType: TComponentPaletteHandlerType; procedure TBaseComponentPalette.AddHandler(HandlerType: TComponentPaletteHandlerType;
const AMethod: TMethod; AsLast: boolean); const AMethod: TMethod; AsLast: boolean);
begin begin
@ -719,8 +632,8 @@ begin
DoChange; DoChange;
end; end;
procedure TBaseComponentPalette.OnPageRemovedComponent( procedure TBaseComponentPalette.OnPageRemovedComponent(Page: TBaseComponentPage;
Page: TBaseComponentPage; Component: TRegisteredComponent); Component: TRegisteredComponent);
begin begin
DoChange; DoChange;
end; end;
@ -740,7 +653,7 @@ begin
end; end;
procedure TBaseComponentPalette.UpdateVisible(AComponent: TRegisteredComponent); function TBaseComponentPalette.UpdateVisible(AComponent: TRegisteredComponent): Boolean;
var var
i, Vote: Integer; i, Vote: Integer;
begin begin
@ -750,7 +663,8 @@ begin
i:=FHandlers[cphtUpdateVisible].Count; i:=FHandlers[cphtUpdateVisible].Count;
while FHandlers[cphtUpdateVisible].NextDownIndex(i) do while FHandlers[cphtUpdateVisible].NextDownIndex(i) do
TUpdateCompVisibleEvent(FHandlers[cphtUpdateVisible][i])(AComponent,Vote); TUpdateCompVisibleEvent(FHandlers[cphtUpdateVisible][i])(AComponent,Vote);
AComponent.Visible:=Vote>0; Result:=Vote>0;
AComponent.Visible:=Result;
end; end;
procedure TBaseComponentPalette.SetBaseComponentPageClass( procedure TBaseComponentPalette.SetBaseComponentPageClass(
@ -768,7 +682,8 @@ end;
constructor TBaseComponentPalette.Create; constructor TBaseComponentPalette.Create;
begin begin
FPages:=TList.Create; FPages:=TList.Create;
fPagesDefaultOrder:=TList.Create; FComps:=TList.Create;
fOrigPagePriorities:=TPagePriorityList.Create;
fPagesUserOrder:=TStringList.Create; fPagesUserOrder:=TStringList.Create;
end; end;
@ -781,7 +696,8 @@ begin
for i := 0 to fPagesUserOrder.Count-1 do for i := 0 to fPagesUserOrder.Count-1 do
fPagesUserOrder.Objects[i].Free; // Free also contained StringLists. fPagesUserOrder.Objects[i].Free; // Free also contained StringLists.
FreeAndNil(fPagesUserOrder); FreeAndNil(fPagesUserOrder);
FreeAndNil(fPagesDefaultOrder); FreeAndNil(fOrigPagePriorities);
FreeAndNil(FComps);
FreeAndNil(FPages); FreeAndNil(FPages);
for HandlerType:=Low(HandlerType) to High(HandlerType) do for HandlerType:=Low(HandlerType) to High(HandlerType) do
FHandlers[HandlerType].Free; FHandlers[HandlerType].Free;
@ -792,21 +708,15 @@ procedure TBaseComponentPalette.Clear;
var var
i: Integer; i: Integer;
begin begin
ClearButtons;
for i:=0 to FComps.Count-1 do
Comps[i].RealPage:=nil;
FComps.Clear;
for i:=0 to FPages.Count-1 do for i:=0 to FPages.Count-1 do
Pages[i].Free; Pages[i].Free;
FPages.Clear; FPages.Clear;
end; end;
procedure TBaseComponentPalette.ClearButtons;
var
Cnt: Integer;
i: Integer;
begin
Cnt:=Count;
for i:=0 to Cnt-1 do
Pages[i].ClearButtons;
end;
procedure TBaseComponentPalette.BeginUpdate(Change: boolean); procedure TBaseComponentPalette.BeginUpdate(Change: boolean);
begin begin
inc(FUpdateLock); inc(FUpdateLock);
@ -839,12 +749,7 @@ begin
TComponentAddedEvent(FHandlers[cphtComponentAdded][i])(); TComponentAddedEvent(FHandlers[cphtComponentAdded][i])();
end; end;
procedure TBaseComponentPalette.ConsistencyCheck; function TBaseComponentPalette.PageCount: integer;
begin
end;
function TBaseComponentPalette.Count: integer;
begin begin
Result:=FPages.Count; Result:=FPages.Count;
end; end;
@ -866,26 +771,46 @@ end;
function TBaseComponentPalette.IndexOfPageName(const APageName: string): integer; function TBaseComponentPalette.IndexOfPageName(const APageName: string): integer;
begin begin
Result:=Count-1; // Case sensitive search Result:=PageCount-1; // Case sensitive search
while (Result>=0) and (Pages[Result].PageName <> APageName) do while (Result>=0) and (Pages[Result].PageName <> APageName) do
dec(Result); dec(Result);
end; end;
function TBaseComponentPalette.IndexOfPageWithName(const APageName: string): integer; function TBaseComponentPalette.IndexOfPageWithName(const APageName: string): integer;
begin begin
Result:=Count-1; // Case in-sensitive search Result:=PageCount-1; // Case in-sensitive search
while (Result>=0) and (AnsiCompareText(Pages[Result].PageName,APageName)<>0) do while (Result>=0) and (AnsiCompareText(Pages[Result].PageName,APageName)<>0) do
dec(Result); dec(Result);
end; end;
function TBaseComponentPalette.CompCount: integer;
begin
Result:=FComps.Count;
end;
procedure TBaseComponentPalette.AddComponent(NewComponent: TRegisteredComponent); procedure TBaseComponentPalette.AddComponent(NewComponent: TRegisteredComponent);
var var
CurPage: TBaseComponentPage; NewPriority: TComponentPriority;
InsertIndex: Integer;
begin begin
CurPage:=GetPage(NewComponent.OrigPageName); // Store components to FComps, sorting them by priority.
if CurPage=nil then NewPriority:=NewComponent.GetPriority;
CurPage:=CreateNewPage(NewComponent.OrigPageName,NewComponent.GetPriority); InsertIndex:=0;
CurPage.Add(NewComponent); while (InsertIndex<FComps.Count)
and (ComparePriority(NewPriority,Comps[InsertIndex].GetPriority)<=0) do
inc(InsertIndex);
FComps.Insert(InsertIndex,NewComponent);
OnPageAddedComponent(NewComponent);
// Store a list of page names and their priorities.
if (NewComponent.OrigPageName <> '')
and (fOrigPagePriorities.IndexOf(NewComponent.OrigPageName) = -1) then begin
InsertIndex:=0;
while (InsertIndex<fOrigPagePriorities.Count)
and (ComparePriority(NewPriority, fOrigPagePriorities.Data[InsertIndex])<=0) do
inc(InsertIndex);
fOrigPagePriorities.InsertKeyData(InsertIndex, NewComponent.OrigPageName, NewPriority);
end;
end; end;
function TBaseComponentPalette.CreateNewPage(const NewPageName: string; function TBaseComponentPalette.CreateNewPage(const NewPageName: string;
@ -896,7 +821,7 @@ begin
Result:=TBaseComponentPage.Create(NewPageName); Result:=TBaseComponentPage.Create(NewPageName);
Result.Priority:=Priority; Result.Priority:=Priority;
InsertIndex:=0; InsertIndex:=0;
while (InsertIndex<Count) while (InsertIndex<PageCount)
and (ComparePriority(Priority,Pages[InsertIndex].Priority)<=0) do and (ComparePriority(Priority,Pages[InsertIndex].Priority)<=0) do
inc(InsertIndex); inc(InsertIndex);
FPages.Insert(InsertIndex,Result); FPages.Insert(InsertIndex,Result);
@ -905,11 +830,18 @@ begin
Result.Visible:=false; Result.Visible:=false;
end; end;
procedure TBaseComponentPalette.RemoveComponent(AComponent: TRegisteredComponent);
begin
FComps.Remove(AComponent);
AComponent.RealPage:=nil;
//ToDo: fix OnPageRemovedComponent(AComponent.RealPage,AComponent);
end;
function TBaseComponentPalette.FindComponent(const CompClassName: string): TRegisteredComponent; function TBaseComponentPalette.FindComponent(const CompClassName: string): TRegisteredComponent;
var var
i: Integer; i: Integer;
begin begin
for i:=0 to Count-1 do begin for i:=0 to PageCount-1 do begin
Result:=Pages[i].FindComponent(CompClassName); Result:=Pages[i].FindComponent(CompClassName);
if Result<>nil then exit; if Result<>nil then exit;
end; end;
@ -920,7 +852,7 @@ function TBaseComponentPalette.FindButton(Button: TComponent): TRegisteredCompon
var var
i: Integer; i: Integer;
begin begin
for i:=0 to Count-1 do begin for i:=0 to PageCount-1 do begin
Result:=Pages[i].FindButton(Button); Result:=Pages[i].FindButton(Button);
if Result<>nil then exit; if Result<>nil then exit;
end; end;
@ -945,58 +877,29 @@ end;
function TBaseComponentPalette.IndexOfPageComponent(AComponent: TComponent): integer; function TBaseComponentPalette.IndexOfPageComponent(AComponent: TComponent): integer;
begin begin
if AComponent<>nil then begin if AComponent<>nil then begin
Result:=Count-1; Result:=PageCount-1;
while (Result>=0) and (Pages[Result].PageComponent<>AComponent) do while (Result>=0) and (Pages[Result].PageComponent<>AComponent) do
dec(Result); dec(Result);
end else end else
Result:=-1; Result:=-1;
end; end;
function TBaseComponentPalette.SortPagesDefaultOrder: Boolean;
// Calculate default page order by using component priorities (without user config).
// Note: components inside a page already have right default order after they are added.
var
Pg: TBaseComponentPage;
CurPrio, ListPrio: TComponentPriority;
i, PageCnt: Integer;
begin
Result := True;
fPagesDefaultOrder.Clear;
for PageCnt:=0 to Count-1 do
begin
Pg := Pages[PageCnt];
if Pg.PageName = '' then Continue;
i := fPagesDefaultOrder.Count-1;
while (i >= 0) do begin
CurPrio := Pg.GetMaxComponentPriority;
ListPrio := TBaseComponentPage(fPagesDefaultOrder[i]).GetMaxComponentPriority;
if ComparePriority(CurPrio, ListPrio) <= 0 then Break;
dec(i);
end;
fPagesDefaultOrder.Insert(i+1, Pg);
end;
end;
procedure TBaseComponentPalette.UpdateVisible; procedure TBaseComponentPalette.UpdateVisible;
var var
i: Integer; i: Integer;
begin begin
BeginUpdate(false); BeginUpdate(false);
for i:=0 to Count-1 do for i:=0 to PageCount-1 do
Pages[i].UpdateVisible; Pages[i].UpdateVisible;
EndUpdate; EndUpdate;
end; end;
procedure TBaseComponentPalette.IterateRegisteredClasses(Proc: TGetComponentClassEvent); procedure TBaseComponentPalette.IterateRegisteredClasses(Proc: TGetComponentClassEvent);
var var
i, j: Integer; i: Integer;
APage: TBaseComponentPage;
begin begin
for i:=0 to Count-1 do begin for i:=0 to CompCount-1 do
APage:=Pages[i]; Proc(Comps[i].ComponentClass);
for j:=0 to APage.Count-1 do
Proc(APage[j].ComponentClass);
end;
end; end;
procedure TBaseComponentPalette.RemoveAllHandlersOfObject(AnObject: TObject); procedure TBaseComponentPalette.RemoveAllHandlersOfObject(AnObject: TObject);

View File

@ -191,14 +191,16 @@ var
begin begin
if Assigned(IDEComponentPalette) then if Assigned(IDEComponentPalette) then
begin begin
for i := 0 to IDEComponentPalette.Count-1 do for i := 0 to IDEComponentPalette.PageCount-1 do
begin begin
APage := IDEComponentPalette.Pages[i]; APage := IDEComponentPalette.Pages[i];
if APage.Visible then if APage.Visible then
for j := 0 to APage.Count-1 do for j := 0 to IDEComponentPalette.CompCount-1 do
begin begin
AComponent := APage.Comps[j]; AComponent := IDEComponentPalette.Comps[j];
if AComponent.Visible and (AComponent.OrigPageName<>'') then if (AComponent.RealPage = APage)
and AComponent.Visible
and (AComponent.OrigPageName <> '') then
FComponentList.Add(AComponent); FComponentList.Add(AComponent);
end; end;
end; end;

View File

@ -354,7 +354,7 @@ var
CurPage: TBaseComponentPage; CurPage: TBaseComponentPage;
SelectButtonOnPage: TSpeedButton; SelectButtonOnPage: TSpeedButton;
begin begin
for i:=0 to Count-1 do begin for i:=0 to PageCount-1 do begin
CurPage:=Pages[i]; CurPage:=Pages[i];
if (FSelected=nil) or (FSelected.RealPage<>CurPage) then begin if (FSelected=nil) or (FSelected.RealPage<>CurPage) then begin
SelectButtonOnPage:=TSpeedButton(CurPage.SelectButton); SelectButtonOnPage:=TSpeedButton(CurPage.SelectButton);
@ -511,7 +511,7 @@ begin
Selected := nil; Selected := nil;
end; end;
function TComponentPalette.GetUnregisteredIcon: TCustomBitMap; function TComponentPalette.GetUnregisteredIcon: TCustomBitmap;
begin begin
if fUnregisteredIcon = nil then if fUnregisteredIcon = nil then
begin begin
@ -539,7 +539,7 @@ begin
PopupMenu:=nil; PopupMenu:=nil;
OpenPackageMenuItem:=nil; OpenPackageMenuItem:=nil;
end; end;
inherited ClearButtons; //inherited ClearButtons;
if FPageControl<>nil then if FPageControl<>nil then
FPageControl.EnableAlign; FPageControl.EnableAlign;
end; end;
@ -641,22 +641,22 @@ begin
// First add user defined page order from EnvironmentOptions, // First add user defined page order from EnvironmentOptions,
fPagesUserOrder.Assign(ComponentPaletteOptions.PageNames); fPagesUserOrder.Assign(ComponentPaletteOptions.PageNames);
// then add other pages which don't have user configuration // then add other pages which don't have user configuration
for DefPgInd := 0 to fPagesDefaultOrder.Count-1 do for DefPgInd := 0 to fOrigPagePriorities.Count-1 do
begin begin
Pg:=TBaseComponentPage(fPagesDefaultOrder[DefPgInd]); PgName:=fOrigPagePriorities.Keys[DefPgInd];
if (fPagesUserOrder.IndexOf(Pg.PageName) = -1) if (fPagesUserOrder.IndexOf(PgName) = -1)
and (ComponentPaletteOptions.HiddenPageNames.IndexOf(Pg.PageName) = -1) then and (ComponentPaletteOptions.HiddenPageNames.IndexOf(PgName) = -1) then
fPagesUserOrder.Add(Pg.PageName); fPagesUserOrder.Add(PgName);
end; end;
// Add components for every page // Add pages and components for them
for i := 0 to fPagesUserOrder.Count-1 do for i := 0 to fPagesUserOrder.Count-1 do
begin begin
PgName := fPagesUserOrder[i]; PgName := fPagesUserOrder[i];
DefPgInd := IndexOfPageName(PgName); DefPgInd := IndexOfPageWithName(PgName);
if DefPgInd >= 0 then if DefPgInd >= 0 then
Pg:=Pages[DefPgInd] Pg:=Pages[DefPgInd]
else begin else begin
// ToDo Pg:=CreateNewPage(PgName, ComponentPriorityNormal);
end; end;
DstComps := TStringList.Create; DstComps := TStringList.Create;
fPagesUserOrder.Objects[i] := DstComps; fPagesUserOrder.Objects[i] := DstComps;
@ -670,14 +670,20 @@ begin
begin begin
CompName := DstComps[CompInd]; CompName := DstComps[CompInd];
Comp := FindComponent(CompName); Comp := FindComponent(CompName);
Comp.RealPage := Pages[DefPgInd]; Comp.RealPage := Pg;
// (Comp.Button as TSpeedButton).Parent := Pg.GetScrollBox;
end; end;
end end
// Add components that were not reordered. // Add components that were not reordered.
else else begin
for CompInd := 0 to Pg.Count-1 do OptPgInd := CompCount;
DstComps.Add(Pg[CompInd].ComponentClass.ClassName); for CompInd := 0 to CompCount-1 do begin
Comp := Comps[CompInd];
if SameText(Comp.OrigPageName, Pg.PageName) then begin
Comp.RealPage:=Pg;
DstComps.Add(Comp.ComponentClass.ClassName);
end;
end;
end;
end; end;
end; end;
end; end;
@ -827,7 +833,6 @@ var
end end
else if aComp.Button<>nil then begin else if aComp.Button<>nil then begin
//debugln(['TComponentPalette.UpdateNoteBookButtons Destroy Button: ',aComp.ComponentClass.ClassName,' ',aComp.Button.Name]); //debugln(['TComponentPalette.UpdateNoteBookButtons Destroy Button: ',aComp.ComponentClass.ClassName,' ',aComp.Button.Name]);
//TControl(aComp.Button).Visible:=false; Not needed!
Application.ReleaseComponent(aComp.Button); Application.ReleaseComponent(aComp.Button);
aComp.Button:=nil; aComp.Button:=nil;
end; end;
@ -837,15 +842,12 @@ var
// Create speedbuttons for every visible component // Create speedbuttons for every visible component
var var
i, BtnIndex: Integer; i, BtnIndex: Integer;
//NoteBookPg: TCustomPage;
ScrollBox: TScrollBox; ScrollBox: TScrollBox;
Pg: TBaseComponentPage; Pg: TBaseComponentPage;
Comp: TPkgComponent; Comp: TPkgComponent;
begin begin
Pg := Pages[aPageIndex]; Pg := Pages[aPageIndex];
if not Pg.Visible then Exit; if not Pg.Visible then Exit;
//NoteBookPg := Pg.PageComponent;
//Pg.PageComponent.OnResize := @OnPageResize;
ScrollBox := Pg.GetScrollBox; ScrollBox := Pg.GetScrollBox;
ScrollBox.OnResize := @OnScrollBoxResize; ScrollBox.OnResize := @OnScrollBoxResize;
Assert(Assigned(ScrollBox), 'CreateButtons: ScrollBox not assigned.'); Assert(Assigned(ScrollBox), 'CreateButtons: ScrollBox not assigned.');
@ -879,7 +881,6 @@ begin
FPageControl.DisableAlign; FPageControl.DisableAlign;
try try
OldActivePage:=FPageControl.ActivePage; OldActivePage:=FPageControl.ActivePage;
SortPagesDefaultOrder; // Updates fPagesDefaultOrder
SortPagesAndCompsUserOrder; // Updates fPagesUserOrder SortPagesAndCompsUserOrder; // Updates fPagesUserOrder
// remove every page in the PageControl without a visible page // remove every page in the PageControl without a visible page
for i:=FPageControl.PageCount-1 downto 0 do for i:=FPageControl.PageCount-1 downto 0 do

View File

@ -217,10 +217,11 @@ begin
if Assigned(Pg) then // Can be Nil if this page was added or renamed. if Assigned(Pg) then // Can be Nil if this page was added or renamed.
begin begin
// Collect original components from this page // Collect original components from this page
for CompCnt := 0 to Pg.Count-1 do for CompCnt := 0 to IDEComponentPalette.PageCount-1 do
begin begin
Comp := Pg.Comps[CompCnt]; Comp := IDEComponentPalette.Comps[CompCnt];
OrigComps.Add(Comp.ComponentClass.ClassName); if Comp.RealPage = Pg then
OrigComps.Add(Comp.ComponentClass.ClassName);
end; end;
end; end;
// Differs from original order -> add configuration for components // Differs from original order -> add configuration for components

View File

@ -1343,7 +1343,7 @@ var
begin begin
// get all current pagenames (excluding the hidden page) // get all current pagenames (excluding the hidden page)
sl:=TStringList.Create; sl:=TStringList.Create;
for i:=0 to IDEComponentPalette.Count-1 do begin for i:=0 to IDEComponentPalette.PageCount-1 do begin
APageName:=IDEComponentPalette[i].PageName; APageName:=IDEComponentPalette[i].PageName;
if APageName<>'' then if APageName<>'' then
sl.Add(APageName); sl.Add(APageName);