From 23bec6671cfb019bcd2f16a036c0aa5c8c1ab325 Mon Sep 17 00:00:00 2001 From: maxim Date: Thu, 25 Jun 2015 20:38:58 +0000 Subject: [PATCH] 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 - --- designer/taborderdlg.pas | 48 +++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/designer/taborderdlg.pas b/designer/taborderdlg.pas index 89a78de768..d0fc841046 100644 --- a/designer/taborderdlg.pas +++ b/designer/taborderdlg.pas @@ -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