(*************************************************************************

     $RCSfile: AppWindow.mod $
  Description:

   Created by: fjc (Frank Copeland)
    $Revision: 1.5 $
      $Author: fjc $
        $Date: 1995/07/02 17:01:00 $

  Copyright © 1994-1995, Frank Copeland.
  This example program is part of Oberon-A.
  See Oberon-A.doc for conditions of use and distribution.

*************************************************************************)

<* STANDARD- *>

MODULE AppWindow;

IMPORT
  SYS := SYSTEM,
  e   := Exec,
  u   := Utility,
  I   := Intuition,
  wb  := Workbench,
  IO  := StdIO;

CONST VersionTag = "$VER: AppWindow 1.3 (25.1.95)\r\n";

VAR

  awport : e.MsgPortPtr;
  win    : I.WindowPtr;
  appwin : wb.AppWindowPtr;
  imsg   : I.IntuiMessagePtr;
  amsg   : wb.AppMessagePtr;

  winsig, appwinsig : SHORTINT;
  id, userdata : LONGINT;
  signals : SET;
  done : BOOLEAN;
  i : INTEGER;

BEGIN (* AppWindow *)
  IF I.base.libNode.version >= 37 THEN
    IF (wb.base # NIL) & (wb.base.version >= 37) THEN
      awport := e.CreateMsgPort ();
      IF awport # NIL THEN
        win := I.OpenWindowTagsA
          ( NIL,
            I.waWidth,  200,
            I.waHeight, 50,
            I.waIDCMP,  {I.closeWindow},
            I.waFlags,  {I.windowClose, I.windowDrag},
            I.waTitle,  SYS.ADR ("AppWindow"),
            u.done );
        IF win # NIL THEN
          id := 1; userdata := 0;
          appwin := wb.AddAppWindow ( id, userdata, win, awport, NIL );
          IF appwin # NIL THEN
            IO.WriteStr ("AppWindow added... Drag files into AppWindow\n");
            winsig := win.userPort.sigBit;
            appwinsig := awport.sigBit;
            done := FALSE;
            WHILE ~done DO
              (* Wait for IDCMP messages and AppMessages *)
              signals := e.Wait ({winsig, appwinsig});
              IF winsig IN signals THEN (* Got an IDCMP message *)
                LOOP
                  imsg := SYS.VAL (I.IntuiMessagePtr,
                    e.GetMsg (win.userPort));
                  IF imsg = NIL THEN EXIT END;
                  IF imsg.class = {I.closeWindow} THEN
                    done := TRUE
                  END;
                  e.ReplyMsg (imsg)
                END;
              END;
              IF appwinsig IN signals THEN (* Got an AppMessage *)
                LOOP
                  amsg := SYS.VAL (wb.AppMessagePtr,
                    e.GetMsg (awport));
                  IF amsg = NIL THEN EXIT END;
                  IO.WriteF3
                    ( "AppMsg: Type=%ld, ID=%ld, NumArgs=%ld\n",
                      amsg.type, amsg.id, amsg.numArgs );
                  FOR i := 0 TO amsg.numArgs - 1 DO
                    IO.WriteF3
                      ( "  arg(%ld): Name='%s', Lock=%lx\n",
                        i, amsg.argList[i].name, amsg.argList[i].lock )
                  END;
                  e.ReplyMsg (amsg)
                END;
              END;
            END; (* WHILE *)
            IF wb.RemoveAppWindow (appwin) THEN END
          END; (* IF *)
          I.CloseWindow (win)
        END; (* IF *)
        (* Make sure there are no more outstanding messages *)
        LOOP
          amsg := SYS.VAL (wb.AppMessagePtr,
            e.GetMsg (awport));
          IF imsg = NIL THEN EXIT END;
          e.ReplyMsg (amsg)
        END;
        e.DeleteMsgPort (awport)
      END; (* IF *)
    END; (* IF *)
  END; (* IF *)
END AppWindow.
