DEFINITION MODULE StringInOut;
(*
  Created:   10.11.1987
  Changed:   18.1.88/08.02.88/29.02.88 by 
             Stefan Salewski
             Stolper Weg 3
             2160 Stade   West-Germany
             Tel: 04141/61130
             
  Note: compiled with AMIGA Modula-2 System by AMSoft Version from 5.5.88
   
  This Module may be freely copied. But please
  leave my name in. Thanks....Stefan  
  
  Dieser Modul dient zur (komfortablen) Ein- und Ausgabe von Strings und
  zun Einlesen einzelner Zeichen.
  OpenNewWindow oeffnet ein Intuition-Window. Die groesse wird in Zeichen
  angegeben, die linke obere Ecke in Pixel. Das Fenster erhaelt die Gadgets,
  die der Variablen wFlags entsprechen. Ist wFlags=FlagSet{}, so hat das
  Window keinen Titelbalken und es passen bei maximaler Hoehe auch im 60
  Zeichenmodus 27 Textzeilen ins Window, mit Titel nur 26. Ist close in
  wFlags enthalten, so bekonnt man ein closeWindow-Message beim anklicken
  dieses Gadgets und muss sie selber auswerten. Das Window kann auch mit einem
  Menu versehen werden, dann muessen die Menu-Messages aber vom Dir ausgewertet
  werden. Es koennen mehrere Fenster unabhangig voneinander benutzt 
  werden. SetColor setzt die vier Workbench-Farben. GetPos bzw.
  SetPos liest bzw. setzt die Cursorposition(Spalten- und Zeilenzahl).
  Links-Oben => Spalte=x=0 und Zeile=y=1
  ReadString liest ueber ein StringGadget eine Zeichenkette ein.
  Jetzt werden von ReadString und GetKey nicht mehr alle Messages im UserPort
  verbraucht,sondern nur Tastatureingaben. Andere Message werden nicht
  vom UserPort entfernt, sondern beenden die Procedure( gleichzeitig bekommt
  inputOK den Wert FALSE). Dadurch koennen
  sie vom Hauptprogramm ausgewertet werden ( z.B. Menuoperationen).
  Die IDCMPFlags des Windows werden jetzt am ende der Procedure restauriert.
  Nachdem ReadString durch druecken der Return- oder Enter-Taste oder
  durch deaktivieren mit der Maus beendet
  wurde, springt der (unsichtbare) Cursor auf den Anfang der naechnsten
  Zeile. WriteString scheibt an die momentane Cursorposition. Ist
  NewLine=TRUE, so wird nach der Schreiboperation auf den Anfang der
  naechsten Zeile gesprungen bzw. der Bildschirm wird nach oben
  gescrollt. Bei NewLine=FALSE bleibt der Cursor hinter dem geschriebenen
  Wort stehen.Es kann an dieser Position weitergeschrieben oder gelesen
  werden. Wird der rechte Rand des Fensters erreicht,bleibt der Cursor
  auf der letzten Spalte stehen. GetKey wartet auf das druecken einer
  Taste(ohne Return) und liefert das entsprechnende Zeichen.
  Durch SetClear wird bestimmt, ob der vorhandene Wert von
  str bei der Stringeingabe ins StringGadget uebernommen werden soll,
  oder ob er geloescht werden soll.

*)
  FROM Intuition IMPORT WindowPtr;
  TYPE 
    StrGadgetLaenge=[1..79];
    Flags=(close,drag,depth);
    FlagSet= SET OF Flags;
  VAR 
    inputOK:BOOLEAN;

  PROCEDURE OpenNewWindow(VAR wP:WindowPtr;x,y,w,h:INTEGER;wFlags:FlagSet;
                          titel:ARRAY OF CHAR);
  PROCEDURE CloseNewWindow(wP:WindowPtr);

  PROCEDURE ClearWindow(wP:WindowPtr);
  PROCEDURE SetColors(wP:WindowPtr;background,input,output:INTEGER);
  PROCEDURE SetClear(wP:WindowPtr;clearInput:BOOLEAN);
  PROCEDURE GetPos(wP:WindowPtr;VAR x,y:INTEGER);
  PROCEDURE SetPos(wP:WindowPtr;x,y:INTEGER);

  PROCEDURE GetKey(wP:WindowPtr):CHAR;
  PROCEDURE ReadString(wP:WindowPtr;text:ARRAY OF CHAR;
                       VAR str:ARRAY OF CHAR;sichtbareZeichen:StrGadgetLaenge);
  PROCEDURE WriteString(wP:WindowPtr;s:ARRAY OF CHAR;newLine:BOOLEAN);

  PROCEDURE DeleteChar(wP:WindowPtr;chars:INTEGER);
  (* DeleteChar(w,5) entspraeche WriteString(w,'     ',FALSE) wenn
     die geschriebenen Leerzeichen Hintergrundfarbe haetten.
     Die Leerzeichen sind aber farblos (nur Cursorbewegung)
  *)
       
END StringInOut.def
