(* ------------------------------------------------------------------------
  :Program.     MenuTest.
  :Contents.    Testprogram, öffnet Screen, Window und Menü.
  :Author.      Klaus Hlawaty.
  :Address.     Waldhof
  :Address.     3579 Schrecksbach
  :History.     v1.0 - 23.Nov.91. ???
  :Imports.     Speed.
  :Imports.     Menu.
  :Imports.     xDisplay.
  :Imports.     xIntui.
  :Imports.     IntuiPointer.
  :Copyright.   PD
  :Language.    Oberon v2.13
  :Translator.  OBERON v2.13 / OLink v2.13d
------------------------------------------------------------------------ *)
MODULE MenuTest;

IMPORT
        c:Conversions,
        D:Display,
       xD:xDisplay,
        e:Exec,
        i:Intuition,
       xi:xIntui,
       ip:IntuiPointer,
        M:Menu,
       ng:Requests,
          NoGuruRq,
        s:SYSTEM;

VAR
   MyScreen : D.ScreenPtr;
   MyWindow : M.WinMenuPtr;

   class    : LONGSET;
   code     : INTEGER;
   iadr     : s.ADDRESS;

   Item     : i.MenuItemPtr;
   Kennung  : INTEGER;
   nMenu,
   nItem,
   nSubI    : INTEGER;

   Str      : e.STRING;
   Dummy    : BOOLEAN;

BEGIN  (* ------------------- Hauptprogramm --------------------- *)
  NEW(MyScreen);
  ng.Assert(MyScreen#NIL,"Screenspeicher nicht verfügbar");
  NEW(MyWindow);
  ng.Assert(MyWindow#NIL,"Windowspeicher nicht verfügbar");
  MyScreen^.screen := NIL;
  MyWindow^.window := NIL;
  ng.Assert(D.OpenScreen(MyScreen,"TestScreen",
                         0,0,640,256,2,
                         TRUE,FALSE),
                                      "Screen nicht geöffnet");
  xD.WindowFlags := LONGSET{i.backDrop, i.borderless,
                            i.activate};
  ng.Assert(M.OpenWinMenu(MyWindow,"TestWindo",
                          0,0,640,256,
                          MyScreen.screen),
                                           "Window nicht geöffnet");
  i.OldModifyIDCMP(MyWindow.window,LONGSET{i.menuPick});
  ip.Busy(MyWindow.window);
(* ------------- Ende des Open Block ------------ *)
(* ---------------------------------------------------------------------- *)
(* ------------------- Aufbau des Menüs --------------------------------- *)
(* ---------------------------------------------------------------------- *)
  M.AddMenu(MyWindow,"Menü X");
  Item   := M.AddItem(MyWindow
                     ,"Ende"
                     ,"Q"
                     ,0011);
  Item   := M.AddSeparator(MyWindow);
  Item   := M.AddItem(MyWindow
                     ,"Clear"
                     ,"C"
                     ,0012);
  EXCL(Item.flags,i.highComp);          (* Lösche nachträglich Invers   *)
  INCL(Item.flags,i.highBox);           (* Setze nachträglich Umrandung *)
  M.AddMenu(MyWindow,"Menü 2");
  Item   := M.AddItem(MyWindow
                     ,"Item 21"
                     ,"\o"
                     ,0021);
  Item   := M.AddSubSeparator(MyWindow);
  Item   := M.AddTSubI(MyWindow
                      ,"Item 211"
                      ,"Y"
                      ,0211
                      ,TRUE);
  Item   := M.AddTSubI(MyWindow
                      ,"Item 212"
                      ,"X"
                      ,0212
                      ,FALSE);
  M.MutualEx(MyWindow,211 , 212 ,              TRUE);
              (* Item 211 & 212 schließen sich gegenseitig aus *)
  Item   := M.AddTSubI(MyWindow
                      ,"Item 213"
                      ,"Z"
                      ,0213
                      ,FALSE);
  M.MutualEx(MyWindow,211 , 213 ,              TRUE);
              (* Item 211 & 213 schließen sich gegenseitig aus *)
  M.MutualEx(MyWindow,212 , 213 ,              TRUE);
              (* Item 212 & 213 schließen sich gegenseitig aus *)
          (* Alle Item's 211 .. 213 schließen sich gegenseitig aus *)
  Item   := M.AddSubSeparator(MyWindow);
  Item   := M.AddSeparator(MyWindow);
  Item   := M.AddItem(MyWindow
                     ,"Item 22"
                     ,"A"
                     ,0022);
  M.AddMenu(MyWindow,"Menü 3");
  Item   := M.AddItem(MyWindow
                     ,"Item 31"
                     ,"\o"
                     ,0031);
  Item   := M.AddSeparator(MyWindow);
  Item   := M.AddTItem(MyWindow
                      ,"Item 32"
                      ,"\o"
                      ,0032
                      ,FALSE);
  Item   := M.AddSeparator(MyWindow);
  Item   := M.AddItem(MyWindow
                     ,"Item 33"
                     ,"\o"
                     ,0033);
  EXCL(Item.flags,i.itemEnabled);
                 (* Nachträgliche Änderung  *)
                 (* Item nicht mehr wählbar *)
                 (* ======================= *)

  M.FmtMenu(MyWindow); (* Formatiert das Menü *)
  M.MenuON(MyWindow);  (* Aktiviert das Menü  *)
(* ---------------------------------------------------------------------- *)
(* ------------------- Abfrage des Menüs -------------------------------- *)
(* ---------------------------------------------------------------------- *)
  ip.Busy(MyWindow.window);
  ip.Normal(MyWindow.window);
  D.ClrHome(MyWindow);
  D.Position(MyWindow,0,2);
  D.CursorOn(MyWindow);
  REPEAT
    ip.Normal(MyWindow.window);
    Item := M.Wait(MyWindow,class,code,iadr);
    WHILE(Item # NIL)DO
      Kennung := Item(M.MItem).Kennung;       (* Item : M.MItemPtr *)
            (* Kennung wird - wegen Multiselect - erst hier geholt *)
      ip.Busy(MyWindow.window);               (* Mouse = ZZZ       *)
      (* ----------------------------- Textausgabe und Itemnummern *)
      D.Write(MyWindow,"Intuition : MenuNr.");
      xi.decodeMenu(code,nMenu,nItem,nSubI);
      Dummy := c.IntToString(nMenu,Str,3);
      D.Write(MyWindow,Str);
      D.Write(MyWindow,"| ItemNr.");
      Dummy := c.IntToString(nItem,Str,3);
      D.Write(MyWindow,Str);
      D.Write(MyWindow,"| SubItemNr.");
      Dummy := c.IntToString(nSubI,Str,3);
      D.Write(MyWindow,Str);
      D.Write(MyWindow,"# Kennung:");
      Dummy := c.IntToString(Kennung,Str,3);
      D.Write(MyWindow,Str);
      D.Write(MyWindow,". ");
      (* -------------------- Bei Toggel-Item's Ausgabe von ON/OFF *)
      IF(i.checkIt IN Item.flags)THEN
        IF(i.checked IN Item.flags)THEN
          D.Write(MyWindow," ON ");
          IF(Kennung = 32)THEN
            M.ItemON(MyWindow,33);       (* Anschalten von Item 33 *)
          END;
        ELSE
          D.Write(MyWindow," OFF");
          IF(Kennung = 32)THEN
            M.ItemOFF(MyWindow,33);      (* Abschalten von Item 33 *)
          END;
        END (* IF checked *);
      END (* IF checkit *);
      D.WriteLn(MyWindow);
      (* ----------------------------------------- Item 12 = Clear *)
      IF(Kennung = 12)THEN
        D.ClrHome(MyWindow);
        D.Position(MyWindow,0,2);
        D.CursorOn(MyWindow);
      END;
      (* ------------------------------ Hole nächstes Item bei MultiSelect *)
      Item := M.ItemAdr(MyWindow,Item.nextSelect); (* Item : i.MenuItemPtr *)
    END (* WHILE *);
    IF(i.windowSizing IN class)THEN
      D.Init(MyWindow);
    END (* IF windowSizing *);
  UNTIL(i.closeWindow IN class)OR(Kennung = 11); (* Item 11 = Ende *)

(* ------------- Begin des Endes ---------------- *)
CLOSE
  ip.Normal(MyWindow.window);
  IF(MyWindow^.window # NIL)THEN
    M.MenuOFF(MyWindow);
    M.Close(MyWindow);
  END;
  IF(MyScreen^.screen # NIL)THEN
     M.Close(MyScreen);
  END;

  IF(MyScreen # NIL)THEN
     DISPOSE(MyScreen);
  END;
  IF(MyWindow # NIL)THEN
     DISPOSE(MyWindow);
  END;
END MenuTest.
