(**********************************************************************

    :Program.    VHilfe.mod
    :Contents.   Procedure, die die Anleitung zum Programm VTrainer
    :Contents.   anzeigt
    :Author.     Dieter WILHELM
    :Address.    Albert-Schweitzer-Str.44, 8000 München 83
    :Phone.      089/671693
    :Copyright.  PD
    :Language.   Modula-2
    :Translator. M2Amiga A+L V4.0d
    :Imports.    IntuiStruct1.3 [bne] Amok#, VMenue
    :History.    V1.0 Dieter WILHELM 13.Jan.1991
    :History.    V1.1 Dieter WILHELM 29.Sept.1991

**********************************************************************)

IMPLEMENTATION MODULE VHilfe ;


  FROM ExecL       IMPORT GetMsg, ReplyMsg, WaitPort;
  FROM GraphicsD   IMPORT jam1;
  FROM GraphicsL   IMPORT Move, RectFill, SetAPen;
  FROM Heap        IMPORT AllocMem, Deallocate;
  FROM IntuiStruct IMPORT AllocProc, BorderEnd, DeallocProc, Rectangle,
                          StructBorder, StructGadget, StructText;
  FROM IntuitionD  IMPORT ActivationFlags, ActivationFlagSet, boolGadget,
                          Border, Gadget, GadgetFlags, GadgetFlagSet,
                          GadgetPtr, IDCMPFlags, IDCMPFlagSet,
                          IntuiMessagePtr, IntuiText, WindowPtr;
  FROM IntuitionL  IMPORT AddGList, ModifyIDCMP, OffGadget, OnGadget,
                          PrintIText, RefreshGList, RemoveGList;
  FROM String      IMPORT Length;
  FROM SYSTEM      IMPORT ADR, LONGSET;
  FROM VMenue      IMPORT attr;


  TYPE  String  =  ARRAY [0..63] OF CHAR ;


  CONST seiteLang = 17;
        maxZeile  = 112;


  VAR Z      : ARRAY [1..maxZeile] OF String ;
      intuiZ : ARRAY [1..maxZeile] OF IntuiText;
      i, j,
      nr     : INTEGER;
      Gad    : ARRAY [0..2] OF Gadget;
      GadPos : INTEGER;
      GPtr   : GadgetPtr;
      IText  : ARRAY [0..2] OF IntuiText;
      funk   : ARRAY [0..2] OF IntuiText;
      Bord   : ARRAY [0..2] OF Border;
      Msg    : IntuiMessagePtr;
      class  : IDCMPFlagSet;
      code   : CARDINAL;
      letzte : INTEGER;


  PROCEDURE Seite(W: WindowPtr; nr: INTEGER) ;
    BEGIN
      SetAPen(W^.rPort, 0) ; RectFill(W^.rPort, 0, 0, W^.width, 222);
      PrintIText(W^.rPort, ADR(intuiZ[1 + nr * seiteLang]), 60, 5);
  END Seite ;


  PROCEDURE Hilfe(W: WindowPtr) ;
    BEGIN
      SetAPen(W^.rPort, 0);
      RectFill(W^.rPort, 0, 15, W^.width, W^.height);
      SetAPen(W^.rPort, 3) ;
      PrintIText(W^.rPort, ADR(funk[0]), 0, 0);
      INCL(W^.idcmpFlags, gadgetUp) ;
      INCL(W^.idcmpFlags, rawKey) ;
      ModifyIDCMP(W, W^.idcmpFlags) ;
      GadPos := AddGList(W, ADR(Gad[0]), -1, 3, NIL) ;
      RefreshGList(ADR(Gad[0]), W, NIL, 3) ;
      nr := 0 ;
      OffGadget(ADR(Gad[1]), W, NIL);
      Seite(W, nr) ;
      LOOP
        WaitPort(W^.userPort) ;
        Msg := GetMsg(W^.userPort) ;
        WHILE Msg # NIL DO
          class := Msg^.class ;
          GPtr := Msg^.iAddress ;
          code := Msg^.code ;
          ReplyMsg(Msg) ;
          IF rawKey IN class THEN
            IF code = 89 THEN
              IF nr # letzte THEN
                IF nr = 0 THEN
                  OnGadget(ADR(Gad[1]), W, NIL);
                  SetAPen(W^.rPort, 0);
                  RectFill(W^.rPort, 280, 227, 356, 238);
                  PrintIText(W^.rPort, ADR(IText[1]), 280, 227);
                END;  (* NR = *)
                INC(nr);
                Seite(W, nr);
                IF nr = letzte THEN
                  OffGadget(ADR(Gad[2]), W, NIL);
                END;  (* NR = *)
              END ;  (* IF nr # *)
            ELSIF code = 84 THEN
              IF nr # 0 THEN
                IF nr = letzte THEN
                  OnGadget(ADR(Gad[2]), W, NIL);
                  SetAPen(W^.rPort, 0);
                  RectFill(W^.rPort, 480, 227, 556, 238);
                  PrintIText(W^.rPort, ADR(IText[2]), 480, 227);
                END;  (* NR = *)
                DEC(nr) ;
                Seite(W, nr);
                IF nr = 0 THEN
                  OffGadget(ADR(Gad[1]), W, NIL);
                END;  (* NR = *)
              END ;  (* IF nr *)
            ELSIF code = 80 THEN
              EXIT ;
            END ;  (* IF code *)
          END ;  (* IF rawKey *)
          IF gadgetUp IN class THEN
            CASE GPtr^.gadgetID OF
              0 : EXIT |
              1 : IF nr # 0 THEN
                    IF nr = letzte THEN
                      OnGadget(ADR(Gad[2]), W, NIL);
                      SetAPen(W^.rPort, 0);
                      RectFill(W^.rPort, 480, 227, 556, 238);
                      PrintIText(W^.rPort, ADR(IText[2]), 480, 227);
                    END;  (* NR = *)
                    DEC(nr) ;
                    Seite(W, nr);
                    IF nr = 0 THEN
                      OffGadget(ADR(Gad[1]), W, NIL);
                    END;  (* NR = *)
                  END |  (* IF nr *)
              2 : IF nr # letzte THEN
                    IF nr = 0 THEN
                      OnGadget(ADR(Gad[1]), W, NIL);
                      SetAPen(W^.rPort, 0);
                      RectFill(W^.rPort, 280, 227, 356, 238);
                      PrintIText(W^.rPort, ADR(IText[1]), 280, 227);
                    END;  (* NR = *)
                    INC(nr) ;
                    Seite(W, nr);
                    IF nr = letzte THEN
                      OffGadget(ADR(Gad[2]), W, NIL);
                    END;  (* NR = *)
                  END|  (* IF nr *)
              ELSE;
            END ;  (* CASE *)
          END ;  (* IF *)
          Msg := GetMsg(W^.userPort) ;
        END ;  (* WHILE *)
      END ;  (* LOOP *)
      GadPos := RemoveGList(W, ADR(Gad[0]), 3) ;
      EXCL(W^.idcmpFlags, gadgetUp) ;
      EXCL(W^.idcmpFlags, rawKey) ;
      ModifyIDCMP(W, W^.idcmpFlags) ;
      SetAPen(W^.rPort, 0);
      RectFill(W^.rPort, 0, 15, W^.width, W^.height);
  END Hilfe ;


    BEGIN
      IF (maxZeile MOD seiteLang) # 0 THEN
        letzte := maxZeile DIV seiteLang;
      ELSE
        letzte := (maxZeile DIV seiteLang) - 1;
      END;  (* FOR *)
      FOR i := 1 TO (seiteLang - 1) DO
        FOR j := 0 TO (letzte - 1) DO
          StructText(intuiZ[j * seiteLang + i], 1, 0, jam1, 0, 12 * i,
                     ADR(Z[j * seiteLang +i]),
                     ADR(intuiZ[1+ j * seiteLang +i]));
          intuiZ[j * seiteLang + i].iTextFont := ADR(attr);
        END;  (* FOR j *)
      END;  (* FOR i *)
      FOR i := seiteLang TO maxZeile BY seiteLang DO
        StructText(intuiZ[i], 1, 0, jam1, 0, 12 * seiteLang, ADR(Z[i]),
                   NIL);
        intuiZ[i].iTextFont := ADR(attr);
      END;  (* FOR *)
      j := 1;
      FOR i := (seiteLang * letzte + 1) TO (maxZeile - 1) DO
        StructText(intuiZ[i], 1, 0, jam1, 0, 12 * j, ADR(Z[i]),
                   ADR(intuiZ[i + 1]));
        INC(j);
        intuiZ[i].iTextFont := ADR(attr);
      END;  (* FOR i *)
      StructText(intuiZ[maxZeile], 1, 0, jam1, 0, 12 * j,
                 ADR(Z[maxZeile]), NIL);
      intuiZ[maxZeile].iTextFont := ADR(attr);

Z[1] := "Das Programm VokabelTrainer frägt Vokabeln oder Ähnliches in" ;
Z[2] := "zufälliger Reihenfolge ab. Dabei werden Vokabeln, die man gut" ;
Z[3] := "kennt, weniger häufig abgefragt, als Vokabeln, die man weniger";
Z[4] := "gut kennt. Dazu werden beim Speichern die persönlichen Daten" ;
Z[5] := "mitabgespeichert. Zu den Menüpunkten im einzelnen :";
Z[6] := "" ;
Z[7] := "";
Z[8] := "Projekt-Menü :" ;
Z[9] := "";
Z[10] := "  -Laden : Bei Laden öffnet sich ein FileRequester in dem Sie";
Z[11] := "           eine Datei zum Laden auswählen können. In der Um-";
Z[12] := "           gebungsvariable ENV:VTrainer können Sie einen Pfad";
Z[13] := "           angeben, der beim erstenmal Laden benutzt wird.";
Z[14] := "";
Z[15]:="  -Speichern als : Hier können Sie in einem FileRequester ange-";
Z[16]:="                   ben wo und unter welchem Namen Sie die Datei";
Z[17] :="                   speichern wollen.";

Z[18] := "  -Speichern : Wenn die Datei geladen oder schon einmal ge-" ;
Z[19] := "               speichert wurde, wird Sie an alter Stelle ge-" ;
Z[20] := "               speichert. Sonst verhält sich dieser Menüpunkt";
Z[21] := "               wie 'Speichern als'." ;
Z[22] := "";
Z[24] := "";
Z[25] := "  -Info : Zeigt die Versionsnummer und die Adresse des Autors";
Z[26] := "          an (wird auch bei jedem Programmstart angezeigt)." ;
Z[27] := "";
Z[28] := "  -ENDE : Beendet das Programm." ;
Z[29] := "";
Z[30] := "";
Z[31] := "";
Z[32] := "";
Z[33] := "";
Z[34] := "";

Z[35] := "Datei-Menü :" ;
Z[36] := "";
Z[37]:= "  -Abfrage : Frägt die Vokabeln ab. Bei 'Vokabel->Übersetzung'";
Z[38]:="             wird die Vokabel angezeigt und sie haben 5 String-";
Z[39]:="             gadgets zur Eingabe der Übersetzung zur Verfügung.";
Z[40]:="             Wenn Sie nach der Eingabe auf 'OK' klicken, werden";
Z[41]:="             Ihnen die Übersetzungen angezeigt. Sie können dann";
Z[42] := "             selbst entscheiden, ob Ihre Antwort richtig oder";
Z[43]:="             falsch war und das entsprechende Gadget anklicken.";
Z[44]:="             Durch anklicken von Abbruch können Sie die Abfrage";
Z[45]:= "             beenden. Bei 'Übersetzung->Vokabel' läuft es ge-" ;
Z[46]:="             nauso, nur daß die Übersetzungen angezeigt werden,";
Z[47] := "             und Sie die Vokabel eingeben können." ;
Z[48] := "";
Z[49] := "  -Eingabe : Hier können Sie links die Vokabel und rechts bis";
Z[50] := "             zu 5 Übersetzungen eingeben. Nach Anklicken von";
Z[51] := "             'OK' können Sie eine weitere Vokabel eingeben.";

Z[52] := "             Um die letzte Vokabel, die Sie eingeben wollen," ;
Z[53]:= "             an die anderen anzuhängen und die Eingabe zu be-" ;
Z[54]:= "             enden, klicken Sie 'Anhängen' an. Soll die Einga-";
Z[55]:= "             be beendet werden, ohne daß die Vokabel angehängt";
Z[56] := "             wird, so klicken Sie 'Abbruch' an." ;
Z[57]:= "             'Erweitern' und 'Neu' unterscheiden sich nur da-" ;
Z[58]:= "             durch, daß bei Neu eine neue Datei begonnen wird,";
Z[59]:= "             während bei Erweitern die Vokabeln an eine, even-";
Z[60] := "             tuell schon vorhandene, Datei angehängt werden." ;
Z[61] := "";
Z[62] := "  -Anzeige : Hiermit können Sie sich die Vokabeln anschauen.";
Z[63]:= "             Es wird die Vokabel mit ihren Übersetzungen sowie";
Z[64] := "             Ihren persönlichen Daten angezeigt. Mit 'weiter'";
Z[65]:= "             bzw. 'zurück' wird die nächste bzw. vorhergehende";
Z[66] := "             Vokabel angezeigt. Mit 'Abbruch' kommen Sie zum";
Z[67] := "             Hauptmenü zurück." ;
Z[68] := "";

Z[69] := "  -Editieren : Mit diesem Menüpunkt können Sie schon eingege-";
Z[70] := "               bene Vokabeln ändern und löschen." ;
Z[71] := "               Die Vokabeln werden seitenweise (max. 20 Voka-";
Z[72] := "               beln pro Seite), ohne Übersetzung angezeigt." ;
Z[73]:= "               Mit 'weiter' bzw. 'zurück' können Sie die näch-";
Z[74] := "               ste bzw. die vorhergehende Seite sehen. Mit" ;
Z[75] := "               'Abbruch' kommen Sie wie üblich zum Hauptmenü" ;
Z[76]:= "               zurück. Um eine Vokabel zu editieren müssen Sie";
Z[77] := "               diese nur anklicken. Danach können Sie die Vo-";
Z[78] := "               kabel und die Übersetzungen verändern und 'än-";
Z[79] := "               dern' anklicken oder die Vokabel durch anklik-";
Z[80] := "               ken von 'löschen' aus der Datei entfernen.";
Z[81] := "               Wollen Sie keines von beiden, klicken Sie wie-";
Z[82] := "               der 'Abbruch' an.";
Z[83] := "";
Z[84] := "  -Statistik : Um zu sehen, welche Dateien Sie schon gut be-" ;
Z[85]:="               herrschen und welche nicht, können Sie sich hier";

Z[86] := "               die Gesamtdaten zu einer Datei anschauen." ;
Z[87] := "";
Z[88] := "";
Z[89] := "Ausgabe-Menü :" ;
Z[90] := "";
Z[91]:="  -Datei ausgeben : Dieser Menüpunkt entspricht 'Speichern als'";
Z[92]:= "                    mit dem Unterschied, daß alle persönlichen";
Z[93] := "                    Daten gelöscht werden.";
Z[94] := "" ;
Z[95] := "";
Z[96] := "";
Z[97]:="Alle Menüpunkte können auch durch Shortcuts (rechte Amiga-Taste";
Z[98]:="und gleichzeitig den Buchstaben, der im Menü ganz rechts steht,";
Z[99] := "drücken) aufgerufen werden. Ebenso kann statt anklicken der" ;
Z[100] :="Gadgets die Funktionstaste, die unter dem Gadget angegeben";
Z[101] := "ist, gedrückt werden." ;
Z[102] := "";

Z[103] := "Als sinnvolle Dateilänge hat sich bei mir etwa 100 Vokabeln";
Z[104] := "herausgestellt, da sonst einzelne Vokabeln zu selten abge-";
Z[105] := "fragt werden. Es besteht aber, außer durch den Speicher,";
Z[106] := "keine Beschränkung der Dateilänge." ;
Z[107] := "" ;
Z[108] := "";
Z[109] := "";
Z[110] := "";
Z[111] := "Viel Erfolg beim Lernen wünscht Ihnen" ;
Z[112]:= "                                              Dieter WILHELM.";

      FOR i := 0 TO 2 DO
        StructBorder(Bord[i], -2, -2, 3, jam1, 4, NIL) ;
        Rectangle(80, 15) ;
        BorderEnd ;
        StructText(IText[i], 3, 1, jam1, 1, 1, NIL, NIL) ;
        StructText(funk[i], 3, 1, jam1, 105 + i * 200, 245, NIL, NIL) ;
        StructGadget(Gad[i], 80 + 200 * i, 227, 76, 11, GadgetFlagSet{},
                     ActivationFlagSet{gadgImmediate, relVerify},
                     boolGadget, ADR(Bord[i]), ADR(IText[i]), LONGSET{},
                     i, NIL);
      END ;  (* FOR *)
      IText[0].iText := ADR(" Abbruch") ;
      IText[1].iText := ADR(" zurück") ;
      IText[2].iText := ADR(" weiter") ;
      funk[0].iText := ADR("F1");
      funk[1].iText := ADR("F5");
      funk[2].iText := ADR("F10");
      FOR i := 0 TO 2 DO
        IText[i].iTextFont := ADR(attr);
        funk[i].iTextFont := ADR(attr);
      END;  (* FOR *)
      FOR i := 0 TO 1 DO
        funk[i].nextText := ADR(funk[i + 1]);
      END;  (* FOR *)
      Gad[0].nextGadget := ADR(Gad[1]) ;
      Gad[1].nextGadget := ADR(Gad[2]) ;
      AllocProc := AllocMem ;
      DeallocProc := Deallocate ;

END VHilfe.
