mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-12 14:29:36 +02:00
change formatting of dragmanager code
git-svn-id: trunk@13581 -
This commit is contained in:
parent
0ced829a0f
commit
7bad8ae57d
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user