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

    :Program.    VAnzeige.mod
    :Contents.   Zeigt die Vokabeln im Programm VTrainer an
    :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#3, Lists [bne] Amok#22,
    :Imports.    VEingabe, VMenue
    :History.    V1.0 Dieter WILHELM 13.Jan.1991
    :History.    V1.1 Dieter WILHELM 29.Sept.1991

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

IMPLEMENTATION MODULE VAnzeige ;


  FROM Conversions IMPORT ValToStr;
  FROM ExecL       IMPORT GetMsg, ReplyMsg, WaitPort;
  FROM GraphicsD   IMPORT jam1;
  FROM GraphicsL   IMPORT Move, RectFill, SetAPen, Text;
  FROM Heap        IMPORT AllocMem, Deallocate;
  FROM IntuiStruct IMPORT AllocProc, BorderEnd, DeallocProc,
                          StructBorder, StructGadget, StructText,
                          Rectangle;
  FROM IntuitionD  IMPORT ActivationFlags, ActivationFlagSet,
                          boolGadget, Border, Gadget, GadgetFlags,
                          GadgetFlagSet, GadgetPtr, IDCMPFlags,
                          IDCMPFlagSet, IntuiMessagePtr, IntuiText,
                          WindowPtr;
  FROM IntuitionL  IMPORT AddGList, DrawBorder, ModifyIDCMP,
                          RefreshGList, RemoveGList;
  FROM Lists       IMPORT EntriesInList, EntryPtr, LocateEntryAbs,
                          ReadEntryC;
  FROM String      IMPORT Length ;
  FROM SYSTEM      IMPORT ADR, LONGSET ;
  FROM VEingabe    IMPORT Modus, VKopf, Vokabel ;
  FROM VMenue      IMPORT attr;


  VAR  Anz      : ARRAY [0..3] OF CARDINAL ;
       GNr, VNr,
       m        : CARDINAL ;
       Eintrag  : EntryPtr ;
       GadPos   : INTEGER ;
       Vok      : Vokabel ;
       Gad      : ARRAY [0..2] OF Gadget ;
       GPtr     : GadgetPtr ;
       IText    : ARRAY [0..2] OF IntuiText ;
       GBorder  : ARRAY [0..2] OF Border ;
       Rand,
       Rand2    : Border ;
       fehler   : BOOLEAN ;
       Zahl     : ARRAY [0..4] OF CHAR ;
       Msg      : IntuiMessagePtr ;
       class    : IDCMPFlagSet ;
       code     : CARDINAL ;
       bruch    : REAL;
       lang     : INTEGER;


  PROCEDURE Naechste(Kopf: VKopf; vor: BOOLEAN) ;
    BEGIN
      IF vor THEN
        INC(VNr) ;
        IF (VNr = Anz[GNr]) THEN
          GNr := (GNr + 1) MOD 4 ; VNr := 0 ;
          WHILE Anz[GNr] = 0 DO
            GNr := (GNr + 1) MOD 4 ;
          END ;  (* WHILE *)
        END ;  (* IF *)
      ELSE
        IF VNr # 0 THEN
          DEC(VNr) ;
        ELSE
          CASE GNr OF
            0 : IF Anz[3] # 0 THEN
                  GNr := 3 ;
                ELSIF Anz[2] # 0 THEN
                  GNr := 2 ;
                ELSIF Anz[1] # 0 THEN
                  GNr := 1 ;
                ELSE
                  GNr := 0 ;
                END |  (* IF Anz *)
            1 : IF Anz[0] # 0 THEN
                  GNr := 0 ;
                ELSIF Anz[3] # 0 THEN
                  GNr := 3 ;
                ELSIF Anz[2] # 0 THEN
                  GNr := 2 ;
                ELSE
                  GNr := 1 ;
                END |  (* IF Anz *)
            2 : IF Anz[1] # 0 THEN
                  GNr := 1 ;
                ELSIF Anz[0] # 0 THEN
                  GNr := 0 ;
                ELSIF Anz[3] # 0 THEN
                  GNr := 3 ;
                ELSE
                  GNr := 2 ;
                END |  (* IF Anz *)
            3 : IF Anz[2] # 0 THEN
                  GNr := 2 ;
                ELSIF Anz[1] # 0 THEN
                  GNr := 1 ;
                ELSIF Anz[0] # 0 THEN
                  GNr := 0 ;
                ELSE
                  GNr := 3 ;
                END ;  (* IF Anz *)
          END ;  (* CASE *)
          VNr := Anz[GNr] - 1 ;
        END ;  (* IF VNr *)
      END ;  (* IF vor *)
      Eintrag := LocateEntryAbs(Kopf.Gruppe[GNr], VNr) ;
      ReadEntryC(Kopf.Gruppe[GNr], Eintrag, Vok) ;
  END Naechste ;


  PROCEDURE Anzeige(W: WindowPtr; Kopf: VKopf) ;
    BEGIN
      FOR m := 0 TO 3 DO
        Anz[m] := INTEGER(EntriesInList(Kopf.Gruppe[m])) ;
      END ;  (* FOR *)
      VNr := 0 ; GNr := 0 ;
      WHILE Anz[GNr] = 0 DO
        INC(GNr) ;
      END ;  (* WHILE *)
      SetAPen(W^.rPort, 0);
      RectFill(W^.rPort, 0, 15, W^.width, W^.height);
      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) ;
      Eintrag := LocateEntryAbs(Kopf.Gruppe[GNr], VNr) ;
      ReadEntryC(Kopf.Gruppe[GNr], Eintrag, Vok) ;
      SetAPen(W^.rPort, 1) ;
      Move(W^.rPort, 80, 140) ;
      Text(W^.rPort, ADR("Vokabel --> Übersetzung"), 23) ;
      Move(W^.rPort, 80, 155) ; Text(W^.rPort, ADR("abgefragt :"), 11);
      Move(W^.rPort, 260, 155) ; Text(W^.rPort, ADR("gewußt :"), 8);
      DrawBorder(W^.rPort, ADR(Rand2), 410, 145) ;
      DrawBorder(W^.rPort, ADR(Rand2), 410, 185) ;
      Move(W^.rPort, 80, 180) ;
      Text(W^.rPort, ADR("Übersetzung --> Vokabel"), 23) ;
      Move(W^.rPort, 80, 195) ; Text(W^.rPort, ADR("abgefragt :"), 11);
      Move(W^.rPort, 260, 195) ; Text(W^.rPort, ADR("gewußt :"), 8);
      SetAPen(W^.rPort, 3) ;
      Move(W^.rPort, 80, 235) ; Text(W^.rPort, ADR("   F1"), 5) ;
      Move(W^.rPort, 280, 235) ; Text(W^.rPort, ADR("   F5"), 5) ;
      Move(W^.rPort, 480, 235) ; Text(W^.rPort, ADR("   F10"), 6) ;
      LOOP
        SetAPen(W^.rPort, 1) ;
        ValToStr(LONGINT(Vok.abgefragt[v]), FALSE, Zahl, 10, 4, " ",
                 fehler);
        Move(W^.rPort, 180, 155) ; Text(W^.rPort, ADR(Zahl), 4) ;
        ValToStr(LONGINT(Vok.gewusst[v]), FALSE, Zahl, 10, 4, " ",
                 fehler);
        Move(W^.rPort, 340, 155) ; Text(W^.rPort, ADR(Zahl), 4) ;
        ValToStr(LONGINT(Vok.abgefragt[ue]), FALSE, Zahl, 10, 4, " ",
                 fehler);
        Move(W^.rPort, 180, 195) ; Text(W^.rPort, ADR(Zahl), 4) ;
        ValToStr(LONGINT(Vok.gewusst[ue]), FALSE, Zahl, 10, 4, " ",
                 fehler);
        Move(W^.rPort, 340, 195) ; Text(W^.rPort, ADR(Zahl), 4) ;
        SetAPen(W^.rPort, 0) ;
        RectFill(W^.rPort, 411, 146, 561, 155) ;
        RectFill(W^.rPort, 411, 186, 561, 195) ;
        SetAPen(W^.rPort, 3) ;
        IF Vok.abgefragt[v] # 0 THEN
          bruch := REAL(Vok.gewusst[v]) / REAL(Vok.abgefragt[v]);
          lang := 411 + INTEGER(150.0 * bruch);
          RectFill(W^.rPort, 411, 146, lang, 155);
        END ;  (* IF *)
        IF Vok.abgefragt[ue] # 0 THEN
          bruch := REAL(Vok.gewusst[ue]) / REAL(Vok.abgefragt[ue]);
          lang := 411 + INTEGER(150.0 * bruch);
          RectFill(W^.rPort, 411, 186, lang, 195);
        END ;  (* IF *)
        DrawBorder(W^.rPort, ADR(Rand), 80, 30) ;
        Move(W^.rPort, 85, 38) ;
        Text(W^.rPort, ADR(Vok.Wort), Length(Vok.Wort)) ;
        FOR m := 0 TO 4 DO
          DrawBorder(W^.rPort, ADR(Rand), 330, 30 + m * 18) ;
          Move(W^.rPort, 335, 38 + m * 18) ;
          Text(W^.rPort, ADR(Vok.Uebersetzung[m]),
               Length(Vok.Uebersetzung[m]));
        END ;  (* FOR *)
        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
               Naechste(Kopf, TRUE) ;
            ELSIF code = 84 THEN
              Naechste(Kopf, FALSE) ;
            ELSIF code = 80 THEN
              EXIT ;
            END ;  (* IF code *)
          END ;  (* IF rawKey *)
          IF gadgetUp IN class THEN
            CASE GPtr^.gadgetID OF
              0 : EXIT |
              1 : Naechste(Kopf, FALSE) |
              2 : Naechste(Kopf, TRUE)|
              ELSE;
            END ;  (* CASE *)
          END ;  (* IF *)
          Msg := GetMsg(W^.userPort) ;
        END ;  (* WHILE *)
        SetAPen(W^.rPort, 0) ;
        RectFill(W^.rPort, 82, 29, 280, 41);
        RectFill(W^.rPort, 332, 29, 530, 41);
        RectFill(W^.rPort, 332, 47, 530, 59);
        RectFill(W^.rPort, 332, 65, 530, 77);
        RectFill(W^.rPort, 332, 83, 530, 95);
        RectFill(W^.rPort, 332, 101, 530, 113);
        Eintrag := LocateEntryAbs(Kopf.Gruppe[GNr], VNr) ;
        ReadEntryC(Kopf.Gruppe[GNr], Eintrag, Vok) ;
      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 Anzeige ;


  BEGIN
    AllocProc := AllocMem ;
    DeallocProc := Deallocate ;
    FOR m := 0 TO 2 DO
      StructBorder(GBorder[m], -2, -2, 3, jam1, 4, NIL) ;
      Rectangle(80, 15) ;
      BorderEnd ;
      StructText(IText[m], 3, 1, jam1, 1, 1, NIL, NIL) ;
      IText[m].iTextFont := ADR(attr);
      StructGadget(Gad[m], 80 + 200 * m, 212, 76, 11, GadgetFlagSet{},
                   ActivationFlagSet{gadgImmediate, relVerify},
                   boolGadget, ADR(GBorder[m]), ADR(IText[m]),
                   LONGSET{}, m, NIL);
    END ;  (* FOR *)
    IText[0].iText := ADR(" Abbruch") ;
    IText[1].iText := ADR(" zurück") ;
    IText[2].iText := ADR(" weiter") ;
    Gad[0].nextGadget := ADR(Gad[1]) ;
    Gad[1].nextGadget := ADR(Gad[2]) ;
    StructBorder(Rand, -2, -2, 1, jam1, 4, NIL) ;
    Rectangle(205, 15) ;
    BorderEnd ;
    StructBorder(Rand2, 0, 0, 1, jam1, 4, NIL) ;
    Rectangle(153, 12) ;
    BorderEnd ;

END VAnzeige.
