Component palette: Add a selection changed event and handler.

git-svn-id: trunk@48312 -
This commit is contained in:
juha 2015-03-12 23:01:59 +00:00
parent ac1b44a800
commit b0023622ae
2 changed files with 101 additions and 75 deletions

View File

@ -171,15 +171,16 @@ type
{ TBaseComponentPalette } { TBaseComponentPalette }
TComponentPaletteHandlerType = ( TComponentPaletteHandlerType = (
cphtUpdateVisible, // visibility of component palette icons is recomputed cphtUpdateVisible, // Visibility of component palette icons is recomputed
cphtComponentAdded // Typically selection is changed after component was added. cphtComponentAdded, // Typically selection is changed after component was added.
cphtSelectionChanged
); );
TEndUpdatePaletteEvent = procedure(Sender: TObject; PaletteChanged: boolean) of object; TEndUpdatePaletteEvent = procedure(Sender: TObject; PaletteChanged: boolean) of object;
TGetComponentClassEvent = procedure(const AClass: TComponentClass) of object; TGetComponentClassEvent = procedure(const AClass: TComponentClass) of object;
TUpdateCompVisibleEvent = procedure(AComponent: TRegisteredComponent; TUpdateCompVisibleEvent = procedure(AComponent: TRegisteredComponent;
var VoteVisible: integer { Visible>0 } ) of object; var VoteVisible: integer { Visible>0 } ) of object;
TComponentAddedEvent = procedure of object; TPaletteHandlerEvent = procedure of object;
RegisterUnitComponentProc = procedure(const Page, UnitName: ShortString; RegisterUnitComponentProc = procedure(const Page, UnitName: ShortString;
ComponentClass: TComponentClass); ComponentClass: TComponentClass);
TBaseComponentPageList = specialize TFPGList<TBaseComponentPage>; TBaseComponentPageList = specialize TFPGList<TBaseComponentPage>;
@ -205,6 +206,7 @@ type
fOrigPageHelper: TStringList; fOrigPageHelper: TStringList;
fHandlers: array[TComponentPaletteHandlerType] of TMethodList; fHandlers: array[TComponentPaletteHandlerType] of TMethodList;
fComponentPageClass: TBaseComponentPageClass; fComponentPageClass: TBaseComponentPageClass;
fSelected: TRegisteredComponent;
fHideControls: boolean; fHideControls: boolean;
fUpdateLock: integer; fUpdateLock: integer;
fChanged: boolean; fChanged: boolean;
@ -219,9 +221,8 @@ type
procedure DoPageAddedComponent(Component: TRegisteredComponent); procedure DoPageAddedComponent(Component: TRegisteredComponent);
procedure DoPageRemovedComponent(Component: TRegisteredComponent); procedure DoPageRemovedComponent(Component: TRegisteredComponent);
function VoteCompVisibility(AComponent: TRegisteredComponent): Boolean; function VoteCompVisibility(AComponent: TRegisteredComponent): Boolean;
protected function GetSelected: TRegisteredComponent;
function GetSelected: TRegisteredComponent; virtual; procedure SetSelected(const AValue: TRegisteredComponent);
procedure SetSelected(const AValue: TRegisteredComponent); virtual; abstract;
public public
constructor Create(EnvPaletteOptions: TCompPaletteOptions); constructor Create(EnvPaletteOptions: TCompPaletteOptions);
destructor Destroy; override; destructor Destroy; override;
@ -233,7 +234,6 @@ type
procedure EndUpdate; procedure EndUpdate;
function IsUpdateLocked: boolean; function IsUpdateLocked: boolean;
procedure IncChangeStamp; procedure IncChangeStamp;
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;
@ -244,18 +244,18 @@ type
procedure Update(ForceUpdateAll: Boolean); virtual; procedure Update(ForceUpdateAll: Boolean); virtual;
procedure IterateRegisteredClasses(Proc: TGetComponentClassEvent); procedure IterateRegisteredClasses(Proc: TGetComponentClassEvent);
// Registered handlers // Registered handlers
procedure DoAfterComponentAdded;
procedure DoAfterSelectionChanged;
procedure RemoveAllHandlersOfObject(AnObject: TObject); procedure RemoveAllHandlersOfObject(AnObject: TObject);
procedure AddHandlerUpdateVisible( procedure AddHandlerUpdateVisible(const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent;
const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent; AsLast: boolean = false);
AsLast: boolean = false); procedure RemoveHandlerUpdateVisible(OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent);
procedure RemoveHandlerUpdateVisible( procedure AddHandlerComponentAdded(OnComponentAddedEvent: TPaletteHandlerEvent);
const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent); procedure RemoveHandlerComponentAdded(OnComponentAddedEvent: TPaletteHandlerEvent);
procedure AddHandlerComponentAdded( procedure AddHandlerSelectionChanged(OnSelectionChangedEvent: TPaletteHandlerEvent);
const OnComponentAddedEvent: TComponentAddedEvent); procedure RemoveHandlerSelectionChanged(OnSelectionChangedEvent: TPaletteHandlerEvent);
procedure RemoveHandlerComponentAdded(
const OnComponentAddedEvent: TComponentAddedEvent);
{$IFDEF CustomIDEComps} {$IFDEF CustomIDEComps}
procedure RegisterCustomIDEComponents(const RegisterProc: RegisterUnitComponentProc); procedure RegisterCustomIDEComponents(RegisterProc: RegisterUnitComponentProc);
{$ENDIF} {$ENDIF}
public public
property Pages: TBaseComponentPageList read fPages; property Pages: TBaseComponentPageList read fPages;
@ -844,7 +844,20 @@ end;
function TBaseComponentPalette.GetSelected: TRegisteredComponent; function TBaseComponentPalette.GetSelected: TRegisteredComponent;
begin begin
result := nil; Result := fSelected;
end;
procedure TBaseComponentPalette.SetSelected(const AValue: TRegisteredComponent);
begin
if fSelected=AValue then exit;
fSelected:=AValue;
if fSelected<>nil then begin
if (fSelected.RealPage=nil) or (fSelected.RealPage.Palette<>Self)
or (not fSelected.Visible)
or (not fSelected.CanBeCreatedInDesigner) then
fSelected:=nil;
end;
DoAfterSelectionChanged;
end; end;
procedure TBaseComponentPalette.AddHandler(HandlerType: TComponentPaletteHandlerType; procedure TBaseComponentPalette.AddHandler(HandlerType: TComponentPaletteHandlerType;
@ -881,20 +894,6 @@ begin
DoChange; DoChange;
end; end;
function TBaseComponentPalette.VoteCompVisibility(AComponent: TRegisteredComponent): Boolean;
var
i, Vote: Integer;
begin
Vote:=1;
if HideControls and AComponent.IsTControl then
Dec(Vote);
i:=FHandlers[cphtUpdateVisible].Count;
while FHandlers[cphtUpdateVisible].NextDownIndex(i) do
TUpdateCompVisibleEvent(FHandlers[cphtUpdateVisible][i])(AComponent,Vote);
Result:=Vote>0;
AComponent.Visible:=Result;
end;
procedure TBaseComponentPalette.BeginUpdate(Change: boolean); procedure TBaseComponentPalette.BeginUpdate(Change: boolean);
begin begin
inc(FUpdateLock); inc(FUpdateLock);
@ -923,15 +922,6 @@ begin
Inc(fChangeStamp); Inc(fChangeStamp);
end; end;
procedure TBaseComponentPalette.DoAfterComponentAdded;
var
i: Integer;
begin
i:=FHandlers[cphtComponentAdded].Count;
while FHandlers[cphtComponentAdded].NextDownIndex(i) do
TComponentAddedEvent(FHandlers[cphtComponentAdded][i])();
end;
function TBaseComponentPalette.IndexOfPageName(const APageName: string): integer; function TBaseComponentPalette.IndexOfPageName(const APageName: string): integer;
begin begin
Result:=Pages.Count-1; // Case sensitive search Result:=Pages.Count-1; // Case sensitive search
@ -1046,6 +1036,40 @@ begin
Proc(Comps[i].ComponentClass); Proc(Comps[i].ComponentClass);
end; end;
// Execute handlers
function TBaseComponentPalette.VoteCompVisibility(AComponent: TRegisteredComponent): Boolean;
var
i, Vote: Integer;
begin
Vote:=1;
if HideControls and AComponent.IsTControl then
Dec(Vote);
i:=FHandlers[cphtUpdateVisible].Count;
while FHandlers[cphtUpdateVisible].NextDownIndex(i) do
TUpdateCompVisibleEvent(FHandlers[cphtUpdateVisible][i])(AComponent,Vote);
Result:=Vote>0;
AComponent.Visible:=Result;
end;
procedure TBaseComponentPalette.DoAfterComponentAdded;
var
i: Integer;
begin
i:=FHandlers[cphtComponentAdded].Count;
while FHandlers[cphtComponentAdded].NextDownIndex(i) do
TPaletteHandlerEvent(FHandlers[cphtComponentAdded][i])();
end;
procedure TBaseComponentPalette.DoAfterSelectionChanged;
var
i: Integer;
begin
i:=FHandlers[cphtSelectionChanged].Count;
while FHandlers[cphtSelectionChanged].NextDownIndex(i) do
TPaletteHandlerEvent(FHandlers[cphtSelectionChanged][i])();
end;
procedure TBaseComponentPalette.RemoveAllHandlersOfObject(AnObject: TObject); procedure TBaseComponentPalette.RemoveAllHandlersOfObject(AnObject: TObject);
var var
HandlerType: TComponentPaletteHandlerType; HandlerType: TComponentPaletteHandlerType;
@ -1056,6 +1080,7 @@ end;
// Add / Remove handlers // Add / Remove handlers
// UpdateVisible
procedure TBaseComponentPalette.AddHandlerUpdateVisible( procedure TBaseComponentPalette.AddHandlerUpdateVisible(
const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent; AsLast: boolean); const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent; AsLast: boolean);
begin begin
@ -1063,26 +1088,41 @@ begin
end; end;
procedure TBaseComponentPalette.RemoveHandlerUpdateVisible( procedure TBaseComponentPalette.RemoveHandlerUpdateVisible(
const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent); OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent);
begin begin
RemoveHandler(cphtUpdateVisible,TMethod(OnUpdateCompVisibleEvent)); RemoveHandler(cphtUpdateVisible,TMethod(OnUpdateCompVisibleEvent));
end; end;
// ComponentAdded
procedure TBaseComponentPalette.AddHandlerComponentAdded( procedure TBaseComponentPalette.AddHandlerComponentAdded(
const OnComponentAddedEvent: TComponentAddedEvent); OnComponentAddedEvent: TPaletteHandlerEvent);
begin begin
AddHandler(cphtComponentAdded,TMethod(OnComponentAddedEvent)); AddHandler(cphtComponentAdded,TMethod(OnComponentAddedEvent));
end; end;
procedure TBaseComponentPalette.RemoveHandlerComponentAdded( procedure TBaseComponentPalette.RemoveHandlerComponentAdded(
const OnComponentAddedEvent: TComponentAddedEvent); OnComponentAddedEvent: TPaletteHandlerEvent);
begin begin
RemoveHandler(cphtComponentAdded,TMethod(OnComponentAddedEvent)); RemoveHandler(cphtComponentAdded,TMethod(OnComponentAddedEvent));
end; end;
// SelectionChanged
procedure TBaseComponentPalette.AddHandlerSelectionChanged(
OnSelectionChangedEvent: TPaletteHandlerEvent);
begin
AddHandler(cphtSelectionChanged,TMethod(OnSelectionChangedEvent));
end;
procedure TBaseComponentPalette.RemoveHandlerSelectionChanged(
OnSelectionChangedEvent: TPaletteHandlerEvent);
begin
RemoveHandler(cphtSelectionChanged,TMethod(OnSelectionChangedEvent));
end;
//
{$IFDEF CustomIDEComps} {$IFDEF CustomIDEComps}
procedure TBaseComponentPalette.RegisterCustomIDEComponents( procedure TBaseComponentPalette.RegisterCustomIDEComponents(
const RegisterProc: RegisterUnitComponentProc); RegisterProc: RegisterUnitComponentProc);
begin begin
CustomIDEComps.RegisterCustomComponents(RegisterProc); CustomIDEComps.RegisterCustomComponents(RegisterProc);
end; end;

View File

@ -101,7 +101,6 @@ type
FOnOpenPackage: TNotifyEvent; FOnOpenPackage: TNotifyEvent;
FOnOpenUnit: TNotifyEvent; FOnOpenUnit: TNotifyEvent;
FOnClassSelected: TNotifyEvent; FOnClassSelected: TNotifyEvent;
FSelected: TRegisteredComponent;
FSelectionMode: TComponentSelectionMode; FSelectionMode: TComponentSelectionMode;
fUnregisteredIcon: TCustomBitmap; fUnregisteredIcon: TCustomBitmap;
fSelectButtonIcon: TCustomBitmap; fSelectButtonIcon: TCustomBitmap;
@ -127,13 +126,12 @@ type
WheelDelta: Integer; {%H-}MousePos: TPoint; var Handled: Boolean); WheelDelta: Integer; {%H-}MousePos: TPoint; var Handled: Boolean);
procedure CreatePopupMenu; procedure CreatePopupMenu;
procedure UnselectAllButtons; procedure UnselectAllButtons;
procedure SelectionWasChanged;
function GetUnregisteredIcon: TCustomBitmap; function GetUnregisteredIcon: TCustomBitmap;
function GetSelectButtonIcon: TCustomBitmap; function GetSelectButtonIcon: TCustomBitmap;
function SelectAButton(Button: TSpeedButton): boolean; function SelectAButton(Button: TSpeedButton): boolean;
procedure ComponentWasAdded; procedure ComponentWasAdded;
procedure CheckComponentDesignerVisible(AComponent: TComponent; var Invisible: boolean); procedure CheckComponentDesignerVisible(AComponent: TComponent; var Invisible: boolean);
procedure SetSelected(const AValue: TRegisteredComponent); override;
function GetSelected: TRegisteredComponent; override;
public public
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
@ -515,8 +513,8 @@ end;
procedure TComponentPalette.ActivePageChanged(Sender: TObject); procedure TComponentPalette.ActivePageChanged(Sender: TObject);
begin begin
if FPageControl=nil then exit; if FPageControl=nil then exit;
if (FSelected<>nil) if (Selected<>nil)
and ((FSelected.RealPage as TComponentPage).PageComponent=FPageControl.ActivePage) then exit; and ((Selected.RealPage as TComponentPage).PageComponent=FPageControl.ActivePage) then exit;
if fUpdatingPageControl then exit; if fUpdatingPageControl then exit;
{$IFDEF VerboseComponentPalette} {$IFDEF VerboseComponentPalette}
DebugLn('TComponentPalette.ActivePageChanged: Calling ReAlignButtons, setting Selected:=nil.'); DebugLn('TComponentPalette.ActivePageChanged: Calling ReAlignButtons, setting Selected:=nil.');
@ -667,11 +665,11 @@ var
DisableAutoSize: Boolean; DisableAutoSize: Boolean;
begin begin
//debugln('TComponentPalette.ComponentBtnDblClick ',TComponent(Sender).Name); //debugln('TComponentPalette.ComponentBtnDblClick ',TComponent(Sender).Name);
if SelectAButton(TSpeedButton(Sender)) and (FSelected<>nil) then begin if SelectAButton(TSpeedButton(Sender)) and (Selected<>nil) then begin
if FormEditingHook<>nil then begin if FormEditingHook<>nil then begin
TypeClass:=FSelected.ComponentClass; TypeClass:=Selected.ComponentClass;
if assigned(FSelected.OnGetCreationClass) then if assigned(Selected.OnGetCreationClass) then
FSelected.OnGetCreationClass(Self,TypeClass); Selected.OnGetCreationClass(Self,TypeClass);
if TypeClass=nil then exit; if TypeClass=nil then exit;
ParentComp:=FormEditingHook.GetDefaultComponentParent(TypeClass); ParentComp:=FormEditingHook.GetDefaultComponentParent(TypeClass);
if ParentComp=nil then exit; if ParentComp=nil then exit;
@ -702,7 +700,7 @@ var
begin begin
for i:=0 to Pages.Count-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 (Selected=nil) or (Selected.RealPage<>CurPage) then begin
SelectButtonOnPage:=TSpeedButton(TComponentPage(CurPage).SelectButton); SelectButtonOnPage:=TSpeedButton(TComponentPage(CurPage).SelectButton);
if SelectButtonOnPage<>nil then if SelectButtonOnPage<>nil then
SelectButtonOnPage.Down:=true; SelectButtonOnPage.Down:=true;
@ -710,39 +708,26 @@ begin
end; end;
end; end;
procedure TComponentPalette.SetSelected(const AValue: TRegisteredComponent); procedure TComponentPalette.SelectionWasChanged;
var var
Sheet: TTabSheet; Sheet: TTabSheet;
i: Integer; i: Integer;
begin begin
if FSelected=AValue then exit;
FSelected:=AValue;
if FSelected<>nil then begin
if (FSelected.RealPage=nil) or (FSelected.RealPage.Palette<>Self)
or (not FSelected.Visible)
or (not FSelected.CanBeCreatedInDesigner) then
FSelected:=nil;
end;
if FPageControl=nil then exit; if FPageControl=nil then exit;
UnselectAllButtons; UnselectAllButtons;
if FSelected=nil then exit; if Selected=nil then exit;
Assert(Assigned(FSelected.RealPage), 'TComponentPalette.SetSelected: FSelected.RealPage = Nil.'); Assert(Assigned(Selected.RealPage), 'TComponentPalette.SelectionWasChanged: Selected.RealPage = Nil.');
Sheet:=(FSelected.RealPage as TComponentPage).PageComponent as TTabSheet; Sheet:=(Selected.RealPage as TComponentPage).PageComponent as TTabSheet;
{$IFDEF VerboseComponentPalette} {$IFDEF VerboseComponentPalette}
DebugLn(['TComponentPalette.SetSelected: Setting FPageControl.ActivePage index ',Sheet.PageIndex]); DebugLn(['TComponentPalette.SelectionWasChanged: Setting FPageControl.ActivePage index ',Sheet.PageIndex]);
{$ENDIF} {$ENDIF}
// Switch to the new page // Switch to the new page
FPageControl.ActivePage:=Sheet; FPageControl.ActivePage:=Sheet;
// Build the GUI layout for this page if not done yet. // Build the GUI layout for this page if not done yet.
if not fComponentButtons.Find(FSelected.ComponentClass.ClassName, i) then if not fComponentButtons.Find(Selected.ComponentClass.ClassName, i) then
ReAlignButtons(FPageControl.ActivePage); ReAlignButtons(FPageControl.ActivePage);
// Select button // Select button
fComponentButtons[FSelected.ComponentClass.ClassName].Down := true; fComponentButtons[Selected.ComponentClass.ClassName].Down := true;
end;
function TComponentPalette.GetSelected: TRegisteredComponent;
begin
Result:=FSelected;
end; end;
procedure TComponentPalette.CreatePopupMenu; procedure TComponentPalette.CreatePopupMenu;
@ -827,6 +812,7 @@ begin
fComponentButtons.Sorted:=True; fComponentButtons.Sorted:=True;
OnComponentIsInvisible:=@CheckComponentDesignerVisible; OnComponentIsInvisible:=@CheckComponentDesignerVisible;
{IDEComponentPalette.} AddHandlerComponentAdded(@ComponentWasAdded); {IDEComponentPalette.} AddHandlerComponentAdded(@ComponentWasAdded);
{IDEComponentPalette.} AddHandlerSelectionChanged(@SelectionWasChanged);
ComponentPageClass := TComponentPage; // Used by CreatePagesFromUserOrder ComponentPageClass := TComponentPage; // Used by CreatePagesFromUserOrder
end; end;