IMPLEMENTATION MODULE MakeMenu;
(*
  Created:   1987
  Changed:   1.8.88 by
             Stefan Salewski
             Stolper Weg 3
             2160 Stade   West-Germany
             Tel: 04141/61130
             
  Note: compiled with AMIGA Modula-2 System by AMSoft from 5.5.88
   
  This Module may be freely copied. But please
  leave my name in. Thanks....Stefan  
*)

  FROM Preference IMPORT CharSize;
  FROM SYSTEM IMPORT ADR,ADDRESS,BYTE,BITSET,LONGSET;
  FROM Graphics IMPORT jam1,jam2,DrawModeSet;
  FROM Exec IMPORT CopyMem,MemReqs,MemReqSet;
  FROM Intuition IMPORT MenuPtr,MenuItemPtr,MenuItemFlagSet,checkWidth,
       commWidth,menuEnabled,MenuItemFlags,IntuiTextPtr,WindowPtr;
  FROM MyRemember IMPORT AllocRemember,FreeRemember,RememberNodePtr;
(*  TYPE
    Menunummer=INTEGER[0..MaxAnzahlMenus-1];
    Itemnummer=INTEGER[0..MaxAnzahlItems-1];
    Subitemnummer=INTEGER[0..MaxAnzahlSubitems-1];
    !!!!!!!Integer hat keine Wirkung,deshalb -1..  (CompilerFehler) !!!!!
 *)
  TYPE
    Menunummer=[-1..MaxAnzahlMenus-1];
    Itemnummer=[-1..MaxAnzahlItems-1];
    Subitemnummer=[-1..MaxAnzahlSubitems-1];
  VAR
    charWidth,charHeight:INTEGER;
    
(*************************************************************************)
  PROCEDURE InitMenu(VAR mRcs:ARRAY OF MenuRecord;VAR firstMenu:MenuPtr;
                     VAR remKey:RememberNodePtr);
    VAR
      menuPtr1,menuPtr2:MenuPtr;
      firstItemPtr:MenuItemPtr;
      intuTextPtr:IntuiTextPtr;
      j:Menunummer;
    PROCEDURE InitItems(VAR firstItem:MenuItemPtr);
      VAR(*InitItems*)
        itemPtr1,itemPtr2,firstSubitemPtr:MenuItemPtr;
        i:Itemnummer;
      PROCEDURE InitSubitems(VAR firstSubitem:MenuItemPtr);
        VAR
          subItemPtr1,subItemPtr2:MenuItemPtr;
          m:Subitemnummer;
      BEGIN
        IF mRcs[j].mItems[i].anzahlSubitems > 0 THEN
          AllocRemember(remKey,subItemPtr1,SIZE(subItemPtr1^))
        ELSE
          subItemPtr1:=NIL
        END;
        firstSubitem:=subItemPtr1;
        FOR m:=0 TO mRcs[j].mItems[i].anzahlSubitems-1 DO
          IF m < mRcs[j].mItems[i].anzahlSubitems-1 THEN
            AllocRemember(remKey,subItemPtr2,SIZE(subItemPtr2^));
            subItemPtr1^.nextItem:=subItemPtr2
          ELSE
            subItemPtr1^.nextItem:=NIL
          END;
          WITH subItemPtr1^ DO
            leftEdge:=ItemnamenLaenge*charWidth;
            topEdge:=m*(charHeight+2);
            width:=(SubitemnamenLaenge+1)*charWidth+checkWidth+commWidth;
            height:=(charHeight+2);
            flags:=MenuItemFlagSet{itemText,itemEnabled,checkIt,highComp};
            IF m=0 THEN INCL(flags,checked);END;
            mutualExclude:=LONGSET{0..31}-LONGSET{(m)};
            AllocRemember(remKey,intuTextPtr,SIZE(intuTextPtr^));
            itemFill:=intuTextPtr;
            selectFill:=NIL;
            command:=mRcs[j].mItems[i].subrecords[m].commandKey;
            IF command#0C THEN
              flags:=flags+MenuItemFlagSet{commSeq}
            END;
            subItem:=NIL;
            nextSelect:=0;
          END;
          WITH intuTextPtr^ DO
            frontPen:=0;
            backPen:=1; 
            drawMode:=jam2;
            leftEdge:=checkWidth;
            topEdge:=1;
            iTextFont:=NIL;
            nextText:=NIL;
            AllocRemember(remKey,iText,SIZE(Subitemname));
            CopyMem(ADR (mRcs[j].mItems[i].subrecords[m].subName),iText,
                    SIZE(Subitemname));
          END;
          subItemPtr1:=subItemPtr2;
        END;(*FOR*)
      END InitSubitems;    
         
    BEGIN (*InitItems*)
      IF mRcs[j].anzahlItems > 0 THEN
        AllocRemember(remKey,itemPtr1,SIZE(itemPtr1^))
      ELSE
        itemPtr1:=NIL
      END;
      firstItem:=itemPtr1;
      FOR i:=0 TO mRcs[j].anzahlItems-1 DO
        InitSubitems(firstSubitemPtr);
        WITH itemPtr1^ DO
          IF i < mRcs[j].anzahlItems-1 THEN
            AllocRemember(remKey,itemPtr2,SIZE(itemPtr2^));
            nextItem:=itemPtr2
          ELSE
            nextItem:=NIL
          END;
          leftEdge:=0;
          topEdge:=i*(charHeight+2);
          width:=(ItemnamenLaenge+1)*charWidth+commWidth;
          height:=(charHeight+2);
          flags:=MenuItemFlagSet{itemText,itemEnabled,highComp};
          mutualExclude:=LONGSET{};
          AllocRemember(remKey,intuTextPtr,SIZE(intuTextPtr^));
          itemFill:=intuTextPtr;
          selectFill:=NIL; 
          IF mRcs[j].mItems[i].anzahlSubitems=0 THEN
            command:=mRcs[j].mItems[i].commandKey;
            subItem:=NIL;
            IF command#0C THEN
              INCL(flags,commSeq)
            END;
          ELSE
            subItem:= firstSubitemPtr;
            command:=0C
          END;
          nextSelect:=0;
        END;
        WITH intuTextPtr^ DO
          frontPen:=0;
          backPen:=1; 
          drawMode:=jam2;
          leftEdge:=0;
          topEdge:=1;
          iTextFont:=NIL;
          nextText:=NIL;
          AllocRemember(remKey,iText,SIZE(Itemname));
          CopyMem(ADR (mRcs[j].mItems[i].iname),iText,SIZE(Itemname));
        END;
        itemPtr1:=itemPtr2;
      END;(*FOR*)
    END InitItems;
  BEGIN (* InitMenu *)
    remKey:=NIL;
    IF HIGH(mRcs) > -1 THEN
      AllocRemember(remKey,menuPtr1,SIZE(menuPtr1^));
      firstMenu:=menuPtr1
    ELSE
      firstMenu:=NIL
    END;
    FOR j:=0 TO HIGH(mRcs) DO
      InitItems(firstItemPtr);
      WITH menuPtr1^ DO
        IF j < HIGH(mRcs) THEN
        AllocRemember(remKey,menuPtr2,SIZE(menuPtr2^));
          nextMenu:=menuPtr2
        ELSE
          nextMenu:=NIL
        END;
        leftEdge:=j*charWidth*MenunamenLaenge;
        topEdge:=0;
        width:=charWidth*MenunamenLaenge;
        height:=charHeight+2;
        flags:=BITSET{menuEnabled};
        firstItem:=firstItemPtr;
        AllocRemember(remKey,menuName,SIZE(Menuname));
        CopyMem(ADR (mRcs[j].mname),menuName,SIZE(Menuname));
      END;
      menuPtr1:=menuPtr2;
    END;
  END InitMenu;
  
  PROCEDURE FreeMenu(VAR remKey:RememberNodePtr);
  BEGIN
    FreeRemember(remKey);
  END FreeMenu;
      
  PROCEDURE MenuNum(code:CARDINAL):CARDINAL;
  BEGIN
    RETURN code MOD 32
  END MenuNum; 
  
  PROCEDURE ItemNum(code:CARDINAL):CARDINAL;
  BEGIN
    RETURN (code DIV 32) MOD 64
  END ItemNum;
   
  PROCEDURE SubNum(code:CARDINAL):CARDINAL;
  BEGIN
    RETURN ((code DIV 32) DIV 64) MOD 32
  END SubNum;
      
BEGIN
  CharSize(charWidth,charHeight);
END MakeMenu.mod
