Separate TBaseComponentPalette and TComponentPalette more.

git-svn-id: trunk@48311 -
This commit is contained in:
juha 2015-03-12 23:01:57 +00:00
parent 1efe3b0e31
commit ac1b44a800
4 changed files with 75 additions and 105 deletions

View File

@ -25,6 +25,9 @@ interface
uses uses
Classes, SysUtils, typinfo, AVL_Tree, fgl, Classes, SysUtils, typinfo, AVL_Tree, fgl,
{$IFDEF CustomIDEComps}
CustomIDEComps,
{$ENDIF}
Controls, Laz2_XMLCfg, LCLProc; Controls, Laz2_XMLCfg, LCLProc;
type type
@ -184,21 +187,6 @@ type
TBaseComponentPalette = class TBaseComponentPalette = class
private private
FHandlers: array[TComponentPaletteHandlerType] of TMethodList;
FComponentPageClass: TBaseComponentPageClass;
FOnBeginUpdate: TNotifyEvent;
FOnEndUpdate: TEndUpdatePaletteEvent;
FHideControls: boolean;
FUpdateLock: integer;
fChanged: boolean;
fChangeStamp: integer;
// Used to find names that differ in character case only.
fOrigPageHelper: TStringList;
procedure AddHandler(HandlerType: TComponentPaletteHandlerType;
const AMethod: TMethod; AsLast: boolean = false);
procedure RemoveHandler(HandlerType: TComponentPaletteHandlerType;
const AMethod: TMethod);
protected
// List of pages, created based on user ordered and original pages. // List of pages, created based on user ordered and original pages.
fPages: TBaseComponentPageList; fPages: TBaseComponentPageList;
// List of all components in all pages. // List of all components in all pages.
@ -213,15 +201,25 @@ type
// Lists have page names. Object holds another StringList for component names. // Lists have page names. Object holds another StringList for component names.
fOrigComponentPageCache: TStringList; // Original fOrigComponentPageCache: TStringList; // Original
fUserComponentPageCache: TStringList; // User ordered fUserComponentPageCache: TStringList; // User ordered
// Used to find names that differ in character case only.
fOrigPageHelper: TStringList;
fHandlers: array[TComponentPaletteHandlerType] of TMethodList;
fComponentPageClass: TBaseComponentPageClass;
fHideControls: boolean;
fUpdateLock: integer;
fChanged: boolean;
fChangeStamp: integer;
procedure AddHandler(HandlerType: TComponentPaletteHandlerType;
const AMethod: TMethod; AsLast: boolean = false);
procedure RemoveHandler(HandlerType: TComponentPaletteHandlerType;
const AMethod: TMethod);
procedure CacheOrigComponentPages; procedure CacheOrigComponentPages;
function CreatePagesFromUserOrder: Boolean; function CreatePagesFromUserOrder: Boolean;
procedure DoChange; virtual; procedure DoChange;
procedure OnPageAddedComponent({%H-}Component: TRegisteredComponent); virtual; procedure DoPageAddedComponent(Component: TRegisteredComponent);
procedure OnPageRemovedComponent({%H-}Page: TBaseComponentPage; procedure DoPageRemovedComponent(Component: TRegisteredComponent);
{%H-}Component: TRegisteredComponent); virtual; function VoteCompVisibility(AComponent: TRegisteredComponent): Boolean;
procedure OnComponentVisibleChanged({%H-}AComponent: TRegisteredComponent); virtual; protected
procedure OnPageVisibleChanged({%H-}APage: TBaseComponentPage); virtual;
function VoteCompVisibility(AComponent: TRegisteredComponent): Boolean; virtual;
function GetSelected: TRegisteredComponent; virtual; function GetSelected: TRegisteredComponent; virtual;
procedure SetSelected(const AValue: TRegisteredComponent); virtual; abstract; procedure SetSelected(const AValue: TRegisteredComponent); virtual; abstract;
public public
@ -235,7 +233,7 @@ type
procedure EndUpdate; procedure EndUpdate;
function IsUpdateLocked: boolean; function IsUpdateLocked: boolean;
procedure IncChangeStamp; procedure IncChangeStamp;
procedure DoAfterComponentAdded; virtual; procedure DoAfterComponentAdded;
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 GetPage(const APageName: string; aCaseSens: Boolean = False): TBaseComponentPage; function GetPage(const APageName: string; aCaseSens: Boolean = False): TBaseComponentPage;
@ -243,12 +241,9 @@ type
procedure RemoveComponent(AComponent: TRegisteredComponent); procedure RemoveComponent(AComponent: TRegisteredComponent);
function FindComponent(const CompClassName: string): TRegisteredComponent; 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;
procedure IterateRegisteredClasses(Proc: TGetComponentClassEvent); procedure IterateRegisteredClasses(Proc: TGetComponentClassEvent);
{$IFDEF CustomIDEComps} // Registered handlers
procedure RegisterCustomIDEComponents(
const RegisterProc: RegisterUnitComponentProc); virtual; abstract;
{$ENDIF}
procedure RemoveAllHandlersOfObject(AnObject: TObject); procedure RemoveAllHandlersOfObject(AnObject: TObject);
procedure AddHandlerUpdateVisible( procedure AddHandlerUpdateVisible(
const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent; const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent;
@ -259,6 +254,9 @@ type
const OnComponentAddedEvent: TComponentAddedEvent); const OnComponentAddedEvent: TComponentAddedEvent);
procedure RemoveHandlerComponentAdded( procedure RemoveHandlerComponentAdded(
const OnComponentAddedEvent: TComponentAddedEvent); const OnComponentAddedEvent: TComponentAddedEvent);
{$IFDEF CustomIDEComps}
procedure RegisterCustomIDEComponents(const RegisterProc: RegisterUnitComponentProc);
{$ENDIF}
public public
property Pages: TBaseComponentPageList read fPages; property Pages: TBaseComponentPageList read fPages;
property Comps: TRegisteredComponentList read fComps; property Comps: TRegisteredComponentList read fComps;
@ -642,14 +640,14 @@ procedure TBaseComponentPage.SetVisible(const AValue: boolean);
begin begin
if FVisible=AValue then exit; if FVisible=AValue then exit;
FVisible:=AValue; FVisible:=AValue;
if (FPalette<>nil) then //if (FPalette<>nil) then
FPalette.OnPageVisibleChanged(Self); // FPalette.OnPageVisibleChanged(Self);
end; end;
procedure TBaseComponentPage.OnComponentVisibleChanged(AComponent: TRegisteredComponent); procedure TBaseComponentPage.OnComponentVisibleChanged(AComponent: TRegisteredComponent);
begin begin
if FPalette<>nil then //if FPalette<>nil then
FPalette.OnComponentVisibleChanged(AComponent); // FPalette.OnComponentVisibleChanged(AComponent);
end; end;
{ TBaseComponentPalette } { TBaseComponentPalette }
@ -844,6 +842,11 @@ begin
Result := Nil; Result := Nil;
end; end;
function TBaseComponentPalette.GetSelected: TRegisteredComponent;
begin
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
@ -852,11 +855,6 @@ begin
FHandlers[HandlerType].Add(AMethod,AsLast); FHandlers[HandlerType].Add(AMethod,AsLast);
end; end;
function TBaseComponentPalette.GetSelected: TRegisteredComponent;
begin
result := nil;
end;
procedure TBaseComponentPalette.RemoveHandler(HandlerType: TComponentPaletteHandlerType; procedure TBaseComponentPalette.RemoveHandler(HandlerType: TComponentPaletteHandlerType;
const AMethod: TMethod); const AMethod: TMethod);
begin begin
@ -871,27 +869,18 @@ begin
Update(False); Update(False);
end; end;
procedure TBaseComponentPalette.OnPageAddedComponent(Component: TRegisteredComponent); procedure TBaseComponentPalette.DoPageAddedComponent(Component: TRegisteredComponent);
begin begin
fComponentCache.Add(Component);
DoChange; DoChange;
end; end;
procedure TBaseComponentPalette.OnPageRemovedComponent(Page: TBaseComponentPage; procedure TBaseComponentPalette.DoPageRemovedComponent(Component: TRegisteredComponent);
Component: TRegisteredComponent);
begin begin
fComponentCache.Remove(Component);
DoChange; DoChange;
end; end;
procedure TBaseComponentPalette.OnComponentVisibleChanged(AComponent: TRegisteredComponent);
begin
;
end;
procedure TBaseComponentPalette.OnPageVisibleChanged(APage: TBaseComponentPage);
begin
;
end;
function TBaseComponentPalette.VoteCompVisibility(AComponent: TRegisteredComponent): Boolean; function TBaseComponentPalette.VoteCompVisibility(AComponent: TRegisteredComponent): Boolean;
var var
i, Vote: Integer; i, Vote: Integer;
@ -984,7 +973,7 @@ begin
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); DoPageAddedComponent(NewComponent);
if NewComponent.FOrigPageName = '' then Exit; if NewComponent.FOrigPageName = '' then Exit;
@ -1011,7 +1000,7 @@ 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 DoPageRemovedComponent(AComponent);
end; end;
function TBaseComponentPalette.FindComponent(const CompClassName: string): TRegisteredComponent; function TBaseComponentPalette.FindComponent(const CompClassName: string): TRegisteredComponent;
@ -1041,6 +1030,14 @@ begin
end; end;
end; end;
procedure TBaseComponentPalette.Update(ForceUpdateAll: Boolean);
begin
fUserOrder.SortPagesAndCompsUserOrder;
CreatePagesFromUserOrder;
//for Viewer in Viewers do
// Viewer.Update(ForceUpdateAll);
end;
procedure TBaseComponentPalette.IterateRegisteredClasses(Proc: TGetComponentClassEvent); procedure TBaseComponentPalette.IterateRegisteredClasses(Proc: TGetComponentClassEvent);
var var
i: Integer; i: Integer;
@ -1057,6 +1054,8 @@ begin
FHandlers[HandlerType].RemoveAllMethodsOfObject(AnObject); FHandlers[HandlerType].RemoveAllMethodsOfObject(AnObject);
end; end;
// Add / Remove handlers
procedure TBaseComponentPalette.AddHandlerUpdateVisible( procedure TBaseComponentPalette.AddHandlerUpdateVisible(
const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent; AsLast: boolean); const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent; AsLast: boolean);
begin begin
@ -1081,5 +1080,13 @@ begin
RemoveHandler(cphtComponentAdded,TMethod(OnComponentAddedEvent)); RemoveHandler(cphtComponentAdded,TMethod(OnComponentAddedEvent));
end; end;
{$IFDEF CustomIDEComps}
procedure TBaseComponentPalette.RegisterCustomIDEComponents(
const RegisterProc: RegisterUnitComponentProc);
begin
CustomIDEComps.RegisterCustomComponents(RegisterProc);
end;
{$ENDIF}
end. end.

View File

@ -41,9 +41,6 @@ uses
Classes, SysUtils, AVL_Tree, fgl, Classes, SysUtils, AVL_Tree, fgl,
Controls, Forms, Graphics, ComCtrls, Buttons, Menus, ExtCtrls, Controls, Forms, Graphics, ComCtrls, Buttons, Menus, ExtCtrls,
FileUtil, LazFileCache, PropEdits, LCLProc, FormEditingIntf, LazIDEIntf, FileUtil, LazFileCache, PropEdits, LCLProc, FormEditingIntf, LazIDEIntf,
{$IFDEF CustomIDEComps}
CustomIDEComps,
{$ENDIF}
MainBase, LazarusIDEStrConsts, ComponentReg, DesignerProcs, PackageDefs, EnvironmentOpts; MainBase, LazarusIDEStrConsts, ComponentReg, DesignerProcs, PackageDefs, EnvironmentOpts;
const const
@ -116,10 +113,8 @@ type
function FindCompByButton(Button: TSpeedButton): TRegisteredComponent; function FindCompByButton(Button: TSpeedButton): TRegisteredComponent;
function FindPkgCompByButton(Button: TComponent): TPkgComponent; function FindPkgCompByButton(Button: TComponent): TPkgComponent;
function IndexOfPageComponent(AComponent: TComponent): integer; function IndexOfPageComponent(AComponent: TComponent): integer;
// Component layout :
procedure ReAlignButtons(aSheet: TCustomPage); procedure ReAlignButtons(aSheet: TCustomPage);
procedure UpdateNoteBookButtons(ForceUpdateAll: Boolean); procedure UpdateNoteBookButtons(ForceUpdateAll: Boolean);
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);
@ -135,24 +130,15 @@ type
function GetUnregisteredIcon: TCustomBitmap; function GetUnregisteredIcon: TCustomBitmap;
function GetSelectButtonIcon: TCustomBitmap; function GetSelectButtonIcon: TCustomBitmap;
function SelectAButton(Button: TSpeedButton): boolean; function SelectAButton(Button: TSpeedButton): boolean;
protected procedure ComponentWasAdded;
procedure OnPageAddedComponent(Component: TRegisteredComponent); override; procedure CheckComponentDesignerVisible(AComponent: TComponent; var Invisible: boolean);
procedure OnPageRemovedComponent(Page: TBaseComponentPage;
Component: TRegisteredComponent); override;
procedure CheckComponentDesignerVisible(AComponent: TComponent;
var Invisible: boolean);
procedure SetSelected(const AValue: TRegisteredComponent); override; procedure SetSelected(const AValue: TRegisteredComponent); override;
function GetSelected: TRegisteredComponent; override; function GetSelected: TRegisteredComponent; override;
public public
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
procedure DoAfterComponentAdded; override;
procedure OnGetNonVisualCompIcon(Sender: TObject; procedure OnGetNonVisualCompIcon(Sender: TObject;
AComponent: TComponent; var Icon: TCustomBitmap); AComponent: TComponent; var Icon: TCustomBitmap);
{$IFDEF CustomIDEComps}
procedure RegisterCustomIDEComponents(
const RegisterProc: RegisterUnitComponentProc); override;
{$ENDIF}
procedure Update(ForceUpdateAll: Boolean); override; procedure Update(ForceUpdateAll: Boolean); override;
public public
property PageControl: TPageControl read FPageControl write SetPageControl; property PageControl: TPageControl read FPageControl write SetPageControl;
@ -809,21 +795,9 @@ begin
Handled := True; Handled := True;
end; end;
procedure TComponentPalette.OnPageAddedComponent(Component: TRegisteredComponent);
begin
fComponentCache.Add(Component);
inherited OnPageAddedComponent(Component);
end;
procedure TComponentPalette.OnPageRemovedComponent(Page: TBaseComponentPage;
Component: TRegisteredComponent);
begin
fComponentCache.Remove(Component);
inherited OnPageRemovedComponent(Page, Component);
end;
procedure TComponentPalette.Update(ForceUpdateAll: Boolean); procedure TComponentPalette.Update(ForceUpdateAll: Boolean);
begin begin
inherited Update(ForceUpdateAll);
{$IFDEF VerboseComponentPalette} {$IFDEF VerboseComponentPalette}
DebugLn(['TComponentPalette.Update, calling UpdateNoteBookButtons, fUpdatingPageControl=', fUpdatingPageControl]); DebugLn(['TComponentPalette.Update, calling UpdateNoteBookButtons, fUpdatingPageControl=', fUpdatingPageControl]);
{$ENDIF} {$ENDIF}
@ -852,6 +826,8 @@ begin
fComponentButtons:=TComponentButtonMap.Create; fComponentButtons:=TComponentButtonMap.Create;
fComponentButtons.Sorted:=True; fComponentButtons.Sorted:=True;
OnComponentIsInvisible:=@CheckComponentDesignerVisible; OnComponentIsInvisible:=@CheckComponentDesignerVisible;
{IDEComponentPalette.} AddHandlerComponentAdded(@ComponentWasAdded);
ComponentPageClass := TComponentPage; // Used by CreatePagesFromUserOrder
end; end;
destructor TComponentPalette.Destroy; destructor TComponentPalette.Destroy;
@ -885,13 +861,6 @@ begin
FPageControl.EnableAlign; FPageControl.EnableAlign;
end; end;
procedure TComponentPalette.DoAfterComponentAdded;
begin
inherited DoAfterComponentAdded;
if not (ssShift in GetKeyShiftState) and (SelectionMode = csmSingle) then
Selected := nil;
end;
function TComponentPalette.GetUnregisteredIcon: TCustomBitmap; function TComponentPalette.GetUnregisteredIcon: TCustomBitmap;
begin begin
if fUnregisteredIcon = nil then if fUnregisteredIcon = nil then
@ -919,6 +888,12 @@ begin
Result := (Selected = NewComponent); Result := (Selected = NewComponent);
end; end;
procedure TComponentPalette.ComponentWasAdded;
begin
if not (ssShift in GetKeyShiftState) and (SelectionMode = csmSingle) then
Selected := nil;
end;
procedure TComponentPalette.ReAlignButtons(aSheet: TCustomPage); procedure TComponentPalette.ReAlignButtons(aSheet: TCustomPage);
var var
PageInd: Integer; PageInd: Integer;
@ -966,11 +941,7 @@ begin
FPageControl.DisableAlign; FPageControl.DisableAlign;
try try
fOldActivePage:=FPageControl.ActivePage; fOldActivePage:=FPageControl.ActivePage;
fUserOrder.SortPagesAndCompsUserOrder;
ComponentPageClass := TComponentPage; // Used by CreatePagesFromUserOrder
CreatePagesFromUserOrder;
CreatePopupMenu; CreatePopupMenu;
{$IFDEF VerboseComponentPalette} {$IFDEF VerboseComponentPalette}
DebugLn(['TComponentPalette.UpdateNoteBookButtons: FPageCount before=', FPageControl.PageCount]); DebugLn(['TComponentPalette.UpdateNoteBookButtons: FPageCount before=', FPageControl.PageCount]);
{$ENDIF} {$ENDIF}
@ -991,8 +962,8 @@ begin
fVisiblePageIndex := 0; fVisiblePageIndex := 0;
for i := 0 to Pages.Count-1 do for i := 0 to Pages.Count-1 do
begin begin
// fPages and fUserOrder.ComponentPages are now synchronized, same index applies. // Pages and UserOrder.ComponentPages are now synchronized, same index applies.
Assert(Pages[i].PageName=fUserOrder.ComponentPages[i], Assert(Pages[i].PageName=UserOrder.ComponentPages[i],
'UpdateNoteBookButtons: Page names do not match.'); 'UpdateNoteBookButtons: Page names do not match.');
Pg := TComponentPage(Pages[i]); Pg := TComponentPage(Pages[i]);
{$IFDEF LCLQt} // Qt has some problems in moving existing tabs! {$IFDEF LCLQt} // Qt has some problems in moving existing tabs!
@ -1001,7 +972,7 @@ begin
Pg.RemoveSheet; Pg.RemoveSheet;
end; end;
{$ENDIF} {$ENDIF}
Pg.InsertVisiblePage(TStringList(fUserOrder.ComponentPages.Objects[i])); Pg.InsertVisiblePage(TStringList(UserOrder.ComponentPages.Objects[i]));
{$IFDEF VerboseComponentPalette} {$IFDEF VerboseComponentPalette}
DebugLn(['TComponentPalette.UpdateNoteBookButtons: PageIndex=', i, ' PageName=',Pages[i].PageName]); DebugLn(['TComponentPalette.UpdateNoteBookButtons: PageIndex=', i, ' PageName=',Pages[i].PageName]);
{$ENDIF} {$ENDIF}
@ -1073,13 +1044,5 @@ begin
Result := FindCompByButton(Button as TSpeedButton) as TPkgComponent; Result := FindCompByButton(Button as TSpeedButton) as TPkgComponent;
end; end;
{$IFDEF CustomIDEComps}
procedure TComponentPalette.RegisterCustomIDEComponents(
const RegisterProc: RegisterUnitComponentProc);
begin
CustomIDEComps.RegisterCustomComponents(RegisterProc);
end;
{$ENDIF}
end. end.

View File

@ -1523,6 +1523,7 @@ begin
{$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TMainIDE.Create IDE COMPONENTS');{$ENDIF} {$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TMainIDE.Create IDE COMPONENTS');{$ENDIF}
// load installed packages // load installed packages
TComponentPalette(IDEComponentPalette).PageControl:=MainIDEBar.ComponentPageControl;
PkgBoss.LoadInstalledPackages; PkgBoss.LoadInstalledPackages;
EditorMacroListViewer.LoadGlobalInfo; // Must be after packages are loaded/registered. EditorMacroListViewer.LoadGlobalInfo; // Must be after packages are loaded/registered.
@ -8575,7 +8576,7 @@ var
Grid: TOICustomPropertyGrid; Grid: TOICustomPropertyGrid;
Row: TOIPropertyGridRow; Row: TOIPropertyGridRow;
begin begin
TComponentPalette(IDEComponentPalette).DoAfterComponentAdded; IDEComponentPalette.DoAfterComponentAdded;
if EnvironmentOptions.CreateComponentFocusNameProperty if EnvironmentOptions.CreateComponentFocusNameProperty
and (ObjectInspector1<>nil) then begin and (ObjectInspector1<>nil) then begin
if (ObjectInspector1.ShowFavorites) and (EnvironmentOptions.SwitchToFavoritesOITab) then if (ObjectInspector1.ShowFavorites) and (EnvironmentOptions.SwitchToFavoritesOITab) then

View File

@ -3078,7 +3078,6 @@ begin
PackageGraph.LoadStaticBasePackages; PackageGraph.LoadStaticBasePackages;
LoadStaticCustomPackages; LoadStaticCustomPackages;
LoadAutoInstallPackages; LoadAutoInstallPackages;
TComponentPalette(IDEComponentPalette).PageControl:=MainIDEBar.ComponentPageControl;
finally finally
IDEComponentPalette.EndUpdate; IDEComponentPalette.EndUpdate;
end; end;