change formatting of dragmanager code

git-svn-id: trunk@13581 -
This commit is contained in:
paul 2008-01-02 16:05:00 +00:00
parent 0ced829a0f
commit 7bad8ae57d

View File

@ -138,7 +138,8 @@ begin
inherited Create(AManager, AControl); inherited Create(AManager, AControl);
AControl.DoStartDock(FDragObject); AControl.DoStartDock(FDragObject);
if FDragObject = nil then begin if FDragObject = nil then
begin
FDragObjectAutoFree := true; FDragObjectAutoFree := true;
FDragObject := TDragControlObject.Create(AControl); FDragObject := TDragControlObject.Create(AControl);
end; end;
@ -150,8 +151,7 @@ end;
destructor TDragPerformer.Destroy; destructor TDragPerformer.Destroy;
begin begin
FDragObject.Free; FreeAndNil(FDragObject);
FDragObject:=nil;
inherited Destroy; inherited Destroy;
end; end;
@ -163,11 +163,10 @@ end;
procedure TDragPerformer.DragStarted(APosition: TPoint); procedure TDragPerformer.DragStarted(APosition: TPoint);
//Imput device has moved beyond tresholt limits (or immediate docking) //Imput device has moved beyond tresholt limits (or immediate docking)
begin begin
if FDragObject=nil if FDragObject = nil then Exit;
then Exit;
FDragImageList := FDragObject.GetDragImages; FDragImageList := FDragObject.GetDragImages;
if FDragImageList <> nil if FDragImageList <> nil then
then FDragImageList.BeginDrag(0, APosition.X, APosition.Y); FDragImageList.BeginDrag(0, APosition.X, APosition.Y);
end; end;
procedure TDragPerformer.DragMove(APosition: TPoint); procedure TDragPerformer.DragMove(APosition: TPoint);
@ -175,25 +174,28 @@ var
ATarget: TControl; ATarget: TControl;
DragCursor: TCursor; DragCursor: TCursor;
begin begin
if FDragObject=nil if FDragObject = nil then
then Exit; Exit;
//Inform user of entering and leaving the area //Inform user of entering and leaving the area
ATarget := FindControlAtPosition(APosition,false); ATarget := FindControlAtPosition(APosition,false);
ATarget := TControl(SendDragMessage(ATarget,dmFindTarget,FDragObject,nil,APosition)); ATarget := TControl(SendDragMessage(ATarget,dmFindTarget,FDragObject,nil,APosition));
if ATarget <> FDragObject.DragTarget then begin if ATarget <> FDragObject.DragTarget then
begin
SendCmDragMsg(FDragObject, dmDragLeave); SendCmDragMsg(FDragObject, dmDragLeave);
FDragObject.DragTarget := TWinControl(ATarget); FDragObject.DragTarget := TWinControl(ATarget);
FDragObject.DragPos := APosition; FDragObject.DragPos := APosition;
SendCmDragMsg(FDragObject, dmDragEnter); SendCmDragMsg(FDragObject, dmDragEnter);
end end
else FDragObject.DragPos := APosition; else
FDragObject.DragPos := APosition;
//TODO: Need to rewrite this(or even delete it, back to the roots) //TODO: Need to rewrite this(or even delete it, back to the roots)
if FDragObject.DragTarget <> nil if FDragObject.DragTarget <> nil then
then FDragObject.DragTargetPos := FDragObject.DragTarget.ScreenToClient(APosition); FDragObject.DragTargetPos := FDragObject.DragTarget.ScreenToClient(APosition);
DragCursor := FDragObject.GetDragCursor(SendCmDragMsg(FDragObject, dmDragMove),APosition.X, APosition.Y); DragCursor := FDragObject.GetDragCursor(SendCmDragMsg(FDragObject, dmDragMove),APosition.X, APosition.Y);
if FDragImageList <> nil then begin if FDragImageList <> nil then
begin
if(ATarget = nil)or(csDisplayDragImage in ATarget.ControlStyle) then begin if(ATarget = nil)or(csDisplayDragImage in ATarget.ControlStyle) then begin
FDragImageList.DragCursor := DragCursor; FDragImageList.DragCursor := DragCursor;
if not FDragImageList.Dragging if not FDragImageList.Dragging
@ -213,39 +215,44 @@ var
TargetPos: TPoint; TargetPos: TPoint;
begin begin
ADragObjectCopy:=FDragObject; ADragObjectCopy:=FDragObject;
if FDragObject<>nil then try if FDragObject<>nil then
try
FDragObject := nil; FDragObject := nil;
SetCaptureControl(nil); SetCaptureControl(nil);
if FDragImageList <> nil if FDragImageList <> nil then
then FDragImageList.EndDrag; FDragImageList.EndDrag;
WidgetSet.SetCursor(Screen.Cursors[Screen.Cursor]); WidgetSet.SetCursor(Screen.Cursors[Screen.Cursor]);
if (ADragObjectCopy.DragTarget <> nil) and (ADragObjectCopy.DragTarget is TControl) if (ADragObjectCopy.DragTarget <> nil) and (ADragObjectCopy.DragTarget is TControl) then
then TargetPos := ADragObjectCopy.DragTargetPos //controls can override the position TargetPos := ADragObjectCopy.DragTargetPos //controls can override the position
else TargetPos := ADragObjectCopy.DragPos; //otherwise take the current position else
TargetPos := ADragObjectCopy.DragPos; //otherwise take the current position
Accepted := ADropped and SendCmDragMsg(ADragObjectCopy, dmDragLeave); Accepted := ADropped and SendCmDragMsg(ADragObjectCopy, dmDragLeave);
if ADragObjectCopy.DragTarget <> nil then begin if ADragObjectCopy.DragTarget <> nil then
if not Accepted then begin begin
if not Accepted then
begin
TargetPos.X := 0; TargetPos.X := 0;
TargetPos.Y := 0; TargetPos.Y := 0;
DragMsg := dmDragCancel; DragMsg := dmDragCancel;
ADragObjectCopy.DragPos:=Point(0,0); ADragObjectCopy.DragPos:=Point(0,0);
ADragObjectCopy.DragTarget := nil; ADragObjectCopy.DragTarget := nil;
end end
else DragMsg := dmDragDrop; else
DragMsg := dmDragDrop;
SendDragMessage(ADragObjectCopy.DragTarget, DragMsg, ADragObjectCopy, SendDragMessage(ADragObjectCopy.DragTarget, DragMsg, ADragObjectCopy,
ADragObjectCopy.DragTarget, ADragObjectCopy.DragPos); ADragObjectCopy.DragTarget, ADragObjectCopy.DragPos);
end; end;
if not Accepted if not Accepted then
then ADragObjectCopy.Control.DragCanceled; ADragObjectCopy.Control.DragCanceled;
ADragObjectCopy.Control.DoEndDrag(ADragObjectCopy.DragTarget, TargetPos.X, TargetPos.Y); ADragObjectCopy.Control.DoEndDrag(ADragObjectCopy.DragTarget, TargetPos.X, TargetPos.Y);
finally finally
//erase global variables (dragging stopped) //erase global variables (dragging stopped)
if FDragObjectAutoFree if FDragObjectAutoFree then
then ADragObjectCopy.Free; ADragObjectCopy.Free;
end; end;
end; end;
@ -259,7 +266,8 @@ var
begin begin
inherited Create(AManager, AControl); inherited Create(AManager, AControl);
AControl.DoStartDock(TDragObject(FDockObject)); AControl.DoStartDock(TDragObject(FDockObject));
if FDockObject = nil then begin if FDockObject = nil then
begin
FDragObjectAutoFree := true; FDragObjectAutoFree := true;
FDockObject := TDragDockObject.Create(AControl); FDockObject := TDragDockObject.Create(AControl);
end; end;
@ -274,8 +282,7 @@ end;
destructor TDockPerformer.Destroy; destructor TDockPerformer.Destroy;
begin begin
FDockObject.Free; FreeAndNil(FDockObject);
FDockObject:=nil;
inherited Destroy; inherited Destroy;
end; end;
@ -287,11 +294,11 @@ end;
procedure TDockPerformer.DragStarted(APosition: TPoint); procedure TDockPerformer.DragStarted(APosition: TPoint);
//Imput device has moved beyond tresholt (or immediate docking) //Imput device has moved beyond tresholt (or immediate docking)
begin begin
if FDockObject=nil if FDockObject = nil then
then Exit; Exit;
FDragImageList := FDockObject.GetDragImages; FDragImageList := FDockObject.GetDragImages;
if FDragImageList <> nil if FDragImageList <> nil then
then FDragImageList.BeginDrag(0, APosition.X, APosition.Y); FDragImageList.BeginDrag(0, APosition.X, APosition.Y);
DefaultDockImage(FDockObject.DockRect); DefaultDockImage(FDockObject.DockRect);
end; end;
@ -299,24 +306,31 @@ procedure TDockPerformer.DragMove(APosition: TPoint);
function GetDropControl: TControl; function GetDropControl: TControl;
//Select a control where the dragged control will be docked //Select a control where the dragged control will be docked
var ADragTarget: TWinControl; var
ADragTarget: TWinControl;
AControl: TControl; AControl: TControl;
i: integer; i: integer;
begin begin
Result := nil; Result := nil;
ADragTarget := TWinControl(FDockObject.DragTarget); ADragTarget := TWinControl(FDockObject.DragTarget);
if ADragTarget <> nil then begin if ADragTarget <> nil then
if ADragTarget.UseDockManager then begin begin
if ADragTarget.DockClientCount > 0 then begin if ADragTarget.UseDockManager then
begin
if ADragTarget.DockClientCount > 0 then
begin
//Did the user drop it on the same positon? //Did the user drop it on the same positon?
AControl := ADragTarget.DockClients[0]; AControl := ADragTarget.DockClients[0];
if (ADragTarget.DockClientCount = 1)and (AControl = FDockObject.Control) if (ADragTarget.DockClientCount = 1) and (AControl = FDockObject.Control) then
then Exit; Exit;
AControl := FindDragTarget(FDockObject.DragPos, false); AControl := FindDragTarget(FDockObject.DragPos, false);
while(AControl <> nil)and(AControl <> ADragTarget)do begin while (AControl <> nil) and (AControl <> ADragTarget) do
for i:=0 to ADragTarget.DockClientCount-1 do begin begin
if ADragTarget.DockClients[i]=AControl then begin for i := 0 to ADragTarget.DockClientCount-1 do
begin
if ADragTarget.DockClients[i]=AControl then
begin
Result := ADragTarget.DockClients[i]; Result := ADragTarget.DockClients[i];
Exit; Exit;
end; end;
@ -332,9 +346,11 @@ procedure TDockPerformer.DragMove(APosition: TPoint);
function IsControlChildOfClient(AControl:TWinControl): Boolean; function IsControlChildOfClient(AControl:TWinControl): Boolean;
begin begin
Result := False; Result := False;
while Assigned(AControl) do begin while Assigned(AControl) do
if AControl=FDockObject.Control then begin begin
Result:=true; if AControl=FDockObject.Control then
begin
Result := True;
exit; exit;
end; end;
AControl := AControl.Parent; AControl := AControl.Parent;
@ -344,7 +360,8 @@ procedure TDockPerformer.DragMove(APosition: TPoint);
function FindDockSiteAtPosition: TWinControl; function FindDockSiteAtPosition: TWinControl;
//Replace with lookup in Application.Zorder(?) //Replace with lookup in Application.Zorder(?)
var AControl: TWinControl; var
AControl: TWinControl;
CanDock: Boolean; CanDock: Boolean;
QualifyingSites: TList; QualifyingSites: TList;
ARect: TRect; ARect: TRect;
@ -354,7 +371,8 @@ procedure TDockPerformer.DragMove(APosition: TPoint);
QualifyingSites := TList.Create; QualifyingSites := TList.Create;
try try
for i:=0 to Manager.FDockSites.Count - 1 do begin for i := 0 to Manager.FDockSites.Count - 1 do
begin
AControl:=TWinControl(Manager.FDockSites[i]); AControl:=TWinControl(Manager.FDockSites[i]);
//Sanity checks.. //Sanity checks..
if not AControl.Showing then continue; if not AControl.Showing then continue;
@ -363,15 +381,17 @@ procedure TDockPerformer.DragMove(APosition: TPoint);
if AControl=FDockObject.Control then continue; if AControl=FDockObject.Control then continue;
if IsControlChildOfClient(AControl) then continue; if IsControlChildOfClient(AControl) then continue;
if (FDockObject.Control.HostDockSite <> AControl) or (AControl.VisibleDockClientCount > 1) then begin if (FDockObject.Control.HostDockSite <> AControl) or (AControl.VisibleDockClientCount > 1) then
begin
CanDock := True; CanDock := True;
AControl.GetSiteInfo(FDockObject.Control, ARect, APosition, CanDock); AControl.GetSiteInfo(FDockObject.Control, ARect, APosition, CanDock);
if CanDock and PtInRect(ARect, APosition) if CanDock and PtInRect(ARect, APosition) then
then QualifyingSites.Add(AControl); QualifyingSites.Add(AControl);
end; end;
end; end;
if QualifyingSites.Count > 0 then begin if QualifyingSites.Count > 0 then
begin
Result := TWinControl(QualifyingSites[0]); //.GetTopSite; TODO!!! Result := TWinControl(QualifyingSites[0]); //.GetTopSite; TODO!!!
//if not ValidDockTarget(Result) TODO!!! //if not ValidDockTarget(Result) TODO!!!
//then Result := nil; TODO!!! //then Result := nil; TODO!!!
@ -381,52 +401,64 @@ procedure TDockPerformer.DragMove(APosition: TPoint);
end; end;
end; end;
var ATarget: TControl; var
ATarget: TControl;
DragCursor: TCursor; DragCursor: TCursor;
begin begin
if FDockObject=nil if FDockObject = nil then
then Exit; Exit;
//Inform user of entering and leaving //Inform user of entering and leaving
ATarget := FindDockSiteAtPosition; ATarget := FindDockSiteAtPosition;
if ATarget <> FDockObject.DragTarget then begin if ATarget <> FDockObject.DragTarget then
begin
SendCmDragMsg(FDockObject, dmDragLeave); SendCmDragMsg(FDockObject, dmDragLeave);
FDockObject.DragTarget := TWinControl(ATarget); FDockObject.DragTarget := TWinControl(ATarget);
FDockObject.DragPos := APosition; FDockObject.DragPos := APosition;
SendCmDragMsg(FDockObject, dmDragEnter); SendCmDragMsg(FDockObject, dmDragEnter);
end end
else FDockObject.DragPos := APosition; else
FDockObject.DragPos := APosition;
if FDockObject.DragTarget <> nil if FDockObject.DragTarget <> nil then
then FDockObject.DragTargetPos := TControl(FDockObject.DragTarget).ScreenToClient(APosition); FDockObject.DragTargetPos := TControl(FDockObject.DragTarget).ScreenToClient(APosition);
DragCursor := FDockObject.GetDragCursor(SendCmDragMsg(FDockObject, dmDragMove),APosition.X, APosition.Y); DragCursor := FDockObject.GetDragCursor(SendCmDragMsg(FDockObject, dmDragMove),APosition.X, APosition.Y);
if FDragImageList <> nil then begin if FDragImageList <> nil then
if(ATarget = nil)or(csDisplayDragImage in ATarget.ControlStyle) then begin begin
if(ATarget = nil) or (csDisplayDragImage in ATarget.ControlStyle) then
begin
FDragImageList.DragCursor := DragCursor; FDragImageList.DragCursor := DragCursor;
if not FDragImageList.Dragging if not FDragImageList.Dragging then
then FDragImageList.BeginDrag(0, APosition.X, APosition.Y) FDragImageList.BeginDrag(0, APosition.X, APosition.Y)
else FDragImageList.DragMove(APosition.X, APosition.Y); else
FDragImageList.DragMove(APosition.X, APosition.Y);
end end
else FDragImageList.EndDrag; else
FDragImageList.EndDrag;
end; end;
WidgetSet.SetCursor(Screen.Cursors[DragCursor]); WidgetSet.SetCursor(Screen.Cursors[DragCursor]);
//Draw borders for the docking section or the boundaries of the dragged form //Draw borders for the docking section or the boundaries of the dragged form
with FDockObject do begin with FDockObject do
if DragTarget = nil begin
then FDockObject.Control.DockTrackNoTarget(TDragDockObject(FDockObject), APosition.X, APosition.Y) if DragTarget = nil then
else begin FDockObject.Control.DockTrackNoTarget(TDragDockObject(FDockObject), APosition.X, APosition.Y)
else
begin
DropOnControl := GetDropControl; DropOnControl := GetDropControl;
if DropOnControl = nil if DropOnControl = nil then
then with FDockObject do DropAlign := DragTarget.GetDockEdge(DragTargetPos) with FDockObject do
else DropAlign := DropOnControl.GetDockEdge(DropOnControl.ScreenToClient(APosition)); DropAlign := DragTarget.GetDockEdge(DragTargetPos)
else
DropAlign := DropOnControl.GetDockEdge(DropOnControl.ScreenToClient(APosition));
end; end;
//Draw the form outlines when the position has changed //Draw the form outlines when the position has changed
if not CompareMem(@DockRect, @EraseDockRect, SizeOf(TRect)) then begin if not CompareMem(@DockRect, @EraseDockRect, SizeOf(TRect)) then
if EraseDockRect.Left<>Maxint begin
then DefaultDockImage(FDockObject.EraseDockRect); if EraseDockRect.Left <> Maxint then
DefaultDockImage(FDockObject.EraseDockRect);
DefaultDockImage(FDockObject.DockRect); DefaultDockImage(FDockObject.DockRect);
EraseDockRect := DockRect; EraseDockRect := DockRect;
end; end;
@ -434,14 +466,16 @@ begin
end; end;
procedure TDockPerformer.DragStop(ADropped: Boolean); procedure TDockPerformer.DragStop(ADropped: Boolean);
var ADockObjectCopy:TDragDockObject; var
ADockObjectCopy: TDragDockObject;
ParentForm: TCustomForm; ParentForm: TCustomForm;
DragMsg: TDragMessage; DragMsg: TDragMessage;
Accepted: Boolean; Accepted: Boolean;
TargetPos: TPoint; TargetPos: TPoint;
begin begin
ADockObjectCopy := FDockObject; ADockObjectCopy := FDockObject;
if FDockObject <> nil then try if FDockObject <> nil then
try
FDockObject := nil; FDockObject := nil;
SetCaptureControl(nil); SetCaptureControl(nil);
@ -449,52 +483,63 @@ begin
ADockObjectCopy.Floating := ADockObjectCopy.DragTarget = nil; ADockObjectCopy.Floating := ADockObjectCopy.DragTarget = nil;
Accepted := ADockObjectCopy.DragTarget <> nil; Accepted := ADockObjectCopy.DragTarget <> nil;
if ADropped then begin if ADropped then
if ADockObjectCopy.Control.HostDockSite <> nil begin
then Accepted := ADockObjectCopy.Control.HostDockSite.DoUnDock(TWinControl(ADockObjectCopy.DragTarget), ADockObjectCopy.Control) if ADockObjectCopy.Control.HostDockSite <> nil then
else if ADockObjectCopy.DragTarget = nil Accepted := ADockObjectCopy.Control.HostDockSite.DoUnDock(TWinControl(ADockObjectCopy.DragTarget), ADockObjectCopy.Control)
then Accepted := true else
else if ADockObjectCopy.Control.HostDockSite = nil if ADockObjectCopy.DragTarget = nil then
then Accepted := true; Accepted := True else
if ADockObjectCopy.Control.HostDockSite = nil then
Accepted := True;
end; end;
if (ADockObjectCopy.DragTarget <> nil) and (ADockObjectCopy.DragTarget is TControl) if (ADockObjectCopy.DragTarget <> nil) and
then TargetPos := ADockObjectCopy.DragTargetPos //controls can override the position (ADockObjectCopy.DragTarget is TControl) then
else TargetPos := ADockObjectCopy.DragPos; //otherwise take the current position TargetPos := ADockObjectCopy.DragTargetPos //controls can override the position
else
TargetPos := ADockObjectCopy.DragPos; //otherwise take the current position
Accepted := Accepted and (ADockObjectCopy.Floating or SendCmDragMsg(ADockObjectCopy, dmDragLeave)) and ADropped; Accepted := Accepted and (ADockObjectCopy.Floating or SendCmDragMsg(ADockObjectCopy, dmDragLeave)) and ADropped;
if Accepted and ADockObjectCopy.Floating then begin if Accepted and ADockObjectCopy.Floating then
begin
ParentForm := GetParentForm(ADockObjectCopy.Control); ParentForm := GetParentForm(ADockObjectCopy.Control);
if (ParentForm <> nil) and (ParentForm.ActiveControl = ADockObjectCopy.Control) if (ParentForm <> nil) and
then ParentForm.ActiveControl := nil; (ParentForm.ActiveControl = ADockObjectCopy.Control) then
ParentForm.ActiveControl := nil;
ADockObjectCopy.Control.DoFloatMsg(ADockObjectCopy); ADockObjectCopy.Control.DoFloatMsg(ADockObjectCopy);
end; end;
if ADockObjectCopy.DragTarget <> nil then begin if ADockObjectCopy.DragTarget <> nil then
if not Accepted then begin begin
if not Accepted then
begin
TargetPos.X := 0; TargetPos.X := 0;
TargetPos.Y := 0; TargetPos.Y := 0;
DragMsg := dmDragCancel; DragMsg := dmDragCancel;
ADockObjectCopy.DragPos:=Point(0,0); ADockObjectCopy.DragPos:=Point(0,0);
ADockObjectCopy.DragTarget:=nil; ADockObjectCopy.DragTarget:=nil;
end end
else DragMsg := dmDragDrop; else
DragMsg := dmDragDrop;
SendDragMessage(ADockObjectCopy.DragTarget, DragMsg,ADockObjectCopy, ADockObjectCopy.DragTarget, ADockObjectCopy.DragPos); SendDragMessage(ADockObjectCopy.DragTarget, DragMsg,ADockObjectCopy, ADockObjectCopy.DragTarget, ADockObjectCopy.DragPos);
end; end;
if not Accepted if not Accepted then
then ADockObjectCopy.Control.DragCanceled; ADockObjectCopy.Control.DragCanceled;
ADockObjectCopy.Control.DoEndDock(ADockObjectCopy.DragTarget,TargetPos.X,TargetPos.Y); ADockObjectCopy.Control.DoEndDock(ADockObjectCopy.DragTarget,TargetPos.X,TargetPos.Y);
finally finally
if FDragObjectAutoFree if FDragObjectAutoFree then
then ADockObjectCopy.Free ADockObjectCopy.Free
end; end;
end; end;
procedure TDockPerformer.DefaultDockImage(ADrawRect: TRect); procedure TDockPerformer.DefaultDockImage(ADrawRect: TRect);
const PenSize=4; const
var ACanvas: TCanvas; PenSize=4;
var
ACanvas: TCanvas;
DC: HDC; DC: HDC;
begin begin
DC := GetDC(0); DC := GetDC(0);
@ -504,7 +549,8 @@ begin
ACanvas.Pen.Mode := pmXOR; ACanvas.Pen.Mode := pmXOR;
ACanvas.Pen.Color := clWhite; ACanvas.Pen.Color := clWhite;
ACanvas.Pen.Width := PenSize; ACanvas.Pen.Width := PenSize;
with ADrawRect do begin with ADrawRect do
begin
ACanvas.MoveTo(Left+PenSize, Top+PenSize); ACanvas.MoveTo(Left+PenSize, Top+PenSize);
ACanvas.LineTo(Right-PenSize,Top+PenSize); ACanvas.LineTo(Right-PenSize,Top+PenSize);
ACanvas.LineTo(Right-PenSize, Bottom-PenSize); ACanvas.LineTo(Right-PenSize, Bottom-PenSize);
@ -534,18 +580,21 @@ end;
function TDragManagerDefault.Dragging(AControl: TControl): boolean; function TDragManagerDefault.Dragging(AControl: TControl): boolean;
//Is the control being dragged //Is the control being dragged
begin begin
if FPerformer = nil if FPerformer = nil then
then Result := false Result := false
else Result := FPerformer.Dragging(AControl) else
Result := FPerformer.Dragging(AControl)
end; end;
procedure TDragManagerDefault.DragStart(AControl: TControl; AImmediate: Boolean; AThreshold: Integer); procedure TDragManagerDefault.DragStart(AControl: TControl; AImmediate: Boolean; AThreshold: Integer);
//Start a drag operation //Start a drag operation
begin begin
if FPerformer = nil then begin if FPerformer = nil then
if AThreshold >= 0 begin
then FThresholdValue := AThreshold if AThreshold >= 0 then
else FThresholdValue := DragThreshold; FThresholdValue := AThreshold
else
FThresholdValue := DragThreshold;
FWaitForTreshold := not AImmediate; FWaitForTreshold := not AImmediate;
GetCursorPos(FStartPosition); GetCursorPos(FStartPosition);
@ -554,7 +603,8 @@ begin
dkDock: FPerformer := TDockPerformer.Create(Self, AControl); dkDock: FPerformer := TDockPerformer.Create(Self, AControl);
end; end;
if AImmediate then begin if AImmediate then
begin
FPerformer.DragStarted(FStartPosition); FPerformer.DragStarted(FStartPosition);
DragMove(FStartPosition); DragMove(FStartPosition);
end; end;
@ -564,14 +614,18 @@ end;
procedure TDragManagerDefault.DragMove(APosition: TPoint); procedure TDragManagerDefault.DragMove(APosition: TPoint);
//The captured input device has moved //The captured input device has moved
begin begin
if FPerformer <> nil then begin if FPerformer <> nil then
begin
//delay until the input device has moved at least x pixels //delay until the input device has moved at least x pixels
if FWaitForTreshold then begin if FWaitForTreshold then
if Abs(FStartPosition.X - APosition.X) >= FThresholdValue begin
then FWaitForTreshold := false if Abs(FStartPosition.X - APosition.X) >= FThresholdValue then
else if Abs(FStartPosition.Y - APosition.Y) >= FThresholdValue FWaitForTreshold := false
then FWaitForTreshold := false else
else exit; if Abs(FStartPosition.Y - APosition.Y) >= FThresholdValue then
FWaitForTreshold := false
else
exit;
FPerformer.DragStarted(APosition); FPerformer.DragStarted(APosition);
end; end;
FPerformer.DragMove(APosition); FPerformer.DragMove(APosition);
@ -595,26 +649,28 @@ end;
procedure TDragManagerDefault.RegisterDockSite(Site: TWinControl; DoRegister: Boolean); procedure TDragManagerDefault.RegisterDockSite(Site: TWinControl; DoRegister: Boolean);
begin begin
if (Site <> nil) then begin if (Site <> nil) then
if FDockSites = nil begin
then FDockSites := TFPList.Create; if FDockSites = nil then
if DoRegister FDockSites := TFPList.Create;
then FDockSites.Add(Site) if DoRegister then
else FDockSites.Remove(Site) FDockSites.Add(Site)
else
FDockSites.Remove(Site)
end; end;
end; end;
procedure TDragManagerDefault.KeyDown(var Key: Word; Shift: TShiftState); procedure TDragManagerDefault.KeyDown(var Key: Word; Shift: TShiftState);
begin begin
if Key = VK_ESCAPE if Key = VK_ESCAPE then
then DragStop(false); DragStop(False);
Key := 0; Key := 0;
end; end;
procedure TDragManagerDefault.KeyUp(var Key: Word; Shift: TShiftState); procedure TDragManagerDefault.KeyUp(var Key: Word; Shift: TShiftState);
begin begin
if Key = VK_ESCAPE if Key = VK_ESCAPE then
then DragStop(false); DragStop(False);
Key := 0; Key := 0;
end; end;
@ -633,7 +689,8 @@ begin
end; end;
procedure TDragManagerDefault.MouseMove(Shift: TShiftState; X, Y: Integer); procedure TDragManagerDefault.MouseMove(Shift: TShiftState; X, Y: Integer);
var P: TPoint; var
P: TPoint;
begin begin
P.X := X; P.X := X;
P.Y := Y; P.Y := Y;
@ -646,17 +703,20 @@ begin
end; end;
procedure TDragManagerDefault.CaptureChanged(OldCaptureControl: TControl); procedure TDragManagerDefault.CaptureChanged(OldCaptureControl: TControl);
var i: integer; var
i: integer;
AIsDragging: Boolean; AIsDragging: Boolean;
begin begin
// if this is TWinControl, and it have controls (not TWinControls) // if this is TWinControl, and it have controls (not TWinControls)
// then we should check Dragging in those controls // then we should check Dragging in those controls
AIsDragging := OldCaptureControl.Dragging; AIsDragging := OldCaptureControl.Dragging;
if (not AIsDragging) and (OldCaptureControl is TWinControl) then begin if (not AIsDragging) and (OldCaptureControl is TWinControl) then
for i := 0 to TWinControl(OldCaptureControl).ControlCount - 1 do begin begin
for i := 0 to TWinControl(OldCaptureControl).ControlCount - 1 do
begin
AIsDragging := AIsDragging or TWinControl(OldCaptureControl).Controls[i].Dragging; AIsDragging := AIsDragging or TWinControl(OldCaptureControl).Controls[i].Dragging;
if AIsDragging if AIsDragging then
then break; break;
end; end;
end; end;
DragStop(AIsDragging); DragStop(AIsDragging);