mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-14 07:19:18 +02:00
IdeIntf: Move non-GUI related code from ComponentPalette to ComponentReg.
git-svn-id: trunk@48308 -
This commit is contained in:
parent
2f283d0521
commit
c0b38940f9
@ -24,8 +24,8 @@ unit ComponentReg;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, typinfo, Controls,
|
Classes, SysUtils, typinfo, AVL_Tree, fgl,
|
||||||
Laz2_XMLCfg, LCLProc, fgl;
|
Controls, Laz2_XMLCfg, LCLProc;
|
||||||
|
|
||||||
type
|
type
|
||||||
TComponentPriorityCategory = (
|
TComponentPriorityCategory = (
|
||||||
@ -92,6 +92,24 @@ type
|
|||||||
property HiddenPageNames: TStringList read FHiddenPageNames;
|
property HiddenPageNames: TStringList read FHiddenPageNames;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ 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;
|
||||||
|
|
||||||
{ TRegisteredComponent }
|
{ TRegisteredComponent }
|
||||||
|
|
||||||
TRegisteredComponent = class
|
TRegisteredComponent = class
|
||||||
@ -122,7 +140,6 @@ type
|
|||||||
property Visible: boolean read FVisible write SetVisible;
|
property Visible: boolean read FVisible write SetVisible;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TRegisteredComponentClass = class of TRegisteredComponent;
|
|
||||||
TRegisteredComponentList = specialize TFPGList<TRegisteredComponent>;
|
TRegisteredComponentList = specialize TFPGList<TRegisteredComponent>;
|
||||||
|
|
||||||
|
|
||||||
@ -145,7 +162,7 @@ type
|
|||||||
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 }
|
||||||
|
|
||||||
@ -167,8 +184,7 @@ type
|
|||||||
TBaseComponentPalette = class
|
TBaseComponentPalette = class
|
||||||
private
|
private
|
||||||
FHandlers: array[TComponentPaletteHandlerType] of TMethodList;
|
FHandlers: array[TComponentPaletteHandlerType] of TMethodList;
|
||||||
FBaseComponentPageClass: TBaseComponentPageClass;
|
//FBaseComponentPageClass: TBaseComponentPageClass;
|
||||||
FRegisteredComponentClass: TRegisteredComponentClass;
|
|
||||||
FOnBeginUpdate: TNotifyEvent;
|
FOnBeginUpdate: TNotifyEvent;
|
||||||
FOnEndUpdate: TEndUpdatePaletteEvent;
|
FOnEndUpdate: TEndUpdatePaletteEvent;
|
||||||
FHideControls: boolean;
|
FHideControls: boolean;
|
||||||
@ -188,6 +204,16 @@ type
|
|||||||
fComps: TRegisteredComponentList;
|
fComps: TRegisteredComponentList;
|
||||||
// New pages added and their priorities, ordered by priority.
|
// New pages added and their priorities, ordered by priority.
|
||||||
fOrigPagePriorities: TPagePriorityList;
|
fOrigPagePriorities: TPagePriorityList;
|
||||||
|
// User ordered + original pages and components
|
||||||
|
fUserOrder: TCompPaletteUserOrder;
|
||||||
|
// Component cache, a tree of TRegisteredComponent sorted for componentclass
|
||||||
|
fComponentCache: TAVLTree;
|
||||||
|
// Two page caches, one for original pages, one for user ordered pages.
|
||||||
|
// Lists have page names. Object holds another StringList for component names.
|
||||||
|
fOrigComponentPageCache: TStringList; // Original
|
||||||
|
fUserComponentPageCache: TStringList; // User ordered
|
||||||
|
procedure CacheOrigComponentPages;
|
||||||
|
|
||||||
procedure DoChange; virtual;
|
procedure DoChange; virtual;
|
||||||
procedure DoBeginUpdate; virtual;
|
procedure DoBeginUpdate; virtual;
|
||||||
procedure DoEndUpdate(Changed: boolean); virtual;
|
procedure DoEndUpdate(Changed: boolean); virtual;
|
||||||
@ -198,18 +224,15 @@ type
|
|||||||
procedure OnPageVisibleChanged({%H-}APage: TBaseComponentPage); virtual;
|
procedure OnPageVisibleChanged({%H-}APage: TBaseComponentPage); virtual;
|
||||||
function VoteCompVisibility(AComponent: TRegisteredComponent): Boolean; virtual;
|
function VoteCompVisibility(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 SetSelected(const AValue: TRegisteredComponent); virtual; abstract;
|
procedure SetSelected(const AValue: TRegisteredComponent); virtual; abstract;
|
||||||
public
|
public
|
||||||
constructor Create;
|
constructor Create(EnvPaletteOptions: TCompPaletteOptions);
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
procedure Clear;
|
procedure Clear;
|
||||||
function AssignOrigCompsForPage(PageName: string;
|
function AssignOrigCompsForPage(PageName: string; DestComps: TStringList): Boolean;
|
||||||
DestComps: TStringList): Boolean; virtual; abstract;
|
function AssignOrigVisibleCompsForPage(PageName: string; DestComps: TStringList): Boolean;
|
||||||
function AssignOrigVisibleCompsForPage(PageName: string;
|
function RefUserCompsForPage(PageName: string): TStringList;
|
||||||
DestComps: TStringList): Boolean; virtual; abstract;
|
|
||||||
function RefUserCompsForPage(PageName: string): TStringList; virtual; abstract;
|
|
||||||
procedure BeginUpdate(Change: boolean);
|
procedure BeginUpdate(Change: boolean);
|
||||||
procedure EndUpdate;
|
procedure EndUpdate;
|
||||||
function IsUpdateLocked: boolean;
|
function IsUpdateLocked: boolean;
|
||||||
@ -220,7 +243,7 @@ type
|
|||||||
function GetPage(const APageName: string; aCaseSens: Boolean = False): TBaseComponentPage;
|
function GetPage(const APageName: string; aCaseSens: Boolean = False): TBaseComponentPage;
|
||||||
procedure AddComponent(NewComponent: TRegisteredComponent);
|
procedure AddComponent(NewComponent: TRegisteredComponent);
|
||||||
procedure RemoveComponent(AComponent: TRegisteredComponent);
|
procedure RemoveComponent(AComponent: TRegisteredComponent);
|
||||||
function FindComponent(const CompClassName: string): TRegisteredComponent; virtual;
|
function FindComponent(const CompClassName: string): TRegisteredComponent;
|
||||||
function CreateNewClassName(const Prefix: string): string;
|
function CreateNewClassName(const Prefix: string): string;
|
||||||
procedure Update(ForceUpdateAll: Boolean); virtual; abstract;
|
procedure Update(ForceUpdateAll: Boolean); virtual; abstract;
|
||||||
procedure IterateRegisteredClasses(Proc: TGetComponentClassEvent);
|
procedure IterateRegisteredClasses(Proc: TGetComponentClassEvent);
|
||||||
@ -242,15 +265,15 @@ type
|
|||||||
property Pages: TBaseComponentPageList read fPages;
|
property Pages: TBaseComponentPageList read fPages;
|
||||||
property Comps: TRegisteredComponentList read fComps;
|
property Comps: TRegisteredComponentList read fComps;
|
||||||
property OrigPagePriorities: TPagePriorityList read fOrigPagePriorities;
|
property OrigPagePriorities: TPagePriorityList read fOrigPagePriorities;
|
||||||
property BaseComponentPageClass: TBaseComponentPageClass read FBaseComponentPageClass;
|
//property BaseComponentPageClass: TBaseComponentPageClass read FBaseComponentPageClass;
|
||||||
property RegisteredComponentClass: TRegisteredComponentClass
|
|
||||||
read FRegisteredComponentClass;
|
|
||||||
property UpdateLock: integer read FUpdateLock;
|
property UpdateLock: integer read FUpdateLock;
|
||||||
property ChangeStamp: integer read fChangeStamp;
|
property ChangeStamp: integer read fChangeStamp;
|
||||||
property OnBeginUpdate: TNotifyEvent read FOnBeginUpdate write FOnBeginUpdate;
|
property OnBeginUpdate: TNotifyEvent read FOnBeginUpdate write FOnBeginUpdate;
|
||||||
property OnEndUpdate: TEndUpdatePaletteEvent read FOnEndUpdate write FOnEndUpdate;
|
property OnEndUpdate: TEndUpdatePaletteEvent read FOnEndUpdate write FOnEndUpdate;
|
||||||
property HideControls: boolean read FHideControls write FHideControls;
|
property HideControls: boolean read FHideControls write FHideControls;
|
||||||
property Selected: TRegisteredComponent read GetSelected write SetSelected;
|
property Selected: TRegisteredComponent read GetSelected write SetSelected;
|
||||||
|
// User ordered + original pages and components.
|
||||||
|
property UserOrder: TCompPaletteUserOrder read fUserOrder;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -289,7 +312,7 @@ begin
|
|||||||
Result:=p1.Level-p2.Level;
|
Result:=p1.Level-p2.Level;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function CompareIDEComponentByClassName(Data1, Data2: pointer): integer;
|
function CompareIDEComponentByClassName(Data1, Data2: Pointer): integer;
|
||||||
var
|
var
|
||||||
Comp1: TRegisteredComponent;
|
Comp1: TRegisteredComponent;
|
||||||
Comp2: TRegisteredComponent;
|
Comp2: TRegisteredComponent;
|
||||||
@ -300,6 +323,16 @@ begin
|
|||||||
Comp2.ComponentClass.Classname);
|
Comp2.ComponentClass.Classname);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function CompareClassNameWithRegisteredComponent(Key, Data: Pointer): integer;
|
||||||
|
var
|
||||||
|
AClassName: String;
|
||||||
|
RegComp: TRegisteredComponent;
|
||||||
|
begin
|
||||||
|
AClassName:=String(Key);
|
||||||
|
RegComp:=TRegisteredComponent(Data);
|
||||||
|
Result:=CompareText(AClassName,RegComp.ComponentClass.ClassName);
|
||||||
|
end;
|
||||||
|
|
||||||
function dbgs(const c: TComponentPriorityCategory): string;
|
function dbgs(const c: TComponentPriorityCategory): string;
|
||||||
begin
|
begin
|
||||||
Result:=GetEnumName(TypeInfo(TComponentPriorityCategory),ord(c));
|
Result:=GetEnumName(TypeInfo(TComponentPriorityCategory),ord(c));
|
||||||
@ -477,6 +510,61 @@ begin
|
|||||||
Result:=true;
|
Result:=true;
|
||||||
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
|
||||||
|
DstComps: TStringList;
|
||||||
|
PageI, i: Integer;
|
||||||
|
PgName: String;
|
||||||
|
begin
|
||||||
|
Result:=True;
|
||||||
|
Clear;
|
||||||
|
fPalette.CacheOrigComponentPages;
|
||||||
|
// First add user defined page order from EnvironmentOptions,
|
||||||
|
FComponentPages.Assign(fOptions.PageNames);
|
||||||
|
// then add other pages which don't have user configuration
|
||||||
|
for PageI := 0 to fPalette.OrigPagePriorities.Count-1 do
|
||||||
|
begin
|
||||||
|
PgName:=fPalette.OrigPagePriorities.Keys[PageI];
|
||||||
|
if (FComponentPages.IndexOf(PgName) = -1)
|
||||||
|
and (fOptions.HiddenPageNames.IndexOf(PgName) = -1) then
|
||||||
|
FComponentPages.Add(PgName);
|
||||||
|
end;
|
||||||
|
// Map components with their pages
|
||||||
|
for PageI := 0 to FComponentPages.Count-1 do
|
||||||
|
begin
|
||||||
|
PgName := FComponentPages[PageI];
|
||||||
|
DstComps := TStringList.Create;
|
||||||
|
DstComps.CaseSensitive := True;
|
||||||
|
FComponentPages.Objects[PageI] := DstComps;
|
||||||
|
i := fOptions.ComponentPages.IndexOf(PgName);
|
||||||
|
if i >= 0 then // Add components reordered by user.
|
||||||
|
DstComps.Assign(fOptions.ComponentPages.Objects[i] as TStringList)
|
||||||
|
else // Add components that were not reordered.
|
||||||
|
fPalette.AssignOrigCompsForPage(PgName, DstComps);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TRegisteredComponent }
|
{ TRegisteredComponent }
|
||||||
|
|
||||||
procedure TRegisteredComponent.SetVisible(const AValue: boolean);
|
procedure TRegisteredComponent.SetVisible(const AValue: boolean);
|
||||||
@ -566,11 +654,22 @@ end;
|
|||||||
|
|
||||||
{ TBaseComponentPalette }
|
{ TBaseComponentPalette }
|
||||||
|
|
||||||
constructor TBaseComponentPalette.Create;
|
constructor TBaseComponentPalette.Create(EnvPaletteOptions: TCompPaletteOptions);
|
||||||
begin
|
begin
|
||||||
fPages:=TBaseComponentPageList.Create;
|
fPages:=TBaseComponentPageList.Create;
|
||||||
fComps:=TRegisteredComponentList.Create;
|
fComps:=TRegisteredComponentList.Create;
|
||||||
fOrigPagePriorities:=TPagePriorityList.Create;
|
fOrigPagePriorities:=TPagePriorityList.Create;
|
||||||
|
fUserOrder:=TCompPaletteUserOrder.Create(Self);
|
||||||
|
fUserOrder.Options:=EnvPaletteOptions; // EnvironmentOptions.ComponentPaletteOptions;
|
||||||
|
fComponentCache:=TAVLTree.Create(@CompareIDEComponentByClassName);
|
||||||
|
fOrigComponentPageCache:=TStringList.Create;
|
||||||
|
fOrigComponentPageCache.OwnsObjects:=True;
|
||||||
|
fOrigComponentPageCache.CaseSensitive:=True;
|
||||||
|
fOrigComponentPageCache.Sorted:=True;
|
||||||
|
fUserComponentPageCache:=TStringList.Create;
|
||||||
|
fUserComponentPageCache.OwnsObjects:=True;
|
||||||
|
fUserComponentPageCache.CaseSensitive:=True;
|
||||||
|
fUserComponentPageCache.Sorted:=True;
|
||||||
fOrigPageHelper:=TStringList.Create; // Note: CaseSensitive = False
|
fOrigPageHelper:=TStringList.Create; // Note: CaseSensitive = False
|
||||||
fOrigPageHelper.Sorted:=True;
|
fOrigPageHelper.Sorted:=True;
|
||||||
end;
|
end;
|
||||||
@ -581,6 +680,10 @@ var
|
|||||||
begin
|
begin
|
||||||
Clear;
|
Clear;
|
||||||
FreeAndNil(fOrigPageHelper);
|
FreeAndNil(fOrigPageHelper);
|
||||||
|
FreeAndNil(fUserComponentPageCache);
|
||||||
|
FreeAndNil(fOrigComponentPageCache);
|
||||||
|
FreeAndNil(fComponentCache);
|
||||||
|
FreeAndNil(fUserOrder);
|
||||||
FreeAndNil(fOrigPagePriorities);
|
FreeAndNil(fOrigPagePriorities);
|
||||||
FreeAndNil(fComps);
|
FreeAndNil(fComps);
|
||||||
FreeAndNil(fPages);
|
FreeAndNil(fPages);
|
||||||
@ -603,6 +706,75 @@ begin
|
|||||||
fOrigPageHelper.Clear;
|
fOrigPageHelper.Clear;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TBaseComponentPalette.CacheOrigComponentPages;
|
||||||
|
var
|
||||||
|
sl: TStringList;
|
||||||
|
PageI, CompI: Integer;
|
||||||
|
PgName: string;
|
||||||
|
Comp: TRegisteredComponent;
|
||||||
|
begin
|
||||||
|
if fOrigComponentPageCache.Count > 0 then Exit; // Fill cache only once.
|
||||||
|
for PageI := 0 to fOrigPagePriorities.Count-1 do
|
||||||
|
begin
|
||||||
|
PgName:=fOrigPagePriorities.Keys[PageI];
|
||||||
|
Assert((PgName <> '') and not fOrigComponentPageCache.Find(PgName, CompI),
|
||||||
|
Format('CacheComponentPages: %s already cached.', [PgName]));
|
||||||
|
// Add a cache StringList for this page name.
|
||||||
|
sl := TStringList.Create;
|
||||||
|
sl.CaseSensitive := True;
|
||||||
|
fOrigComponentPageCache.AddObject(PgName, sl);
|
||||||
|
// Find all components for this page and add them to cache.
|
||||||
|
for CompI := 0 to fComps.Count-1 do begin
|
||||||
|
Comp := fComps[CompI];
|
||||||
|
if Comp.OrigPageName = PgName then //if SameText(Comp.OrigPageName, PgName) then
|
||||||
|
sl.AddObject(Comp.ComponentClass.ClassName, Comp);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TBaseComponentPalette.AssignOrigCompsForPage(PageName: string;
|
||||||
|
DestComps: TStringList): Boolean;
|
||||||
|
// Returns True if the page was found.
|
||||||
|
var
|
||||||
|
sl: TStringList;
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
Result := fOrigComponentPageCache.Find(PageName, i);
|
||||||
|
if Result then begin
|
||||||
|
sl := fOrigComponentPageCache.Objects[i] as TStringList;
|
||||||
|
DestComps.Assign(sl);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
DestComps.Clear;
|
||||||
|
//raise Exception.Create(Format('AssignOrigCompsForPage: %s not found in cache.', [PageName]));
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TBaseComponentPalette.AssignOrigVisibleCompsForPage(PageName: string;
|
||||||
|
DestComps: TStringList): Boolean;
|
||||||
|
// Returns True if the page was found.
|
||||||
|
var
|
||||||
|
sl: TStringList;
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
DestComps.Clear;
|
||||||
|
Result := fOrigComponentPageCache.Find(PageName, i);
|
||||||
|
if not Result then Exit;
|
||||||
|
sl := fOrigComponentPageCache.Objects[i] as TStringList;
|
||||||
|
for i := 0 to sl.Count-1 do
|
||||||
|
if FindComponent(sl[i]).Visible then
|
||||||
|
DestComps.Add(sl[i]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TBaseComponentPalette.RefUserCompsForPage(PageName: string): TStringList;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
if fUserComponentPageCache.Find(PageName, i) then
|
||||||
|
Result := fUserComponentPageCache.Objects[i] as TStringList
|
||||||
|
else
|
||||||
|
Result := Nil;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TBaseComponentPalette.AddHandler(HandlerType: TComponentPaletteHandlerType;
|
procedure TBaseComponentPalette.AddHandler(HandlerType: TComponentPaletteHandlerType;
|
||||||
const AMethod: TMethod; AsLast: boolean);
|
const AMethod: TMethod; AsLast: boolean);
|
||||||
begin
|
begin
|
||||||
@ -675,18 +847,6 @@ begin
|
|||||||
AComponent.Visible:=Result;
|
AComponent.Visible:=Result;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TBaseComponentPalette.SetBaseComponentPageClass(
|
|
||||||
const AValue: TBaseComponentPageClass);
|
|
||||||
begin
|
|
||||||
FBaseComponentPageClass:=AValue;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TBaseComponentPalette.SetRegisteredComponentClass(
|
|
||||||
const AValue: TRegisteredComponentClass);
|
|
||||||
begin
|
|
||||||
FRegisteredComponentClass:=AValue;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TBaseComponentPalette.BeginUpdate(Change: boolean);
|
procedure TBaseComponentPalette.BeginUpdate(Change: boolean);
|
||||||
begin
|
begin
|
||||||
inc(FUpdateLock);
|
inc(FUpdateLock);
|
||||||
@ -797,14 +957,14 @@ end;
|
|||||||
|
|
||||||
function TBaseComponentPalette.FindComponent(const CompClassName: string): TRegisteredComponent;
|
function TBaseComponentPalette.FindComponent(const CompClassName: string): TRegisteredComponent;
|
||||||
var
|
var
|
||||||
i: Integer;
|
ANode: TAVLTreeNode;
|
||||||
begin
|
begin
|
||||||
for i:=0 to Comps.Count-1 do begin
|
ANode:=fComponentCache.FindKey(Pointer(CompClassName),
|
||||||
Result:=Comps[i];
|
@CompareClassNameWithRegisteredComponent);
|
||||||
if CompareText(Result.ComponentClass.ClassName,CompClassName) = 0 then
|
if ANode<>nil then
|
||||||
exit;
|
Result:=TRegisteredComponent(ANode.Data)
|
||||||
end;
|
else
|
||||||
Result:=nil;
|
Result:=nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TBaseComponentPalette.CreateNewClassName(const Prefix: string): string;
|
function TBaseComponentPalette.CreateNewClassName(const Prefix: string): string;
|
||||||
|
@ -58,26 +58,6 @@ type
|
|||||||
csmMulty // don't reset selection on component add
|
csmMulty // don't reset selection on component add
|
||||||
);
|
);
|
||||||
|
|
||||||
TComponentPalette = class;
|
|
||||||
|
|
||||||
{ 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: TComponentPalette;
|
|
||||||
// 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;
|
|
||||||
|
|
||||||
{ TComponentPage }
|
{ TComponentPage }
|
||||||
|
|
||||||
TComponentPage = class(TBaseComponentPage)
|
TComponentPage = class(TBaseComponentPage)
|
||||||
@ -123,12 +103,6 @@ type
|
|||||||
procedure PopupMenuPopup(Sender: TObject);
|
procedure PopupMenuPopup(Sender: TObject);
|
||||||
private
|
private
|
||||||
fComponentButtons: TComponentButtonMap;
|
fComponentButtons: TComponentButtonMap;
|
||||||
// Component cache, a tree of TRegisteredComponent sorted for componentclass
|
|
||||||
fComponentCache: TAVLTree;
|
|
||||||
// Two page caches, one for original pages, one for user ordered pages.
|
|
||||||
// Lists have page names. Object holds another StringList for component names.
|
|
||||||
fOrigComponentPageCache: TStringList; // Original
|
|
||||||
fUserComponentPageCache: TStringList; // User ordered
|
|
||||||
// Visual container for tabs
|
// Visual container for tabs
|
||||||
FPageControl: TPageControl;
|
FPageControl: TPageControl;
|
||||||
fNoteBookNeedsUpdate: boolean;
|
fNoteBookNeedsUpdate: boolean;
|
||||||
@ -143,8 +117,6 @@ type
|
|||||||
// Used by UpdateNoteBookButtons
|
// Used by UpdateNoteBookButtons
|
||||||
fOldActivePage: TTabSheet;
|
fOldActivePage: TTabSheet;
|
||||||
fVisiblePageIndex: integer;
|
fVisiblePageIndex: integer;
|
||||||
// User ordered + original pages and components
|
|
||||||
fUserOrder: TCompPaletteUserOrder;
|
|
||||||
procedure ClearButtons;
|
procedure ClearButtons;
|
||||||
function FindCompByButton(Button: TSpeedButton): TRegisteredComponent;
|
function FindCompByButton(Button: TSpeedButton): TRegisteredComponent;
|
||||||
function FindPkgCompByButton(Button: TComponent): TPkgComponent;
|
function FindPkgCompByButton(Button: TComponent): TPkgComponent;
|
||||||
@ -152,9 +124,8 @@ type
|
|||||||
// Component layout :
|
// Component layout :
|
||||||
procedure ReAlignButtons(aSheet: TCustomPage);
|
procedure ReAlignButtons(aSheet: TCustomPage);
|
||||||
procedure UpdateNoteBookButtons(ForceUpdateAll: Boolean);
|
procedure UpdateNoteBookButtons(ForceUpdateAll: Boolean);
|
||||||
//procedure AssociatePageComps(aPageInd: Integer; aCompNames: TStringList);
|
|
||||||
function CreatePagesFromUserOrder: Boolean;
|
function CreatePagesFromUserOrder: Boolean;
|
||||||
procedure CacheOrigComponentPages;
|
|
||||||
procedure RemoveUnneededPage(aSheet: TCustomPage);
|
procedure RemoveUnneededPage(aSheet: TCustomPage);
|
||||||
procedure SetPageControl(const AValue: TPageControl);
|
procedure SetPageControl(const AValue: TPageControl);
|
||||||
procedure SelectionToolClick(Sender: TObject);
|
procedure SelectionToolClick(Sender: TObject);
|
||||||
@ -185,25 +156,17 @@ type
|
|||||||
procedure DoAfterComponentAdded; override;
|
procedure DoAfterComponentAdded; override;
|
||||||
procedure OnGetNonVisualCompIcon(Sender: TObject;
|
procedure OnGetNonVisualCompIcon(Sender: TObject;
|
||||||
AComponent: TComponent; var Icon: TCustomBitmap);
|
AComponent: TComponent; var Icon: TCustomBitmap);
|
||||||
function FindComponent(const CompClassName: string): TRegisteredComponent; override;
|
|
||||||
{$IFDEF CustomIDEComps}
|
{$IFDEF CustomIDEComps}
|
||||||
procedure RegisterCustomIDEComponents(
|
procedure RegisterCustomIDEComponents(
|
||||||
const RegisterProc: RegisterUnitComponentProc); override;
|
const RegisterProc: RegisterUnitComponentProc); override;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
procedure Update(ForceUpdateAll: Boolean); override;
|
procedure Update(ForceUpdateAll: Boolean); override;
|
||||||
function AssignOrigCompsForPage(PageName: string;
|
|
||||||
DestComps: TStringList): Boolean; override;
|
|
||||||
function AssignOrigVisibleCompsForPage(PageName: string;
|
|
||||||
DestComps: TStringList): Boolean; override;
|
|
||||||
function RefUserCompsForPage(PageName: string): TStringList; override;
|
|
||||||
public
|
public
|
||||||
property PageControl: TPageControl read FPageControl write SetPageControl;
|
property PageControl: TPageControl read FPageControl write SetPageControl;
|
||||||
property SelectionMode: TComponentSelectionMode read FSelectionMode write FSelectionMode;
|
property SelectionMode: TComponentSelectionMode read FSelectionMode write FSelectionMode;
|
||||||
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;
|
||||||
@ -216,27 +179,6 @@ implementation
|
|||||||
const
|
const
|
||||||
OVERVIEW_PANEL_WIDTH = 20;
|
OVERVIEW_PANEL_WIDTH = 20;
|
||||||
|
|
||||||
function CompareRegisteredComponents(Data1, Data2: Pointer): integer;
|
|
||||||
var
|
|
||||||
RegComp1: TRegisteredComponent;
|
|
||||||
RegComp2: TRegisteredComponent;
|
|
||||||
begin
|
|
||||||
RegComp1:=TRegisteredComponent(Data1);
|
|
||||||
RegComp2:=TRegisteredComponent(Data2);
|
|
||||||
Result:=CompareText(RegComp1.ComponentClass.ClassName,
|
|
||||||
RegComp2.ComponentClass.ClassName);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function CompareClassNameWithRegisteredComponent(Key, Data: Pointer): integer;
|
|
||||||
var
|
|
||||||
AClassName: String;
|
|
||||||
RegComp: TRegisteredComponent;
|
|
||||||
begin
|
|
||||||
AClassName:=String(Key);
|
|
||||||
RegComp:=TRegisteredComponent(Data);
|
|
||||||
Result:=CompareText(AClassName,RegComp.ComponentClass.ClassName);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function CompareControlsWithTag(Control1, Control2: Pointer): integer;
|
function CompareControlsWithTag(Control1, Control2: Pointer): integer;
|
||||||
var
|
var
|
||||||
Ctrl1: TControl absolute Control1;
|
Ctrl1: TControl absolute Control1;
|
||||||
@ -250,61 +192,6 @@ begin
|
|||||||
Result:=0;
|
Result:=0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TCompPaletteUserOrder }
|
|
||||||
|
|
||||||
constructor TCompPaletteUserOrder.Create(aPalette: TBaseComponentPalette);
|
|
||||||
begin
|
|
||||||
inherited Create;
|
|
||||||
fPalette:=TComponentPalette(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
|
|
||||||
DstComps: TStringList;
|
|
||||||
PageI, i: Integer;
|
|
||||||
PgName: String;
|
|
||||||
begin
|
|
||||||
Result:=True;
|
|
||||||
Clear;
|
|
||||||
fPalette.CacheOrigComponentPages;
|
|
||||||
// First add user defined page order from EnvironmentOptions,
|
|
||||||
FComponentPages.Assign(fOptions.PageNames);
|
|
||||||
// then add other pages which don't have user configuration
|
|
||||||
for PageI := 0 to fPalette.OrigPagePriorities.Count-1 do
|
|
||||||
begin
|
|
||||||
PgName:=fPalette.OrigPagePriorities.Keys[PageI];
|
|
||||||
if (FComponentPages.IndexOf(PgName) = -1)
|
|
||||||
and (fOptions.HiddenPageNames.IndexOf(PgName) = -1) then
|
|
||||||
FComponentPages.Add(PgName);
|
|
||||||
end;
|
|
||||||
// Map components with their pages
|
|
||||||
for PageI := 0 to FComponentPages.Count-1 do
|
|
||||||
begin
|
|
||||||
PgName := FComponentPages[PageI];
|
|
||||||
DstComps := TStringList.Create;
|
|
||||||
DstComps.CaseSensitive := True;
|
|
||||||
FComponentPages.Objects[PageI] := DstComps;
|
|
||||||
i := fOptions.ComponentPages.IndexOf(PgName);
|
|
||||||
if i >= 0 then // Add components reordered by user.
|
|
||||||
DstComps.Assign(fOptions.ComponentPages.Objects[i] as TStringList)
|
|
||||||
else // Add components that were not reordered.
|
|
||||||
fPalette.AssignOrigCompsForPage(PgName, DstComps);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
{ TComponentPage }
|
{ TComponentPage }
|
||||||
|
|
||||||
constructor TComponentPage.Create(const ThePageName: string);
|
constructor TComponentPage.Create(const ThePageName: string);
|
||||||
@ -954,75 +841,6 @@ begin
|
|||||||
inherited OnPageRemovedComponent(Page, Component);
|
inherited OnPageRemovedComponent(Page, Component);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TComponentPalette.CacheOrigComponentPages;
|
|
||||||
var
|
|
||||||
sl: TStringList;
|
|
||||||
PageI, CompI: Integer;
|
|
||||||
PgName: string;
|
|
||||||
Comp: TRegisteredComponent;
|
|
||||||
begin
|
|
||||||
if fOrigComponentPageCache.Count > 0 then Exit; // Fill cache only once.
|
|
||||||
for PageI := 0 to fOrigPagePriorities.Count-1 do
|
|
||||||
begin
|
|
||||||
PgName:=fOrigPagePriorities.Keys[PageI];
|
|
||||||
Assert((PgName <> '') and not fOrigComponentPageCache.Find(PgName, CompI),
|
|
||||||
Format('CacheComponentPages: %s already cached.', [PgName]));
|
|
||||||
// Add a cache StringList for this page name.
|
|
||||||
sl := TStringList.Create;
|
|
||||||
sl.CaseSensitive := True;
|
|
||||||
fOrigComponentPageCache.AddObject(PgName, sl);
|
|
||||||
// Find all components for this page and add them to cache.
|
|
||||||
for CompI := 0 to fComps.Count-1 do begin
|
|
||||||
Comp := fComps[CompI];
|
|
||||||
if Comp.OrigPageName = PgName then //if SameText(Comp.OrigPageName, PgName) then
|
|
||||||
sl.AddObject(Comp.ComponentClass.ClassName, Comp);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TComponentPalette.AssignOrigCompsForPage(PageName: string;
|
|
||||||
DestComps: TStringList): Boolean;
|
|
||||||
// Returns True if the page was found.
|
|
||||||
var
|
|
||||||
sl: TStringList;
|
|
||||||
i: Integer;
|
|
||||||
begin
|
|
||||||
Result := fOrigComponentPageCache.Find(PageName, i);
|
|
||||||
if Result then begin
|
|
||||||
sl := fOrigComponentPageCache.Objects[i] as TStringList;
|
|
||||||
DestComps.Assign(sl);
|
|
||||||
end
|
|
||||||
else
|
|
||||||
DestComps.Clear;
|
|
||||||
//raise Exception.Create(Format('AssignOrigCompsForPage: %s not found in cache.', [PageName]));
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TComponentPalette.AssignOrigVisibleCompsForPage(PageName: string;
|
|
||||||
DestComps: TStringList): Boolean;
|
|
||||||
// Returns True if the page was found.
|
|
||||||
var
|
|
||||||
sl: TStringList;
|
|
||||||
i: Integer;
|
|
||||||
begin
|
|
||||||
DestComps.Clear;
|
|
||||||
Result := fOrigComponentPageCache.Find(PageName, i);
|
|
||||||
if not Result then Exit;
|
|
||||||
sl := fOrigComponentPageCache.Objects[i] as TStringList;
|
|
||||||
for i := 0 to sl.Count-1 do
|
|
||||||
if FindComponent(sl[i]).Visible then
|
|
||||||
DestComps.Add(sl[i]);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TComponentPalette.RefUserCompsForPage(PageName: string): TStringList;
|
|
||||||
var
|
|
||||||
i: Integer;
|
|
||||||
begin
|
|
||||||
if fUserComponentPageCache.Find(PageName, i) then
|
|
||||||
Result := fUserComponentPageCache.Objects[i] as TStringList
|
|
||||||
else
|
|
||||||
Result := Nil;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TComponentPalette.Update(ForceUpdateAll: Boolean);
|
procedure TComponentPalette.Update(ForceUpdateAll: Boolean);
|
||||||
begin
|
begin
|
||||||
{$IFDEF VerboseComponentPalette}
|
{$IFDEF VerboseComponentPalette}
|
||||||
@ -1049,21 +867,10 @@ end;
|
|||||||
|
|
||||||
constructor TComponentPalette.Create;
|
constructor TComponentPalette.Create;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create(EnvironmentOptions.ComponentPaletteOptions);
|
||||||
FSelectionMode:=csmSingle;
|
FSelectionMode:=csmSingle;
|
||||||
fUserOrder:=TCompPaletteUserOrder.Create(Self);
|
|
||||||
fUserOrder.Options:=EnvironmentOptions.ComponentPaletteOptions;
|
|
||||||
fComponentButtons:=TComponentButtonMap.Create;
|
fComponentButtons:=TComponentButtonMap.Create;
|
||||||
fComponentButtons.Sorted:=True;
|
fComponentButtons.Sorted:=True;
|
||||||
fComponentCache:=TAVLTree.Create(@CompareRegisteredComponents);
|
|
||||||
fOrigComponentPageCache:=TStringList.Create;
|
|
||||||
fOrigComponentPageCache.OwnsObjects:=True;
|
|
||||||
fOrigComponentPageCache.CaseSensitive:=True;
|
|
||||||
fOrigComponentPageCache.Sorted:=True;
|
|
||||||
fUserComponentPageCache:=TStringList.Create;
|
|
||||||
fUserComponentPageCache.OwnsObjects:=True;
|
|
||||||
fUserComponentPageCache.CaseSensitive:=True;
|
|
||||||
fUserComponentPageCache.Sorted:=True;
|
|
||||||
OnComponentIsInvisible:=@CheckComponentDesignerVisible;
|
OnComponentIsInvisible:=@CheckComponentDesignerVisible;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1074,13 +881,9 @@ begin
|
|||||||
if OnComponentIsInvisible=@CheckComponentDesignerVisible then
|
if OnComponentIsInvisible=@CheckComponentDesignerVisible then
|
||||||
OnComponentIsInvisible:=nil;
|
OnComponentIsInvisible:=nil;
|
||||||
PageControl:=nil;
|
PageControl:=nil;
|
||||||
FreeAndNil(fUserComponentPageCache);
|
|
||||||
FreeAndNil(fOrigComponentPageCache);
|
|
||||||
FreeAndNil(fComponentCache);
|
|
||||||
for i := 0 to fComponentButtons.Count-1 do
|
for i := 0 to fComponentButtons.Count-1 do
|
||||||
fComponentButtons.Data[i].Free;
|
fComponentButtons.Data[i].Free;
|
||||||
FreeAndNil(fComponentButtons);
|
FreeAndNil(fComponentButtons);
|
||||||
FreeAndNil(fUserOrder);
|
|
||||||
FreeAndNil(fUnregisteredIcon);
|
FreeAndNil(fUnregisteredIcon);
|
||||||
FreeAndNil(fSelectButtonIcon);
|
FreeAndNil(fSelectButtonIcon);
|
||||||
FreeAndNil(PopupMenu);
|
FreeAndNil(PopupMenu);
|
||||||
@ -1256,7 +1059,6 @@ begin
|
|||||||
// lock
|
// lock
|
||||||
fUpdatingPageControl:=true;
|
fUpdatingPageControl:=true;
|
||||||
FPageControl.DisableAlign;
|
FPageControl.DisableAlign;
|
||||||
//FPageControl.DisableAutoSizing;
|
|
||||||
try
|
try
|
||||||
fOldActivePage:=FPageControl.ActivePage;
|
fOldActivePage:=FPageControl.ActivePage;
|
||||||
fUserOrder.SortPagesAndCompsUserOrder;
|
fUserOrder.SortPagesAndCompsUserOrder;
|
||||||
@ -1320,7 +1122,6 @@ begin
|
|||||||
// unlock
|
// unlock
|
||||||
fUpdatingPageControl:=false;
|
fUpdatingPageControl:=false;
|
||||||
fNoteBookNeedsUpdate:=false;
|
fNoteBookNeedsUpdate:=false;
|
||||||
//FPageControl.EnableAutoSizing;
|
|
||||||
FPageControl.EnableAlign;
|
FPageControl.EnableAlign;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -1350,18 +1151,6 @@ begin
|
|||||||
Result:=-1;
|
Result:=-1;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TComponentPalette.FindComponent(const CompClassName: string): TRegisteredComponent;
|
|
||||||
var
|
|
||||||
ANode: TAVLTreeNode;
|
|
||||||
begin
|
|
||||||
ANode:=fComponentCache.FindKey(Pointer(CompClassName),
|
|
||||||
@CompareClassNameWithRegisteredComponent);
|
|
||||||
if ANode<>nil then
|
|
||||||
Result:=TRegisteredComponent(ANode.Data)
|
|
||||||
else
|
|
||||||
Result:=nil;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TComponentPalette.FindCompByButton(Button: TSpeedButton): TRegisteredComponent;
|
function TComponentPalette.FindCompByButton(Button: TSpeedButton): TRegisteredComponent;
|
||||||
var
|
var
|
||||||
i: Integer;
|
i: Integer;
|
||||||
|
Loading…
Reference in New Issue
Block a user