(******************************************************************************
*                                                                             *
*    Programmname:  RequesterWindow                                           *
*                                                                             *
*    Stand:         31.12.89                            Uhrzeit:  21:01:06    *
*                                                                             *
*    Bearbeitet mit dem MODULETool V1.11        (©) by  Thomas Stolze 1989    *
*                                                                             *
******************************************************************************)

(* $R- *) (* $V- *) (* $S- *) (* $N- *) (* $F- *)
IMPLEMENTATION MODULE RequesterWindow;

FROM Arts             IMPORT Assert;
FROM DirectorySupport IMPORT GetDevList,NewDir;
FROM Dos              IMPORT CreateDir,CreateProc,DeleteFile,FileLockPtr,IoErr,
                             ProcessPtr,Rename,UnLock;
FROM Exec             IMPORT AllocMem,AvailMem,CloseDevice,DoIO,FindTask,
                             FreeMem,GetMsg,MemReqs,MemReqSet,MsgPortPtr,
                             OpenDevice,ReplyMsg,Task,TaskPtr,WaitPort;
FROM ExecSupport      IMPORT CreateExtIO,CreatePort,CreateTask,DeleteExtIO,
                             DeletePort;
FROM FileSystem       IMPORT Close,File,Lookup,ReadChar,Response,WriteBytes,
                             WriteChar;
FROM Graphics         IMPORT DrawModeSet,jam1,jam2,Move,RastPortPtr,SetAPen,
                             SetBPen,SetDrMd,Text;
FROM Intuition        IMPORT ActivationFlags,ActivationFlagSet,AddGadget,
                             AddGList,boolGadget,Border,BorderPtr,CloseWindow,
                             Gadget,GadgetFlags,GadgetFlagSet,GadgetPtr,
                             GetPrefs,IDCMPFlags,IDCMPFlagSet,IntuiMessagePtr,
                             IntuiText,IntuiTextPtr,MenuItemFlags,
                             MenuItemFlagSet,NewWindow,OpenWindow,Preferences,
                             PreferencesPtr,PrintIText,RefreshGadgets,
                             ScreenFlags,ScreenFlagSet,strGadget,StringInfo,
                             WindowFlags,WindowFlagSet,WindowPtr;
FROM IntuitionSupport IMPORT SetBorder,SetBorderKoord,SetGadget,SetInfo,
                             SetIText,SetWindow;
FROM SYSTEM           IMPORT ADDRESS,ADR,CAST,LONGSET,SHIFT,WORD;
FROM Storage          IMPORT ALLOCATE,Available,DEALLOCATE;
FROM Str              IMPORT Concat,Copy,FirstPos,LastPos,Length;
FROM StringSupport    IMPORT ChangeStr,LeftStr,Occurs,StringStr,ValStr;
FROM Timer            IMPORT addRequest,IOTimer,IOTimerPtr,timerName,vBlank;
FROM TimerSupport     IMPORT MakeDateString,MakeTimeString;
FROM m2Maker          IMPORT BufferString,GadgetFeldListe,GadgetNamen,
                             MemoryTask,MenuItemFeld,OptionenString,projectFlag,
                             Rahmen,SystemString,win,window;
FROM m2MakerRoutines  IMPORT Block,Convert,Executeing,Invers,PrintDosErr,
                             PrintStatus,Project,ProjektSpeichern;

CONST version = " m2Maker V1.42 ";

VAR windowptr  : WindowPtr;
    GadgetText : ARRAY [0..1] OF IntuiText;
    Gadgets    : ARRAY [0..1] OF Gadget;
    RahmenGadg : Border;
    BorderKoord: ARRAY [0..9] OF INTEGER;

PROCEDURE ShowRequest(titleptr : ADDRESS;
                      x,y,w,h  : INTEGER;
                      textptr  : IntuiTextPtr;
                      gadgptr  : GadgetPtr;
                      cancel,
                      work     : BOOLEAN): BOOLEAN;

CONST action = ActivationFlagSet{gadgImmediate,relVerify};

VAR wind       : NewWindow;
    Auswahl    : GadgetPtr;
    ptr        : IntuiTextPtr;
    msg        : IntuiMessagePtr;
    response   : BOOLEAN;
    code       : CARDINAL;
    class      : IDCMPFlagSet;
    pos        : INTEGER;
    bordptr    : BorderPtr;

BEGIN
  ptr:=SetIText(GadgetText[0],ADR("  OK  "),2,1,1,2,jam2);
  ptr:=SetIText(GadgetText[1],ADR("CANCEL"),2,1,1,2,jam2);

  SetWindow(wind,x,y,w,h,0,1,IDCMPFlagSet{gadgetUp,closeWindow,mouseButtons,
                                          rawKey},
            WindowFlagSet{windowDepth,activate,windowActive,windowClose,
                          windowRefresh},
            titleptr,NIL,NIL,-1,-1,20,40,ScreenFlagSet{wbenchScreen});
  SetGadget(Gadgets[0],20,-18,50,10,GadgetFlagSet{gRelBottom},
            action,boolGadget,ADR(RahmenGadg),ADR(GadgetText[0]),NIL,0);
  SetGadget(Gadgets[1],w-70,-18,50,10,GadgetFlagSet{gRelBottom},
            action,boolGadget,ADR(RahmenGadg),ADR(GadgetText[1]),NIL,1);
  bordptr:=SetBorder(RahmenGadg,-1,-1,2,0,5,jam1,ADR(BorderKoord));
  SetBorderKoord(BorderKoord,Gadgets[0]);

  windowptr:=OpenWindow(wind);
    Assert(windowptr # NIL,ADR("Requester nicht geöffnet"));
  Block(windowptr^.rPort,1,4,11,w-5,h-3);
  PrintIText(windowptr^.rPort,textptr,0,0);

  IF cancel THEN
     pos:=AddGadget(windowptr,ADR(Gadgets[1]),-1);
  ELSE
     Gadgets[0].leftEdge:=w-70;
  END;
  pos:=AddGadget(windowptr,ADR(Gadgets[0]),-1);
  IF (gadgptr # NIL) THEN pos:=AddGList(windowptr,gadgptr,-1,11,NIL) END;
  RefreshGadgets(windowptr^.firstGadget,windowptr,NIL);

  IF work THEN
    LOOP
      response:=FALSE;
      WaitPort(windowptr^.userPort);
        msg:=GetMsg(windowptr^.userPort);
        class:=msg^.class;
         Auswahl:=msg^.iAddress;
      ReplyMsg(msg);

      IF (closeWindow IN class) THEN
          response:=FALSE; EXIT;
      ELSIF (gadgetUp IN class) THEN
         CASE Auswahl^.gadgetID OF
           0 : response:=TRUE;  EXIT;
         | 1 : response:=FALSE; EXIT;
         ELSE
         END;
      END;
    END;
    CloseWindow(windowptr); windowptr:=NIL;
    RETURN response;
  ELSE
    RETURN TRUE;
  END;
END ShowRequest;

PROCEDURE PrinterRequest(): BOOLEAN;
VAR texte : ARRAY [0..1] OF IntuiText;
    ptr   : IntuiTextPtr;
BEGIN
  ptr:=SetIText(texte[0],ADR('Drucker vorbereiten:'),2,1,16,20,jam1);
  texte[0].nextText:=SetIText(texte[1],
                     ADR('Papier justieren & ON-Line wählen.'),0,1,16,36,jam1);
  RETURN ShowRequest(ADR("Drucker Nachricht"),160,20,320,70,ptr,NIL,TRUE,TRUE);
END PrinterRequest;

PROCEDURE DeleteDatei;
VAR DummyStr : ARRAY [0..80] OF CHAR;
    erfolg   : BOOLEAN;
    frage    : ARRAY [0..1] OF IntuiText;
    ptr      : IntuiTextPtr;
BEGIN
 ptr:=SetIText(frage[0],ADR("Wollen Sie diese Datei löschen ?"),3,1,25,25,jam2);
  frage[0].nextText:=SetIText(frage[1],ADR(BufferString[3]),2,1,40,39,jam2);

  erfolg:=ShowRequest(ADR("Datei löschen:"),160,20,320,82,ptr,NIL,TRUE,TRUE);

  IF erfolg THEN
     Copy(DummyStr,BufferString[9]); Concat(DummyStr,BufferString[3]);

     erfolg:=DeleteFile(ADR(DummyStr));
       Concat(DummyStr,".Info");
     erfolg:=DeleteFile(ADR(DummyStr));
     NewDir(FALSE);
  END;
END DeleteDatei;

PROCEDURE RenameDatei;
VAR erfolg   : BOOLEAN;
    gadg     : Gadget;
    text     : IntuiText;
    textptr  : IntuiTextPtr;
    rahmen   : Border;
    bordptr  : BorderPtr;
    bordkoor : ARRAY [0..9] OF INTEGER;
    info     : StringInfo;
    String   : ARRAY [0..1],[0..30] OF CHAR;
    DummyStr : ARRAY [0..1],[0..110] OF CHAR;
BEGIN
  bordptr:=SetBorder(rahmen,-1,-1,2,0,5,jam2,ADR(bordkoor));
  SetInfo(info,ADR(String[0]),ADR(String[1]),0,31,0);
  SetGadget(gadg,40,35,242,8,GadgetFlagSet{},
             ActivationFlagSet{relVerify,gadgImmediate,toggleSelect},
             strGadget,bordptr,NIL,ADR(info),2);
  SetBorderKoord(bordkoor,gadg);
  Copy(String[0],BufferString[3]);     Copy(DummyStr[0],BufferString[9]);
  Copy(DummyStr[1],BufferString[9]); Concat(DummyStr[0],BufferString[3]);

  textptr:=SetIText(text,ADR("Geben Sie den neuen Namen ein:"),2,1,40,22,jam2);
  IF ShowRequest(ADR("Datei umbenennen:"),160,20,320,70,textptr,ADR(gadg),
                                                               TRUE,TRUE) THEN
     Concat(DummyStr[1],String[0]);
     erfolg:=Rename(ADR(DummyStr[0]),ADR(DummyStr[1]));
       Concat(DummyStr[0],".info");
       Concat(DummyStr[1],".info");
     erfolg:=Rename(ADR(DummyStr[0]),ADR(DummyStr[1]));
     NewDir(FALSE);
  END;
END RenameDatei;

PROCEDURE Printer;
VAR texte       : ARRAY [0..6] OF IntuiText;
    Gadgs       : ARRAY [0..3] OF Gadget;
    Infos       : ARRAY [0..1] OF StringInfo;
    BorderKoord : ARRAY [0..2],[0..9] OF INTEGER;
    ZahlenString: ARRAY [0..3],[0..10] OF CHAR;
    GadgetRahmen: ARRAY [0..2] OF Border;
    bptr        : BorderPtr;
    ptr         : IntuiTextPtr;
    proc        : ProcessPtr;
    DummyStr    : ARRAY [0..140] OF CHAR;

CONST actions       = ActivationFlagSet{relVerify,gadgImmediate,toggleSelect,
                                        longint};
      gadgetFlaggen = GadgetFlagSet{};
      eol = 12C;

  PROCEDURE Drucken;
  VAR in,out : File;
      char   : CHAR;
      prt    : ARRAY [0..4] OF CHAR;
      dummy  : ARRAY [0..5] OF CHAR;
      von,bis,
      zeile  : INTEGER;
      counter: CARDINAL;
      dum    : LONGINT;
      adr    : ADDRESS;
      prefs  : PreferencesPtr;
  BEGIN
     von:=ValStr(ZahlenString[0]); bis:=ValStr(ZahlenString[2]);
     IF (von < 1) THEN von:=1 END; bis:=ABS(bis); zeile:=0;

     prt:=("prt:");
     Lookup(in,DummyStr,10240,FALSE);
     IF (in.res = done) THEN
        Lookup(out,prt,10240,TRUE);
        IF (out.res = done) THEN
           IF Available(SIZE(Preferences)) THEN
              ALLOCATE(adr,SIZE(Preferences));
              GetPrefs(adr,SIZE(Preferences));
              prefs:=CAST(PreferencesPtr,adr);
              dummy:=('[2"z'); char:=33C; counter:=0;

              IF (selected IN Gadgs[2].flags) THEN
                 WriteChar(out,char); WriteBytes(out,ADR(dummy),4,dum);
              ELSE
                 dummy:=('[1"z');
                 WriteChar(out,char); WriteBytes(out,ADR(dummy),4,dum);
              END;

              WHILE NOT in.eof DO
                ReadChar(in,char);
                IF (char = eol) THEN
                   INC(zeile); INC(counter);
                END;
                IF (zeile >= von-1) AND (zeile <= bis-1) THEN
                   WriteChar(out,char);
                END;
                IF (selected IN Gadgs[3].flags) THEN
                   IF (counter >= prefs^.paperLength-5) THEN
                      FOR dum:=0 TO 4 DO WriteChar(out,eol) END;
                      counter:=0;
                   END;
                END;
              END;
              IF (selected IN Gadgs[3].flags) THEN
                 FOR dum:=0 TO prefs^.paperLength-counter-1 DO
                     char:=eol; WriteChar(out,char);
                 END;
                 dummy:=("c"); char:=33C;
                 WriteChar(out,char); WriteBytes(out,ADR(dummy),1,dum);
              END;
              DEALLOCATE(adr,SIZE(Preferences));
           END;
        END;
        Close(out);
     END;
     Close(in);
  END Drucken;

(*
PROCEDURE CreateFunctionProc(name    : ADDRESS;
                             pri       : LONGINT;
                             function  : ADDRESS;
                             stacksize : INTEGER): ProcessPtr;

TYPE HelpSegPtr = POINTER TO HelpSeg;
     HelpSeg    = RECORD
                    Len,
                    Next  : LONGINT;
                    OCode : WORD;
                    FAddr : ADDRESS;
                  END;
VAR taskptr : TaskPtr;
    portPtr : MsgPortPtr;
    procPtr : ProcessPtr;
    Segment : LONGINT;
    HSeg    : HelpSegPtr;
    adr     : ADDRESS;
BEGIN

  adr:=AllocMem(SIZE(HelpSeg),MemReqSet{public});
  IF (adr # NIL) THEN
     HSeg:=CAST(HelpSegPtr,adr);
     WITH HSeg^ DO
       Len:=SIZE(HelpSeg);
       Next:=NIL;
       OCode:=04EF9H;
       FAddr:=ADR(function);
     END;
     Assert(CAST(LONGSET,HSeg^.Next)*LONGSET{0,1}=LONGSET{},
            ADR("BPTR not Longword aligned"));
     Segment:=SHIFT(HSeg^.Next,-2);
     portPtr:=CreateProc(name,pri,Segment,stacksize);
     IF (portPtr # NIL) THEN
        procPtr:=CAST(ProcessPtr,(CAST(LONGINT,portPtr)
                                - CAST(LONGINT,SIZE(Task))));
        WHILE (FindTask(name) = NIL) DO END;
     END;
  ELSE
     RETURN NIL;
  END;
  FreeMem(adr,SIZE(HelpSeg));
  RETURN procPtr;
END CreateFunctionProc;
*)

BEGIN
  PrintStatus("Ausdruck des Listings");
  ptr:=SetIText(texte[0],ADR('Drucker vorbereiten:'),2,1,16,20,jam1);
  texte[0].nextText:=SetIText(texte[1],
                     ADR("Papier justieren & ON-Line wählen."),0,1,16,32,jam1);
  texte[1].nextText:=SetIText(texte[2],
                ADR("Bitte die gewünschten Zeilen eingeben"),2,1,16,46,jam1);
  texte[2].nextText:=SetIText(texte[3],ADR("von:"),2,1,16,60,jam1);
  texte[3].nextText:=SetIText(texte[4],ADR("bis:"),2,1,160,60,jam1);

  SetGadget(Gadgs[0],58,60,72,8,gadgetFlaggen,
             actions,strGadget,ADR(GadgetRahmen[0]),NIL,ADR(Infos[0]),2);
  SetGadget(Gadgs[1],200,60,72,8,gadgetFlaggen,
             actions,strGadget,ADR(GadgetRahmen[0]),NIL,ADR(Infos[1]),3);
  SetGadget(Gadgs[2],58,74,72,10,GadgetFlagSet{},
             ActivationFlagSet{relVerify,gadgImmediate,toggleSelect},
             boolGadget,ADR(GadgetRahmen[1]),
             SetIText(texte[5],ADR("   NLQ"),0,1,1,2,jam1),NIL,4);
  SetGadget(Gadgs[3],200,74,96,10,GadgetFlagSet{},
             ActivationFlagSet{relVerify,gadgImmediate,toggleSelect},
             boolGadget,ADR(GadgetRahmen[2]),
             SetIText(texte[6],ADR(" formatiert "),0,1,1,2,jam1),NIL,5);

  ZahlenString[0]:=("1"); ZahlenString[2]:=("5000");
  SetInfo(Infos[0],ADR(ZahlenString[0]),ADR(ZahlenString[1]),0,10,0);
  SetInfo(Infos[1],ADR(ZahlenString[2]),ADR(ZahlenString[3]),0,10,0);
  SetBorderKoord(BorderKoord[0],Gadgs[0]);
  SetBorderKoord(BorderKoord[1],Gadgs[2]);
  SetBorderKoord(BorderKoord[2],Gadgs[3]);
  bptr:=SetBorder(GadgetRahmen[0],-1,-1,2,0,5,jam1,ADR(BorderKoord[0]));
  bptr:=SetBorder(GadgetRahmen[1],-1,-1,2,0,5,jam1,ADR(BorderKoord[1]));
  bptr:=SetBorder(GadgetRahmen[2],-1,-1,2,0,5,jam1,ADR(BorderKoord[2]));
  Gadgs[0].nextGadget:=ADR(Gadgs[1]);
  Gadgs[1].nextGadget:=ADR(Gadgs[2]);
  Gadgs[2].nextGadget:=ADR(Gadgs[3]);

  IF ShowRequest(ADR("Drucker Nachricht:"),160,20,320,110,
                                        ptr,ADR(Gadgs[0]),TRUE,TRUE) THEN
     Copy(DummyStr,BufferString[9]); Concat(DummyStr,BufferString[3]);
   (*  proc:=CreateFunctionProc(ADR("m2Maker_Print"),0,
                              ADR(Drucken),8024);*)
    Drucken;
  END;
  Invers(ADR(GadgetFeldListe[printGadget]));
END Printer;

PROCEDURE OptionenRequester;
CONST actions       = ActivationFlagSet{relVerify,gadgImmediate,toggleSelect};
      gadgetFlaggen = GadgetFlagSet{};

VAR dummys      : ARRAY [0..5],[0..80] OF CHAR;
    Texte       : ARRAY [0..10] OF IntuiText;
    Gadgs       : ARRAY [0..10] OF Gadget;
    Infos       : ARRAY [0..10] OF StringInfo;
    BorderKoord : ARRAY [0..1],[0..9] OF INTEGER;
    GadgetRahmen: ARRAY [0..1] OF Border;
    ptr         : IntuiTextPtr;
    bptr        : BorderPtr;
    bool        : BOOLEAN;
BEGIN
                ptr:=SetIText(Texte[0],ADR('  Editor '),0,0,225,17,jam1);
  Texte[0].nextText:=SetIText(Texte[1],ADR(' Compiler'),0,0,225,29,jam1);
  Texte[1].nextText:=SetIText(Texte[2],ADR('  Linker '),0,0,225,41,jam1);
  Texte[2].nextText:=SetIText(Texte[3],ADR(' Projekt '),2,0,225,53,jam1);
  Texte[3].nextText:=SetIText(Texte[4],ADR('{-d -bcinr}'),0,0,400,17,jam1);
  Texte[4].nextText:=SetIText(Texte[5],ADR('{-abcdfilnqrsvz}'),0,0,400,29,jam1);
  Texte[5].nextText:=SetIText(Texte[6],ADR('{-aiqx}')    ,0,0,400,41,jam1);
  Texte[6].nextText:=SetIText(Texte[7],ADR('{-biorst}')  ,0,0,400,53,jam1);
  Texte[7].nextText:=SetIText(Texte[8],ADR('FastLister Verzeichnis:'),
                                            2,0,25,65,jam1);
  Texte[8].nextText:=SetIText(Texte[9],ADR('Systemverzeichnis:'),
                                            2,0,225,65,jam1);

  SetGadget(Gadgs[0],310,17,80,8,gadgetFlaggen,
             actions,strGadget,ADR(GadgetRahmen[0]),NIL,ADR(Infos[0]),2);
  SetGadget(Gadgs[1],310,29,80,8,gadgetFlaggen,
             actions,strGadget,ADR(GadgetRahmen[0]),NIL,ADR(Infos[1]),3);
  SetGadget(Gadgs[2],310,41,80,8,gadgetFlaggen,
             actions,strGadget,ADR(GadgetRahmen[0]),NIL,ADR(Infos[2]),4);
  SetGadget(Gadgs[3],310,53,80,8,gadgetFlaggen,
             actions,strGadget,ADR(GadgetRahmen[0]),NIL,ADR(Infos[3]),5);
  SetGadget(Gadgs[4],25,77,184,8,gadgetFlaggen,
             actions,strGadget,ADR(GadgetRahmen[1]),NIL,ADR(Infos[4]),6);
  SetGadget(Gadgs[5],25,17,184,8,gadgetFlaggen,
             actions,strGadget,ADR(GadgetRahmen[1]),NIL,ADR(Infos[5]),7);
  SetGadget(Gadgs[6],25,29,184,8,gadgetFlaggen,
             actions,strGadget,ADR(GadgetRahmen[1]),NIL,ADR(Infos[6]),8);
  SetGadget(Gadgs[7],25,41,184,8,gadgetFlaggen,
             actions,strGadget,ADR(GadgetRahmen[1]),NIL,ADR(Infos[7]),9);
  SetGadget(Gadgs[8],25,53,184,8,gadgetFlaggen,
             actions,strGadget,ADR(GadgetRahmen[1]),NIL,ADR(Infos[8]),10);
  SetGadget(Gadgs[9],225,77,80,8,gadgetFlaggen,
             actions,strGadget,ADR(GadgetRahmen[0]),NIL,ADR(Infos[9]),11);

  Gadgs[0].nextGadget:=ADR(Gadgs[1]);
  Gadgs[1].nextGadget:=ADR(Gadgs[2]);
  Gadgs[2].nextGadget:=ADR(Gadgs[3]);
  Gadgs[3].nextGadget:=ADR(Gadgs[4]);
  Gadgs[4].nextGadget:=ADR(Gadgs[5]);
  Gadgs[5].nextGadget:=ADR(Gadgs[6]);
  Gadgs[6].nextGadget:=ADR(Gadgs[7]);
  Gadgs[7].nextGadget:=ADR(Gadgs[8]);
  Gadgs[8].nextGadget:=ADR(Gadgs[9]);

  SetInfo(Infos[0],ADR(OptionenString[0]),ADR(OptionenString[1]),0,11,0);
  SetInfo(Infos[1],ADR(OptionenString[2]),ADR(OptionenString[3]),0,11,0);
  SetInfo(Infos[2],ADR(OptionenString[4]),ADR(OptionenString[5]),0,11,0);
  SetInfo(Infos[3],ADR(OptionenString[6]),ADR(OptionenString[7]),0,11,0);
  SetInfo(Infos[4],ADR(BufferString[11]),ADR(BufferString[10]),  0,79,0);
  SetInfo(Infos[5],ADR(SystemString[0]),ADR(dummys[0]),0,79,0);
  SetInfo(Infos[6],ADR(SystemString[1]),ADR(dummys[1]),0,79,0);
  SetInfo(Infos[7],ADR(SystemString[2]),ADR(dummys[2]),0,79,0);
  SetInfo(Infos[8],ADR(SystemString[3]),ADR(dummys[3]),0,79,0);
  SetInfo(Infos[9],ADR(SystemString[4]),ADR(dummys[4]),0,79,0);

  SetBorderKoord(BorderKoord[0],Gadgs[0]);
  SetBorderKoord(BorderKoord[1],Gadgs[4]);
  bptr:=SetBorder(GadgetRahmen[0],-1,-1,3,0,5,jam1,ADR(BorderKoord[0]));
  bptr:=SetBorder(GadgetRahmen[1],-1,-1,2,1,5,jam2,ADR(BorderKoord[1]));

  bool:=ShowRequest(ADR("m2Maker Optionen:"),50,20,540,95,ptr,
                    ADR(Gadgs[0]),FALSE,TRUE);
END OptionenRequester;

PROCEDURE InfoRequester;
VAR  ptr  : IntuiTextPtr;
     Texte: ARRAY [0..7] OF IntuiText;
     bool : BOOLEAN;
BEGIN
   ptr:=SetIText(Texte[0],ADR("Der"),2,0,25,20,jam1);
   Texte[0].nextText:=SetIText(Texte[1],
              ADR(version),0,0,57,20,jam1);
   Texte[1].nextText:=SetIText(Texte[2],
              ADR('ist ein "Shareware-Produkt".'),2,0,185,20,jam1);
   Texte[2].nextText:=SetIText(Texte[3],
    ADR('Wem dieses Programm zusagt, überweise mir bitte'),2,0,25,32,jam1);
   Texte[3].nextText:=SetIText(Texte[4],
    ADR('DM 20 ,- (oder mehr ...) auf mein Konto:'),2,0,25,44,jam1);
   Texte[4].nextText:=SetIText(Texte[5],
    ADR(' Ko.Nr.: 14561514'),0,0,190,56,jam1);
   Texte[5].nextText:=SetIText(Texte[6],
    ADR('Stadtsparkasse Hannover  BLZ 250 501 80'),0,0,25,66,jam1);
   Texte[6].nextText:=SetIText(Texte[7],
    ADR('Copyright by Thomas Stolze    Nov. 1989'),2,0,50,78,jam1);

  bool:=ShowRequest(ADR("m2Maker Info:"),80,20,480,102,ptr,NIL,FALSE,TRUE);
END InfoRequester;

PROCEDURE WriteHeadLine;
VAR msgTimerPort : MsgPortPtr;
    adrIOTimer   : IOTimerPtr;
    wind         : NewWindow;

  PROCEDURE WriteMemory;
    PROCEDURE freeMemory(memory : MemReqSet): INTEGER;
    VAR bytes : LONGINT;
    BEGIN
      bytes:=AvailMem(memory);
      RETURN bytes DIV 1024;
    END freeMemory;

    PROCEDURE Print(text : ARRAY OF CHAR; rport : RastPortPtr;
                                      fPen,bPen : INTEGER;
                                      drawM     : DrawModeSet;
                                      xpos,ypos : INTEGER);
    BEGIN
      SetAPen(rport,fPen); SetBPen(rport,bPen); SetDrMd(rport,drawM);
      Move(rport,xpos,ypos);
      Text(rport,ADR(text),Length(text));
    END Print;

  VAR print : ARRAY [0..10] OF CHAR;
      Title : ARRAY [0..40] OF CHAR;
      mem   : INTEGER;
  BEGIN
    MakeDateString(print); Title:=("  ");       Concat(Title,print);
    MakeTimeString(print); Concat(Title,"   "); Concat(Title,print);
    mem:=freeMemory(MemReqSet{fast});
      Concat(Title,'    F:'); StringStr(print,mem,4);
      Concat(Title,print);
    mem:=freeMemory(MemReqSet{chip});
      Concat(Title,'K C:'); StringStr(print,mem,4);
      Concat(Title,print); Concat(Title,'K  ');
    Print(version,win^.rPort,3,1,jam2,0, 7);
    Print(Title  ,win^.rPort,2,1,jam2,118,7);
  END WriteMemory;

BEGIN
    SetWindow(wind,30,0,500,10,0,1,IDCMPFlagSet{},
            WindowFlagSet{windowDepth,windowDrag,noCareRefresh},
            NIL,NIL,NIL,0,0,0,0,ScreenFlagSet{wbenchScreen});
  win:=OpenWindow(wind);

  IF (win # NIL) THEN
     msgTimerPort:=CreatePort(NIL,0);
     adrIOTimer:=CreateExtIO(msgTimerPort,SIZE(IOTimer));
     OpenDevice(ADR(timerName),vBlank,adrIOTimer,LONGSET{});

     LOOP
       adrIOTimer^.node.command:=addRequest;
       adrIOTimer^.time.secs:=1;
       adrIOTimer^.time.micro:=0;

      DoIO(adrIOTimer);
        IF (window = NIL) THEN
           EXIT;
        ELSE
           WriteMemory;
        END;
     END;

    CloseDevice(adrIOTimer);
    DeleteExtIO(adrIOTimer);
    DeletePort(msgTimerPort);
    CloseWindow(win);
    MemoryTask:=NIL;
  END;
END WriteHeadLine;

PROCEDURE InstallTimerTask(): TaskPtr;
VAR task : TaskPtr;
BEGIN
 task:=CreateTask(ADR("m2Maker_TimerTask"),0,ADR(WriteHeadLine),2024);
 RETURN task;
END InstallTimerTask;

PROCEDURE MakerOptionen;
CONST actions       = ActivationFlagSet{relVerify,gadgImmediate,toggleSelect};
      gadgetFlaggen = GadgetFlagSet{};

VAR erfolg   : BOOLEAN;
    gadg     : Gadget;
    text     : ARRAY [0..1] OF IntuiText;
    textptr  : IntuiTextPtr;
    rahmen   : Border;
    bordptr  : BorderPtr;
    bordkoor : ARRAY [0..9] OF INTEGER;
    info     : StringInfo;
    DummyString : ARRAY [0..31] OF CHAR;
BEGIN
  bordptr:=SetBorder(rahmen,-1,-1,2,0,5,jam2,ADR(bordkoor));
  SetInfo(info,ADR(SystemString[5]),ADR(DummyString),0,31,0);

  SetGadget(gadg,90,35,240,8,gadgetFlaggen,actions,
             strGadget,bordptr,NIL,ADR(info),2);
  SetBorderKoord(bordkoor,gadg);

  textptr:=SetIText(text[0],ADR("Bitte geben Sie die Link-Datei ein:")
                                                     ,2,1,20,22,jam2);
  text[0].nextText:=SetIText(text[1],ADR("Linker  :"),0,1,10,35,jam2);

  IF ShowRequest(ADR("Make Optionen:"),62,20,340,70,textptr,ADR(gadg),
                                                               TRUE,TRUE) THEN
     INCL(MenuItemFeld[17].flags,checked);
     PrintStatus("Erweiterte Make-Funktion aktiv!");
  ELSE
     EXCL(MenuItemFeld[17].flags,checked);
  END;
END MakerOptionen;

PROCEDURE LoadProjekt;
CONST actions       = ActivationFlagSet{relVerify,gadgImmediate,toggleSelect};
      gadgetFlaggen = GadgetFlagSet{};

VAR projekt,
    response : BOOLEAN;
    pos      : INTEGER;
    textptr  : IntuiTextPtr;
    text     : ARRAY [0..1] OF IntuiText;
    gadg     : Gadget;
    rahmen   : Border;
    bordptr  : BorderPtr;
    bordkoor : ARRAY [0..9] OF INTEGER;
    info     : StringInfo;
    DummyString,
    merkStr,
    back,
    pro      : ARRAY [0..81] OF CHAR;
BEGIN
  projekt:=FALSE;
  IF projectFlag THEN
     Invers(ADR(GadgetFeldListe[projectGadget])); Project; projekt:=TRUE;
  END;
  Copy(back,BufferString[5]); Copy(pro,BufferString[7]);
  bordptr:=SetBorder(rahmen,-1,-1,2,0,5,jam2,ADR(bordkoor));
  SetInfo(info,ADR(merkStr),ADR(DummyString),0,80,0);
  SetGadget(gadg,90,35,240,8,gadgetFlaggen,actions,
             strGadget,bordptr,NIL,ADR(info),2);
  SetBorderKoord(bordkoor,gadg);

  textptr:=SetIText(text[0],ADR("Bitte wählen Sie das Verzeichnis:")
                                                     ,2,1,20,22,jam2);
  text[0].nextText:=SetIText(text[1],ADR("Projekt :"),0,1,10,35,jam2);

  IF ShowRequest(ADR("Lade Projekt:"),62,20,340,70,textptr,ADR(gadg),
                                                           TRUE,TRUE) THEN
     IF (Occurs(merkStr,0,".Projekt",FALSE) < 0) THEN
        Concat(merkStr,".Projekt");
     END;
     Concat(BufferString[5],merkStr);
     ChangeStr(BufferString[5],BufferString[7]);

     pos:=LastPos(BufferString[5],Length(BufferString[5]),"/");
       IF (pos < 0) THEN pos:=FirstPos(BufferString[5],0,":") END;
     LeftStr(BufferString[5],BufferString[5],pos+1);

     ProjektSpeichern(FALSE);
  END;
  Copy(BufferString[5],back); Copy(BufferString[7],pro);
  IF projekt THEN
     Convert(ADR(GadgetFeldListe[projectGadget])); Project;
  END;
END LoadProjekt;

PROCEDURE DeleteProjekt;
VAR DummyStr : ARRAY [0..80] OF CHAR;
    erfolg   : BOOLEAN;
    frage    : ARRAY [0..1] OF IntuiText;
    ptr      : IntuiTextPtr;
BEGIN
  ptr:=SetIText(frage[0],ADR("Wollen Sie dieses Projekt löschen ?")
                                                        ,3,1,25,25,jam2);
  frage[0].nextText:=SetIText(frage[1],ADR(BufferString[7]),2,1,40,39,jam2);

  erfolg:=ShowRequest(ADR("Projekt löschen:"),160,20,320,82,ptr,NIL,TRUE,TRUE);

  IF projectFlag THEN
     Invers(ADR(GadgetFeldListe[projectGadget])); Project;
  END;
  IF erfolg THEN
     DummyStr:=("sys:c/Delete "); Concat(DummyStr,BufferString[7]);
       Concat(DummyStr," ALL QUIET");
     PrintDosErr(Executeing(DummyStr));

     DummyStr:=("sys:c/Delete "); Concat(DummyStr,BufferString[7]);
       Concat(DummyStr,".Info");
     PrintDosErr(Executeing(DummyStr));
  END;
  GetDevList;
END DeleteProjekt;

BEGIN
END RequesterWindow.

