MODULE Mechanisms;
(**

   project   = "BlackBox"
   organization   = "www.oberon.ch"
   contributors   = "Oberon microsystems"
   version   = "System/Rsrc/About"
   copyright   = "System/Rsrc/About"
   license   = "Docu/BB-License"
   changes   = ""
   issues   = ""

**)

   IMPORT Kernel, Views;

   CONST

      (** FocusBorderCursor/SelBorderCursor result **)
      inside* = -1; outside* = -2;   (** plus defined Ports cursors **)
      (** TrackToResize op **)

      cancelResize* = 0; resize* = 1;
      (** TrackToDrop op **)

      cancelDrop* = 0; copy* = 1; move* = 2; link* = 3;
      (** TrackToPick op **)

      cancelPick* = 0; pick* = 1; pickForeign* = 2;
   TYPE

      Hook* = POINTER TO ABSTRACT RECORD (Kernel.Hook) END;
   VAR hook: Hook;

   PROCEDURE SetHook*(h: Hook);

   BEGIN
      hook := h
   END SetHook;
   PROCEDURE (hook: Hook) MarkFocusBorder* (host: Views.Frame;

                              focus: Views.View; l, t, r, b: INTEGER;
                              show: BOOLEAN), NEW, ABSTRACT;
   PROCEDURE (hook: Hook) MarkSingletonBorder* (host: Views.Frame;
                              view: Views.View; l, t, r, b: INTEGER;
                              show: BOOLEAN), NEW, ABSTRACT;
   PROCEDURE (hook: Hook) FocusBorderCursor* (host: Views.Frame;

                              view: Views.View; l, t, r, b: INTEGER;
                              x, y: INTEGER): INTEGER, NEW, ABSTRACT;
   PROCEDURE (hook: Hook) SelBorderCursor* (host: Views.Frame;
                              view: Views.View; l, t, r, b: INTEGER;
                              x, y: INTEGER): INTEGER, NEW, ABSTRACT;
   PROCEDURE (hook: Hook) TrackToResize* (host: Views.Frame; view: Views.View;

                              minW, maxW, minH, maxH: INTEGER;
                              VAR l, t, r, b: INTEGER; VAR op: INTEGER;
                              VAR x, y: INTEGER; VAR buttons: SET), NEW, ABSTRACT;
   PROCEDURE (hook: Hook) TrackToDrop* (source: Views.Frame; view: Views.View;
                              isSingle: BOOLEAN; w, h, rx, ry: INTEGER;
                              VAR dest: Views.Frame; VAR destX, destY: INTEGER;
                              VAR op: INTEGER;
                              VAR x, y: INTEGER; VAR buttons: SET), NEW, ABSTRACT;
   PROCEDURE (hook: Hook) TrackToPick* (source: Views.Frame;
                              VAR dest: Views.Frame; VAR destX, destY: INTEGER;
                              VAR op: INTEGER;
                              VAR x, y: INTEGER; VAR buttons: SET), NEW, ABSTRACT;
   PROCEDURE (hook: Hook) PopUpAndSelect* (f: Views.Frame;

                              n, this: INTEGER;
                              s: ARRAY OF ARRAY OF CHAR;
                              enabled, checked: ARRAY OF BOOLEAN;
                              VAR i: INTEGER;
                              VAR x, y: INTEGER; VAR buttons: SET), NEW, ABSTRACT;
   PROCEDURE MarkFocusBorder* (host: Views.Frame;

                              focus: Views.View; l, t, r, b: INTEGER;
                              show: BOOLEAN);
   BEGIN
      hook.MarkFocusBorder(host, focus, l, t, r, b, show)
   END MarkFocusBorder;
   PROCEDURE MarkSingletonBorder* (host: Views.Frame;

                              view: Views.View; l, t, r, b: INTEGER;
                              show: BOOLEAN);
   BEGIN
      hook.MarkSingletonBorder(host, view, l, t, r, b, show)
   END MarkSingletonBorder;
   PROCEDURE FocusBorderCursor* (host: Views.Frame;

                              view: Views.View; l, t, r, b: INTEGER;
                              x, y: INTEGER): INTEGER;
   BEGIN
      RETURN hook.FocusBorderCursor(host, view, l, t, r, b, x, y)
   END FocusBorderCursor;
   PROCEDURE SelBorderCursor* (host: Views.Frame;

                              view: Views.View; l, t, r, b: INTEGER;
                              x, y: INTEGER): INTEGER;
   BEGIN
      RETURN hook.SelBorderCursor(host, view, l, t, r, b, x, y)
   END SelBorderCursor;
   PROCEDURE TrackToResize* (host: Views.Frame; view: Views.View;

                              minW, maxW, minH, maxH: INTEGER;
                              VAR l, t, r, b: INTEGER; VAR op: INTEGER;
                              VAR x, y: INTEGER; VAR buttons: SET);
   BEGIN
      hook.TrackToResize(host, view, minW, maxW, minH, maxH, l, t, r, b, op, x, y, buttons)
   END TrackToResize;
   PROCEDURE TrackToDrop* (source: Views.Frame; view: Views.View;

                              isSingle: BOOLEAN; w, h, rx, ry: INTEGER;
                              VAR dest: Views.Frame; VAR destX, destY: INTEGER;
                              VAR op: INTEGER;
                              VAR x, y: INTEGER; VAR buttons: SET);
   BEGIN
      hook.TrackToDrop(source, view, isSingle, w, h, rx, ry, dest, destX, destY, op, x, y, buttons)
   END TrackToDrop;
   PROCEDURE TrackToPick* (source: Views.Frame;

                              VAR dest: Views.Frame; VAR destX, destY: INTEGER;
                              VAR op: INTEGER;
                              VAR x, y: INTEGER; VAR buttons: SET);
   BEGIN
      hook.TrackToPick(source, dest, destX, destY, op, x, y, buttons)
   END TrackToPick;
   PROCEDURE PopUpAndSelect* (f: Views.Frame;

                              n, this: INTEGER;
                              s: ARRAY OF ARRAY OF CHAR;
                              enabled, checked: ARRAY OF BOOLEAN;
                              VAR i: INTEGER;
                              VAR x, y: INTEGER; VAR buttons: SET);
   BEGIN
      hook.PopUpAndSelect(f, n, this, s, enabled, checked, i, x, y, buttons)
   END PopUpAndSelect;
END Mechanisms.