{************************************************}
{                                                }
{   Turbo Vision File Manager Demo               }
{   Copyright (c) 1992 by Borland International  }
{                                                }
{   For Virtual Pascal v2.1 (c) 2000 vpascal.com }
{                                                }
{************************************************}

unit DragDrop;  { Drag and drop support objects }

{$X+,V-}
{&Use32+}

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.
