Merged revision(s) 49310 #663e1b5ca2 from trunk:

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

git-svn-id: branches/fixes_1_4@49444 -
This commit is contained in:
maxim 2015-06-25 20:38:58 +00:00
parent 9afc021050
commit 23bec6671c

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