Designer: Update TabOrder component tree also when TabSheet is switched. Issue #30010.

git-svn-id: trunk@52633 -
This commit is contained in:
juha 2016-07-05 21:10:37 +00:00
parent 3852d2bd5e
commit 1f77a3c790

View File

@ -364,35 +364,34 @@ var
LookupRoot: TPersistent;
Candidates: TAvgLvlTree;
begin
if IsVisible and not FUpdating then
begin
FUpdating := true;
ItemTreeview.BeginUpdate;
try
ItemTreeview.Items.Clear;
LookupRoot := GlobalDesignHook.LookupRoot;
if Assigned(LookupRoot) and (LookupRoot is TWinControl) then begin
Candidates := TAvgLvlTree.Create;
try
CreateCandidates(TComponent(LookupRoot), Candidates);
CreateNodes(TWinControl(LookupRoot), nil, Candidates);
finally
Candidates.Free;
end;
Caption := Format(lisTabOrderOf, [TWinControl(LookupRoot).Name]);
end else
Caption := lisMenuViewTabOrder;
finally
ItemTreeview.EndUpdate;
FUpdating := false;
end;
if not IsVisible then Exit;
ItemTreeview.BeginUpdate;
try
ItemTreeview.Items.Clear;
LookupRoot := GlobalDesignHook.LookupRoot;
if Assigned(LookupRoot) and (LookupRoot is TWinControl) then begin
Candidates := TAvgLvlTree.Create;
try
CreateCandidates(TComponent(LookupRoot), Candidates);
CreateNodes(TWinControl(LookupRoot), nil, Candidates);
finally
Candidates.Free;
end;
Caption := Format(lisTabOrderOf, [TWinControl(LookupRoot).Name]);
end else
Caption := lisMenuViewTabOrder;
finally
ItemTreeview.EndUpdate;
end;
end;
procedure TTabOrderDialog.OnSomethingChanged;
begin
if FUpdating then Exit;
FUpdating := true;
RefreshTree;
CheckButtonsEnabled;
FUpdating := false;
end;
procedure TTabOrderDialog.OnPersistentAdded(APersistent: TPersistent; Select: boolean);
@ -413,27 +412,36 @@ end;
procedure TTabOrderDialog.OnSetSelection(const ASelection: TPersistentSelectionList);
// Select item also in TreeView when selection in Designer changes.
function FindSelection: TTreeNode;
var
Node: TTreeNode;
begin
Node := ItemTreeview.Items.GetFirstNode;
while Assigned(Node) do
begin
if Assigned(Node.Data)
and (ASelection.IndexOf(TPersistent(Node.Data)) >= 0) then
Exit(Node);
Node := Node.GetNext;
end;
Result := Nil;
end;
var
Ctrl: TPersistent;
Node: TTreeNode;
begin
// ToDo: support also multiply selections.
if FUpdating then Exit;
FUpdating := True;
ItemTreeview.BeginUpdate;
Node := ItemTreeview.Items.GetFirstNode;
while Assigned(Node) do begin
if Assigned(Node.Data) then begin
Ctrl := TPersistent(Node.Data);
Assert(Ctrl is TWinControl);
if ASelection.IndexOf(Ctrl) >= 0 then begin
ItemTreeview.Selected := Node;
Break;
end;
end;
Node := Node.GetNext;
Node := FindSelection;
if Node = Nil then
begin // Changing TabSheet in a PageControl does not trigger handlers
RefreshTree; // thus selection is not found -> refresh tree and try again.
Node := FindSelection;
end;
ItemTreeview.EndUpdate;
if Assigned(Node) then
ItemTreeview.Selected := Node;
FUpdating := False;
CheckButtonsEnabled;
end;