home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 03 / 68000 / reqstr.mod < prev    next >
Encoding:
Modula Implementation  |  1988-12-22  |  5.6 KB  |  173 lines

  1. (*********************************************************)
  2. (*                    ReqString.mod                      *)
  3. (*  Module zum einfachen Erstellen eines Stringrequests  *)
  4. (*            (C) 1988 Frank Schäfer & TOOLBOX           *)
  5.  
  6. IMPLEMENTATION MODULE ReqString;
  7.  
  8. FROM Dos         IMPORT Delay;
  9. FROM Strings     IMPORT Length;
  10. FROM Graphics    IMPORT jam2,Text;
  11. FROM Intuition   IMPORT ActivateGadget,ActivationFlags,
  12.  ActivationFlagSet,Gadget,GadgetFlags,Point,
  13.  Border,CloseWindow,BorderPtr,IntuiTextPtr,GadgetFlagSet,
  14.  IDCMPFlags,IDCMPFlagSet,IntuiMessage,IntuiText,
  15.  RefreshGadgets,ScreenPtr,strGadget,StringInfo,
  16.  WindowFlags,WindowFlagSet,WindowPtr,GadgetPtr,
  17.  RefreshGList,StringInfoPtr;
  18. FROM SYSTEM  IMPORT ADDRESS,ADR,INLINE,CAST;
  19. FROM WindowHelp2 IMPORT GADGET,SCREEN,WaitEvent,WINDOW;
  20.  
  21. (*-------------------------------------------------------*)
  22.  
  23. CONST MaxGadget   = 20;
  24.       Max8Zeichen = 47;
  25.       Max9Zeichen = 38;
  26.  
  27. (*-------------------------------------------------------*)
  28.  
  29. PROCEDURE MakeIText (VAR IText : IntuiText;
  30.                          Text  : ADDRESS;
  31.                          x,y   : INTEGER);
  32.  
  33. BEGIN
  34.  WITH IText DO
  35.    frontPen  := 1;     backPen  := 0;
  36.    drawMode  := jam2;  leftEdge := x;
  37.    topEdge   := y;     iText    := Text;
  38.    iTextFont := NIL;   nextText := NIL
  39.  END
  40. END MakeIText;
  41.  
  42. (*-------------------------------------------------------*)
  43.  
  44. PROCEDURE StringGadget (VAR SGad           : Gadget;
  45.                         VAR SInfo          : StringInfo;
  46.                         VAR Buffer,UBuffer : STRING);
  47. BEGIN
  48.  SGad.specialInfo := ADR (SInfo);
  49.  SGad.gadgetType := strGadget;
  50.  WITH SInfo DO
  51.    buffer       := ADR (Buffer);
  52.    undoBuffer   := ADR (UBuffer);
  53.    bufferPos    := 0;  maxChars   := SIZE (Buffer);
  54.    dispPos := 0;  altKeyMap  := NIL
  55.  END
  56. END StringGadget;
  57.  
  58.  
  59. PROCEDURE RequestString (SPtr           : ScreenPtr;
  60.                          Anzahl         : INTEGER;
  61.                          Texte          : STRINGS;
  62.                          VAR Ergebnisse : Daten);
  63.  
  64. VAR SGad            : ARRAY [0..MaxGadget] OF Gadget;
  65.     SInfos          : ARRAY [0..MaxGadget] OF StringInfo;
  66.     SInfo           : StringInfoPtr;
  67.     UBuffers        : STRINGS;
  68.     ITexte          : ARRAY [0..MaxGadget] OF IntuiText;
  69.     GPtr1,GPtr2     : GadgetPtr;
  70.     WPtr            : WindowPtr;
  71.     WindowY,WindowX,
  72.     Zeichen,Size,X  : INTEGER;
  73.     AFlags          : ActivationFlagSet;
  74.     Message         : IntuiMessage;
  75.     Ok              : BOOLEAN;
  76.     GadBorder       : Border;
  77.     Ecken           : ARRAY [0..4] OF Point;
  78.  
  79. BEGIN
  80.  IF Anzahl < 19 THEN
  81.   DEC (Anzahl);
  82.   Size := CAST (INTEGER,SPtr^.font^.ySize);
  83.   Zeichen := Max8Zeichen;
  84.   X := 8;
  85.   IF Size = 9 THEN
  86.     X := 10;
  87.     Zeichen := Max9Zeichen
  88.   END;
  89.   Ecken[0].x := 0;   Ecken[0].y := Size + 1;
  90.   Ecken[1].x := 200; Ecken[1].y := Size + 1;
  91.   Ecken[2].x := 200; Ecken[2].y := (Size + 1) * 2;
  92.   Ecken[3].x := 0;   Ecken[3].y := (Size + 1) * 2;
  93.   Ecken[4].x := 0;   Ecken[4].y := Size + 1;
  94.   WITH GadBorder DO       (* Daten für den Gadgetborder *)
  95.     leftEdge   := -10;
  96.     topEdge    := -Size-2;
  97.     frontPen   := 1;
  98.     backPen    := 3;
  99.     drawMode   := jam2;
  100.     count      := 5;
  101.     xy         := ADR (Ecken);
  102.     nextBorder := NIL
  103.   END;
  104.   WindowX := 0;
  105.   FOR WindowY := 0 TO Anzahl DO (* X-Ausdehnung des     *)
  106.                                 (* Windows bestimmen    *)
  107.     IF Length(Texte[WindowY + 1]) * X > 376 THEN
  108.       Texte[WindowY + 1,Zeichen] := CHR (0)
  109.     END;
  110.     IF (Length(Texte[WindowY + 1]) * Size) > WindowX THEN
  111.         WindowX := Length(Texte[WindowY + 1]) * X;
  112.         IF WindowX > 376  THEN
  113.            WindowX := 376
  114.         END
  115.     END
  116.   END;
  117.   AFlags := ActivationFlagSet {relVerify};
  118.   IF NOT (Ergebnisse.TextOrZahl) THEN
  119.     INCL (AFlags,longint)   (* Zahlen müssen eingegeben *)
  120.                             (* werden                   *)
  121.   END;
  122.   FOR WindowY := 0 TO Anzahl DO (* Gadgets erzeugen     *)
  123.     MakeIText (ITexte[WindowY],ADR(Texte[WindowY+1]),
  124.                - WindowX - 20,0);
  125.     Ergebnisse.Texte[WindowY] := "";
  126.     UBuffers[WindowY] := "";
  127.     GADGET (SGad[WindowY],WindowX+35,20 + WindowY *
  128.            (Size + 3),190,Size,
  129.             GadgetFlagSet{},AFlags,ADR(GadBorder),
  130.             NIL,ADR(ITexte[WindowY]),WindowY + 1 );
  131.     StringGadget (SGad[WindowY],SInfos[WindowY],
  132.                   Ergebnisse.Texte[WindowY],
  133.                   UBuffers[WindowY]);
  134.   END;
  135.   IF Anzahl > 0 THEN (* Pointerkette aufbauen           *)
  136.     FOR WindowY := 0 TO Anzahl-1 DO
  137.       SGad[WindowY].nextGadget := ADR(SGad[WindowY+1])
  138.     END
  139.   END;
  140.   WindowY := 40 + Anzahl * (Size + 3);
  141.   WPtr := WINDOW (SPtr,WindowX + 250,WindowY,-1,-1,1,2,
  142.         ADR(Texte[0]),ADR(SGad[0]),
  143.         WindowFlagSet{noCareRefresh,activate,windowDrag},
  144.         IDCMPFlagSet{gadgetUp,activeWindow,mouseButtons});
  145.   GPtr1 := ADR(SGad[0]);
  146.   INC (Anzahl); WindowY := 0;
  147.   REPEAT
  148.    Ok := ActivateGadget (GPtr1,WPtr,NIL);
  149.    Delay (5);
  150.    WaitEvent (WPtr,Message);
  151.    GPtr2 := Message.iAddress;
  152.    SInfo := GPtr2^.specialInfo;
  153.    IF NOT (Ergebnisse.TextOrZahl) THEN
  154.      Ergebnisse.Zahlen[GPtr2^.gadgetID] := SInfo^.longInt
  155.    ELSE
  156.      Ergebnisse.Zahlen[GPtr2^.gadgetID] := 0
  157.    END;
  158.    IF (GPtr1 # NIL) AND (Message.class =
  159.       IDCMPFlagSet{gadgetUp}) THEN
  160.      INC (WindowY);
  161.      GPtr1 := GPtr1^.nextGadget
  162.    END
  163.   UNTIL (GPtr2^.gadgetID = Anzahl) AND
  164.         (WindowY = Anzahl) AND
  165.         (Message.class = IDCMPFlagSet{gadgetUp});
  166.    CloseWindow (WPtr)
  167.  END
  168. END RequestString;
  169.  
  170. (*-------------------------------------------------------*)
  171.  
  172. END ReqString.
  173.