mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-11-26 11:27:20 +01:00
IdeIntf: Update also an associated Collection after deleting a component node from OI's TreeView. Issue #38235.
git-svn-id: trunk@64273 -
This commit is contained in:
parent
323a21ee2b
commit
a28aa70a44
@ -707,9 +707,24 @@ begin
|
|||||||
EndUpdate;
|
EndUpdate;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function FindCollectionNode(ANode: TTreeNode): TTreeNode;
|
||||||
|
begin
|
||||||
|
ANode := ANode.GetFirstChild;
|
||||||
|
while Assigned(ANode) do
|
||||||
|
begin
|
||||||
|
DebugLn(['FindCollectionNode: Testing node ', TPersistent(ANode.Data)]);
|
||||||
|
if TObject(ANode.Data) is TOwnedCollection then
|
||||||
|
Exit(ANode);
|
||||||
|
ANode := ANode.GetNextSibling;
|
||||||
|
end;
|
||||||
|
Result := Nil;
|
||||||
|
end;
|
||||||
|
|
||||||
function TComponentTreeView.FindAndChange(APers: TPersistent;
|
function TComponentTreeView.FindAndChange(APers: TPersistent;
|
||||||
ZOrderDel: TZOrderDelete): Boolean;
|
ZOrderDel: TZOrderDelete): Boolean;
|
||||||
// APers is Component to be moved or deleted based on ZOrderDel value.
|
// APers is Component to be moved or deleted based on ZOrderDel value.
|
||||||
|
var
|
||||||
|
DoneChange: Boolean;
|
||||||
|
|
||||||
procedure ChangeNode(ANode: TTreeNode);
|
procedure ChangeNode(ANode: TTreeNode);
|
||||||
// Change ZOrder of the given node or delete it.
|
// Change ZOrder of the given node or delete it.
|
||||||
@ -741,21 +756,36 @@ function TComponentTreeView.FindAndChange(APers: TPersistent;
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function IterateTree(ANode: TTreeNode): Boolean;
|
procedure IterateTree(ANode: TTreeNode);
|
||||||
|
var
|
||||||
|
CollNode: TTreeNode;
|
||||||
begin
|
begin
|
||||||
if TObject(ANode.Data)=APers then
|
if TObject(ANode.Data)=APers then
|
||||||
begin
|
begin
|
||||||
ChangeNode(ANode);
|
ChangeNode(ANode);
|
||||||
Exit(True); // Found and changed.
|
DoneChange := True;
|
||||||
|
Exit; // Found and changed.
|
||||||
end;
|
end;
|
||||||
ANode := ANode.GetFirstChild;
|
ANode := ANode.GetFirstChild;
|
||||||
while ANode<>nil do
|
while Assigned(ANode) and not DoneChange do
|
||||||
begin
|
begin
|
||||||
Result := IterateTree(ANode); // Recursive call.
|
IterateTree(ANode); // Recursive call.
|
||||||
if Result then Exit; // Found in a child item. Don't search more.
|
if DoneChange then
|
||||||
|
begin
|
||||||
|
// After a node was changed, search a Collection from its siblings and
|
||||||
|
// rebuild its items if found. Needed for FlowPanel.ControlList at least.
|
||||||
|
CollNode := FindCollectionNode(ANode);
|
||||||
|
if Assigned(CollNode) then
|
||||||
|
begin
|
||||||
|
DebugLn(['IterateTree: Rebuilding Collection node ', TOwnedCollection(CollNode.Data)]);
|
||||||
|
CollNode.DeleteChildren;
|
||||||
|
BuildComponentNodes(False);
|
||||||
|
CollNode.Expand(False);
|
||||||
|
end;
|
||||||
|
Exit; // Found in a child item. Don't search more.
|
||||||
|
end;
|
||||||
ANode := ANode.GetNextSibling;
|
ANode := ANode.GetNextSibling;
|
||||||
end;
|
end;
|
||||||
Result := False;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -763,7 +793,9 @@ begin
|
|||||||
Assert(Assigned(APers), 'TComponentTreeView.FindAndChangeItem: APers=Nil.');
|
Assert(Assigned(APers), 'TComponentTreeView.FindAndChangeItem: APers=Nil.');
|
||||||
Assert(Items.GetFirstNode.GetNextSibling=Nil,
|
Assert(Items.GetFirstNode.GetNextSibling=Nil,
|
||||||
'TComponentTreeView.FindAndChange: Top node has siblings.');
|
'TComponentTreeView.FindAndChange: Top node has siblings.');
|
||||||
Result := IterateTree(Items.GetFirstNode);
|
DoneChange := False;
|
||||||
|
IterateTree(Items.GetFirstNode);
|
||||||
|
Result := DoneChange;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TComponentTreeView.ChangeCompZOrder(APersistent: TPersistent;
|
procedure TComponentTreeView.ChangeCompZOrder(APersistent: TPersistent;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user