From c5898737435e3bb0cda23cee867d513b4a6df371 Mon Sep 17 00:00:00 2001 From: juha Date: Sun, 30 Nov 2014 13:13:08 +0000 Subject: [PATCH] Designer, OI: Synchronize z-order changes. Issue #20450, patch from Mike Thompson. git-svn-id: trunk@47039 - --- components/ideintf/objectinspector.pp | 20 +++++++ designer/designer.pp | 75 ++++++++++----------------- 2 files changed, 46 insertions(+), 49 deletions(-) diff --git a/components/ideintf/objectinspector.pp b/components/ideintf/objectinspector.pp index 957b680a65..a63f7a2719 100644 --- a/components/ideintf/objectinspector.pp +++ b/components/ideintf/objectinspector.pp @@ -5320,6 +5320,7 @@ end; procedure TObjectInspectorDlg.DoZOrderItemClick(Sender: TObject); var Control: TControl; + NewSelection: TPersistentSelectionList; begin if not (Sender is TMenuItem) then Exit; if (Selection.Count <> 1) or @@ -5333,6 +5334,25 @@ begin 2: Control.Parent.SetControlIndex(Control, Control.Parent.GetControlIndex(Control) + 1); 3: Control.Parent.SetControlIndex(Control, Control.Parent.GetControlIndex(Control) - 1); end; + + // Ensure controls that belong to a container are rearranged if required. + Control.Parent.ReAlign; + + // Ensure the order of controls in the OI now reflects the new ZOrder + NewSelection := TPersistentSelectionList.Create; + try + NewSelection.ForceUpdate:=True; + NewSelection.Add(Control.Parent); + SetSelection(NewSelection); + + NewSelection.Clear; + NewSelection.ForceUpdate:=True; + NewSelection.Add(Control); + SetSelection(NewSelection); + finally + NewSelection.Free; + end; + DoModified(Self); end; diff --git a/designer/designer.pp b/designer/designer.pp index e5487c3b98..ae5b591bc5 100644 --- a/designer/designer.pp +++ b/designer/designer.pp @@ -217,10 +217,7 @@ type procedure DoShowTabOrderEditor; procedure DoShowChangeClassDialog; procedure DoShowObjectInspector; - procedure DoOrderMoveSelectionToFront; - procedure DoOrderMoveSelectionToBack; - procedure DoOrderForwardSelectionOne; - procedure DoOrderBackSelectionOne; + procedure DoChangeZOrder(TheAction: Integer); procedure GiveComponentsNames; procedure NotifyPersistentAdded(APersistent: TPersistent); @@ -1421,25 +1418,7 @@ begin OnShowObjectInspector(Self); end; -procedure TDesigner.DoOrderMoveSelectionToFront; -begin - if ControlSelection.Count <> 1 then Exit; - if not ControlSelection[0].IsTControl then Exit; - - TControl(ControlSelection[0].Persistent).BringToFront; - Modified; -end; - -procedure TDesigner.DoOrderMoveSelectionToBack; -begin - if ControlSelection.Count <> 1 then Exit; - if not ControlSelection[0].IsTControl then Exit; - - TControl(ControlSelection[0].Persistent).SendToBack; - Modified; -end; - -procedure TDesigner.DoOrderForwardSelectionOne; +procedure TDesigner.DoChangeZOrder(TheAction: Integer); var Control: TControl; Parent: TWinControl; @@ -1449,26 +1428,24 @@ begin Control := TControl(ControlSelection[0].Persistent); Parent := Control.Parent; - if Parent = nil then Exit; + if (Parent = nil) and (TheAction in [2, 3]) then Exit; - Parent.SetControlIndex(Control, Parent.GetControlIndex(Control) + 1); + case TheAction of + 0: Control.BringToFront; + 1: Control.SendToBack; + 2: Parent.SetControlIndex(Control, Parent.GetControlIndex(Control) + 1); + 3: Parent.SetControlIndex(Control, Parent.GetControlIndex(Control) - 1); + end; - Modified; -end; - -procedure TDesigner.DoOrderBackSelectionOne; -var - Control: TControl; - Parent: TWinControl; -begin - if ControlSelection.Count <> 1 then Exit; - if not ControlSelection[0].IsTControl then Exit; - - Control := TControl(ControlSelection[0].Persistent); - Parent := Control.Parent; - if Parent = nil then Exit; - - Parent.SetControlIndex(Control, Parent.GetControlIndex(Control) - 1); + // Ensure the order of controls in the OI now reflects the new ZOrder + // Unfortunately, if there is no parent, this code doesn't achieve a refresh + // of ComponentTree in the OI + if assigned(Parent) then + begin + Parent.ReAlign; + SelectOnlyThisComponent(Parent); + end; + SelectOnlyThisComponent(Control); Modified; end; @@ -1590,10 +1567,10 @@ begin ecDesignerCopy : CopySelection; ecDesignerCut : CutSelection; ecDesignerPaste : PasteSelection([cpsfFindUniquePositions]); - ecDesignerMoveToFront : DoOrderMoveSelectionToFront; - ecDesignerMoveToBack : DoOrderMoveSelectionToBack; - ecDesignerForwardOne : DoOrderForwardSelectionOne; - ecDesignerBackOne : DoOrderBackSelectionOne; + ecDesignerMoveToFront : DoChangeZOrder(0); + ecDesignerMoveToBack : DoChangeZOrder(1); + ecDesignerForwardOne : DoChangeZOrder(2); + ecDesignerBackOne : DoChangeZOrder(3); else Exit; end; @@ -4122,22 +4099,22 @@ end; procedure TDesigner.OnOrderMoveToFrontMenuClick(Sender: TObject); begin - DoOrderMoveSelectionToFront; + DoChangeZOrder(0); end; procedure TDesigner.OnOrderMoveToBackMenuClick(Sender: TObject); begin - DoOrderMoveSelectionToBack; + DoChangeZOrder(1); end; procedure TDesigner.OnOrderForwardOneMenuClick(Sender: TObject); begin - DoOrderForwardSelectionOne; + DoChangeZOrder(2); end; procedure TDesigner.OnOrderBackOneMenuClick(Sender: TObject); begin - DoOrderBackSelectionOne; + DoChangeZOrder(3); end; procedure TDesigner.HintTimer(Sender: TObject);