IMPLEMENTATION MODULE Menus;

FROM AbiturScreen IMPORT BACKWindow;
FROM Globals IMPORT AnzahlSpieler, AlleSpieler, Spieler, SpielerPtr;
FROM SYSTEM IMPORT CAST, ADR, LONGSET, BITSET;
FROM Intuition IMPORT Menu, MenuItem, MenuItemPtr, MenuItemFlagSet,
                      MenuItemFlags, SetMenuStrip, ClearMenuStrip,
                      IntuiText, IntuiTextPtr, OnMenu, menuEnabled;
FROM FaecherNamen IMPORT FaecherTypen, FaecherNamen;
FROM Exec IMPORT AllocMem, FreeMem, MemReqSet, MemReqs;
FROM Arts IMPORT Assert, TermProcedure, BreakPoint;
FROM Graphics IMPORT DrawModeSet;
FROM Str IMPORT Copy;


(* DEBUG *)
(* FROM InOut IMPORT WriteString, WriteLn;  *)





VAR Menu0, Menu1, Menu2, Menu3: Menu;
    SaveItem, LoadItem, NewItem, EndeItem, CHItem: MenuItem;
    JahrItem: ARRAY[1..4] OF MenuItem;
    FachItem: ARRAY[Turnen..Informatik] OF MenuItem;
    Dummy : BOOLEAN;

    Menu0Text, Menu1Text, Menu2Text, Menu3Text,
    SaveItemText, LoadItemText, NewItemText, EndeItemText,
                  CHItemText, ItemText: IntuiText;
    JahrItemText: ARRAY[1..4] OF IntuiText;
    JahrName: ARRAY[1..4] OF ARRAY[0..20] OF CHAR;
    FachItemText: ARRAY[Turnen..Informatik] OF IntuiText;

    SpielerIntuiTextPtr: IntuiTextPtr;
     (* Jeder Spieler hat für seinen Namen einen IntuiText *)




PROCEDURE FreeMenu0FromWindow;
BEGIN
   ClearMenuStrip(BACKWindow);
   BACKWindow^.menuStrip := NIL
END FreeMenu0FromWindow;





PROCEDURE FreeSpielerItems;
VAR Temp : MenuItemPtr;
    ITmp : IntuiTextPtr;
BEGIN
   WHILE Menu3.firstItem # NIL DO
      Temp := Menu3.firstItem;
      Menu3.firstItem := Menu3.firstItem^.nextItem;
      FreeMem(Temp, SIZE(MenuItem));
   END;
   WHILE SpielerIntuiTextPtr # NIL DO
      ITmp := SpielerIntuiTextPtr;
      SpielerIntuiTextPtr := SpielerIntuiTextPtr^.nextText;
      FreeMem(ITmp, SIZE(IntuiText))
   END
END FreeSpielerItems;



PROCEDURE AppendSpielerItem(VAR Name: ARRAY OF CHAR; i:INTEGER);
 (* i: 1... *)
VAR j : INTEGER;
    t, TempPtr: MenuItemPtr;
    d, TempITextPtr: IntuiTextPtr;
BEGIN
   TempPtr := AllocMem(SIZE(MenuItem), MemReqSet{public});
   Assert(TempPtr#NIL, ADR("Not enough memory"));
   TempITextPtr := AllocMem(SIZE(IntuiText), MemReqSet{public});
   IF TempITextPtr = NIL THEN
      FreeMem(TempPtr, SIZE(MenuItem));
      Assert(FALSE, ADR("Not enough Mem"))
   END;
   WITH TempPtr^ DO
      nextItem := NIL;
      leftEdge := 0;
      topEdge := 10*i - 10;
      width := 120;
      height := 10;
      flags := MenuItemFlagSet{itemText, itemEnabled, highComp};
      mutualExclude := LONGSET{};
      itemFill := NIL;
      selectFill := NIL;
      command := 0C;
      subItem := NIL;
      nextSelect := 0
   END;
   WITH TempITextPtr^ DO
      frontPen := 4;
      backPen := 5;
      drawMode := DrawModeSet{};
      leftEdge := 0;
      topEdge := i * 10 -9; (* (AnzahlSpieler - i) * 10  - 10 *)
      iTextFont := NIL;
      iText := ADR(Name); (* Sollte gehen, da VAR Parameter *)
      nextText := NIL
   END;
   IF i = 1 THEN
      Menu3.firstItem := TempPtr;
      SpielerIntuiTextPtr := TempITextPtr;
   ELSIF i = 2 THEN
      Menu3.firstItem^.nextItem := TempPtr;
      SpielerIntuiTextPtr^.nextText := TempITextPtr;
   ELSE
      t := Menu3.firstItem;
      d := SpielerIntuiTextPtr;
      FOR j := 1 TO i - 2 DO
         t := t^.nextItem;
         d := d^.nextText
      END;
      t^.nextItem := TempPtr;
      d^.nextText := TempITextPtr
   END
END AppendSpielerItem;



PROCEDURE RefreshSpielerMenu(): BOOLEAN;
VAR i: INTEGER;
    AktSp: SpielerPtr;
BEGIN
   FreeSpielerItems;
   IF AnzahlSpieler > 20 THEN RETURN FALSE END;
   IF AnzahlSpieler <=0  THEN RETURN TRUE END;

   ClearMenuStrip(BACKWindow);
    AktSp:=AlleSpieler;
    FOR i := 1 TO AnzahlSpieler DO
       AppendSpielerItem(AktSp^.Name, i);
       AktSp := AktSp^.Next
    END;

    Menu3.firstItem^.itemFill := SpielerIntuiTextPtr;

   IF SetMenuStrip(BACKWindow, ADR(Menu0)) THEN END;

   (* OnMenu(BACKWindow, 0); *)
   RETURN TRUE
END RefreshSpielerMenu;



PROCEDURE CH():BOOLEAN;
BEGIN
   RETURN checked IN CHItem.flags
END CH;



VAR i: INTEGER;
    F: FaecherTypen;
BEGIN (* Menus Initialisierung *)


 (*********************************)
 (***** M E N U   0   Install *****)
 (*********************************)

   WITH Menu0 DO
      nextMenu  := ADR(Menu1);
      leftEdge  := 0;
      topEdge   := 0;
      width     := 48;
      height    := 10;
      flags     := BITSET{menuEnabled};
      menuName  := ADR("GAME");
      firstItem := ADR(SaveItem);
      jazzX     := 0;
      jazzY     := 0;
      beatX     := 0;
      beatY     := 0
   END;
   WITH SaveItemText DO
      frontPen := 3;
      backPen := 6;
      drawMode := DrawModeSet{};
      leftEdge := 0;
      topEdge := 1;
      iTextFont := NIL;
      iText := ADR("SAVE");
      nextText := NIL
   END;
   WITH SaveItem DO
      nextItem := ADR(LoadItem);
      leftEdge := 0;
      topEdge  := 0;
      width := 80;
      height := 10;
      flags := MenuItemFlagSet{itemText, commSeq, itemEnabled, highComp};
      mutualExclude := LONGSET{};
      itemFill := ADR(SaveItemText);
      selectFill := NIL;
      command := "S";
      subItem := NIL;
      nextSelect := 0
   END;
   WITH LoadItemText DO
      frontPen := 3;
      backPen := 6;
      drawMode := DrawModeSet{};
      leftEdge := 0;
      topEdge := 1;
      iTextFont := NIL;
      iText := ADR("LOAD");
      nextText := NIL
   END;
   WITH LoadItem DO
      nextItem := ADR(NewItem);
      leftEdge := 0;
      topEdge  := 10;
      width := 80;
      height := 10;
      flags := MenuItemFlagSet{itemText, commSeq, itemEnabled, highComp};
      mutualExclude := LONGSET{};
      itemFill := ADR(LoadItemText);
      selectFill := NIL;
      command := "L";
      subItem := NIL;
      nextSelect := 0
   END;
   WITH NewItemText DO
      frontPen := 3;
      backPen := 6;
      drawMode := DrawModeSet{};
      leftEdge := 0;
      topEdge := 1;
      iTextFont := NIL;
      iText := ADR("NEU ");
      nextText := NIL
   END;
   WITH NewItem DO
      nextItem := ADR(EndeItem);
      leftEdge := 0;
      topEdge  := 20;
      width := 80;
      height := 10;
      flags := MenuItemFlagSet{itemText, commSeq, itemEnabled, highComp};
      mutualExclude := LONGSET{};
      itemFill := ADR(NewItemText);
      selectFill := NIL;
      command := "N";
      subItem := NIL;
      nextSelect := 0
   END;
   WITH EndeItemText DO
      frontPen := 3;
      backPen := 6;
      drawMode := DrawModeSet{};
      leftEdge := 0;
      topEdge := 1;
      iTextFont := NIL;
      iText := ADR("ENDE");
      nextText := NIL
   END;
   WITH EndeItem DO
      nextItem := ADR(CHItem);
      leftEdge := 0;
      topEdge  := 30;
      width := 80;
      height := 10;
      flags := MenuItemFlagSet{itemText, commSeq, itemEnabled, highComp};
      mutualExclude := LONGSET{};
      itemFill := ADR(EndeItemText);
      selectFill := NIL;
      command := "E";
      subItem := NIL;
      nextSelect := 0
   END;
   WITH CHItemText DO
      frontPen := 3;
      backPen := 6;
      drawMode := DrawModeSet{};
      leftEdge := 0;
      topEdge := 1;
      iTextFont := NIL;
      iText := ADR("  CH");
      nextText := NIL
   END;
   WITH CHItem DO
      nextItem := NIL;
      leftEdge := 0;
      topEdge  := 40;
      width := 80;
      height := 10;
      flags := MenuItemFlagSet{checkIt,menuToggle,itemText, commSeq,
                               itemEnabled, highComp};
      mutualExclude := LONGSET{};
      itemFill := ADR(CHItemText);
      selectFill := NIL;
      command := "C";
      subItem := NIL;
      nextSelect := 0
   END;


 (*********************************)
 (***** M E N U   1   Install *****)
 (*********************************)



   WITH Menu1 DO
      nextMenu := ADR(Menu2);
      leftEdge := 50;
      topEdge := 0;
      width := 48;
      height := 10;
      flags := BITSET{menuEnabled};
      menuName := ADR("Pläne");
      firstItem := ADR(JahrItem[1]);
      jazzX := 0;
      jazzY := 0;
      beatX := 0;
      beatY := 0
   END;
   FOR i := 1 TO 4 DO
      Copy(JahrName[i], " . Jahr");
      JahrName[i][0] := CHR(i + ORD("0"));
      WITH JahrItemText[i]  DO
         frontPen := 3;
         backPen := 6;
         drawMode := DrawModeSet{};
         leftEdge := 0;
         topEdge := 1;
         iTextFont := NIL;
         iText := ADR(JahrName[i]);
         nextText := NIL
      END;
      WITH JahrItem[i] DO
         IF i = 4 THEN
            nextItem := NIL
         ELSE
            nextItem := ADR(JahrItem[i+1])
         END;
         leftEdge := 0;
         topEdge  := i*10-10;
         width := 100;
         height := 10;
         flags := MenuItemFlagSet{itemText, commSeq, itemEnabled, highComp};
         mutualExclude := LONGSET{};
         itemFill := ADR(JahrItemText[i]);
         selectFill := NIL;
         command := CHR(ORD("0") + i);
         subItem := NIL;
         nextSelect := 0
      END
   END;


 (*********************************)
 (***** M E N U   2   Install *****)
 (*********************************)

   WITH Menu2 DO
      nextMenu := ADR(Menu3);
      leftEdge := 100;
      topEdge := 0;
      width := 48;
      height := 10;
      flags := BITSET{menuEnabled};
      menuName := ADR("Fach");
      firstItem := ADR(FachItem[Turnen]);
      jazzX := 0;
      jazzY := 0;
      beatX := 0;
      beatY := 0
   END;
   FOR F := Turnen TO Informatik DO
      WITH FachItemText[F]  DO
         frontPen  := 3;
         backPen   := 6;
         drawMode  := DrawModeSet{};
         leftEdge  := 0;
         topEdge   := 1;
         iTextFont := NIL;
         iText     := ADR(FaecherNamen[F].VollName);
         nextText  := NIL
      END;
      WITH FachItem[F] DO
         IF F = Informatik THEN
            nextItem := NIL
         ELSE
            INC(F);
            nextItem := ADR(FachItem[F]);
            DEC(F)
         END;
         leftEdge := 0;
         topEdge  := ORD(F)*10;
         width := 120;
         height := 10;
         flags := MenuItemFlagSet{itemText, itemEnabled, highComp};
         mutualExclude := LONGSET{};
         itemFill := ADR(FachItemText[F]);
         selectFill := NIL;
         command := 0C;
         subItem := NIL;
         nextSelect := 0
      END
   END;

 (*********************************)
 (***** M E N U   3   Install *****)
 (*********************************)


   WITH Menu3 DO
      nextMenu := NIL;
      leftEdge := 150;
      topEdge := 0;
      width := 58;
      height := 10;
      flags := BITSET{menuEnabled};
      menuName := ADR("Zeugnis");
      firstItem := NIL;
      jazzX := 0;
      jazzY := 0;
      beatX := 0;
      beatY := 0
   END;

   SpielerIntuiTextPtr := NIL;

   (* BreakPoint(ADR("In Menus vor SetMenuStrip")); *)
   IF SetMenuStrip(BACKWindow, ADR(Menu0)) THEN
   END;
   (* OnMenu(BACKWindow, 0); *)

   TermProcedure(FreeSpielerItems);
   TermProcedure(FreeMenu0FromWindow)

END Menus.

