diff --git a/lcl/controls.pp b/lcl/controls.pp index b143e19e52..ccde7934d4 100644 --- a/lcl/controls.pp +++ b/lcl/controls.pp @@ -539,7 +539,7 @@ type function Dragging(AControl: TControl): boolean; virtual;abstract; procedure RegisterDockSite(Site: TWinControl; DoRegister: Boolean); virtual;abstract; - procedure DragStart(AControl: TControl; AImmediate: Boolean; AThreshold: Integer);virtual;abstract; + procedure DragStart(AControl: TControl; AImmediate: Boolean; AThreshold: Integer; StartFromCurrentMouse:Boolean=False);virtual;abstract; procedure DragMove(APosition: TPoint); virtual;abstract; procedure DragStop(ADrop: Boolean); virtual;abstract; diff --git a/lcl/include/controlbar.inc b/lcl/include/controlbar.inc index ea1007e928..14ca2cd075 100644 --- a/lcl/include/controlbar.inc +++ b/lcl/include/controlbar.inc @@ -278,7 +278,7 @@ begin if assigned(AControl) and assigned(FOnBandDrag) then FOnBandDrag(self, AControl, Result); if Result then - DragManager.DragStart(AControl, True, -1); + DragManager.DragStart(AControl, True, -1, True); end; procedure TCustomControlBar.DragOver(Source: TObject; X, Y: Integer; State: TDragState; diff --git a/lcl/include/coolbar.inc b/lcl/include/coolbar.inc index f5ed505799..cc83af4ec9 100644 --- a/lcl/include/coolbar.inc +++ b/lcl/include/coolbar.inc @@ -936,7 +936,7 @@ begin aRect := ClientRect; InflateRect(aRect, cUserDragArea, cUserDragArea); if not PtInRect(aRect, Point(X, Y)) then - DragManager.DragStart(FVisiBands[FDraggedBandIndex].Control, True, -1); + DragManager.DragStart(FVisiBands[FDraggedBandIndex].Control, True, -1, True); end; end; end; diff --git a/lcl/include/customdockform.inc b/lcl/include/customdockform.inc index 4330668614..d4c02e001d 100644 --- a/lcl/include/customdockform.inc +++ b/lcl/include/customdockform.inc @@ -15,9 +15,18 @@ { TCustomDockForm } procedure TCustomDockForm.DoAddDockClient(Client: TControl; const ARect: TRect); + procedure FixClientPlacing(Client: TControl); + begin + Client.BorderSpacing.Left:=0; + Client.BorderSpacing.Right:=0; + Client.BorderSpacing.Top:=0; + Client.BorderSpacing.Bottom:=0; + Client.BorderSpacing.Around:=0; + end; begin inherited DoAddDockClient(Client, ARect); Client.Align := alClient; + FixClientPlacing(Client); if ([csLoading,csDestroying]*ComponentState=[]) then Visible := True; end; diff --git a/lcl/include/dragmanager.inc b/lcl/include/dragmanager.inc index 0080a95004..58f6986897 100644 --- a/lcl/include/dragmanager.inc +++ b/lcl/include/dragmanager.inc @@ -95,7 +95,7 @@ type procedure RegisterDockSite(Site: TWinControl; DoRegister: Boolean);override; //The Drag and Drop routines - procedure DragStart(AControl: TControl; AImmediate: Boolean; AThreshold: Integer); override; + procedure DragStart(AControl: TControl; AImmediate: Boolean; AThreshold: Integer; StartFromCurrentMouse:Boolean=False); override; procedure DragMove(APosition: TPoint); override; procedure DragStop(ADropped: Boolean); override; @@ -595,6 +595,8 @@ begin end else DragMsg := dmDragDrop; + ADockObjectCopy.Control.Top:=0; + ADockObjectCopy.Control.Left:=0; SendDragMessage(ADockObjectCopy.DragTarget, DragMsg, ADockObjectCopy, ADockObjectCopy.DragTarget, ADockObjectCopy.DragPos); end; @@ -639,7 +641,7 @@ begin Result := FPerformer.Dragging(AControl) end; -procedure TDragManagerDefault.DragStart(AControl: TControl; AImmediate: Boolean; AThreshold: Integer); +procedure TDragManagerDefault.DragStart(AControl: TControl; AImmediate: Boolean; AThreshold: Integer; StartFromCurrentMouse:Boolean=False); //Start a drag operation begin if FPerformer = nil then @@ -649,7 +651,10 @@ begin else FThresholdValue := DragThreshold; FWaitForTreshold := not AImmediate; - GetCursorPos(FStartPosition); + if StartFromCurrentMouse then + FStartPosition:=AControl.ClientToScreen(point(0,0)) + else + GetCursorPos(FStartPosition); AControl.BeforeDragStart;