(*---------------------------------------------------------------------------
  :Program.    OnLine
  :Author.     Thomas Stolze
  :Address.    Goslarsche Str. 32, 3000 Hannover 21, Germany
  :Phone.      (0)511 / 75 10 77
  :Version.    V1.2
  :Date.       29-Sep-90
  :Copyright.  PD
  :Language.   Modula-2
  :Translator. M2Amiga V3.32d
  :Imports.    FileRequester
  :Contents.   Print Utility.
  :LastChange. 20-Dec-90
---------------------------------------------------------------------------*)
(* $R- *) (* $V- *) (* $S- *) (* $N- *) (* $F- *)
MODULE OnLine;

FROM Arts             IMPORT AllLevelTermProc,Assert,Terminate;
FROM Exec             IMPORT GetMsg,ReplyMsg,WaitPort;
FROM FileRequester    IMPORT FileRequester,CauseAction,CloseFileRequest,
                             FileRequest,FileRequestFlags,FileRequestFlagSet;
FROM Graphics         IMPORT DrawModes,DrawModeSet,jam2;
FROM Intuition        IMPORT ActivationFlags,ActivationFlagSet,boolGadget,
                             Border,BorderPtr,ClearMenuStrip,CloseWindow,Gadget,
                             GadgetFlags,GadgetFlagSet,GadgetPtr,IDCMPFlags,
                             IDCMPFlagSet,IntuiMessage,IntuiMessagePtr,
                             IntuiText,IntuiTextPtr,Menu,MenuItem,MenuItemFlags,
                             MenuItemFlagSet,MenuPtr,NewWindow,OpenWindow,
                             RefreshGadgets,ScreenFlags,ScreenFlagSet,
                             selectDown,SetMenuStrip,strGadget,StringInfo,
                             WindowFlags,WindowFlagSet,WindowPtr;
FROM IntuiMacros      IMPORT ItemNum,MenuNum;
FROM IntuitionSupport IMPORT SetBorder,SetBorderKoord,SetGadget,SetInfo,
                             SetIText,SetMenu,SetMenuItem,SetWindow;
FROM PrintOut         IMPORT PrintIt;
FROM Requester        IMPORT OptionRequester;
FROM Routines         IMPORT Block,Frame,g15Ptr,GetArguments,LoadOpt,Print,
                             PrintModes,PrintPath,prtInfo,QueuePrintOrder,
                             SaveOpt,window;
FROM ShowSelected     IMPORT CheckMouse,Closeup,Down,HandleWindow,ModifyProp,
                             mouseX,mouseY,PrintAllQueuedFiles,RefreshEntry,
                             RemoveEntry,Up;
FROM Str              IMPORT Copy;
FROM SYSTEM           IMPORT ADR;

CONST title    = "OnLine V1.2   © by Thomas Stolze 1990";
      file     = "Filename:";
      scale    = "0%         25%         50%         75%        100%";
      firstrow = "Firstrow:";
      lastrow  = "Lastrow:";
      top      = "Top:";
      bottom   = "Bottom:";
      lmargin  = "Leftmargin:";

VAR GadgetArray  : ARRAY [0..15] OF Gadget;
    TextArray    : ARRAY [0..15] OF IntuiText;
    BorderArray  : ARRAY [0..5],[0..9] OF INTEGER;
    pathArray    : ARRAY [0..80] OF CHAR;
    InfoArray    : ARRAY [0..5] OF StringInfo;
    GadgetBorder : ARRAY [0..5] OF Border;
    BufferArray  : ARRAY [0..4],[0..11] OF CHAR;
    menuStrip    : ARRAY [0..1] OF Menu;
    menuStripPtr : MenuPtr;
    menuItem     : ARRAY [0..4] OF MenuItem;
    menuText     : ARRAY [0..6] OF IntuiText;
    fileRequest  : FileRequest;

PROCEDURE CorrectIntuition(display : BOOLEAN);

  PROCEDURE FillGadg(ID,col : INTEGER);
  BEGIN
    IF display THEN
       Block(window^.rPort,col,GadgetArray[ID].leftEdge,
                GadgetArray[ID].topEdge,
                GadgetArray[ID].leftEdge+GadgetArray[ID].width-1,
                GadgetArray[ID].topEdge+GadgetArray[ID].height-1,
                DrawModeSet{complement});
    END;
  END FillGadg;

  PROCEDURE CorrectGadg(ID : INTEGER; printMode : PrintModes);
  BEGIN
    IF (printMode IN prtInfo.pI.printMode) THEN
        INCL(GadgetArray[ID].flags,selected);
        FillGadg(ID,3);
    ELSE
        EXCL(GadgetArray[ID].flags,selected);
        FillGadg(ID,0);
    END;
  END CorrectGadg;
BEGIN
  CorrectGadg(2,nlq);   CorrectGadg(3,format);
  CorrectGadg(4,date);  CorrectGadg(5,time);
  CorrectGadg(6,page);  CorrectGadg(14,queue);
  IF display THEN RefreshGadgets(ADR(GadgetArray[0]),window,NIL);
                  RefreshGadgets(ADR(GadgetArray[0]),window,NIL);
  END;
END CorrectIntuition;

PROCEDURE InitIntuition;
VAR nw : NewWindow;

  PROCEDURE InitIText;
  VAR ptr : IntuiTextPtr;
  BEGIN
    ptr:=SetIText(TextArray[0],ADR("Directory")   ,1,0,6,2,jam2);
    ptr:=SetIText(TextArray[1],ADR("Selected")    ,1,0,6,2,jam2);
    ptr:=SetIText(TextArray[2],ADR("   NLQ")      ,1,0,1,2,jam2);
    ptr:=SetIText(TextArray[3],ADR("  Format")    ,1,0,1,2,jam2);
    ptr:=SetIText(TextArray[4],ADR("Date")        ,1,0,1,2,jam2);
    ptr:=SetIText(TextArray[5],ADR("Time")        ,1,0,1,2,jam2);
    ptr:=SetIText(TextArray[6],ADR("Page")        ,1,0,1,2,jam2);
    ptr:=SetIText(TextArray[7],ADR("  Print")     ,1,0,6,2,jam2);
    ptr:=SetIText(TextArray[8],ADR("   Quit")     ,1,0,1,2,jam2);
    ptr:=SetIText(TextArray[9],ADR("  Queue")     ,1,0,6,2,jam2);
  END InitIText;

  PROCEDURE InitInfo;
  BEGIN
   SetInfo(InfoArray[0],ADR(prtInfo.pI.numArray[0]),ADR(BufferArray[0]),0,24,0);
   SetInfo(InfoArray[1],ADR(prtInfo.pI.numArray[1]),ADR(BufferArray[1]),0,24,0);
   SetInfo(InfoArray[2],ADR(prtInfo.pI.numArray[2]),ADR(BufferArray[2]),0,24,0);
   SetInfo(InfoArray[3],ADR(prtInfo.pI.numArray[3]),ADR(BufferArray[3]),0,24,0);
   SetInfo(InfoArray[4],ADR(prtInfo.pI.numArray[4]),ADR(BufferArray[4]),0,24,0);
   SetInfo(InfoArray[5],ADR(prtInfo.pI.strPath),ADR(pathArray),0,79,0);

    prtInfo.pI.numArray[0]:=("2");     BufferArray[0]:=("2");
    prtInfo.pI.numArray[1]:=("4");     BufferArray[1]:=("4");
    prtInfo.pI.numArray[2]:=("0");     BufferArray[2]:=("0");
    prtInfo.pI.numArray[3]:=("0");     BufferArray[3]:=("0");
    prtInfo.pI.numArray[4]:=("99999"); BufferArray[4]:=("99999");
    prtInfo.pI.strPath:=(":"); pathArray:=(":");
  END InitInfo;

  PROCEDURE InitGadgets;
  BEGIN
    SetGadget(GadgetArray[0],16,56,80,10,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify},
              boolGadget,ADR(GadgetBorder[0]),ADR(TextArray[0]),NIL,0);
    SetGadget(GadgetArray[1],98,56,80,10,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify},
              boolGadget,ADR(GadgetBorder[0]),ADR(TextArray[1]),NIL,1);
    SetGadget(GadgetArray[2],180,56,80,10,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify,toggleSelect},
              boolGadget,ADR(GadgetBorder[0]),ADR(TextArray[2]),NIL,2);
    SetGadget(GadgetArray[3],262,56,80,10,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify,toggleSelect},
              boolGadget,ADR(GadgetBorder[0]),ADR(TextArray[3]),NIL,3);
    SetGadget(GadgetArray[4],20,78,34,10,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify,toggleSelect},
              boolGadget,ADR(GadgetBorder[2]),ADR(TextArray[4]),NIL,4);
    SetGadget(GadgetArray[5],56,78,34,10,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify,toggleSelect},
              boolGadget,ADR(GadgetBorder[2]),ADR(TextArray[5]),NIL,5);
    SetGadget(GadgetArray[6],92,78,34,10,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify,toggleSelect},
              boolGadget,ADR(GadgetBorder[2]),ADR(TextArray[6]),NIL,6);
    SetGadget(GadgetArray[7],20,114,80,10,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify},
              boolGadget,ADR(GadgetBorder[0]),ADR(TextArray[7]),NIL,7);
    SetGadget(GadgetArray[8],340,114,80,10,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify},
              boolGadget,ADR(GadgetBorder[0]),ADR(TextArray[8]),NIL,8);
    SetGadget(GadgetArray[9],60,95,49,8,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify,toggleSelect,longint},
              strGadget,ADR(GadgetBorder[1]),NIL,ADR(InfoArray[0]),9);
    SetGadget(GadgetArray[10],216,95,49,8,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify,toggleSelect,longint},
              strGadget,ADR(GadgetBorder[1]),NIL,ADR(InfoArray[1]),10);
    SetGadget(GadgetArray[11],371,95,49,8,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify,toggleSelect,longint},
              strGadget,ADR(GadgetBorder[1]),NIL,ADR(InfoArray[2]),11);
    SetGadget(GadgetArray[12],216,79,49,8,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify,toggleSelect,longint},
              strGadget,ADR(GadgetBorder[1]),NIL,ADR(InfoArray[3]),12);
    SetGadget(GadgetArray[13],371,79,49,8,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify,toggleSelect,longint},
              strGadget,ADR(GadgetBorder[1]),NIL,ADR(InfoArray[4]),13);
    SetGadget(GadgetArray[14],344,56,80,10,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify,toggleSelect},
              boolGadget,ADR(GadgetBorder[0]),ADR(TextArray[9]),NIL,14);
    SetGadget(GadgetArray[15],100,13,320,8,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify,toggleSelect},
              strGadget,ADR(GadgetBorder[3]),NIL,ADR(InfoArray[5]),15);
  END InitGadgets;

  PROCEDURE InitBorderCoor;
  BEGIN
    SetBorderKoord(BorderArray[0],GadgetArray[0]);
    SetBorderKoord(BorderArray[1],GadgetArray[9]);
    SetBorderKoord(BorderArray[2],GadgetArray[4]);
    SetBorderKoord(BorderArray[3],GadgetArray[15]);
  END InitBorderCoor;

  PROCEDURE InitBorder;
  VAR ptr : BorderPtr;
  BEGIN
    ptr:=SetBorder(GadgetBorder[0],-1,-1,1,0,5,jam2,ADR(BorderArray[0]));
    ptr:=SetBorder(GadgetBorder[1],-1,-1,1,0,5,jam2,ADR(BorderArray[1]));
    ptr:=SetBorder(GadgetBorder[2],-1,-1,1,0,5,jam2,ADR(BorderArray[2]));
    ptr:=SetBorder(GadgetBorder[3],-1,-1,1,0,5,jam2,ADR(BorderArray[3]));
  END InitBorder;

  PROCEDURE InitMenu;
  VAR ptr  : IntuiTextPtr;
  BEGIN
    ptr:=SetIText(menuText[0],ADR("Load OPT")  ,0,1,17,2,jam2);
    ptr:=SetIText(menuText[1],ADR("Save OPT")  ,0,1,17,2,jam2);
    ptr:=SetIText(menuText[2],ADR("Quit")      ,0,1,17,2,jam2);
    ptr:=SetIText(menuText[3],ADR("Prefs")     ,0,1,17,0,jam2);

    menuStripPtr:=SetMenu(menuStrip[0], 28,0,100,0,ADR(" System"));
    menuStrip[0].nextMenu:=SetMenu(menuStrip[1],156,0,100,0,ADR(" Options"));

   menuStripPtr^.firstItem:=SetMenuItem(menuItem[0],3,0,140,11,
               MenuItemFlagSet{highComp,itemText,itemEnabled,commSeq},
               ADR(menuText[0]),NIL,"L");
       menuItem[0].nextItem:=SetMenuItem(menuItem[1],3,12,140,11,
               MenuItemFlagSet{highComp,itemText,itemEnabled,commSeq},
               ADR(menuText[1]),NIL,"S");
       menuItem[1].nextItem:=SetMenuItem(menuItem[2],3,24,140,11,
               MenuItemFlagSet{highComp,itemText,itemEnabled,commSeq},
               ADR(menuText[2]),NIL,"Q");

  menuStrip[1].firstItem:=SetMenuItem(menuItem[3],3,0,120,11,
               MenuItemFlagSet{highComp,itemText,itemEnabled,commSeq},
               ADR(menuText[3]),NIL,"O");
  END InitMenu;

  PROCEDURE InitAll;
  VAR i : INTEGER;
  BEGIN
    InitIText; InitGadgets; InitBorderCoor; InitBorder; InitInfo; InitMenu;
    g15Ptr:=ADR(GadgetArray[15]);

    FOR i:=1 TO 15 DO GadgetArray[i-1].nextGadget:=ADR(GadgetArray[i]) END;
  END InitAll;

BEGIN
  InitAll; LoadOpt; GetArguments; CorrectIntuition(FALSE);

  SetWindow(nw,100,70,440,128,0,1,
            IDCMPFlagSet{closeWindow,gadgetDown,menuPick},
            WindowFlagSet{windowDrag,windowDepth,windowClose,activate,
                          windowRefresh,windowActive,menuState},
            ADR(title),ADR(GadgetArray[0]),NIL,
            10,60,440,110,ScreenFlagSet{wbenchScreen});

  window:=OpenWindow(nw);
    Assert(window # NIL,ADR("Couldn't open window!"));
    Assert(SetMenuStrip(window,menuStripPtr) # FALSE,
           ADR("Couldn't install Menu!"));

  Frame(window^.rPort,3,20,25,420,43,2);
  Frame(window^.rPort,3,10,70,430,110,2);

  Print(file,window^.rPort,1,0,jam2,20,19);
  Print(scale,window^.rPort,1,0,jam2,20,52);
  Print(firstrow,window^.rPort,1,0,jam2,142,85);
  Print(lastrow,window^.rPort,1,0,jam2,276,85);
  Print(top,window^.rPort,1,0,jam2,20,101);
  Print(bottom,window^.rPort,1,0,jam2,142,101);
  Print(lmargin,window^.rPort,1,0,jam2,276,101);

  PrintPath(ADR(GadgetArray[15]));
END InitIntuition;

PROCEDURE ManipulateGadg(ID : INTEGER; printMode : PrintModes);
BEGIN
  IF (selected IN GadgetArray[ID].flags) THEN
     INCL(prtInfo.pI.printMode,printMode);
  ELSE
     EXCL(prtInfo.pI.printMode,printMode);
  END;
END ManipulateGadg;

PROCEDURE PrintItOut;
VAR bool : BOOLEAN;
BEGIN
  IF (selected IN GadgetArray[14].flags) THEN
     QueuePrintOrder(prtInfo); RefreshEntry;
  ELSE
     PrintIt(prtInfo.pI,TRUE,bool);
  END;
END PrintItOut;

PROCEDURE Cleanup;
BEGIN
  IF (menuStripPtr # NIL) THEN ClearMenuStrip(window); menuStripPtr:=NIL; END;
  IF (window # NIL) THEN Closeup; CloseWindow(window); window:=NIL END;
END Cleanup;

PROCEDURE PrintRequest(VAR File : ARRAY OF CHAR;
                       VAR Dir  : ARRAY OF CHAR): BOOLEAN;
BEGIN
  WITH fileRequest DO
    head       := ADR("--- Print Files ---");
    x          := 350;
    y          := 50;
    displayRows := 9;
    displayColumns := 28;
    Copy(file,File);
    Copy(dirPath,Dir);
    userWindow := window;
    userScreen := NIL;
    patternStr := "#?";
    FRFlags    := FileRequestFlagSet{noInfos,pattern,keyCodes,filesFirst,
                                     sharedIDCMP};
    func       := NIL;
  END;

 RETURN FileRequester(ADR(fileRequest));
END PrintRequest;

PROCEDURE SelectFile;
BEGIN
  IF PrintRequest(prtInfo.pI.fileName,prtInfo.pI.dirName) THEN
     PrintPath(ADR(GadgetArray[15]));
  END;
END SelectFile;

PROCEDURE HandleProgram;
VAR class      : IDCMPFlagSet;
    msg        : IntuiMessagePtr;
    intuiMsg   : IntuiMessage;
    gadgSelect : GadgetPtr;
    win        : WindowPtr;
    code       : CARDINAL;
    bool,exit  : BOOLEAN;

    PROCEDURE GetAllInputs;
    BEGIN
      REPEAT
        msg:=GetMsg(window^.userPort);  IF msg # NIL THEN ReplyMsg(msg) END;
      UNTIL msg = NIL;
    END GetAllInputs;
BEGIN
  InitIntuition;

  LOOP
    WaitPort(window^.userPort);
    msg:=GetMsg(window^.userPort);
    IF msg # NIL THEN
        class:=msg^.class;
        code:=msg^.code;
        mouseX:=msg^.mouseX;
        mouseY:=msg^.mouseY;
        gadgSelect:=msg^.iAddress;
        win:=msg^.idcmpWindow;
        intuiMsg:=msg^;
       ReplyMsg(msg);
    END;

    IF win # fileRequest.FRWindow THEN
       IF (closeWindow IN class) THEN
          IF win = window THEN EXIT ELSE Closeup END;
       ELSIF (gadgetUp IN class) THEN
         CASE (gadgSelect^.gadgetID) OF
           30 : ModifyProp;
         ELSE
         END;
       ELSIF (gadgetDown IN class) THEN
         CASE gadgSelect^.gadgetID OF
            0 : SelectFile;
         |  1 : HandleWindow;
         |  2 : ManipulateGadg(2,nlq);
         |  3 : ManipulateGadg(3,format);
         |  4 : ManipulateGadg(4,date);
         |  5 : ManipulateGadg(5,time);
         |  6 : ManipulateGadg(6,page);
         |  7 : PrintItOut; GetAllInputs;
         |  8 : EXIT;
         | 14 : ManipulateGadg(14,queue);
         | 30 : ModifyProp;
         | 31 : Up;
         | 32 : Down;
         | 33 : RemoveEntry;
         | 34 : Closeup;
         ELSE
         END;
       ELSIF (mouseButtons IN class) THEN
         CASE code OF
           selectDown: CheckMouse;
         ELSE
         END;
       ELSIF (menuPick IN class) THEN
         CASE MenuNum(code) OF
           0 : CASE ItemNum(code) OF
                 0 : LoadOpt; CorrectIntuition(TRUE);
               | 1 : SaveOpt;
               | 2 : EXIT;
               ELSE
               END;
          | 1 : CASE ItemNum(code) OF
                 0 : bool:=OptionRequester();
               ELSE
               END;
         ELSE
         END;
       END;
    ELSE
       IF msg # NIL THEN
          bool:=CauseAction(ADR(fileRequest),ADR(intuiMsg),exit);
          Copy(prtInfo.pI.fileName,fileRequest.file);
          Copy(prtInfo.pI.dirName,fileRequest.dirPath);
          PrintPath(ADR(GadgetArray[15]));
       END;
    END;
  END;
  GetAllInputs; Closeup; CloseFileRequest(ADR(fileRequest)); Cleanup;

  PrintAllQueuedFiles;
END HandleProgram;

BEGIN
  AllLevelTermProc(ADR(Cleanup));

  HandleProgram;

  Terminate(0);
END OnLine.
