diff --git a/lcl/controls.pp b/lcl/controls.pp index 5978022f7e..5b8583d014 100644 --- a/lcl/controls.pp +++ b/lcl/controls.pp @@ -1116,9 +1116,9 @@ type function ManualDock(NewDockSite: TWinControl; DropControl: TControl = nil; ControlSide: TAlign = alNone; - KeepDockSiteSize: Boolean = true): Boolean; + KeepDockSiteSize: Boolean = true): Boolean; dynamic; function ManualFloat(TheScreenRect: TRect; - KeepDockSiteSize: Boolean = true): Boolean; + KeepDockSiteSize: Boolean = true): Boolean; dynamic; function ReplaceDockedControl(Control: TControl; NewDockSite: TWinControl; DropControl: TControl; ControlSide: TAlign): Boolean; function Dragging: Boolean; @@ -1561,9 +1561,6 @@ type procedure DoChildSizingChange(Sender: TObject); virtual; procedure ResizeDelayedAutoSizeChildren; virtual; function CanTab: Boolean; override; - function DoDragMsg(ADragMessage: TDragMessage; APosition: TPoint; ADragObject: TDragObject; ATarget: TControl; ADocking: Boolean):LRESULT; override; - function DoDockClientMsg(DragDockObject: TDragDockObject; Position: TPoint): boolean; virtual; - function DoUndockClientMsg(NewTarget, Client: TControl):boolean; virtual; procedure CMShowingChanged(var Message: TLMessage); message CM_SHOWINGCHANGED; procedure CMVisibleChanged(var TheMessage: TLMessage); message CM_VISIBLECHANGED; procedure DoSendShowHideToInterface; virtual; @@ -1613,7 +1610,12 @@ type procedure CNSysKeyUp(var Message: TLMKeyUp); message CN_SYSKEYUP; procedure CNChar(var Message: TLMKeyUp); message CN_CHAR; protected - // drag and drop + // drag and drop/dock + function DoDragMsg(ADragMessage: TDragMessage; APosition: TPoint; + ADragObject: TDragObject; ATarget: + TControl; ADocking: Boolean): LRESULT; override; + function DoDockClientMsg(DragDockObject: TDragDockObject; Position: TPoint): boolean; virtual; + function DoUndockClientMsg(NewTarget, Client: TControl):boolean; virtual; procedure DoAddDockClient(Client: TControl; const ARect: TRect); dynamic; procedure DockOver(Source: TDragDockObject; X, Y: Integer; State: TDragState; var Accept: Boolean); dynamic; diff --git a/lcl/include/control.inc b/lcl/include/control.inc index 2e26bf4b8b..cb39cbf3db 100644 --- a/lcl/include/control.inc +++ b/lcl/include/control.inc @@ -3490,9 +3490,16 @@ function TControl.ManualFloat(TheScreenRect: TRect; var FloatHost: TWinControl; begin - // undock from old floating host dock site - Result := (HostDockSite=nil) - or HostDockSite.DoUndock(nil,Self,KeepDockSiteSize); + DebugLn(['TControl.ManualFloat ',DbgSName(Self)]); + // undock from old host dock site + if HostDockSite=nil then + begin + Result := true; + if Parent<>nil then + Parent.DoUndockClientMsg(nil,Self); + end else begin + Result := HostDockSite.DoUndock(nil,Self,KeepDockSiteSize); + end; // create new float dock site and dock this control into it. if Result then begin FloatHost := CreateFloatingDockSite(TheScreenRect); diff --git a/lcl/include/wincontrol.inc b/lcl/include/wincontrol.inc index eb895afb6a..9474fbaea8 100644 --- a/lcl/include/wincontrol.inc +++ b/lcl/include/wincontrol.inc @@ -6996,8 +6996,9 @@ end; function TWinControl.DoUnDockClientMsg(NewTarget, Client: TControl): boolean; begin Result := true; + DebugLn(['TWinControl.DoUnDockClientMsg ',DbgSName(Self),' ',DbgSName(Client),' ',DbgSName(Client.Parent)]); if FUseDockManager and (FDockManager <> nil) then - FDockManager.RemoveControl(Client) + FDockManager.RemoveControl(Client); end; {------------------------------------------------------------------------------ diff --git a/lcl/ldocktree.pas b/lcl/ldocktree.pas index c7f1b53c07..ca53df78d3 100644 --- a/lcl/ldocktree.pas +++ b/lcl/ldocktree.pas @@ -213,8 +213,6 @@ type procedure DeleteDockForm(ADockForm: TLazDockForm); function GetAnchorDepth(AControl: TControl; Side: TAnchorKind): Integer; function GetPreferredTitlePosition(AWidth, AHeight: integer): TAnchorKind; - procedure OnLazDockFormDragOver(Sender, Source: TObject; X, Y: Integer; - State: TDragState; var Accept: Boolean); public constructor Create; destructor Destroy; override; @@ -1521,32 +1519,6 @@ end; { TCustomAnchoredDockManager } -procedure TCustomAnchoredDockManager.OnLazDockFormDragOver(Sender, - Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); -var - Form: TLazDockForm; - DragCtrlObj: TDragControlObject; - SrcForm: TLazDockForm; -begin - Accept:=false; - //DebugLn(['TCustomAnchoredDockManager.CustomAnchoredDockManagerDragOver ',DbgSName(Sender),' ',DbgSName(Source)]); - if not (Sender is TLazDockForm) then exit; - Form:=TLazDockForm(Sender); - if Form.Owner<>FOwnerComponent then exit; - if (Source is TDragControlObject) then - begin - DragCtrlObj:=TDragControlObject(Source); - if DragCtrlObj.Control is TLazDockForm then - begin - SrcForm:=TLazDockForm(DragCtrlObj.Control); - end else - exit; - if SrcForm.Owner<>FOwnerComponent then exit; - end else - exit; - Accept:=true; -end; - procedure TCustomAnchoredDockManager.DeleteSideSplitter(Splitter: TLazDockSplitter; Side: TAnchorKind; NewAnchorControl: TControl); var @@ -2591,7 +2563,10 @@ end; function TCustomAnchoredDockManager.CreateForm: TLazDockForm; begin Result:=TLazDockForm.Create(FOwnerComponent); - Result.OnDragOver:=@OnLazDockFormDragOver; + {$IFDEF EnableAnchorDockManager} + Result.DockManager:=Self; + Result.UseDockManager:=true; + {$ENDIF} end; procedure TCustomAnchoredDockManager.ReplaceAnchoredControl(OldControl,