Designer: synchronize Tab Order tree selection with Designer selection

git-svn-id: trunk@30401 -
This commit is contained in:
juha 2011-04-20 12:46:18 +00:00
parent 35ce2fc218
commit 47e46eae59

View File

@ -53,11 +53,13 @@ type
procedure SwapNodes(ANode1, ANode2: TTreeNode);
procedure CheckButtonsEnabled;
procedure CreateNodes(ParentControl: TWinControl; ParentNode: TTreeNode);
procedure Refresh(Force: boolean);
procedure RefreshTree;
procedure OnSomethingChanged;
procedure OnPersistentAdded(APersistent: TPersistent; Select: boolean);
procedure OnPersistentDeleting(APersistent: TPersistent);
procedure OnDeletePersistent(var APersistent: TPersistent);
procedure OnSetSelection(const ASelection: TPersistentSelectionList);
procedure OnRefreshPropertyValues;
end;
{ TTabOrderPropEditor }
@ -86,14 +88,26 @@ begin
GlobalDesignHook.AddHandlerPersistentAdded(@OnPersistentAdded);
GlobalDesignHook.AddHandlerPersistentDeleting(@OnPersistentDeleting);
GlobalDesignHook.AddHandlerDeletePersistent(@OnDeletePersistent);
GlobalDesignHook.AddHandlerSetSelection(@OnSetSelection);
GlobalDesignHook.AddHandlerRefreshPropertyValues(@OnRefreshPropertyValues);
ArrowDown.LoadGlyphFromLazarusResource('arrow_down');
ArrowUp.LoadGlyphFromLazarusResource('arrow_up');
end;
procedure TTabOrderDialog.FormShow(Sender: TObject);
var
Sel: TPersistentSelectionList;
begin
Refresh(true);
RefreshTree;
Sel := TPersistentSelectionList.Create;
try
GlobalDesignHook.GetSelection(Sel);
OnSetSelection(Sel);
finally
Sel.Free;
end;
CheckButtonsEnabled;
end;
procedure TTabOrderDialog.ItemTreeviewClick(Sender: TObject);
@ -150,6 +164,7 @@ begin
end;
procedure TTabOrderDialog.CreateNodes(ParentControl: TWinControl; ParentNode: TTreeNode);
// Add all controls in Designer to ItemTreeview.
var
AControl: TControl;
i, CurTab: integer;
@ -167,7 +182,7 @@ begin
for i := 0 to ParentControl.ControlCount - 1 do
begin
AControl := ParentControl.Controls[i];
// skip non TWinControls and ivisible for designer controls
// skip non TWinControls and invisible form designer controls
if not (AControl is TWinControl) or (csNoDesignVisible in AControl.ControlStyle) then
continue;
AWinControl := TWinControl(AControl);
@ -188,11 +203,11 @@ begin
ItemTreeview.EndUpdate;
end;
procedure TTabOrderDialog.Refresh(Force: boolean);
procedure TTabOrderDialog.RefreshTree;
var
LookupRoot: TPersistent;
begin
if Force or IsVisible and not FUpdating then
if IsVisible and not FUpdating then
begin
FUpdating := true;
ItemTreeview.BeginUpdate;
@ -202,7 +217,6 @@ begin
if Assigned(LookupRoot) and (LookupRoot is TWinControl) then begin
CreateNodes(TWinControl(LookupRoot), nil);
Caption := Format(lisTabOrderOf, [TWinControl(LookupRoot).Name]);
CheckButtonsEnabled;
end;
finally
ItemTreeview.EndUpdate;
@ -213,23 +227,55 @@ end;
procedure TTabOrderDialog.OnSomethingChanged;
begin
Refresh(false);
RefreshTree;
CheckButtonsEnabled;
end;
procedure TTabOrderDialog.OnPersistentAdded(APersistent: TPersistent; Select: boolean);
begin
Refresh(false);
RefreshTree;
CheckButtonsEnabled;
end;
procedure TTabOrderDialog.OnPersistentDeleting(APersistent: TPersistent);
begin
Refresh(false);
RefreshTree;
CheckButtonsEnabled;
end;
procedure TTabOrderDialog.OnDeletePersistent(var APersistent: TPersistent);
begin
ShowMessage('TTabOrderDialog.OnDeletePersistent is never called for some reason!');
Refresh(false);
RefreshTree;
CheckButtonsEnabled;
end;
procedure TTabOrderDialog.OnSetSelection(const ASelection: TPersistentSelectionList);
// Select item also in TreeView when selection in Designer changes.
var
Ctrl: TPersistent;
Node: TTreeNode;
begin
// ToDo: support also multiply selections.
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;
end;
ItemTreeview.EndUpdate;
end;
procedure TTabOrderDialog.OnRefreshPropertyValues;
begin
DebugLn('OnRefreshPropertyValues: ... never happens');
end;
{ TTabOrderPropEditor }