TabOrder dialog: Prevent an extra item under EditButton. Issue #28191, patch from Ondrej Pokorny.

git-svn-id: trunk@49310 -
This commit is contained in:
juha 2015-06-10 09:02:57 +00:00
parent 5955e92f0c
commit 663e1b5ca2

View File

@ -33,7 +33,7 @@ interface
uses
Classes, SysUtils, Forms, Controls, Dialogs, Buttons, ComCtrls,
LCLType, PropEdits, IDEDialogs, LazarusIDEStrConsts;
LCLType, LCLProc, PropEdits, IDEDialogs, LazarusIDEStrConsts, AvgLvlTree;
type
@ -55,7 +55,9 @@ type
FUpdating: Boolean;
procedure SwapNodes(ANode1, ANode2, NewSelected: TTreeNode);
procedure CheckButtonsEnabled;
procedure CreateNodes(ParentControl: TWinControl; ParentNode: TTreeNode);
procedure CreateCandidates(OwnerComponent: TComponent; Candidates: TAvgLvlTree);
procedure CreateNodes(ParentControl: TWinControl; ParentNode: TTreeNode;
Candidates: TAvgLvlTree);
procedure RefreshTree;
procedure OnSomethingChanged;
procedure OnPersistentAdded(APersistent: TPersistent; Select: boolean);
@ -279,7 +281,32 @@ begin
SortByPositionButton.Enabled := Assigned(ItemTreeview.Items.GetFirstNode);
end;
procedure TTabOrderDialog.CreateNodes(ParentControl: TWinControl; ParentNode: TTreeNode);
procedure TTabOrderDialog.CreateCandidates(OwnerComponent: TComponent;
Candidates: TAvgLvlTree);
var
i: Integer;
AComponent: TComponent;
begin
if OwnerComponent = nil then Exit;
if csDestroying in OwnerComponent.ComponentState then exit;
for i := 0 to OwnerComponent.ComponentCount - 1 do
begin
AComponent := OwnerComponent.Components[i];
if csDestroying in AComponent.ComponentState then continue;
if Candidates.Find(AComponent)<>nil then
begin
DebugLn('WARNING: TTabOrderDialog.CreateCandidates doppelganger found ', AComponent.Name);
end
else
begin
Candidates.Add(AComponent);
if csInline in AComponent.ComponentState then
CreateCandidates(AComponent, Candidates);
end;
end;
end;
procedure TTabOrderDialog.CreateNodes(ParentControl: TWinControl; ParentNode: TTreeNode; Candidates: TAvgLvlTree);
// Add all controls in Designer to ItemTreeview.
var
AControl: TControl;
@ -299,7 +326,9 @@ begin
begin
AControl := ParentControl.Controls[i];
// skip non TWinControls and invisible form designer controls
if not (AControl is TWinControl) or (csNoDesignVisible in AControl.ControlStyle) then
if not (AControl is TWinControl) or (csNoDesignVisible in AControl.ControlStyle) or
not Assigned(Candidates.Find(AControl))
then
continue;
AWinControl := TWinControl(AControl);
CurTab := AWinControl.TabOrder;
@ -313,7 +342,7 @@ begin
NewNode := ItemTreeview.Items.AddChildObject(ParentNode, NodeText, AControl);
if (FirstSibling = nil) or (NewNode.GetPrevSibling = nil) then
FirstSibling := NewNode;
CreateNodes(AWinControl, NewNode);
CreateNodes(AWinControl, NewNode, Candidates);
NewNode.Expanded := True;
end;
ItemTreeview.EndUpdate;
@ -322,6 +351,7 @@ end;
procedure TTabOrderDialog.RefreshTree;
var
LookupRoot: TPersistent;
Candidates: TAvgLvlTree;
begin
if IsVisible and not FUpdating then
begin
@ -331,7 +361,13 @@ begin
ItemTreeview.Items.Clear;
LookupRoot := GlobalDesignHook.LookupRoot;
if Assigned(LookupRoot) and (LookupRoot is TWinControl) then begin
CreateNodes(TWinControl(LookupRoot), nil);
Candidates := TAvgLvlTree.Create;
try
CreateCandidates(TComponent(LookupRoot), Candidates);
CreateNodes(TWinControl(LookupRoot), nil, Candidates);
finally
Candidates.Free;
end;
Caption := Format(lisTabOrderOf, [TWinControl(LookupRoot).Name]);
end;
finally