IMPLEMENTATION MODULE CalcMenus;

(** ------------------------------------------------------------------



    ------------------------------------------------------------------ **)


(* VERSION FOR COMMODORE AMIGA

     Version         : 0.00a  04-Jul-86  DJP

  *)

FROM CalcDisplay IMPORT display, displayType, NDecDigits, NSciDigits;

FROM Intuition  IMPORT IntuitionText,
                       MenuItem, MenuItemPtr, ItemFlags, ItemFlagSet,
                       Menu, MenuPtr, MenuFlags, MenuFlagSet,
                       NoMenu, NoItem, NoSub, MenuNULL,
                       WindowPtr,
                       IDCMPFlagSet, IDCMPFlags;
FROM IntuiUtils IMPORT ItemNum, MenuNum, SubNum;
FROM Menus      IMPORT ItemAddress;
FROM Requesters IMPORT AutoRequest;
FROM Storage    IMPORT ALLOCATE;
FROM SYSTEM     IMPORT ADDRESS, ADR, BYTE, NULL;



(* Mostly for InitMenus *)
TYPE  NAME = ARRAY[0..15] OF CHAR;
VAR   SubItems : ARRAY[0..15]  OF MenuItem;
      Items    : ARRAY[0..6]  OF MenuItem;
      Titles   : ARRAY[0..1]  OF Menu;
      SubName  : ARRAY[0..15]  OF NAME;
      ItemName : ARRAY[0..6]  OF NAME;
      TName    : ARRAY[0..1]  OF NAME;
      SubText  : ARRAY[0..15]  OF IntuitionText;
      Itemtext : ARRAY[0..6]  OF IntuitionText;


PROCEDURE MenuHandle( menuNumber : CARDINAL ; wp : WindowPtr ) : BOOLEAN;

 VAR I      : INTEGER;
     ItemA  : MenuItemPtr;
     NMenu  : CARDINAL;
     NItem  : CARDINAL;
     NSubI  : CARDINAL;


 PROCEDURE UnCheck;

 VAR I : INTEGER;

 BEGIN
   (* Un-check all menu and submenu items for menu 1 *)
   FOR I := 2 TO 6 DO
      Items[I].Flags := ItemFlagSet{ItemText, ItemEnabled, It6, CheckIt};
   END;
   FOR I := 0 TO 15 DO
      SubItems[I].Flags := ItemFlagSet{ItemText, ItemEnabled, It6, CheckIt};
   END;
 END UnCheck;



 PROCEDURE AUTOREQUEST;

  TYPE  LINE = ARRAY[0..49] OF CHAR;

  VAR
        I     : CARDINAL;
        NMenu : CARDINAL;
        NItem : CARDINAL;
        NSubI : CARDINAL;
        Line1        : ARRAY[0..49] OF CHAR;
        Line2        : ARRAY[0..49] OF CHAR;
        Line3        : ARRAY[0..49] OF CHAR;
        Line4        : ARRAY[0..49] OF CHAR;
        Line5        : ARRAY[0..49] OF CHAR;
        Line6        : ARRAY[0..49] OF CHAR;
        Line7        : ARRAY[0..49] OF CHAR;
        NoText       : ARRAY[0..4]  OF CHAR;
        YesText      : ARRAY[0..4]  OF CHAR;
        AutoBodyText : ARRAY[0..7]  OF IntuitionText;
        AutoYesText  : IntuitionText;
        AutoNoText   : IntuitionText;
        AutoYesFlags : IDCMPFlagSet;
        AutoNoFlags  : IDCMPFlagSet;
        OK           : BOOLEAN;
        Top          : CARDINAL;

   BEGIN
     (* Create AutoRequester *)
      YesText := " OK ";
      WITH AutoYesText DO
         FrontPen := BYTE(2);  BackPen := BYTE(0);
         DrawMode := BYTE(0);
         LeftEdge := 6;       TopEdge := 3;
         ITextFont := NULL;  NextText  := NULL;
         IText     := ADR( YesText );
      END;
      NoText := "FINE";
      WITH AutoNoText DO
         FrontPen := BYTE(2);  BackPen := BYTE(0);
         DrawMode := BYTE(0);
         LeftEdge := 6;       TopEdge := 3;
         ITextFont := NULL;  NextText  := NULL;
         IText     := ADR( NoText );
      END;
      Line1 := "HP-10C  (sort of)             ";
      Line2 := " Written by  Duncan Prindle   ";
      Line3 := "   using TDI Modula2          ";
      Line4 := " Send comments to;            ";
      Line5 := "   BITNET.DUNCAN@SLACVM       ";
      Line6 := " For more information see     ";
      Line7 := "       HP-10C.DOC             ";
      FOR I := 0 TO 6 DO
         Top := 10 * (I + 1);
         WITH AutoBodyText[I] DO
            FrontPen  := BYTE(2); BackPen   := BYTE(0);
            DrawMode  := BYTE(0);
            LeftEdge  := 10;      TopEdge := Top;
            ITextFont := NULL;    NextText  := NULL;
         END;
      END;
      FOR I := 0 TO 5 DO
         WITH AutoBodyText[I] DO
            NextText := ADR( AutoBodyText[I+1] );
         END;
      END;
      AutoBodyText[0].IText := ADR( Line1 );
      AutoBodyText[1].IText := ADR( Line2 );
      AutoBodyText[2].IText := ADR( Line3 );
      AutoBodyText[3].IText := ADR( Line4 );
      AutoBodyText[4].IText := ADR( Line5 );
      AutoBodyText[5].IText := ADR( Line6 );
      AutoBodyText[6].IText := ADR( Line7 );
      AutoYesFlags := IDCMPFlagSet{};
      AutoNoFlags  := IDCMPFlagSet{};
      OK := AutoRequest( wp^, AutoBodyText[0], AutoYesText,
                         AutoNoText, AutoYesFlags, AutoNoFlags, 300, 130);

   END AUTOREQUEST;



 BEGIN

     WHILE menuNumber # MenuNULL DO
       (* Decode Menu number *)
        NMenu := MenuNum( menuNumber );
        NItem := ItemNum( menuNumber );
        NSubI := SubNum( menuNumber );

       (* Now Do something *)
        IF NMenu = 0 THEN
          (* Menu 0.  The items are:
             NItem  := 0 =>   "ABOUT"
             NItem  := 1 =>   "QUIT"   *)

           IF     NItem = 0  THEN AUTOREQUEST;
            ELSIF NItem = 1  THEN RETURN FALSE;
           END;

        ELSIF NMenu = 1 THEN
           (* Menu 1 is the Display
              NItem := 0 =>   "BINARY"
              NItem := 1 =>   "OCTAL"
              NItem := 2 =>   "HEX"
              NItem := 3 =>   "DECIMAL"
              NItem := 4 =>   "SCIENTIFIC"

            DECIMAL and SCIENTIFIC have subitems. *)

           IF     NItem = 0 THEN display := BINARY;     UnCheck;
            ELSIF NItem = 1 THEN display := OCTAL;      UnCheck;
            ELSIF NItem = 2 THEN display := HEX;        UnCheck;
            ELSIF NItem = 3 THEN display := DECIMAL;    UnCheck;
                  NDecDigits := NSubI + 1;
                  SubItems[NSubI].Flags :=
                                    ItemFlagSet{ItemText, ItemEnabled,
                                                It6, CheckIt, Checked};
            ELSIF NItem = 4 THEN display := SCIENTIFIC; UnCheck;
                  NSciDigits := NSubI + 1;
                  NSciDigits := - NSciDigits;
                  SubItems[NSubI+8].Flags :=
                                    ItemFlagSet{ItemText, ItemEnabled,
                                                It6, CheckIt, Checked};
           END;
           Items[NItem+2].Flags := ItemFlagSet{ItemText, ItemEnabled,
                                             It6, CheckIt, Checked};
        END;
       (* Finished with current menu item. Get next one and handle it. *)
        ItemA := ItemAddress( Titles[0], menuNumber );
        menuNumber := ItemA^.NextSelect;
     END;

   RETURN TRUE;
   END MenuHandle;



PROCEDURE InitMenus( ): MenuPtr;

   VAR   I : CARDINAL;

 BEGIN

   SubName[ 0] := "   1";
   SubName[ 1] := "   2";
   SubName[ 2] := "   3";
   SubName[ 3] := "   4";
   SubName[ 4] := "   5";
   SubName[ 5] := "   6";
   SubName[ 6] := "   7";
   SubName[ 7] := "   8";
   SubName[ 8] := "   1";
   SubName[ 9] := "   2";
   SubName[10] := "   3";
   SubName[11] := "   4";
   SubName[12] := "   5";
   SubName[13] := "   6";
   SubName[14] := "   7";
   SubName[15] := "   8";

   FOR I := 0 TO 15 DO
      WITH SubText[I] DO
         FrontPen := BYTE(2);  BackPen := BYTE(0);  DrawMode := BYTE(0);
         LeftEdge := 0;        TopEdge := 1;
         ITextFont := NULL;
         IText     := ADR( SubName[I] );
         NextText  := NULL;
      END;
   END;

   ItemName[0] := " ABOUT";
   ItemName[1] := " QUIT";
   ItemName[2] := "   BINARY";
   ItemName[3] := "   OCTAL";
   ItemName[4] := "   HEX";
   ItemName[5] := "   DECIMAL";
   ItemName[6] := "   SCIENTIFIC";
   FOR I := 0 TO 6 DO
      WITH Itemtext[I] DO
         FrontPen := BYTE(2);  BackPen := BYTE(0);  DrawMode := BYTE(0);
         LeftEdge := 0;        TopEdge := 1;
         ITextFont := NULL;
         IText     := ADR( ItemName[I] );
         NextText  := NULL;
      END;
   END;

   FOR I := 0 TO 15 DO
      WITH SubItems[I] DO
         IF I < 15
            THEN NextItem := ADR( SubItems[I+1] );
            ELSE NextItem := NULL;
         END;
         IF I < 8
            THEN TopEdge := 10*I;
            ELSE TopEdge := 10*(I-8);
         END;
         LeftEdge := 108;  Width := 48;  Height := 10;
         Flags    :=  ItemFlagSet{ItemText, ItemEnabled, CheckIt, It6};
         ItemFill := ADR( SubText[I] );
         SelectFill    := NULL;
         SubItem  := NULL;
      END;
   END;

   SubItems[ 0].MutualExclude := 254;
   SubItems[ 1].MutualExclude := 253;
   SubItems[ 2].MutualExclude := 251;
   SubItems[ 2].Flags    :=  ItemFlagSet{ItemText, ItemEnabled, It6,
                                                       CheckIt,  Checked};
   SubItems[ 3].MutualExclude := 247;
   SubItems[ 4].MutualExclude := 239;
   SubItems[ 5].MutualExclude := 223;
   SubItems[ 6].MutualExclude := 191;
   SubItems[ 7].MutualExclude := 127;
   SubItems[ 7].NextItem := NULL;

   SubItems[ 8].MutualExclude := 254;
   SubItems[ 9].MutualExclude := 253;
   SubItems[10].MutualExclude := 251;
   SubItems[11].MutualExclude := 247;
   SubItems[12].MutualExclude := 239;
   SubItems[13].MutualExclude := 223;
   SubItems[14].MutualExclude := 191;
   SubItems[15].MutualExclude := 127;

   FOR I := 0 TO 6 DO
      WITH Items[I] DO
         IF I < 6
            THEN NextItem := ADR( Items[I+1] );
            ELSE NextItem := NULL;
         END;
         IF I < 2
            THEN TopEdge := 10*I;
                 Width   :=  64;
            ELSE TopEdge := 10*(I-2);
                 Width   := 120;
         END;
         LeftEdge := 0;  Height := 10;
         Flags    := ItemFlagSet{ItemText, ItemEnabled, CheckIt, It6};
         MutualExclude := 0;
         ItemFill := ADR( Itemtext[I] );
         SelectFill    := NULL;
         SubItem  := NULL;
      END;
   END;

   Items[0].Flags := ItemFlagSet{ItemText, ItemEnabled, It6};
   Items[1].NextItem := NULL;
   Items[1].Flags := ItemFlagSet{ItemText, ItemEnabled, It6};
   Items[2].MutualExclude := 30;
   Items[3].MutualExclude := 29;
   Items[4].MutualExclude := 27;
   Items[5].MutualExclude := 23;
   Items[5].Flags := ItemFlagSet{ItemText, ItemEnabled, It6,
                                  CheckIt, Checked};
   Items[5].SubItem  := ADR( SubItems[0] );
   Items[6].MutualExclude := 15;
   Items[6].SubItem  := ADR( SubItems[8] );

   TName[0] := " HP-10C";
   TName[1] := " DISPLAY";

   WITH Titles[0] DO
      NextMenu  := ADR( Titles[1] );
      LeftEdge  :=  3;  TopEdge := 0;  Width := 70;  Height := 0;
      Flags     := MenuFlagSet{MenuEnabled};
      MenuName  := ADR( TName[0] );
      FirstItem := ADR( Items[0] );
   END;
   WITH Titles[1] DO
      NextMenu  := NULL;
      LeftEdge  := 72;  TopEdge := 0;  Width := 78;  Height := 0;
      Flags     := MenuFlagSet{MenuEnabled};
      MenuName  := ADR( TName[1] );
      FirstItem := ADR( Items[2] );
   END;

   RETURN ADR( Titles[0] );
   END InitMenus;



END CalcMenus.