


MODULE  DosWinDemo;


(*  Demonstriert die Anwendung der Routine "DosWinToIntui" aus der  *)
(*  Bibliothek "DosWinSupport", indem es die Rahmenfarbe des CLI-   *)
(*  bzw. Shell-Fensters ändert und diesem obendrein ein eigenes     *)
(*  Pull-Down Menü zuordnet.                                        *)
(*                                                                  *)
(*  von Ernst Heinz  /  02.03.1990                                  *)



FROM  Arts  IMPORT
 Assert;

FROM  Dos  IMPORT
 Delay, ProcessPtr;

FROM  DosWinSupport  IMPORT
 DosWinToIntui, ok;

FROM  Exec  IMPORT
 FindTask, GetMsg, ReplyMsg, UByte;

FROM  Graphics  IMPORT
 jam2;

FROM  Intuition  IMPORT
 ClearMenuStrip, IDCMPFlags, IDCMPFlagSet, IntuiMessagePtr, IntuiText, Menu,
 menuEnabled, MenuItem, MenuItemFlags, MenuItemFlagSet, menuNull, ModifyIDCMP,
 RefreshWindowFrame, SetMenuStrip, WindowPtr;

FROM  RandomNumber  IMPORT
 RND;

FROM  SYSTEM  IMPORT
 ADDRESS, ADR, LONGSET;



VAR  myFlags : IDCMPFlagSet;
     myIMsg  : IntuiMessagePtr;
     myItem  : MenuItem;
     myIText : IntuiText;
     myMenu  : Menu;
     myProcess : ProcessPtr;
     myWin   : WindowPtr;
     oldBPen : UByte;
     oldDPen : UByte;
     quit    : BOOLEAN;



BEGIN
 (*  Zuerst das der aktuellen Ausgabedatei zugeordnete Fenster ermitteln.  *)
 myProcess := ADDRESS(FindTask(NIL));
 Assert(DosWinToIntui(myProcess^.cos,myWin)=ok,ADR('No window found !'));

 (*  Danach das kleine Pull-Down Menü initialisieren.  *)
 WITH myMenu DO
  nextMenu := NIL;
  leftEdge := 0;
  topEdge  := 0;
  width    := 87;
  height   := 8;
  flags    := {menuEnabled};
  menuName := ADR('DosWinDemo');
  firstItem := ADR(myItem)
 END;
 WITH myItem DO
  nextItem      := NIL;
  leftEdge      := 0;
  topEdge       := 0;
  width         := 85;
  height        := 8;
  flags         := MenuItemFlagSet{itemText,commSeq,itemEnabled,highComp};
  mutualExclude := LONGSET{};
  itemFill      := ADR(myIText);
  selectFill    := NIL;
  command       := 'Q';
  subItem       := NIL
 END;
 WITH myIText DO
  frontPen  := 1;
  backPen   := 0;
  drawMode  := jam2;
  leftEdge  := 0;
  topEdge   := 0;
  iTextFont := NIL;
  iText     := ADR('Quit');
  nextText  := NIL
 END;

 (*  Jetzt das Pull-Down Menü dem Programmfenster zuordnen und aktivieren.  *)
 Assert(SetMenuStrip(myWin,ADR(myMenu)),ADR('Cannot attach menu !'));
 myFlags := myWin^.idcmpFlags;
 INCL(myFlags,menuPick);
 ModifyIDCMP(myWin,myFlags);

 (*  Die folgende Hauptschleife des Programms wartet darauf, daß der  *)
 (*  Menüpunkt "Quit" vom Benutzer ausgewählt wird. Solange er das    *)
 (*  nicht getan hat, wird laufend der Fensterrahmen geändert.        *)
 oldDPen := myWin^.detailPen;
 oldBPen := myWin^.blockPen;
 quit := FALSE;
 REPEAT
  Delay(30);
  myWin^.detailPen := RND(4);
  myWin^.blockPen  := RND(4);
  RefreshWindowFrame(myWin);
  myIMsg := GetMsg(myWin^.userPort);
  IF myIMsg#NIL THEN
   IF menuPick IN myIMsg^.class THEN   (*  Menüaktion ausgelöst ?  *)
    quit := (myIMsg^.code#menuNull);   (*  ja --> "Quit" gewünscht ?  *)
    ReplyMsg(myIMsg)                   (*  Menünachricht immer beantworten  *)
   END
  END
 UNTIL  quit;

 (*  Zum Abschluß das Menü wieder löschen, den IDCMP zurücksetzen und  *)
 (*  auch die alten Farben des Fensterrahmens reaktivieren.            *)
 EXCL(myFlags,menuPick);
 ModifyIDCMP(myWin,myFlags);
 ClearMenuStrip(myWin);
 myWin^.detailPen := oldDPen;
 myWin^.blockPen  := oldBPen;
 RefreshWindowFrame(myWin)
END  DosWinDemo.
