IDE: Update ComponentList after component visibility in Palette changed. Issue #23541.

This commit is contained in:
Juha 2021-11-24 03:31:08 +02:00
parent 163a3a2018
commit cbc97e5a03
3 changed files with 69 additions and 47 deletions

View File

@ -190,9 +190,10 @@ type
{ TBaseComponentPalette } { TBaseComponentPalette }
TComponentPaletteHandlerType = ( TComponentPaletteHandlerType = (
cphtUpdateVisible, // Visibility of component palette icons is recomputed cphtVoteVisibility, // 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 cphtSelectionChanged,
cphtUpdated
); );
TComponentSelectionMode = ( TComponentSelectionMode = (
@ -281,14 +282,17 @@ type
procedure DoAfterComponentAdded(ALookupRoot, AComponent: TComponent; procedure DoAfterComponentAdded(ALookupRoot, AComponent: TComponent;
ARegisteredComponent: TRegisteredComponent); virtual; ARegisteredComponent: TRegisteredComponent); virtual;
procedure DoAfterSelectionChanged; procedure DoAfterSelectionChanged;
procedure DoAfterUpdate;
procedure RemoveAllHandlersOfObject(AnObject: TObject); procedure RemoveAllHandlersOfObject(AnObject: TObject);
procedure AddHandlerUpdateVisible(const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent; procedure AddHandlerVoteVisibility(const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent;
AsLast: boolean = false); AsLast: boolean = false);
procedure RemoveHandlerUpdateVisible(OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent); procedure RemoveHandlerVoteVisibility(OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent);
procedure AddHandlerComponentAdded(OnComponentAddedEvent: TComponentAddedEvent); procedure AddHandlerComponentAdded(OnComponentAddedEvent: TComponentAddedEvent);
procedure RemoveHandlerComponentAdded(OnComponentAddedEvent: TComponentAddedEvent); procedure RemoveHandlerComponentAdded(OnComponentAddedEvent: TComponentAddedEvent);
procedure AddHandlerSelectionChanged(OnSelectionChangedEvent: TPaletteHandlerEvent); procedure AddHandlerSelectionChanged(OnSelectionChangedEvent: TPaletteHandlerEvent);
procedure RemoveHandlerSelectionChanged(OnSelectionChangedEvent: TPaletteHandlerEvent); procedure RemoveHandlerSelectionChanged(OnSelectionChangedEvent: TPaletteHandlerEvent);
procedure AddHandlerUpdated(OnUpdateEvent: TPaletteHandlerEvent);
procedure RemoveHandlerUpdated(OnUpdateEvent: TPaletteHandlerEvent);
public public
property Pages: TBaseComponentPageList read fPages; property Pages: TBaseComponentPageList read fPages;
property Comps: TRegisteredCompList read fComps; property Comps: TRegisteredCompList read fComps;
@ -1173,6 +1177,7 @@ procedure TBaseComponentPalette.Update(ForceUpdateAll: Boolean);
begin begin
fUserOrder.SortPagesAndCompsUserOrder; fUserOrder.SortPagesAndCompsUserOrder;
CreatePagesFromUserOrder; CreatePagesFromUserOrder;
DoAfterUpdate;
end; end;
procedure TBaseComponentPalette.IterateRegisteredClasses(Proc: TGetComponentClassEvent); procedure TBaseComponentPalette.IterateRegisteredClasses(Proc: TGetComponentClassEvent);
@ -1198,9 +1203,9 @@ begin
Vote:=1; Vote:=1;
if HideControls and AComponent.ComponentClass.InheritsFrom(TControl) then if HideControls and AComponent.ComponentClass.InheritsFrom(TControl) then
Dec(Vote); Dec(Vote);
i:=FHandlers[cphtUpdateVisible].Count; i:=FHandlers[cphtVoteVisibility].Count;
while FHandlers[cphtUpdateVisible].NextDownIndex(i) do while FHandlers[cphtVoteVisibility].NextDownIndex(i) do
TUpdateCompVisibleEvent(FHandlers[cphtUpdateVisible][i])(AComponent,Vote); TUpdateCompVisibleEvent(FHandlers[cphtVoteVisibility][i])(AComponent,Vote);
Result:=Vote>0; Result:=Vote>0;
AComponent.Visible:=Result; AComponent.Visible:=Result;
end; end;
@ -1224,6 +1229,15 @@ begin
TPaletteHandlerEvent(FHandlers[cphtSelectionChanged][i])(); TPaletteHandlerEvent(FHandlers[cphtSelectionChanged][i])();
end; end;
procedure TBaseComponentPalette.DoAfterUpdate;
var
i: Integer;
begin
i:=FHandlers[cphtUpdated].Count;
while FHandlers[cphtUpdated].NextDownIndex(i) do
TPaletteHandlerEvent(FHandlers[cphtUpdated][i])();
end;
procedure TBaseComponentPalette.RemoveAllHandlersOfObject(AnObject: TObject); procedure TBaseComponentPalette.RemoveAllHandlersOfObject(AnObject: TObject);
var var
HandlerType: TComponentPaletteHandlerType; HandlerType: TComponentPaletteHandlerType;
@ -1235,16 +1249,16 @@ end;
// Add / Remove handlers // Add / Remove handlers
// UpdateVisible // UpdateVisible
procedure TBaseComponentPalette.AddHandlerUpdateVisible( procedure TBaseComponentPalette.AddHandlerVoteVisibility(
const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent; AsLast: boolean); const OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent; AsLast: boolean);
begin begin
AddHandler(cphtUpdateVisible,TMethod(OnUpdateCompVisibleEvent),AsLast); AddHandler(cphtVoteVisibility,TMethod(OnUpdateCompVisibleEvent),AsLast);
end; end;
procedure TBaseComponentPalette.RemoveHandlerUpdateVisible( procedure TBaseComponentPalette.RemoveHandlerVoteVisibility(
OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent); OnUpdateCompVisibleEvent: TUpdateCompVisibleEvent);
begin begin
RemoveHandler(cphtUpdateVisible,TMethod(OnUpdateCompVisibleEvent)); RemoveHandler(cphtVoteVisibility,TMethod(OnUpdateCompVisibleEvent));
end; end;
// ComponentAdded // ComponentAdded
@ -1273,5 +1287,17 @@ begin
RemoveHandler(cphtSelectionChanged,TMethod(OnSelectionChangedEvent)); RemoveHandler(cphtSelectionChanged,TMethod(OnSelectionChangedEvent));
end; end;
procedure TBaseComponentPalette.AddHandlerUpdated(
OnUpdateEvent: TPaletteHandlerEvent);
begin
AddHandler(cphtUpdated,TMethod(OnUpdateEvent));
end;
procedure TBaseComponentPalette.RemoveHandlerUpdated(
OnUpdateEvent: TPaletteHandlerEvent);
begin
RemoveHandler(cphtUpdated,TMethod(OnUpdateEvent));
end;
end. end.

View File

@ -7,11 +7,10 @@ object ComponentListForm: TComponentListForm
ClientHeight = 467 ClientHeight = 467
ClientWidth = 300 ClientWidth = 300
KeyPreview = True KeyPreview = True
OnActivate = FormActivate
OnClose = FormClose OnClose = FormClose
OnKeyDown = FormKeyDown OnKeyDown = FormKeyDown
OnShow = FormShow OnShow = FormShow
LCLVersion = '1.9.0.0' LCLVersion = '2.3.0.0'
object PageControl: TPageControl object PageControl: TPageControl
Left = 0 Left = 0
Height = 397 Height = 397

View File

@ -74,7 +74,6 @@ type
TreeFilterEd: TTreeFilterEdit; TreeFilterEd: TTreeFilterEdit;
SelectionToolButton: TSpeedButton; SelectionToolButton: TSpeedButton;
procedure chbKeepOpenChange(Sender: TObject); procedure chbKeepOpenChange(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormShow(Sender: TObject); procedure FormShow(Sender: TObject);
procedure ListTreeSelectionChanged(Sender: TObject); procedure ListTreeSelectionChanged(Sender: TObject);
procedure miCollapseAllClick(Sender: TObject); procedure miCollapseAllClick(Sender: TObject);
@ -102,9 +101,9 @@ type
FAddCompNewLeft, FAddCompNewTop: Integer; FAddCompNewLeft, FAddCompNewTop: Integer;
FAddCompNewParent: TComponent; FAddCompNewParent: TComponent;
procedure ClearSelection; procedure ClearSelection;
procedure SelectionWasChanged;
procedure ComponentWasAdded({%H-}ALookupRoot, {%H-}AComponent: TComponent; procedure ComponentWasAdded({%H-}ALookupRoot, {%H-}AComponent: TComponent;
{%H-}ARegisteredComponent: TRegisteredComponent); {%H-}ARegisteredComponent: TRegisteredComponent);
procedure SelectionWasChanged;
procedure DoComponentInheritence(Comp: TRegisteredComponent); procedure DoComponentInheritence(Comp: TRegisteredComponent);
procedure UpdateComponents; procedure UpdateComponents;
procedure UpdateButtonState; procedure UpdateButtonState;
@ -158,14 +157,26 @@ begin
begin begin
UpdateComponents; UpdateComponents;
TreeFilterEd.InvalidateFilter; TreeFilterEd.InvalidateFilter;
IDEComponentPalette.AddHandlerSelectionChanged(@SelectionWasChanged);
IDEComponentPalette.AddHandlerComponentAdded(@ComponentWasAdded); IDEComponentPalette.AddHandlerComponentAdded(@ComponentWasAdded);
IDEComponentPalette.AddHandlerSelectionChanged(@SelectionWasChanged);
IDEComponentPalette.AddHandlerUpdated(@UpdateComponents);
end; end;
chbKeepOpen.Checked := EnvironmentOptions.ComponentListKeepOpen; chbKeepOpen.Checked := EnvironmentOptions.ComponentListKeepOpen;
PageControl.PageIndex := EnvironmentOptions.ComponentListPageIndex; PageControl.PageIndex := EnvironmentOptions.ComponentListPageIndex;
PageControlChange(Nil); PageControlChange(Nil);
end; end;
destructor TComponentListForm.Destroy;
begin
if Assigned(IDEComponentPalette) then begin
IDEComponentPalette.RemoveHandlerUpdated(@UpdateComponents);
IDEComponentPalette.RemoveHandlerSelectionChanged(@SelectionWasChanged);
IDEComponentPalette.RemoveHandlerComponentAdded(@ComponentWasAdded);
end;
ComponentListForm := nil;
inherited Destroy;
end;
procedure TComponentListForm.AddSelectedComponent; procedure TComponentListForm.AddSelectedComponent;
var var
AComponent: TRegisteredComponent; AComponent: TRegisteredComponent;
@ -214,14 +225,6 @@ begin
EnvironmentOptions.ComponentListKeepOpen := chbKeepOpen.Checked; EnvironmentOptions.ComponentListKeepOpen := chbKeepOpen.Checked;
end; end;
destructor TComponentListForm.Destroy;
begin
if Assigned(IDEComponentPalette) then
IDEComponentPalette.RemoveHandlerComponentAdded(@ComponentWasAdded);
ComponentListForm := nil;
inherited Destroy;
end;
procedure TComponentListForm.FormShow(Sender: TObject); procedure TComponentListForm.FormShow(Sender: TObject);
begin begin
//DebugLn(['*** TComponentListForm.FormShow, Parent=', Parent, ', Parent.Parent=', ParentParent]); //DebugLn(['*** TComponentListForm.FormShow, Parent=', Parent, ', Parent.Parent=', ParentParent]);
@ -238,12 +241,6 @@ begin
PageControl.AnchorSideBottom.Side := asrBottom; PageControl.AnchorSideBottom.Side := asrBottom;
end; end;
procedure TComponentListForm.FormActivate(Sender: TObject);
begin
if Assigned(IDEComponentPalette) and (IDEComponentPalette.ChangeStamp<>PrevChangeStamp) then
UpdateComponents;
end;
procedure TComponentListForm.ClearSelection; procedure TComponentListForm.ClearSelection;
begin begin
ListTree.Selected := Nil; ListTree.Selected := Nil;
@ -265,22 +262,6 @@ begin
aTree.Selected.MakeVisible; aTree.Selected.MakeVisible;
end; end;
procedure TComponentListForm.SelectionWasChanged;
begin
SelectionToolButton.Down := (IDEComponentPalette.Selected = nil);
// ToDo: Select the component in active treeview.
if FIgnoreSelection then
Exit;
if ListTree.IsVisible then
SelectTreeComp(ListTree)
else if PalletteTree.IsVisible then
SelectTreeComp(PalletteTree)
else if InheritanceTree.IsVisible then
SelectTreeComp(InheritanceTree)
end;
function GetSelectedTreeComp(aTree: TTreeView): TRegisteredComponent; function GetSelectedTreeComp(aTree: TTreeView): TRegisteredComponent;
begin begin
if Assigned(aTree.Selected) then if Assigned(aTree.Selected) then
@ -312,6 +293,20 @@ begin
UpdateButtonState; UpdateButtonState;
end; end;
procedure TComponentListForm.SelectionWasChanged;
begin
SelectionToolButton.Down := (IDEComponentPalette.Selected = nil);
// ToDo: Select the component in active treeview.
if FIgnoreSelection then
Exit;
if ListTree.IsVisible then
SelectTreeComp(ListTree)
else if PalletteTree.IsVisible then
SelectTreeComp(PalletteTree)
else if InheritanceTree.IsVisible then
SelectTreeComp(InheritanceTree)
end;
procedure TComponentListForm.UpdateButtonState; procedure TComponentListForm.UpdateButtonState;
begin begin
OKButton.Enabled := Assigned(GetSelectedComponent); OKButton.Enabled := Assigned(GetSelectedComponent);
@ -410,12 +405,14 @@ begin
for i := 0 to IDEComponentPalette.Pages.Count-1 do for i := 0 to IDEComponentPalette.Pages.Count-1 do
begin begin
Pg := IDEComponentPalette.Pages[i]; Pg := IDEComponentPalette.Pages[i];
if not Pg.Visible then Continue;
Comps := IDEComponentPalette.RefUserCompsForPage(Pg.PageName); Comps := IDEComponentPalette.RefUserCompsForPage(Pg.PageName);
// Palette layout Page header // Palette layout Page header
ParentNode := PalletteTree.Items.AddChild(nil, Pg.PageName); ParentNode := PalletteTree.Items.AddChild(nil, Pg.PageName);
// Iterate components of one page // Iterate components of one page
for j := 0 to Comps.Count-1 do begin for j := 0 to Comps.Count-1 do begin
Comp := Comps[j]; Comp := Comps[j];
if not Comp.Visible then Continue;
// Flat list item // Flat list item
AListNode := ListTree.Items.AddChildObject(Nil, Comp.ComponentClass.ClassName, Comp); AListNode := ListTree.Items.AddChildObject(Nil, Comp.ComponentClass.ClassName, Comp);
// Palette layout item // Palette layout item