juno-app/src/Drag.i3


 Copyright (C) 1992, Digital Equipment Corporation                         
 All rights reserved.                                                      
 See the file COPYRIGHT for a full description.                            
                                                                           
 Last modified on Mon Apr 15 09:52:32 PDT 1996 by heydon                   
<* PRAGMA LL *>

INTERFACE Drag;
Dragging points in the drawing view

IMPORT Drawing, ExternalProc, PSImpl, VBT, Point;

REVEAL
  Drawing.T <: T;
  Drawing.ArgTool <: ArgTool;

CONST MaxArgs = 100;			 (* maximum # of args to any tool *)

TYPE
  T <: Public;
  Public = PSImpl.T BRANDED "Drag.Public" OBJECT
    (* Stack *)
    stackSize: CARDINAL := 0;
    stack: ARRAY [0..MaxArgs-1] OF Drawing.Arg;
    (* "Drag" args *)
    dragging := FALSE;
    dragger, draggee: Point.T;
    dragName: TEXT;
    dragMode: DragMode;
  END;
  DragMode = { Unconstrained, Hor, Ver };
If d: T, the dragging, dragger, draggee, dragName, and dragMode fields are relevant when the current argument of d.tool has type ArgType.Drag. The bit d.dragging is set during the drag, d.dragger is the location of the mouse as it is moved (in Trestle coordinates), d.draggee is the location of the point being dragged (also in Trestle coordinates), d.dragName is the name of the point being dragged, and d.dragMode is the drag mode.

EXCEPTION Aborted;
The Aborted method is raised to abort the drag prematurely, as if the user had released the mouse button.

TYPE
  ArgTool <: ArgToolPublic;
  ArgToolPublic = Drawing.ArgToolPublic OBJECT METHODS
    <* LL.sup = VBT.mu *>
    pre(d: Drawing.T; READONLY cd: VBT.MouseRec; i: INTEGER)
      RAISES {Aborted};
    during(d: Drawing.T; READONLY delta: Point.T; i: INTEGER): Point.T
      RAISES {Aborted};
    post(d: Drawing.T; READONLY cd: VBT.MouseRec; i: INTEGER);
  END;
The pre method is called at the start of the drag, with d the current drawing, cd the mouse event initializing the drag, and i the current size of the tool argument stack.

The during method is called each time the mouse moves while dragging a ArgType.Drag argument. The call tool.during(d, delta, i) is made with d the current drawing, delta the difference vector between the current mouse position (namely, d.dragger) and the last one, and i the current size of the tool argument stack. This routine should return the new coordinates for the point d.draggee (in Trestle coordinates) as a result of moving the mouse. It should raise Aborted to abort the drag prematurely, as if the user had released the mouse button.

PROCEDURE NewTool(): Drawing.ArgTool;
Return a new tool taking 1 Drag argument whose methods conspire to implement continuous solve.

PROCEDURE CallbackProc(dc: ExternalProc.Closure): BOOLEAN;
The JunoUI._DRAG procedure called while dragging a point.

END Drag.