mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-18 11:59:20 +02:00
IDE, Component Palette options: Refactoring. Implement "Restore defaults". Don't change settings when user clicks Cancel.
git-svn-id: trunk@46871 -
This commit is contained in:
parent
d01c453f5f
commit
ca628990f5
@ -11,10 +11,11 @@
|
|||||||
for details about the license.
|
for details about the license.
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
|
|
||||||
Author: Mattias Gaertner
|
Author: Mattias Gaertner, Juha Manninen
|
||||||
|
|
||||||
Abstract:
|
Abstract:
|
||||||
Interface to the component palette and the registered component classes.
|
Interface to the component palette and the registered component classes.
|
||||||
|
Supports reordering of pages and components by user settings in environment options.
|
||||||
}
|
}
|
||||||
unit ComponentReg;
|
unit ComponentReg;
|
||||||
|
|
||||||
@ -53,33 +54,46 @@ type
|
|||||||
TOnGetCreationClass = procedure(Sender: TObject;
|
TOnGetCreationClass = procedure(Sender: TObject;
|
||||||
var NewComponentClass: TComponentClass) of object;
|
var NewComponentClass: TComponentClass) of object;
|
||||||
|
|
||||||
{ TCompPaletteOptions }
|
{ TBaseCompPaletteOptions }
|
||||||
|
|
||||||
TCompPaletteOptions = class
|
TBaseCompPaletteOptions = class
|
||||||
private
|
protected
|
||||||
FConfigStore: TConfigStorage;
|
|
||||||
// Pages reordered by user.
|
// Pages reordered by user.
|
||||||
FPageNames: TStringList;
|
FPageNames: TStringList;
|
||||||
// Pages removed or renamed. They must be hidden in the palette.
|
// List of page names with component contents.
|
||||||
FHiddenPageNames: TStringList;
|
|
||||||
// List of page names with changed component contents.
|
|
||||||
// Object holds another StringList for the component names.
|
// Object holds another StringList for the component names.
|
||||||
FComponentPages: TStringList;
|
FComponentPages: TStringList;
|
||||||
public
|
public
|
||||||
constructor Create;
|
constructor Create;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
|
procedure Clear;
|
||||||
procedure ClearComponentPages;
|
procedure ClearComponentPages;
|
||||||
procedure AssignComponentPages(aPageName: string; aList: TStringList);
|
procedure Assign(Source: TBaseCompPaletteOptions);
|
||||||
|
procedure AssignComponentPage(aPageName: string; aList: TStringList);
|
||||||
|
public
|
||||||
|
property PageNames: TStringList read FPageNames;
|
||||||
|
property ComponentPages: TStringList read FComponentPages;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ TCompPaletteOptions }
|
||||||
|
|
||||||
|
TCompPaletteOptions = class(TBaseCompPaletteOptions)
|
||||||
|
private
|
||||||
|
FConfigStore: TConfigStorage;
|
||||||
|
// Pages removed or renamed. They must be hidden in the palette.
|
||||||
|
FHiddenPageNames: TStringList;
|
||||||
|
public
|
||||||
|
constructor Create;
|
||||||
|
destructor Destroy; override;
|
||||||
|
procedure Clear;
|
||||||
|
procedure Assign(Source: TCompPaletteOptions);
|
||||||
function Load: boolean;
|
function Load: boolean;
|
||||||
function Save: boolean;
|
function Save: boolean;
|
||||||
public
|
public
|
||||||
property ConfigStore: TConfigStorage read FConfigStore write FConfigStore;
|
property ConfigStore: TConfigStorage read FConfigStore write FConfigStore;
|
||||||
property PageNames: TStringList read FPageNames;
|
|
||||||
property HiddenPageNames: TStringList read FHiddenPageNames;
|
property HiddenPageNames: TStringList read FHiddenPageNames;
|
||||||
property ComponentPages: TStringList read FComponentPages;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
{ TRegisteredComponent }
|
{ TRegisteredComponent }
|
||||||
|
|
||||||
TRegisteredComponent = class
|
TRegisteredComponent = class
|
||||||
@ -87,8 +101,8 @@ type
|
|||||||
FButton: TComponent;
|
FButton: TComponent;
|
||||||
FComponentClass: TComponentClass;
|
FComponentClass: TComponentClass;
|
||||||
FOnGetCreationClass: TOnGetCreationClass;
|
FOnGetCreationClass: TOnGetCreationClass;
|
||||||
FRealPage: TBaseComponentPage;
|
|
||||||
FOrigPageName: string;
|
FOrigPageName: string;
|
||||||
|
FRealPage: TBaseComponentPage;
|
||||||
FVisible: boolean;
|
FVisible: boolean;
|
||||||
protected
|
protected
|
||||||
procedure SetVisible(const AValue: boolean); virtual;
|
procedure SetVisible(const AValue: boolean); virtual;
|
||||||
@ -111,7 +125,9 @@ type
|
|||||||
property Button: TComponent read FButton write FButton;
|
property Button: TComponent read FButton write FButton;
|
||||||
property Visible: boolean read FVisible write SetVisible;
|
property Visible: boolean read FVisible write SetVisible;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TRegisteredComponentClass = class of TRegisteredComponent;
|
TRegisteredComponentClass = class of TRegisteredComponent;
|
||||||
|
TRegisteredComponentList = specialize TFPGList<TRegisteredComponent>;
|
||||||
|
|
||||||
|
|
||||||
{ TBaseComponentPage }
|
{ TBaseComponentPage }
|
||||||
@ -130,20 +146,18 @@ type
|
|||||||
public
|
public
|
||||||
constructor Create(const ThePageName: string);
|
constructor Create(const ThePageName: string);
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
function FindComponent(const CompClassName: string): TRegisteredComponent;
|
|
||||||
function FindButton(Button: TComponent): TRegisteredComponent;
|
|
||||||
procedure UpdateVisible;
|
procedure UpdateVisible;
|
||||||
function GetScrollBox: TScrollBox;
|
function GetScrollBox: TScrollBox;
|
||||||
public
|
public
|
||||||
property PageName: string read FPageName;
|
property PageName: string read FPageName;
|
||||||
property Palette: TBaseComponentPalette read FPalette;
|
property Palette: TBaseComponentPalette read FPalette write FPalette;
|
||||||
property Priority: TComponentPriority read FPriority write FPriority;
|
property Priority: TComponentPriority read FPriority write FPriority;
|
||||||
property PageComponent: TCustomPage read FPageComponent write FPageComponent;
|
property PageComponent: TCustomPage read FPageComponent write FPageComponent;
|
||||||
property SelectButton: TComponent read FSelectButton write FSelectButton;
|
property SelectButton: TComponent read FSelectButton write FSelectButton;
|
||||||
property Visible: boolean read FVisible write SetVisible;
|
property Visible: boolean read FVisible write SetVisible;
|
||||||
end;
|
end;
|
||||||
TBaseComponentPageClass = class of TBaseComponentPage;
|
|
||||||
|
|
||||||
|
TBaseComponentPageClass = class of TBaseComponentPage;
|
||||||
|
|
||||||
{ TBaseComponentPalette }
|
{ TBaseComponentPalette }
|
||||||
|
|
||||||
@ -159,18 +173,11 @@ 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);
|
||||||
|
TBaseComponentPageList = specialize TFPGList<TBaseComponentPage>;
|
||||||
TPagePriorityList = specialize TFPGMap<String, TComponentPriority>;
|
TPagePriorityList = specialize TFPGMap<String, TComponentPriority>;
|
||||||
|
|
||||||
TBaseComponentPalette = class
|
TBaseComponentPalette = class
|
||||||
private
|
private
|
||||||
FPages: TList; // list of TBaseComponentPage
|
|
||||||
FComps: TList; // list of all TRegisteredComponent in all pages
|
|
||||||
// New pages added and their priorities, ordered by priority.
|
|
||||||
fOrigPagePriorities: TPagePriorityList;
|
|
||||||
// All pages, including the original ones, ordered by user. Contains page name +
|
|
||||||
// another StringList for component names, like TCompPaletteOptions.ComponentPages.
|
|
||||||
fPagesUserOrder: TStringList;
|
|
||||||
//
|
|
||||||
FHandlers: array[TComponentPaletteHandlerType] of TMethodList;
|
FHandlers: array[TComponentPaletteHandlerType] of TMethodList;
|
||||||
FBaseComponentPageClass: TBaseComponentPageClass;
|
FBaseComponentPageClass: TBaseComponentPageClass;
|
||||||
FRegisteredComponentClass: TRegisteredComponentClass;
|
FRegisteredComponentClass: TRegisteredComponentClass;
|
||||||
@ -179,14 +186,18 @@ type
|
|||||||
FHideControls: boolean;
|
FHideControls: boolean;
|
||||||
FUpdateLock: integer;
|
FUpdateLock: integer;
|
||||||
fChanged: boolean;
|
fChanged: boolean;
|
||||||
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
|
||||||
|
// List of pages, created based on fUserAndOrigPages data.
|
||||||
|
fPages: TBaseComponentPageList;
|
||||||
|
// List of all components in all pages.
|
||||||
|
fComps: TRegisteredComponentList;
|
||||||
|
// New pages added and their priorities, ordered by priority.
|
||||||
|
fOrigPagePriorities: TPagePriorityList;
|
||||||
procedure DoChange; virtual;
|
procedure DoChange; virtual;
|
||||||
procedure DoBeginUpdate; virtual;
|
procedure DoBeginUpdate; virtual;
|
||||||
procedure DoEndUpdate(Changed: boolean); virtual;
|
procedure DoEndUpdate(Changed: boolean); virtual;
|
||||||
@ -205,19 +216,14 @@ type
|
|||||||
constructor Create;
|
constructor Create;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
procedure Clear;
|
procedure Clear;
|
||||||
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;
|
||||||
function PageCount: integer;
|
|
||||||
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;
|
function GetPage(const APageName: string; aCaseSens: Boolean = False): TBaseComponentPage;
|
||||||
procedure AddComponent(NewComponent: TRegisteredComponent);
|
procedure AddComponent(NewComponent: TRegisteredComponent);
|
||||||
function CreateNewPage(const NewPageName: string;
|
|
||||||
const Priority: TComponentPriority): TBaseComponentPage;
|
|
||||||
procedure RemoveComponent(AComponent: TRegisteredComponent);
|
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;
|
||||||
@ -238,8 +244,8 @@ type
|
|||||||
procedure RemoveHandlerComponentAdded(
|
procedure RemoveHandlerComponentAdded(
|
||||||
const OnComponentAddedEvent: TComponentAddedEvent);
|
const OnComponentAddedEvent: TComponentAddedEvent);
|
||||||
public
|
public
|
||||||
property Pages[Index: integer]: TBaseComponentPage read GetPages; default;
|
property Pages: TBaseComponentPageList read fPages;
|
||||||
property Comps[Index: integer]: TRegisteredComponent read GetComps;
|
property Comps: TRegisteredComponentList read fComps;
|
||||||
property BaseComponentPageClass: TBaseComponentPageClass read FBaseComponentPageClass;
|
property BaseComponentPageClass: TBaseComponentPageClass read FBaseComponentPageClass;
|
||||||
property RegisteredComponentClass: TRegisteredComponentClass
|
property RegisteredComponentClass: TRegisteredComponentClass
|
||||||
read FRegisteredComponentClass;
|
read FRegisteredComponentClass;
|
||||||
@ -249,7 +255,6 @@ type
|
|||||||
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 OrigPagePriorities: TPagePriorityList read fOrigPagePriorities;
|
property OrigPagePriorities: TPagePriorityList read fOrigPagePriorities;
|
||||||
property PagesUserOrder: TStringList read fPagesUserOrder;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -306,26 +311,30 @@ begin
|
|||||||
Result:='Cat='+dbgs(p.Category)+',Lvl='+IntToStr(p.Level);
|
Result:='Cat='+dbgs(p.Category)+',Lvl='+IntToStr(p.Level);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TCompPaletteOptions }
|
{ TBaseCompPaletteOptions }
|
||||||
|
|
||||||
constructor TCompPaletteOptions.Create;
|
constructor TBaseCompPaletteOptions.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
FPageNames := TStringList.Create;
|
FPageNames := TStringList.Create;
|
||||||
FHiddenPageNames := TStringList.Create;
|
|
||||||
FComponentPages := TStringList.Create;
|
FComponentPages := TStringList.Create;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TCompPaletteOptions.Destroy;
|
destructor TBaseCompPaletteOptions.Destroy;
|
||||||
begin
|
begin
|
||||||
ClearComponentPages;
|
ClearComponentPages;
|
||||||
FComponentPages.Free;
|
FComponentPages.Free;
|
||||||
FHiddenPageNames.Free;
|
|
||||||
FPageNames.Free;
|
FPageNames.Free;
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCompPaletteOptions.ClearComponentPages;
|
procedure TBaseCompPaletteOptions.Clear;
|
||||||
|
begin
|
||||||
|
FPageNames.Clear;
|
||||||
|
ClearComponentPages;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TBaseCompPaletteOptions.ClearComponentPages;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
@ -334,7 +343,18 @@ begin
|
|||||||
FComponentPages.Clear;
|
FComponentPages.Clear;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCompPaletteOptions.AssignComponentPages(aPageName: string; aList: TStringList);
|
procedure TBaseCompPaletteOptions.Assign(Source: TBaseCompPaletteOptions);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
FPageNames.Assign(Source.FPageNames);
|
||||||
|
ClearComponentPages;
|
||||||
|
for i:=0 to Source.FComponentPages.Count-1 do
|
||||||
|
AssignComponentPage(Source.FComponentPages[i],
|
||||||
|
TStringList(Source.FComponentPages.Objects[i]));
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TBaseCompPaletteOptions.AssignComponentPage(aPageName: string; aList: TStringList);
|
||||||
var
|
var
|
||||||
sl: TStringList;
|
sl: TStringList;
|
||||||
begin
|
begin
|
||||||
@ -343,6 +363,32 @@ begin
|
|||||||
FComponentPages.AddObject(aPageName, sl);
|
FComponentPages.AddObject(aPageName, sl);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TCompPaletteOptions }
|
||||||
|
|
||||||
|
constructor TCompPaletteOptions.Create;
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
FHiddenPageNames := TStringList.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TCompPaletteOptions.Destroy;
|
||||||
|
begin
|
||||||
|
FHiddenPageNames.Free;
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCompPaletteOptions.Clear;
|
||||||
|
begin
|
||||||
|
inherited Clear;
|
||||||
|
FHiddenPageNames.Clear;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCompPaletteOptions.Assign(Source: TCompPaletteOptions);
|
||||||
|
begin
|
||||||
|
inherited Assign(Source);
|
||||||
|
FHiddenPageNames.Assign(Source.FHiddenPageNames);
|
||||||
|
end;
|
||||||
|
|
||||||
function TCompPaletteOptions.Load: boolean;
|
function TCompPaletteOptions.Load: boolean;
|
||||||
var
|
var
|
||||||
CompList: TStringList;
|
CompList: TStringList;
|
||||||
@ -502,6 +548,19 @@ end;
|
|||||||
|
|
||||||
{ TBaseComponentPage }
|
{ TBaseComponentPage }
|
||||||
|
|
||||||
|
constructor TBaseComponentPage.Create(const ThePageName: string);
|
||||||
|
begin
|
||||||
|
FPageName:=ThePageName;
|
||||||
|
FVisible:=FPageName<>'';
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TBaseComponentPage.Destroy;
|
||||||
|
begin
|
||||||
|
FreeAndNil(FPageComponent);
|
||||||
|
FreeAndNil(FSelectButton);
|
||||||
|
inherited Destroy;
|
||||||
|
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;
|
||||||
@ -516,43 +575,6 @@ begin
|
|||||||
FPalette.OnComponentVisibleChanged(AComponent);
|
FPalette.OnComponentVisibleChanged(AComponent);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TBaseComponentPage.Create(const ThePageName: string);
|
|
||||||
begin
|
|
||||||
FPageName:=ThePageName;
|
|
||||||
FVisible:=FPageName<>'';
|
|
||||||
end;
|
|
||||||
|
|
||||||
destructor TBaseComponentPage.Destroy;
|
|
||||||
begin
|
|
||||||
FreeAndNil(FPageComponent);
|
|
||||||
FreeAndNil(FSelectButton);
|
|
||||||
inherited Destroy;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TBaseComponentPage.FindComponent(const CompClassName: string): TRegisteredComponent;
|
|
||||||
var
|
|
||||||
i: Integer;
|
|
||||||
begin
|
|
||||||
for i:=0 to Palette.CompCount-1 do begin
|
|
||||||
Result:=Palette.Comps[i];
|
|
||||||
if (Result.RealPage = Self)
|
|
||||||
and (CompareText(Result.ComponentClass.ClassName,CompClassName) = 0) then
|
|
||||||
exit;
|
|
||||||
end;
|
|
||||||
Result:=nil;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TBaseComponentPage.FindButton(Button: TComponent): TRegisteredComponent;
|
|
||||||
var
|
|
||||||
i: Integer;
|
|
||||||
begin
|
|
||||||
for i:=0 to Palette.CompCount-1 do begin
|
|
||||||
Result:=Palette.Comps[i];
|
|
||||||
if Result.Button=Button then exit;
|
|
||||||
end;
|
|
||||||
Result:=nil;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TBaseComponentPage.UpdateVisible;
|
procedure TBaseComponentPage.UpdateVisible;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
@ -560,7 +582,7 @@ var
|
|||||||
begin
|
begin
|
||||||
if Palette = nil then Exit;
|
if Palette = nil then Exit;
|
||||||
HasVisibleComponents:=false;
|
HasVisibleComponents:=false;
|
||||||
for i:=0 to Palette.CompCount-1 do
|
for i:=0 to Palette.Comps.Count-1 do
|
||||||
if (Palette.Comps[i].RealPage = Self) then
|
if (Palette.Comps[i].RealPage = Self) then
|
||||||
if Palette.UpdateVisible(Palette.Comps[i]) then
|
if Palette.UpdateVisible(Palette.Comps[i]) then
|
||||||
HasVisibleComponents:=true;
|
HasVisibleComponents:=true;
|
||||||
@ -578,14 +600,37 @@ end;
|
|||||||
|
|
||||||
{ TBaseComponentPalette }
|
{ TBaseComponentPalette }
|
||||||
|
|
||||||
function TBaseComponentPalette.GetPages(Index: integer): TBaseComponentPage;
|
constructor TBaseComponentPalette.Create;
|
||||||
begin
|
begin
|
||||||
Result:=TBaseComponentPage(FPages[Index]);
|
fPages:=TBaseComponentPageList.Create;
|
||||||
|
fComps:=TRegisteredComponentList.Create;
|
||||||
|
fOrigPagePriorities:=TPagePriorityList.Create;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TBaseComponentPalette.GetComps(Index: integer): TRegisteredComponent;
|
destructor TBaseComponentPalette.Destroy;
|
||||||
|
var
|
||||||
|
HandlerType: TComponentPaletteHandlerType;
|
||||||
begin
|
begin
|
||||||
Result:=TRegisteredComponent(FComps[Index])
|
Clear;
|
||||||
|
FreeAndNil(fOrigPagePriorities);
|
||||||
|
FreeAndNil(fComps);
|
||||||
|
FreeAndNil(fPages);
|
||||||
|
for HandlerType:=Low(HandlerType) to High(HandlerType) do
|
||||||
|
FHandlers[HandlerType].Free;
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TBaseComponentPalette.Clear;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
for i:=0 to fPages.Count-1 do
|
||||||
|
fPages[i].Free;
|
||||||
|
fPages.Clear;
|
||||||
|
for i:=0 to fComps.Count-1 do
|
||||||
|
fComps[i].RealPage:=nil;
|
||||||
|
fComps.Clear;
|
||||||
|
fOrigPagePriorities.Clear;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TBaseComponentPalette.AddHandler(HandlerType: TComponentPaletteHandlerType;
|
procedure TBaseComponentPalette.AddHandler(HandlerType: TComponentPaletteHandlerType;
|
||||||
@ -684,44 +729,6 @@ begin
|
|||||||
FRegisteredComponentClass:=AValue;
|
FRegisteredComponentClass:=AValue;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TBaseComponentPalette.Create;
|
|
||||||
begin
|
|
||||||
FPages:=TList.Create;
|
|
||||||
FComps:=TList.Create;
|
|
||||||
fOrigPagePriorities:=TPagePriorityList.Create;
|
|
||||||
fPagesUserOrder:=TStringList.Create;
|
|
||||||
end;
|
|
||||||
|
|
||||||
destructor TBaseComponentPalette.Destroy;
|
|
||||||
var
|
|
||||||
HandlerType: TComponentPaletteHandlerType;
|
|
||||||
i: Integer;
|
|
||||||
begin
|
|
||||||
Clear;
|
|
||||||
for i := 0 to fPagesUserOrder.Count-1 do
|
|
||||||
fPagesUserOrder.Objects[i].Free; // Free also contained StringLists.
|
|
||||||
FreeAndNil(fPagesUserOrder);
|
|
||||||
FreeAndNil(fOrigPagePriorities);
|
|
||||||
FreeAndNil(FComps);
|
|
||||||
FreeAndNil(FPages);
|
|
||||||
for HandlerType:=Low(HandlerType) to High(HandlerType) do
|
|
||||||
FHandlers[HandlerType].Free;
|
|
||||||
inherited Destroy;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TBaseComponentPalette.Clear;
|
|
||||||
var
|
|
||||||
i: Integer;
|
|
||||||
begin
|
|
||||||
ClearButtons;
|
|
||||||
for i:=0 to FComps.Count-1 do
|
|
||||||
Comps[i].RealPage:=nil;
|
|
||||||
FComps.Clear;
|
|
||||||
for i:=0 to FPages.Count-1 do
|
|
||||||
Pages[i].Free;
|
|
||||||
FPages.Clear;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TBaseComponentPalette.BeginUpdate(Change: boolean);
|
procedure TBaseComponentPalette.BeginUpdate(Change: boolean);
|
||||||
begin
|
begin
|
||||||
inc(FUpdateLock);
|
inc(FUpdateLock);
|
||||||
@ -754,9 +761,18 @@ begin
|
|||||||
TComponentAddedEvent(FHandlers[cphtComponentAdded][i])();
|
TComponentAddedEvent(FHandlers[cphtComponentAdded][i])();
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TBaseComponentPalette.PageCount: integer;
|
function TBaseComponentPalette.IndexOfPageName(const APageName: string): integer;
|
||||||
begin
|
begin
|
||||||
Result:=FPages.Count;
|
Result:=Pages.Count-1; // Case sensitive search
|
||||||
|
while (Result>=0) and (Pages[Result].PageName <> APageName) do
|
||||||
|
dec(Result);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TBaseComponentPalette.IndexOfPageWithName(const APageName: string): integer;
|
||||||
|
begin
|
||||||
|
Result:=Pages.Count-1; // Case in-sensitive search
|
||||||
|
while (Result>=0) and (AnsiCompareText(Pages[Result].PageName,APageName)<>0) do
|
||||||
|
dec(Result);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TBaseComponentPalette.GetPage(const APageName: string;
|
function TBaseComponentPalette.GetPage(const APageName: string;
|
||||||
@ -774,42 +790,24 @@ begin
|
|||||||
Result:=nil;
|
Result:=nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TBaseComponentPalette.IndexOfPageName(const APageName: string): integer;
|
|
||||||
begin
|
|
||||||
Result:=PageCount-1; // Case sensitive search
|
|
||||||
while (Result>=0) and (Pages[Result].PageName <> APageName) do
|
|
||||||
dec(Result);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TBaseComponentPalette.IndexOfPageWithName(const APageName: string): integer;
|
|
||||||
begin
|
|
||||||
Result:=PageCount-1; // Case in-sensitive search
|
|
||||||
while (Result>=0) and (AnsiCompareText(Pages[Result].PageName,APageName)<>0) do
|
|
||||||
dec(Result);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TBaseComponentPalette.CompCount: integer;
|
|
||||||
begin
|
|
||||||
Result:=FComps.Count;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TBaseComponentPalette.AddComponent(NewComponent: TRegisteredComponent);
|
procedure TBaseComponentPalette.AddComponent(NewComponent: TRegisteredComponent);
|
||||||
var
|
var
|
||||||
NewPriority: TComponentPriority;
|
NewPriority: TComponentPriority;
|
||||||
InsertIndex: Integer;
|
InsertIndex: Integer;
|
||||||
begin
|
begin
|
||||||
// Store components to FComps, sorting them by priority.
|
// Store components to fComps, sorting them by priority.
|
||||||
NewPriority:=NewComponent.GetPriority;
|
NewPriority:=NewComponent.GetPriority;
|
||||||
InsertIndex:=0;
|
InsertIndex:=0;
|
||||||
while (InsertIndex<FComps.Count)
|
while (InsertIndex<fComps.Count)
|
||||||
and (ComparePriority(NewPriority,Comps[InsertIndex].GetPriority)<=0) do
|
and (ComparePriority(NewPriority,Comps[InsertIndex].GetPriority)<=0) do
|
||||||
inc(InsertIndex);
|
inc(InsertIndex);
|
||||||
FComps.Insert(InsertIndex,NewComponent);
|
fComps.Insert(InsertIndex,NewComponent);
|
||||||
OnPageAddedComponent(NewComponent);
|
OnPageAddedComponent(NewComponent);
|
||||||
|
|
||||||
// Store a list of page names and their priorities.
|
// Store a list of page names and their priorities.
|
||||||
if (NewComponent.OrigPageName <> '')
|
if (NewComponent.OrigPageName <> '')
|
||||||
and (fOrigPagePriorities.IndexOf(NewComponent.OrigPageName) = -1) then begin
|
and (fOrigPagePriorities.IndexOf(NewComponent.OrigPageName) = -1) then
|
||||||
|
begin
|
||||||
InsertIndex:=0;
|
InsertIndex:=0;
|
||||||
while (InsertIndex<fOrigPagePriorities.Count)
|
while (InsertIndex<fOrigPagePriorities.Count)
|
||||||
and (ComparePriority(NewPriority, fOrigPagePriorities.Data[InsertIndex])<=0) do
|
and (ComparePriority(NewPriority, fOrigPagePriorities.Data[InsertIndex])<=0) do
|
||||||
@ -818,26 +816,9 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TBaseComponentPalette.CreateNewPage(const NewPageName: string;
|
|
||||||
const Priority: TComponentPriority): TBaseComponentPage;
|
|
||||||
var
|
|
||||||
InsertIndex: Integer;
|
|
||||||
begin
|
|
||||||
Result:=TBaseComponentPage.Create(NewPageName);
|
|
||||||
Result.Priority:=Priority;
|
|
||||||
InsertIndex:=0;
|
|
||||||
while (InsertIndex<PageCount)
|
|
||||||
and (ComparePriority(Priority,Pages[InsertIndex].Priority)<=0) do
|
|
||||||
inc(InsertIndex);
|
|
||||||
FPages.Insert(InsertIndex,Result);
|
|
||||||
Result.FPalette:=Self;
|
|
||||||
if CompareText(NewPageName,'Hidden')=0 then
|
|
||||||
Result.Visible:=false;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TBaseComponentPalette.RemoveComponent(AComponent: TRegisteredComponent);
|
procedure TBaseComponentPalette.RemoveComponent(AComponent: TRegisteredComponent);
|
||||||
begin
|
begin
|
||||||
FComps.Remove(AComponent);
|
fComps.Remove(AComponent);
|
||||||
AComponent.RealPage:=nil;
|
AComponent.RealPage:=nil;
|
||||||
//ToDo: fix OnPageRemovedComponent(AComponent.RealPage,AComponent);
|
//ToDo: fix OnPageRemovedComponent(AComponent.RealPage,AComponent);
|
||||||
end;
|
end;
|
||||||
@ -846,9 +827,10 @@ function TBaseComponentPalette.FindComponent(const CompClassName: string): TRegi
|
|||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
for i:=0 to PageCount-1 do begin
|
for i:=0 to Comps.Count-1 do begin
|
||||||
Result:=Pages[i].FindComponent(CompClassName);
|
Result:=Comps[i];
|
||||||
if Result<>nil then exit;
|
if CompareText(Result.ComponentClass.ClassName,CompClassName) = 0 then
|
||||||
|
exit;
|
||||||
end;
|
end;
|
||||||
Result:=nil;
|
Result:=nil;
|
||||||
end;
|
end;
|
||||||
@ -857,9 +839,9 @@ function TBaseComponentPalette.FindButton(Button: TComponent): TRegisteredCompon
|
|||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
for i:=0 to PageCount-1 do begin
|
for i:=0 to Comps.Count-1 do begin
|
||||||
Result:=Pages[i].FindButton(Button);
|
Result:=Comps[i];
|
||||||
if Result<>nil then exit;
|
if Result.Button=Button then exit;
|
||||||
end;
|
end;
|
||||||
Result:=nil;
|
Result:=nil;
|
||||||
end;
|
end;
|
||||||
@ -882,7 +864,7 @@ 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:=PageCount-1;
|
Result:=Pages.Count-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
|
||||||
@ -894,7 +876,7 @@ var
|
|||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
BeginUpdate(false);
|
BeginUpdate(false);
|
||||||
for i:=0 to PageCount-1 do
|
for i:=0 to Pages.Count-1 do
|
||||||
Pages[i].UpdateVisible;
|
Pages[i].UpdateVisible;
|
||||||
EndUpdate;
|
EndUpdate;
|
||||||
end;
|
end;
|
||||||
@ -903,7 +885,7 @@ procedure TBaseComponentPalette.IterateRegisteredClasses(Proc: TGetComponentClas
|
|||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
for i:=0 to CompCount-1 do
|
for i:=0 to Comps.Count-1 do
|
||||||
Proc(Comps[i].ComponentClass);
|
Proc(Comps[i].ComponentClass);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -191,11 +191,11 @@ var
|
|||||||
begin
|
begin
|
||||||
if Assigned(IDEComponentPalette) then
|
if Assigned(IDEComponentPalette) then
|
||||||
begin
|
begin
|
||||||
for i := 0 to IDEComponentPalette.PageCount-1 do
|
for i := 0 to IDEComponentPalette.Pages.Count-1 do
|
||||||
begin
|
begin
|
||||||
APage := IDEComponentPalette.Pages[i];
|
APage := IDEComponentPalette.Pages[i];
|
||||||
if APage.Visible then
|
if APage.Visible then
|
||||||
for j := 0 to IDEComponentPalette.CompCount-1 do
|
for j := 0 to IDEComponentPalette.Comps.Count-1 do
|
||||||
begin
|
begin
|
||||||
AComponent := IDEComponentPalette.Comps[j];
|
AComponent := IDEComponentPalette.Comps[j];
|
||||||
if (AComponent.RealPage = APage)
|
if (AComponent.RealPage = APage)
|
||||||
|
@ -25,10 +25,11 @@
|
|||||||
* *
|
* *
|
||||||
***************************************************************************
|
***************************************************************************
|
||||||
|
|
||||||
Author: Mattias Gaertner
|
Author: Mattias Gaertner, Juha Manninen
|
||||||
|
|
||||||
Abstract:
|
Abstract:
|
||||||
The implementation of the component palette.
|
The implementation of the component palette.
|
||||||
|
Supports reordering of pages and components by user settings in environment options.
|
||||||
}
|
}
|
||||||
unit ComponentPalette;
|
unit ComponentPalette;
|
||||||
|
|
||||||
@ -52,6 +53,24 @@ type
|
|||||||
csmMulty // don't reset selection on component add
|
csmMulty // don't reset selection on component add
|
||||||
);
|
);
|
||||||
|
|
||||||
|
{ TCompPaletteUserOrder }
|
||||||
|
|
||||||
|
// Like TCompPaletteOptions but collects all pages and components,
|
||||||
|
// including the original ones. The palette is later synchronized with this.
|
||||||
|
TCompPaletteUserOrder = class(TBaseCompPaletteOptions)
|
||||||
|
private
|
||||||
|
fPalette: TBaseComponentPalette;
|
||||||
|
// Reference to either EnvironmentOptions.ComponentPaletteOptions or a copy of it.
|
||||||
|
fOptions: TCompPaletteOptions;
|
||||||
|
public
|
||||||
|
constructor Create(aPalette: TBaseComponentPalette);
|
||||||
|
destructor Destroy; override;
|
||||||
|
procedure Clear;
|
||||||
|
function SortPagesAndCompsUserOrder: Boolean;
|
||||||
|
public
|
||||||
|
property Options: TCompPaletteOptions read fOptions write fOptions;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TComponentPalette }
|
{ TComponentPalette }
|
||||||
|
|
||||||
TComponentPalette = class(TBaseComponentPalette)
|
TComponentPalette = class(TBaseComponentPalette)
|
||||||
@ -67,7 +86,8 @@ type
|
|||||||
procedure PalettePopupMenuPopup(Sender: TObject);
|
procedure PalettePopupMenuPopup(Sender: TObject);
|
||||||
procedure PopupMenuPopup(Sender: TObject);
|
procedure PopupMenuPopup(Sender: TObject);
|
||||||
private
|
private
|
||||||
fComponents: TAVLTree; // tree of TRegisteredComponent sorted for componentclass
|
// Tree of TRegisteredComponent sorted for componentclass
|
||||||
|
fComponents: TAVLTree;
|
||||||
FPageControl: TPageControl;
|
FPageControl: TPageControl;
|
||||||
fNoteBookNeedsUpdate: boolean;
|
fNoteBookNeedsUpdate: boolean;
|
||||||
FOnOpenPackage: TNotifyEvent;
|
FOnOpenPackage: TNotifyEvent;
|
||||||
@ -78,6 +98,8 @@ type
|
|||||||
fUnregisteredIcon: TCustomBitmap;
|
fUnregisteredIcon: TCustomBitmap;
|
||||||
fSelectButtonIcon: TCustomBitmap;
|
fSelectButtonIcon: TCustomBitmap;
|
||||||
fUpdatingPageControl: boolean;
|
fUpdatingPageControl: boolean;
|
||||||
|
// User ordered + original pages and components.
|
||||||
|
fUserOrder: TCompPaletteUserOrder;
|
||||||
procedure SetPageControl(const AValue: TPageControl);
|
procedure SetPageControl(const AValue: TPageControl);
|
||||||
procedure SelectionToolClick(Sender: TObject);
|
procedure SelectionToolClick(Sender: TObject);
|
||||||
procedure ComponentBtnMouseDown(Sender: TObject; Button: TMouseButton;
|
procedure ComponentBtnMouseDown(Sender: TObject; Button: TMouseButton;
|
||||||
@ -89,7 +111,6 @@ type
|
|||||||
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
|
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
|
||||||
procedure CreatePopupMenu;
|
procedure CreatePopupMenu;
|
||||||
procedure UnselectAllButtons;
|
procedure UnselectAllButtons;
|
||||||
function SortPagesAndCompsUserOrder: Boolean;
|
|
||||||
protected
|
protected
|
||||||
procedure DoBeginUpdate; override;
|
procedure DoBeginUpdate; override;
|
||||||
procedure DoEndUpdate(Changed: boolean); override;
|
procedure DoEndUpdate(Changed: boolean); override;
|
||||||
@ -104,10 +125,14 @@ type
|
|||||||
public
|
public
|
||||||
constructor Create;
|
constructor Create;
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
|
procedure Clear;
|
||||||
|
procedure ClearButtons;
|
||||||
|
function CreateNewPage(const NewPageName: string;
|
||||||
|
const Priority: TComponentPriority): TBaseComponentPage;
|
||||||
|
function CreatePagesFromUserOrder: Boolean;
|
||||||
procedure DoAfterComponentAdded; override;
|
procedure DoAfterComponentAdded; override;
|
||||||
function GetUnregisteredIcon: TCustomBitmap;
|
function GetUnregisteredIcon: TCustomBitmap;
|
||||||
function GetSelectButtonIcon: TCustomBitmap;
|
function GetSelectButtonIcon: TCustomBitmap;
|
||||||
procedure ClearButtons; override;
|
|
||||||
function SelectButton(Button: TComponent): boolean;
|
function SelectButton(Button: TComponent): boolean;
|
||||||
procedure ReAlignButtons(Page: TCustomPage);
|
procedure ReAlignButtons(Page: TCustomPage);
|
||||||
procedure UpdateNoteBookButtons;
|
procedure UpdateNoteBookButtons;
|
||||||
@ -124,6 +149,8 @@ type
|
|||||||
property OnOpenPackage: TNotifyEvent read FOnOpenPackage write FOnOpenPackage;
|
property OnOpenPackage: TNotifyEvent read FOnOpenPackage write FOnOpenPackage;
|
||||||
property OnOpenUnit: TNotifyEvent read FOnOpenUnit write FOnOpenUnit;
|
property OnOpenUnit: TNotifyEvent read FOnOpenUnit write FOnOpenUnit;
|
||||||
property OnClassSelected: TNotifyEvent read FOnClassSelected write FOnClassSelected;
|
property OnClassSelected: TNotifyEvent read FOnClassSelected write FOnClassSelected;
|
||||||
|
// User ordered + original pages and components.
|
||||||
|
property UserOrder: TCompPaletteUserOrder read fUserOrder;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function CompareControlsWithTag(Control1, Control2: Pointer): integer;
|
function CompareControlsWithTag(Control1, Control2: Pointer): integer;
|
||||||
@ -172,6 +199,66 @@ begin
|
|||||||
Result:=0;
|
Result:=0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TCompPaletteUserOrder }
|
||||||
|
|
||||||
|
constructor TCompPaletteUserOrder.Create(aPalette: TBaseComponentPalette);
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
fPalette:=aPalette;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TCompPaletteUserOrder.Destroy;
|
||||||
|
begin
|
||||||
|
Clear;
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TCompPaletteUserOrder.Clear;
|
||||||
|
begin
|
||||||
|
inherited Clear;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TCompPaletteUserOrder.SortPagesAndCompsUserOrder: Boolean;
|
||||||
|
// Calculate page order using user config and default order. User config takes priority.
|
||||||
|
// This order will finally be shown in the palette.
|
||||||
|
var
|
||||||
|
Comp: TRegisteredComponent;
|
||||||
|
DstComps: TStringList;
|
||||||
|
i, j: Integer;
|
||||||
|
PgName: String;
|
||||||
|
begin
|
||||||
|
Result:=True;
|
||||||
|
Clear;
|
||||||
|
// First add user defined page order from EnvironmentOptions,
|
||||||
|
FComponentPages.Assign(fOptions.PageNames);
|
||||||
|
// then add other pages which don't have user configuration
|
||||||
|
for i := 0 to fPalette.OrigPagePriorities.Count-1 do
|
||||||
|
begin
|
||||||
|
PgName:=fPalette.OrigPagePriorities.Keys[i];
|
||||||
|
if (FComponentPages.IndexOf(PgName) = -1)
|
||||||
|
and (fOptions.HiddenPageNames.IndexOf(PgName) = -1) then
|
||||||
|
FComponentPages.Add(PgName);
|
||||||
|
end;
|
||||||
|
// Map components with their pages
|
||||||
|
for i := 0 to FComponentPages.Count-1 do
|
||||||
|
begin
|
||||||
|
PgName := FComponentPages[i];
|
||||||
|
DstComps := TStringList.Create;
|
||||||
|
FComponentPages.Objects[i] := DstComps;
|
||||||
|
j := fOptions.ComponentPages.IndexOf(PgName);
|
||||||
|
if j >= 0 then
|
||||||
|
// Add components that were reordered by user
|
||||||
|
DstComps.Assign(fOptions.ComponentPages.Objects[j] as TStringList)
|
||||||
|
else
|
||||||
|
// Add components that were not reordered.
|
||||||
|
for j := 0 to fPalette.Comps.Count-1 do begin
|
||||||
|
Comp := fPalette.Comps[j];
|
||||||
|
if SameText(Comp.OrigPageName, PgName) then
|
||||||
|
DstComps.Add(Comp.ComponentClass.ClassName);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TComponentPalette }
|
{ TComponentPalette }
|
||||||
|
|
||||||
procedure TComponentPalette.ActivePageChanged(Sender: TObject);
|
procedure TComponentPalette.ActivePageChanged(Sender: TObject);
|
||||||
@ -354,7 +441,7 @@ var
|
|||||||
CurPage: TBaseComponentPage;
|
CurPage: TBaseComponentPage;
|
||||||
SelectButtonOnPage: TSpeedButton;
|
SelectButtonOnPage: TSpeedButton;
|
||||||
begin
|
begin
|
||||||
for i:=0 to PageCount-1 do begin
|
for i:=0 to Pages.Count-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);
|
||||||
@ -486,7 +573,9 @@ end;
|
|||||||
constructor TComponentPalette.Create;
|
constructor TComponentPalette.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
FSelectionMode := csmSingle;
|
FSelectionMode:=csmSingle;
|
||||||
|
fUserOrder:=TCompPaletteUserOrder.Create(Self);
|
||||||
|
fUserOrder.Options:=EnvironmentOptions.ComponentPaletteOptions;
|
||||||
fComponents:=TAVLTree.Create(@CompareRegisteredComponents);
|
fComponents:=TAVLTree.Create(@CompareRegisteredComponents);
|
||||||
OnComponentIsInvisible:=@CheckComponentDesignerVisible;
|
OnComponentIsInvisible:=@CheckComponentDesignerVisible;
|
||||||
end;
|
end;
|
||||||
@ -497,6 +586,7 @@ begin
|
|||||||
OnComponentIsInvisible:=nil;
|
OnComponentIsInvisible:=nil;
|
||||||
PageControl:=nil;
|
PageControl:=nil;
|
||||||
FreeAndNil(fComponents);
|
FreeAndNil(fComponents);
|
||||||
|
FreeAndNil(fUserOrder);
|
||||||
FreeAndNil(fUnregisteredIcon);
|
FreeAndNil(fUnregisteredIcon);
|
||||||
FreeAndNil(fSelectButtonIcon);
|
FreeAndNil(fSelectButtonIcon);
|
||||||
FreeAndNil(PopupMenu);
|
FreeAndNil(PopupMenu);
|
||||||
@ -504,6 +594,70 @@ begin
|
|||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TComponentPalette.Clear;
|
||||||
|
begin
|
||||||
|
ClearButtons;
|
||||||
|
fUserOrder.Clear;
|
||||||
|
inherited Clear;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TComponentPalette.ClearButtons;
|
||||||
|
begin
|
||||||
|
if FPageControl<>nil then
|
||||||
|
FPageControl.DisableAlign;
|
||||||
|
Selected:=nil;
|
||||||
|
if PopupMenu<>nil then begin
|
||||||
|
PopupMenu.Free;
|
||||||
|
PopupMenu:=nil;
|
||||||
|
OpenPackageMenuItem:=nil;
|
||||||
|
end;
|
||||||
|
if FPageControl<>nil then
|
||||||
|
FPageControl.EnableAlign;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TComponentPalette.CreateNewPage(const NewPageName: string;
|
||||||
|
const Priority: TComponentPriority): TBaseComponentPage;
|
||||||
|
var
|
||||||
|
InsertIndex: Integer;
|
||||||
|
begin
|
||||||
|
Result:=TBaseComponentPage.Create(NewPageName);
|
||||||
|
Result.Priority:=Priority;
|
||||||
|
InsertIndex:=0;
|
||||||
|
while (InsertIndex<Pages.Count)
|
||||||
|
and (ComparePriority(Priority,Pages[InsertIndex].Priority)<=0) do
|
||||||
|
inc(InsertIndex);
|
||||||
|
fPages.Insert(InsertIndex,Result);
|
||||||
|
Result.Palette:=Self;
|
||||||
|
if CompareText(NewPageName,'Hidden')=0 then
|
||||||
|
Result.Visible:=false;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TComponentPalette.CreatePagesFromUserOrder: Boolean;
|
||||||
|
var
|
||||||
|
i, j: Integer;
|
||||||
|
PgName: String;
|
||||||
|
Pg: TBaseComponentPage;
|
||||||
|
CompNames: TStringList;
|
||||||
|
Comp: TRegisteredComponent;
|
||||||
|
begin
|
||||||
|
Result := True;
|
||||||
|
for i:=0 to fPages.Count-1 do
|
||||||
|
fPages[i].Free;
|
||||||
|
fPages.Clear;
|
||||||
|
for i := 0 to fUserOrder.ComponentPages.Count-1 do
|
||||||
|
begin
|
||||||
|
PgName := fUserOrder.ComponentPages[i];
|
||||||
|
Pg:=CreateNewPage(PgName, ComponentPriorityNormal);
|
||||||
|
CompNames := TStringList(fUserOrder.ComponentPages.Objects[i]);
|
||||||
|
for j := 0 to CompNames.Count-1 do
|
||||||
|
begin
|
||||||
|
Comp := FindComponent(CompNames[j]);
|
||||||
|
if Assigned(Comp) then
|
||||||
|
Comp.RealPage := Pg;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TComponentPalette.DoAfterComponentAdded;
|
procedure TComponentPalette.DoAfterComponentAdded;
|
||||||
begin
|
begin
|
||||||
inherited DoAfterComponentAdded;
|
inherited DoAfterComponentAdded;
|
||||||
@ -529,21 +683,6 @@ begin
|
|||||||
Result:=fSelectButtonIcon;
|
Result:=fSelectButtonIcon;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TComponentPalette.ClearButtons;
|
|
||||||
begin
|
|
||||||
if FPageControl<>nil then
|
|
||||||
FPageControl.DisableAlign;
|
|
||||||
Selected:=nil;
|
|
||||||
if PopupMenu<>nil then begin
|
|
||||||
PopupMenu.Free;
|
|
||||||
PopupMenu:=nil;
|
|
||||||
OpenPackageMenuItem:=nil;
|
|
||||||
end;
|
|
||||||
//inherited ClearButtons;
|
|
||||||
if FPageControl<>nil then
|
|
||||||
FPageControl.EnableAlign;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TComponentPalette.SelectButton(Button: TComponent): boolean;
|
function TComponentPalette.SelectButton(Button: TComponent): boolean;
|
||||||
var
|
var
|
||||||
NewComponent: TRegisteredComponent;
|
NewComponent: TRegisteredComponent;
|
||||||
@ -623,71 +762,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TComponentPalette.SortPagesAndCompsUserOrder: Boolean;
|
|
||||||
// Calculate page order by user config and default order. User config takes priority.
|
|
||||||
// This order will be shown in the palette.
|
|
||||||
var
|
|
||||||
Pg: TBaseComponentPage;
|
|
||||||
Comp: TRegisteredComponent;
|
|
||||||
SrcComps, DstComps: TStringList;
|
|
||||||
i, DefPgInd, OptPgInd, CompInd: Integer;
|
|
||||||
PgName, CompName: String;
|
|
||||||
begin
|
|
||||||
Result := True;
|
|
||||||
for i:=0 to PagesUserOrder.Count-1 do
|
|
||||||
PagesUserOrder.Objects[i].Free; // Free also the contained StringList.
|
|
||||||
PagesUserOrder.Clear;
|
|
||||||
with EnvironmentOptions do begin
|
|
||||||
// First add user defined page order from EnvironmentOptions,
|
|
||||||
PagesUserOrder.Assign(ComponentPaletteOptions.PageNames);
|
|
||||||
// then add other pages which don't have user configuration
|
|
||||||
for DefPgInd := 0 to OrigPagePriorities.Count-1 do
|
|
||||||
begin
|
|
||||||
PgName:=OrigPagePriorities.Keys[DefPgInd];
|
|
||||||
if (PagesUserOrder.IndexOf(PgName) = -1)
|
|
||||||
and (ComponentPaletteOptions.HiddenPageNames.IndexOf(PgName) = -1) then
|
|
||||||
PagesUserOrder.Add(PgName);
|
|
||||||
end;
|
|
||||||
// Add pages and components for them
|
|
||||||
for i := 0 to PagesUserOrder.Count-1 do
|
|
||||||
begin
|
|
||||||
PgName := PagesUserOrder[i];
|
|
||||||
DefPgInd := IndexOfPageWithName(PgName);
|
|
||||||
if DefPgInd >= 0 then
|
|
||||||
Pg:=Pages[DefPgInd]
|
|
||||||
else begin
|
|
||||||
Pg:=CreateNewPage(PgName, ComponentPriorityNormal);
|
|
||||||
end;
|
|
||||||
DstComps := TStringList.Create;
|
|
||||||
PagesUserOrder.Objects[i] := DstComps;
|
|
||||||
OptPgInd := ComponentPaletteOptions.ComponentPages.IndexOf(PgName);
|
|
||||||
if OptPgInd >= 0 then
|
|
||||||
begin
|
|
||||||
// Add components that were reordered by user
|
|
||||||
SrcComps := ComponentPaletteOptions.ComponentPages.Objects[OptPgInd] as TStringList;
|
|
||||||
DstComps.Assign(SrcComps);
|
|
||||||
for CompInd := 0 to DstComps.Count-1 do
|
|
||||||
begin
|
|
||||||
CompName := DstComps[CompInd];
|
|
||||||
Comp := FindComponent(CompName);
|
|
||||||
Comp.RealPage := Pg;
|
|
||||||
end;
|
|
||||||
end
|
|
||||||
// Add components that were not reordered.
|
|
||||||
else begin
|
|
||||||
OptPgInd := CompCount;
|
|
||||||
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;
|
|
||||||
|
|
||||||
procedure TComponentPalette.UpdateNoteBookButtons;
|
procedure TComponentPalette.UpdateNoteBookButtons;
|
||||||
var
|
var
|
||||||
OldActivePage: TTabSheet;
|
OldActivePage: TTabSheet;
|
||||||
@ -884,22 +958,24 @@ begin
|
|||||||
FPageControl.DisableAlign;
|
FPageControl.DisableAlign;
|
||||||
try
|
try
|
||||||
OldActivePage:=FPageControl.ActivePage;
|
OldActivePage:=FPageControl.ActivePage;
|
||||||
SortPagesAndCompsUserOrder; // Updates PagesUserOrder
|
fUserOrder.SortPagesAndCompsUserOrder;
|
||||||
|
CreatePagesFromUserOrder;
|
||||||
// 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
|
||||||
RemoveUnneededPage(FPageControl.Pages[i]);
|
RemoveUnneededPage(FPageControl.Pages[i]);
|
||||||
// insert a PageControl page for every visible palette page
|
// insert a PageControl page for every visible palette page
|
||||||
VisPageIndex := 0;
|
VisPageIndex := 0;
|
||||||
for i := 0 to PagesUserOrder.Count-1 do
|
for i := 0 to fUserOrder.ComponentPages.Count-1 do
|
||||||
begin
|
begin
|
||||||
PgName := PagesUserOrder[i];
|
PgName := fUserOrder.ComponentPages[i];
|
||||||
PgInd := IndexOfPageName(PgName);
|
PgInd := IndexOfPageName(PgName);
|
||||||
if PgInd >= 0 then
|
if PgInd >= 0 then
|
||||||
begin
|
begin
|
||||||
InsertVisiblePage(Pages[PgInd], VisPageIndex);
|
InsertVisiblePage(Pages[PgInd], VisPageIndex);
|
||||||
CreateButtons(PgInd, PagesUserOrder.Objects[i] as TStringList);
|
CreateButtons(PgInd, fUserOrder.ComponentPages.Objects[i] as TStringList);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// restore active page
|
// restore active page
|
||||||
if (OldActivePage<>nil) and (FPageControl.IndexOf(OldActivePage) >= 0) then
|
if (OldActivePage<>nil) and (FPageControl.IndexOf(OldActivePage) >= 0) then
|
||||||
FPageControl.ActivePage:=OldActivePage
|
FPageControl.ActivePage:=OldActivePage
|
||||||
|
@ -28,7 +28,7 @@ uses
|
|||||||
Classes, SysUtils,
|
Classes, SysUtils,
|
||||||
Graphics, Forms, Controls, StdCtrls, Dialogs, Buttons, ComCtrls, ExtCtrls,
|
Graphics, Forms, Controls, StdCtrls, Dialogs, Buttons, ComCtrls, ExtCtrls,
|
||||||
FileUtil, LCLProc, LCLType, IDEProcs, EnvironmentOpts, LazarusIDEStrConsts,
|
FileUtil, LCLProc, LCLType, IDEProcs, EnvironmentOpts, LazarusIDEStrConsts,
|
||||||
IDEOptionsIntf, IDEImagesIntf, ComponentReg, PackageDefs;
|
IDEOptionsIntf, IDEImagesIntf, ComponentReg, ComponentPalette, PackageDefs;
|
||||||
|
|
||||||
type
|
type
|
||||||
{ TCompPaletteOptionsFrame }
|
{ TCompPaletteOptionsFrame }
|
||||||
@ -69,6 +69,8 @@ type
|
|||||||
procedure PagesListBoxSelectionChange(Sender: TObject; User: boolean);
|
procedure PagesListBoxSelectionChange(Sender: TObject; User: boolean);
|
||||||
procedure RestoreButtonClick(Sender: TObject);
|
procedure RestoreButtonClick(Sender: TObject);
|
||||||
private
|
private
|
||||||
|
fLocalOptions: TCompPaletteOptions;
|
||||||
|
fLocalUserOrder: TCompPaletteUserOrder;
|
||||||
procedure WritePages(cpo: TCompPaletteOptions);
|
procedure WritePages(cpo: TCompPaletteOptions);
|
||||||
procedure WriteComponents(cpo: TCompPaletteOptions);
|
procedure WriteComponents(cpo: TCompPaletteOptions);
|
||||||
procedure FillPages;
|
procedure FillPages;
|
||||||
@ -101,12 +103,16 @@ end;
|
|||||||
constructor TCompPaletteOptionsFrame.Create(AOwner: TComponent);
|
constructor TCompPaletteOptionsFrame.Create(AOwner: TComponent);
|
||||||
begin
|
begin
|
||||||
inherited Create(AOwner);
|
inherited Create(AOwner);
|
||||||
|
fLocalOptions:=TCompPaletteOptions.Create;
|
||||||
|
fLocalUserOrder:=TCompPaletteUserOrder.Create(IDEComponentPalette);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
destructor TCompPaletteOptionsFrame.Destroy;
|
destructor TCompPaletteOptionsFrame.Destroy;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
begin
|
begin
|
||||||
|
fLocalUserOrder.Free;
|
||||||
|
fLocalOptions.Free;
|
||||||
for i := 0 to PagesListBox.Count-1 do
|
for i := 0 to PagesListBox.Count-1 do
|
||||||
PagesListBox.Items.Objects[i].Free; // Free the contained StringList.
|
PagesListBox.Items.Objects[i].Free; // Free the contained StringList.
|
||||||
inherited Destroy;
|
inherited Destroy;
|
||||||
@ -119,9 +125,9 @@ begin
|
|||||||
RestoreButton.Caption := lisCmpRestoreDefaults;
|
RestoreButton.Caption := lisCmpRestoreDefaults;
|
||||||
|
|
||||||
ComponentsGroupBox.Caption := lisCmpLstComponents;
|
ComponentsGroupBox.Caption := lisCmpLstComponents;
|
||||||
ComponentsListView.Column[1].Caption := lisName;
|
ComponentsListView.Column[1].Caption := lisName;
|
||||||
ComponentsListView.Column[2].Caption := lisPage;
|
ComponentsListView.Column[2].Caption := lisPage;
|
||||||
ComponentsListView.Column[3].Caption := lisPackage;
|
ComponentsListView.Column[3].Caption := lisPackage;
|
||||||
ComponentsListView.SmallImages := IDEImages.Images_24;
|
ComponentsListView.SmallImages := IDEImages.Images_24;
|
||||||
// Arrow buttons for pages
|
// Arrow buttons for pages
|
||||||
PageMoveUpBtn.LoadGlyphFromResourceName(HInstance, 'arrow_up');
|
PageMoveUpBtn.LoadGlyphFromResourceName(HInstance, 'arrow_up');
|
||||||
@ -141,7 +147,9 @@ end;
|
|||||||
|
|
||||||
procedure TCompPaletteOptionsFrame.ReadSettings(AOptions: TAbstractIDEOptions);
|
procedure TCompPaletteOptionsFrame.ReadSettings(AOptions: TAbstractIDEOptions);
|
||||||
begin
|
begin
|
||||||
// AOptions is not needed because data is already loaded to IDEComponentPalette.
|
fLocalOptions.Assign((AOptions as TEnvironmentOptions).ComponentPaletteOptions);
|
||||||
|
fLocalUserOrder.Options:=fLocalOptions;
|
||||||
|
fLocalUserOrder.SortPagesAndCompsUserOrder;
|
||||||
FillPages;
|
FillPages;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -210,7 +218,7 @@ 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 IDEComponentPalette.CompCount-1 do
|
for CompCnt := 0 to IDEComponentPalette.Comps.Count-1 do
|
||||||
begin
|
begin
|
||||||
Comp := IDEComponentPalette.Comps[CompCnt];
|
Comp := IDEComponentPalette.Comps[CompCnt];
|
||||||
if Comp.OrigPageName = PgName then
|
if Comp.OrigPageName = PgName then
|
||||||
@ -219,7 +227,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
// Differs from original order -> add configuration for components
|
// Differs from original order -> add configuration for components
|
||||||
if not OrigComps.Equals(UserComps) then
|
if not OrigComps.Equals(UserComps) then
|
||||||
cpo.AssignComponentPages(PgName, UserComps);
|
cpo.AssignComponentPage(PgName, UserComps);
|
||||||
end;
|
end;
|
||||||
finally
|
finally
|
||||||
OrigComps.Free;
|
OrigComps.Free;
|
||||||
@ -227,9 +235,8 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TCompPaletteOptionsFrame.FillPages;
|
procedure TCompPaletteOptionsFrame.FillPages;
|
||||||
//Collect all available components (excluding hidden)
|
// Collect all available components (excluding hidden)
|
||||||
var
|
var
|
||||||
Pg: TBaseComponentPage;
|
|
||||||
CompList: TStringList;
|
CompList: TStringList;
|
||||||
i: Integer;
|
i: Integer;
|
||||||
PgName: String;
|
PgName: String;
|
||||||
@ -238,17 +245,13 @@ begin
|
|||||||
begin
|
begin
|
||||||
PagesListBox.Clear;
|
PagesListBox.Clear;
|
||||||
PagesListBox.Items.Add(lis_All_);
|
PagesListBox.Items.Add(lis_All_);
|
||||||
for i := 0 to IDEComponentPalette.PagesUserOrder.Count-1 do
|
for i := 0 to fLocalUserOrder.ComponentPages.Count-1 do
|
||||||
begin
|
begin
|
||||||
PgName := IDEComponentPalette.PagesUserOrder[i];
|
PgName := fLocalUserOrder.ComponentPages[i];
|
||||||
Pg := IDEComponentPalette.GetPage(PgName, True);
|
Assert(PgName<>'', 'TCompPaletteOptionsFrame.FillPages: PageName is empty.');
|
||||||
Assert(Assigned(Pg), 'TCompPaletteOptionsFrame.FillPages: PageName "'+PgName+'" not found.');
|
CompList := TStringList.Create; // StringList will hold components for this page.
|
||||||
if (Pg<>nil) and Pg.Visible then
|
InitialComps(PgName, CompList);
|
||||||
begin // StringList will hold components for this page.
|
PagesListBox.AddItem(PgName, CompList);
|
||||||
CompList := TStringList.Create;
|
|
||||||
InitialComps(Pg.PageName, CompList);
|
|
||||||
PagesListBox.AddItem(Pg.PageName, CompList);
|
|
||||||
end;
|
|
||||||
end;
|
end;
|
||||||
PagesListBox.ItemIndex := 0; // Activate first item
|
PagesListBox.ItemIndex := 0; // Activate first item
|
||||||
end;
|
end;
|
||||||
@ -261,11 +264,11 @@ var
|
|||||||
i, PgInd: Integer;
|
i, PgInd: Integer;
|
||||||
CompName: String;
|
CompName: String;
|
||||||
begin
|
begin
|
||||||
PgInd := IDEComponentPalette.PagesUserOrder.IndexOf(aPageName);
|
PgInd := fLocalUserOrder.ComponentPages.IndexOf(aPageName);
|
||||||
Assert(PgInd > -1, 'TCompPaletteOptionsFrame.InitialComps: PageName "'+aPageName+'" not found');
|
Assert(PgInd > -1, 'TCompPaletteOptionsFrame.InitialComps: PageName "'+aPageName+'" not found');
|
||||||
if PgInd>=0 then
|
if PgInd>=0 then
|
||||||
begin
|
begin
|
||||||
OrderedComps := IDEComponentPalette.PagesUserOrder.Objects[PgInd] as TStringList;
|
OrderedComps := fLocalUserOrder.ComponentPages.Objects[PgInd] as TStringList;
|
||||||
for i := 0 to OrderedComps.Count-1 do
|
for i := 0 to OrderedComps.Count-1 do
|
||||||
begin
|
begin
|
||||||
CompName := OrderedComps[i];
|
CompName := OrderedComps[i];
|
||||||
@ -333,7 +336,9 @@ end;
|
|||||||
|
|
||||||
procedure TCompPaletteOptionsFrame.RestoreButtonClick(Sender: TObject);
|
procedure TCompPaletteOptionsFrame.RestoreButtonClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
; // ToDo
|
fLocalOptions.Clear;
|
||||||
|
fLocalUserOrder.SortPagesAndCompsUserOrder; // Only updates data structure.
|
||||||
|
FillPages;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// Drag-drop PagesListBox
|
// Drag-drop PagesListBox
|
||||||
|
@ -1343,8 +1343,8 @@ 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.PageCount-1 do begin
|
for i:=0 to IDEComponentPalette.Pages.Count-1 do begin
|
||||||
APageName:=IDEComponentPalette[i].PageName;
|
APageName:=IDEComponentPalette.Pages[i].PageName;
|
||||||
if APageName<>'' then
|
if APageName<>'' then
|
||||||
sl.Add(APageName);
|
sl.Add(APageName);
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user