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