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

FROM Arts             IMPORT AllLevelTermProc,Assert;
FROM Exec             IMPORT FindPort,Forbid,MsgPortPtr,NodeType,Permit,
                             PutMsg,WaitPort;
FROM ExecSupport      IMPORT CreatePort,DeletePort;
FROM Graphics         IMPORT jam2,ScrollRaster;
FROM Images           IMPORT ArrowDown,ArrowUp;
FROM Intuition        IMPORT ActivationFlags,ActivationFlagSet,boolGadget,
                             Border,BorderPtr,CloseWindow,Gadget,GadgetFlags,
                             GadgetFlagSet,IDCMPFlags,IDCMPFlagSet,Image,
                             IntuiText,IntuiTextPtr,maxBody,maxPot,ModifyIDCMP,
                             NewModifyProp,NewWindow,OpenWindow,propGadget,
                             PropInfo,PropInfoFlags,PropInfoFlagSet,ScreenFlags,
                             ScreenFlagSet,WindowFlags,WindowFlagSet,WindowPtr;
FROM IntuitionSupport IMPORT SetBorder,SetBorderKoord,SetGadget,SetImage,
                             SetIText,SetPropInfo,SetWindow;
FROM PrintOut         IMPORT PrintIt;
FROM Routines         IMPORT actualQPtr,Block,Frame,Print,PrintInfo,PrintModes,
                             PrintModeSet,PrintNews,prtInfoPtr,Queued,
                             queuedFiles,QueuedPtr,window;
FROM SYSTEM           IMPORT ADR;
FROM Storage          IMPORT DEALLOCATE;
FROM Str              IMPORT Concat,Copy,Length;

(*FROM InOut IMPORT WriteInt,WriteLn;*)

CONST displayRows = 9;

VAR wind         : WindowPtr;
    GadgetArray  : ARRAY [0..5] OF Gadget;
    TextArray    : ARRAY [0..1] OF IntuiText;
    ImageArray   : ARRAY [0..2] OF Image;
    BorderArray  : ARRAY [0..0],[0..9] OF INTEGER;
    GadgetBorder : ARRAY [0..0] OF Border;
    propInfo     : PropInfo;
    listFile     : CARDINAL;
    selectedFile : INTEGER;
    port         : MsgPortPtr;

PROCEDURE InitShowFiles;
VAR nw : NewWindow;
    i  : CARDINAL;

  PROCEDURE InitIText;
  VAR ptr : IntuiTextPtr;
  BEGIN
    ptr:=SetIText(TextArray[0],ADR("  Remove"),1,0,1,2,jam2);
    ptr:=SetIText(TextArray[1],ADR("    OK")  ,1,0,1,2,jam2);
  END InitIText;

  PROCEDURE InitGadgets;
  BEGIN
    SetPropInfo(propInfo,PropInfoFlagSet{autoKnob,
                freeVert,knobHit},0,0,0,maxBody);
    SetImage(ImageArray[1],-2,-1,16,10,1,ADR(ArrowUp)  ,1,0);
    SetImage(ImageArray[2],-2,-1,16,10,1,ADR(ArrowDown),1,0);

    SetGadget(GadgetArray[0],514,24,16,24+5*8,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify},propGadget,
              ADR(ImageArray[0]),NIL,ADR(propInfo),30);
    SetGadget(GadgetArray[1],516,14,12,8,GadgetFlagSet{gadgImage},
              ActivationFlagSet{gadgImmediate,relVerify},boolGadget,
              ADR(ImageArray[1]),NIL,NIL,31);
    SetGadget(GadgetArray[2],516,90,12,8,GadgetFlagSet{gadgImage},
              ActivationFlagSet{gadgImmediate,relVerify},boolGadget,
              ADR(ImageArray[2]),NIL,NIL,32);
    SetGadget(GadgetArray[3],14,104,80,10,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify},
              boolGadget,ADR(GadgetBorder[0]),ADR(TextArray[0]),NIL,33);
    SetGadget(GadgetArray[4],448,104,80,10,GadgetFlagSet{},
              ActivationFlagSet{gadgImmediate,relVerify},
              boolGadget,ADR(GadgetBorder[0]),ADR(TextArray[1]),NIL,34);

  END InitGadgets;

  PROCEDURE InitBorderCoor;
  BEGIN
    SetBorderKoord(BorderArray[0],GadgetArray[3]);
  END InitBorderCoor;

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

BEGIN
  InitIText; InitGadgets; InitBorderCoor; InitBorder;

  propInfo.vertBody:=maxBody;
  IF (queuedFiles > displayRows) THEN
     propInfo.vertBody:= (maxBody DIV queuedFiles) * (displayRows+1);
  END;

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

  SetWindow(nw,50,0,540,120,0,1,IDCMPFlagSet{},
            WindowFlagSet{windowDrag,windowDepth,windowClose,activate,
                          windowRefresh,windowActive,reportMouse},
            ADR("OnLine -----  Queued Files  ----- "),ADR(GadgetArray[0]),NIL,
            10,60,440,110,ScreenFlagSet{wbenchScreen});

  wind:=OpenWindow(nw);
    Assert(wind # NIL,ADR("Couldn't open window!"));
  wind^.userPort:=window^.userPort;
  ModifyIDCMP(wind,IDCMPFlagSet{closeWindow,gadgetDown,gadgetUp,mouseButtons});

  Frame(wind^.rPort,3,14,13,509,18+10*8,2);

END InitShowFiles;

PROCEDURE PrintSingle(ptr : QueuedPtr; row : CARDINAL);
VAR str : ARRAY [0..62] OF CHAR;
    flg : ARRAY [0.. 7] OF CHAR;
    i   : CARDINAL;
BEGIN
  IF ptr # NIL THEN
     flg:=(" ------");
     IF (nlq    IN ptr^.pI.printMode) THEN flg[1]:=("n") END;
     IF (format IN ptr^.pI.printMode) THEN flg[2]:=("f") END;
     IF (queue  IN ptr^.pI.printMode) THEN flg[3]:=("q") END;
     IF (date   IN ptr^.pI.printMode) THEN flg[4]:=("d") END;
     IF (time   IN ptr^.pI.printMode) THEN flg[5]:=("t") END;
     IF (page   IN ptr^.pI.printMode) THEN flg[6]:=("p") END;

     Copy(str,ptr^.pI.strPath);
     FOR i:=Length(str) TO 52 DO str[i]:=(" "); END; str[53]:=00C;
     Concat(str,flg);

     IF ptr^.selected THEN
        Print(str,wind^.rPort,0,1,jam2,20,22+row*8);
     ELSE
        Print(str,wind^.rPort,1,0,jam2,20,22+row*8);
     END;
  END;
END PrintSingle;

PROCEDURE PrintSelectedFiles(ptr : QueuedPtr);
VAR i : CARDINAL;
BEGIN
  FOR i:=0 TO displayRows DO
    IF ptr # NIL THEN PrintSingle(ptr,i); ptr:=ptr^.nextQueued; END;
  END;
END PrintSelectedFiles;

PROCEDURE FindPtr(nr : CARDINAL): QueuedPtr;
VAR ptr : QueuedPtr;
    i   : CARDINAL;
BEGIN
  i:=0; ptr:=prtInfoPtr;
  REPEAT ptr:=ptr^.nextQueued; INC(i) UNTIL (i = nr+1) OR (ptr = NIL);
  RETURN ptr;
END FindPtr;

PROCEDURE ModifyProp;
BEGIN
  IF queuedFiles > displayRows+1 THEN
     listFile:=(LONGINT(propInfo.vertPot) *
                LONGINT(queuedFiles-displayRows-1)) DIV maxPot;
     PrintSelectedFiles(FindPtr(listFile));
  END;
END ModifyProp;

PROCEDURE Up;
BEGIN
  IF (INTEGER(listFile)-1 >= 0) THEN
     DEC(listFile);
     propInfo.vertPot:=(maxPot DIV (queuedFiles-displayRows-1)) * listFile;
     NewModifyProp(ADR(GadgetArray[0]),wind,NIL,propInfo.flags,0,
                   propInfo.vertPot,0,propInfo.vertBody,1);
     ScrollRaster(wind^.rPort,0,-8,20,16,504,95);

     PrintSingle(FindPtr(listFile),0);
  END;
END Up;

PROCEDURE Down;
BEGIN
  IF INTEGER(listFile+1) <= INTEGER(queuedFiles-displayRows-1) THEN
     INC(listFile);
     propInfo.vertPot:=(maxPot DIV (queuedFiles-displayRows-1)) * listFile;
     NewModifyProp(ADR(GadgetArray[0]),wind,NIL,propInfo.flags,0,
                   propInfo.vertPot,0,propInfo.vertBody,1);
     ScrollRaster(wind^.rPort,0,8,20,16,504,95);

     PrintSingle(FindPtr(listFile+displayRows),displayRows);
  END;
END Down;

PROCEDURE CheckMouse;
VAR row : CARDINAL;
    ptr,
    chg : QueuedPtr;
BEGIN
  IF (mouseX >= 20) AND (mouseX <= 501) THEN
  IF (mouseY >= 15) AND (mouseY <=  94) THEN
     row:=((mouseY-15) DIV 8); ptr:=FindPtr(row+listFile);
     IF ptr # NIL THEN
        IF selectedFile # -1 THEN
           chg:=FindPtr(CARDINAL(selectedFile));
           IF chg # NIL THEN
              chg^.selected:=NOT chg^.selected;
              IF (CARDINAL(selectedFile) >= listFile) AND
                 (CARDINAL(selectedFile) <  listFile+displayRows+1) THEN
                 PrintSingle(chg,CARDINAL(selectedFile)-listFile);
              END;
           END;
        END;
        ptr^.selected:=NOT ptr^.selected;
        PrintSingle(ptr,row); selectedFile:=row+listFile;
     END;
  END;
  END;
END CheckMouse;

PROCEDURE RefreshEntry;
BEGIN
  IF wind # NIL THEN
     propInfo.vertBody:=maxBody;

     IF queuedFiles # 0 THEN
        IF (queuedFiles > displayRows) THEN
           propInfo.vertBody:= (maxBody DIV queuedFiles) * (displayRows+1);
        END;
     ELSE
        actualQPtr:=prtInfoPtr;
     END;
     NewModifyProp(ADR(GadgetArray[0]),wind,NIL,propInfo.flags,0,
                   propInfo.vertPot,0,propInfo.vertBody,1);
     Block(wind^.rPort,0,20,16,504,18+10*8-2,jam2);
     PrintSelectedFiles(FindPtr(listFile));
  END;
END RefreshEntry;

PROCEDURE RemoveSingleEntry(quePtr : QueuedPtr);
BEGIN
   IF quePtr = FindPtr(queuedFiles-1) THEN
      actualQPtr:=quePtr^.lastQueued;
   END;
   quePtr^.nextQueued^.lastQueued:=quePtr^.lastQueued;
   quePtr^.lastQueued^.nextQueued:=quePtr^.nextQueued;
   DEALLOCATE(quePtr,SIZE(Queued));
   selectedFile:=-1; DEC(queuedFiles);
END RemoveSingleEntry;

PROCEDURE RemoveEntry;
BEGIN
  IF selectedFile # -1 THEN
     RemoveSingleEntry(FindPtr(selectedFile));
       IF listFile > 0 THEN DEC(listFile) END;
     RefreshEntry;
  END;
END RemoveEntry;

PROCEDURE HandleWindow;
BEGIN
  IF wind = NIL THEN
     InitShowFiles; PrintSelectedFiles(prtInfoPtr^.nextQueued);
  END;
END HandleWindow;

PROCEDURE Closeup;
BEGIN
  IF (wind # NIL) THEN
     wind^.userPort:=NIL; ModifyIDCMP(wind,IDCMPFlagSet{});
     CloseWindow(wind); wind:=NIL;
  END;
  IF port # NIL THEN DeletePort(port); port:=NIL; END;
END Closeup;

PROCEDURE PrintAllQueuedFiles;
VAR i           : INTEGER;
    ptr         : QueuedPtr;
    trouble     : BOOLEAN;
    m           : MsgPortPtr;
    moreToPrint : PrintNews;
BEGIN
  m:=FindPort(ADR("OnLine_PRT_Port"));
  IF m = NIL THEN
     i:=0; trouble:=FALSE;
     WHILE ((INTEGER(queuedFiles-1)) >= i) AND NOT trouble DO
       ptr:=FindPtr(CARDINAL(i)); INC(i);
       IF ptr # NIL THEN
          PrintIt(ptr^.pI,FALSE,trouble);
          RemoveSingleEntry(ptr); DEC(i);
       ELSE
          trouble:=TRUE;
       END;
     END;
  ELSE
     port:=CreatePort(NIL,0);
       Assert(port # NIL,ADR("MsgPort not Created"));
     Forbid();
       i:=0;
       WHILE ((INTEGER(queuedFiles-1)) >= i) DO
         ptr:=FindPtr(CARDINAL(i)); INC(i);
         WITH moreToPrint DO
           msg.node.type:=message;
           msg.length:=SIZE(PrintInfo);
           msg.replyPort:=port;
           print:=ptr^.pI;
         END;
         PutMsg(m,ADR(moreToPrint)); WaitPort(port);
       END;
       DeletePort(port); port:=NIL;
     Permit();
  END;
END PrintAllQueuedFiles;

BEGIN
  AllLevelTermProc(Closeup); selectedFile:=-1;
END ShowSelected.
