dos_compilers/Borland Turbo Pascal v7/EXAMPLES/TVFM/DRAGDROP.PAS
2024-07-02 08:21:37 -07:00

115 lines
2.7 KiB
Plaintext

{************************************************}
{ }
{ Turbo Vision File Manager Demo }
{ Copyright (c) 1992 by Borland International }
{ }
{************************************************}
unit DragDrop; { Drag and drop support objects }
{$X+,V-}
interface
uses Dos, Objects, Drivers, Views, Dialogs, App;
type
{ TListViewer that supports grabbing an item with the mouse }
PDDList = ^TDDList;
TDDList = object(TListViewer)
procedure HandleEvent(var Event: TEvent); virtual;
procedure PickUpItem(Item: Integer; Where: TPoint); virtual;
end;
{ Moving view while item is dragged }
PMover = ^TMover;
TMover = object(TView)
Dir: PathStr;
Items: PCollection;
constructor Init(Where: TPoint; const ADir: PathStr; AItems: PCollection);
procedure Draw; virtual;
end;
implementation
{ TDDList }
procedure TDDList.PickUpItem(Item: Integer; Where: TPoint);
begin
end;
procedure TDDList.HandleEvent(var Event: TEvent);
var
Mouse: TPoint;
NewItem, OldItem: Integer;
function HasMoved(const P1, P2: TPoint): Boolean;
begin
HasMoved := (P1.X <> P2.X) or (P1.Y <> P2.Y);
end;
begin
if (Event.What = evMouseDown) and (Event.Buttons = mbLeftButton) then
begin
TView.HandleEvent(Event);
if Event.What = evNothing then Exit;
OldItem := Focused;
MakeLocal(Event.Where, Mouse);
NewItem := Mouse.Y + TopItem;
if NewItem <> OldItem then
begin
if NewItem < 0 then NewItem := 0
else if (NewItem >= Range) and (Range > 0) then NewItem := Range - 1;
if Range <> 0 then FocusItem(NewItem);
DrawView;
end;
{ possibly a drag/drop operation }
if (Mouse.X > 1) and (Mouse.X <= 13) then
begin
if MouseEvent(Event, evMouseMove) and (Event.Buttons = mbLeftButton) then
begin
MakeLocal(Event.Where, Event.Where);
if HasMoved(Event.Where, Mouse) then
begin
MakeGlobal(Event.Where, Mouse);
PickUpItem(Focused, Mouse);
ClearEvent(Event);
end;
end;
end;
if Event.Double and (Range > Focused) then SelectItem(Focused);
ClearEvent(Event);
end;
inherited HandleEvent(Event);
end;
{ TMover }
constructor TMover.Init(Where: TPoint; const ADir: PathStr;
AItems: PCollection);
var
R: TRect;
YSize: Integer;
begin
YSize := AItems^.Count;
if YSize > 3 then YSize := 3;
R.Assign(Where.X, Where.Y, Where.X + 12, Where.Y + YSize);
inherited Init(R);
SetState(sfShadow, True);
Dir := ADir;
Items := AItems;
end;
procedure TMover.Draw;
begin
Abstract;
end;
end.