MODULE TheChoice;
(* Version : 1.05 *)
(* Author  : Carsten Wich *)

FROM SYSTEM IMPORT ADR, ADDRESS, TAG;

IMPORT art:Arts,
       dd:DosD,
       dl:DosL,
       el:ExecL,
       gtd:GadToolsD,
       gtl:GadToolsL,
       gd:GraphicsD,
       id:IntuitionD,
       il:IntuitionL,
       io:InOut,
       st:String,
       ud:UtilityD;
VAR
  ScrPtr    : id.ScreenPtr;
  ScrMode   : LONGINT;
  ScrHght,
  MaxRow,
  MaxCol,
  Left,
  Space     : CARDINAL;
  WinPtr    : id.WindowPtr;
  tagBuffer : ARRAY[0..20] OF LONGINT;
  SelectTxt : id.IntuiText;
  Datei     : dd.FileHandlePtr;
  TAttr     : gd.TextAttr;
  VInfo     : ADDRESS;
  NewGad    : gtd.NewGadget;
  Gad       : ARRAY[0..102] OF id.GadgetPtr;
  Name      : ARRAY[1..102] OF ARRAY[0..25] OF CHAR;
  Script    : ARRAY[1..102] OF ARRAY[0..40] OF CHAR;
  PGad      : id.GadgetPtr;
  i,j,
  Max,
  GadNr     : CARDINAL;
  Msg       : id.IntuiMessagePtr;
  Suc       : LONGINT;
  Buffer    : POINTER TO ARRAY[0..40] OF CHAR;
  ExeStr    : ARRAY[0..68] OF CHAR;
  Cancel,
  End       : BOOLEAN;

BEGIN
  ExeStr := 'Execute ';
  End := FALSE;
  Datei := dl.Open(ADR('S:TheChoice.config'),dd.oldFile);
  Max := 0;
  REPEAT
    Buffer := dl.FGets(Datei,ADR(Name[Max+1]),26);
    IF Buffer#NIL THEN
      st.DeleteChar(Name[Max+1],st.Length(Name[Max+1])-1);
      Buffer := dl.FGets(Datei,ADR(Script[Max+1]),41);
      IF Buffer#NIL THEN
        st.DeleteChar(Script[Max+1],st.Length(Script[Max+1])-1);
        INC(Max)
      END
    END
  UNTIL (Max>=102) OR (Buffer=NIL);
  dl.Close(Datei);
  IF Max>0 THEN
    IF Max>48 THEN
      ScrMode := gd.hireslaceKey;
      ScrHght := 512;
      MaxRow  := 34;
      CASE Max OF
        69..102 : MaxCol := 3;
                  Left := 6;
                  Space := 2 |
         35..68 : MaxCol := 2;
                  Left := 74;
                  Space := 75 |
          1..34 : MaxCol := 1;
                  Left := 216;
                  Space := 0 |
        ELSE
      END;
    ELSE
      ScrMode := gd.hiresKey;
      ScrHght := 256;
      MaxRow  := 16;
      CASE Max OF
        33..48 : MaxCol := 3;
                 Left := 6;
                 Space := 2 |
        17..32 : MaxCol := 2;
                 Left := 74;
                 Space := 75 |
         1..16 : MaxCol := 1;
                 Left := 216;
                 Space := 0 |
        ELSE
      END;
    END;
    TAttr.name := ADR('topaz.font');
    TAttr.ySize := 8;
    TAttr.flags := gd.FontFlagSet{gd.romFont};
    ScrPtr := il.OpenScreenTagList(NIL,TAG(tagBuffer,
                                   id.saWidth,640,
                                   id.saHeight,ScrHght,
                                   id.saDepth,2,
                                   id.saFont,ADR(TAttr),
                                   id.saDisplayID,ScrMode,
                                   id.saTitle,ADR('TheChoice V1.05 - Copyright 1993-95 by Carsten Wich'),
                                   id.saPens,ADR(CARDINAL{0FFFFH}),
                                   ud.tagDone));
    art.Assert(ScrPtr#NIL,ADR('Can not open Screen !!!'));
    VInfo := gtl.GetVisualInfoA(ScrPtr,TAG(tagBuffer,ud.tagDone));
    Gad[0] := NIL;
    art.Assert(gtl.CreateContext(Gad[0])#NIL,ADR('Can not create Gadgets !!!'));
    NewGad.width := 208;
    NewGad.height := 12;
    NewGad.flags := gtd.NewGadgetFlagSet{gtd.placetextIn};
    NewGad.visualInfo := VInfo;
    NewGad.textAttr := ScrPtr^.font;
    FOR i:=0 TO MaxCol-1 DO
      FOR j:=0 TO MaxRow-1 DO
        IF Max>=(1+i*MaxRow+j) THEN
          NewGad.leftEdge := Left+i*(208+Space);
          NewGad.topEdge := 14+j*14;
          NewGad.gadgetText := ADR(Name[1+i*MaxRow+j]);
          NewGad.gadgetID := 1+i*MaxRow+j;
          Gad[1+i*MaxRow+j] := gtl.CreateGadgetA(gtd.buttonKind,Gad[i*MaxRow+j]^,NewGad,TAG(tagBuffer,
                                                                                            ud.tagDone));
        END
      END
    END;
    WinPtr := il.OpenWindowTagList(NIL,TAG(tagBuffer,
                                   id.waLeft,0,
                                   id.waTop,0,
                                   id.waWidth,640,
                                   id.waHeight,ScrHght,
                                   id.waTitle,ADR('TheChoice V1.05 - Copyright 1993-95 by Carsten Wich'),
                                   id.waCustomScreen,ScrPtr,
                                   id.waIDCMP,id.IDCMPFlagSet{id.gadgetUp,
                                                              id.closeWindow,
                                                              id.vanillaKey},
                                   id.waCloseGadget, TRUE,
                                   id.waActivate,TRUE,
                                   id.waGadgets,Gad[0],
                                   ud.tagDone));
    art.Assert(ScrPtr#NIL,ADR('Can not open Window !!!'));
    SelectTxt.frontPen := 2;
    SelectTxt.backPen := 0;
    SelectTxt.drawMode := gd.DrawModeSet{gd.dm0};
    SelectTxt.leftEdge := 0;
    SelectTxt.topEdge := 0;
    SelectTxt.iTextFont := ScrPtr^.font;
    SelectTxt.iText := ADR('Select one of the above Programs to be executed');
    il.PrintIText(WinPtr^.rPort,ADR(SelectTxt),132,ScrHght-14);
    REPEAT
      el.WaitPort(WinPtr^.userPort);
      Msg := el.GetMsg(WinPtr^.userPort);
      IF Msg^.class = id.IDCMPFlagSet{id.gadgetUp} THEN
        PGad := Msg^.iAddress;
        GadNr := PGad^.gadgetID;
        End := TRUE;
      ELSIF Msg^.class = id.IDCMPFlagSet{id.closeWindow} THEN
        Cancel := TRUE
      END;
      el.ReplyMsg(Msg);
    UNTIL End OR Cancel;
    il.CloseWindow(WinPtr);
    gtl.FreeGadgets(Gad[0]);
    gtl.FreeVisualInfo(VInfo);
    il.CloseScreen(ScrPtr);
    IF NOT Cancel THEN
      st.Concat(ExeStr, Script[GadNr]);
      Suc := dl.Execute(ADR(ExeStr),NIL,NIL)
    END
  ELSE
    io.WriteString('Bad or missing config file !!!');
    io.WriteLn;
  END;
END TheChoice.
