(*********************************************************************
 *
 *  :Program.    WindowInOut.def
 *  :Author.     Ingo Goldak
 *  :Address.    Hohenzollerndamm 8
 *  :Address.    1000 Berlin 31
 *  :Copyright.  PD
 *  :Language.   Modula-II
 *  :Translator. M2Amiga V3.3d
 *  :Imports.    MemSystem (at least V1.2)
 *  :Contents.   PROCEDUREn zur Ein-/Ausgabe in Windows
 *  :History.    V1.0 [Ingo Goldak] ??.??.89
 *  :History.    V1.2 [Ingo Goldak] 30.03.90 (Compiler Version 3.3d;
 *                     neue VARiable input; keine Fehlermeldungen)
 *
 *********************************************************************)

DEFINITION MODULE WindowInOut;

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

   Modul zur gezielten Ein- und Ausgabe in eigenen Fenstern.

   Version 1.2 by Ingo Goldak  (Public Domain)

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


FROM Intuition IMPORT
     WindowPtr;

(* Allgemeine Informationen für (fast) alle Prozeduren und Funktionen
   ------------------------------------------------------------------

 1 Um gezielt in Fenstern arbeiten zu können, muß das Fenster selbst-
   verständlich bekannt sein. Wenn ein Fenster nicht angegeben wird,
   wird der Befehl ignoriert und 0 bei Zahlen bzw. CHR(0) bei
   Zeichen(-ketten) zurückgegeben.

 2 Um einen möglichst geordneten Bildschirmaufbau zu vereinfachen, muß
   Zeile und Spalte für Ein- und Ausgabe angegeben werden.
   - Zeile 0 ist die Titelzeile, sie sollte nur verwendet werden, wenn es
     sich um ein 'borderless'-Window handelt.
   - Spalte 0 beginnt links auf dem Rahmen. Auch hier ist es empfehlenswert,
     0 nur anzugeben, wenn das Fenster keinen Rahmen hat.
   Bei den Angaben für Zeile und Spalte MUß der Anwender selbst darauf
   achten, daß die Dimensionen des Fensters nicht überschritten werden;
   die Prozeduren prüfen dies nicht nach!

 3 Das Modul liefert keine Kontrolle über die Farben, die verwendet werden.
   Diese müssen vorher z.B. mit 'SetAPen' und 'SetBPen' eingestellt werden.

   ------------------------------------------------------------------------- *)


VAR input : BOOLEAN; (* erhält nach Eingaben den Wert TRUE, wenn die Eingabe
                        andere Zeichen als CR enthält.                       *)


(* Hinweise zu den Schreib-Prozeduren
   ----------------------------------
   Hier ist nur anzumerken, daß bei WriteWindowCard und WriteWindowInt
   selbstverständlich auch SHORT Variable übergeben werden können.
   WICHTIG ist jedoch, daß Width groß genug ist, um die Zahl und das
   Vorzeichen, falls vorhanden, aufzunehmen.
   Wenn bei den Prozeduren mit Zahlen ein Fehler auftritt, wird nichts
   ausgegeben.                                                               *)


PROCEDURE WriteWindowChar (Window : WindowPtr;
                           line,column : CARDINAL;
                           Zeichen : CHAR);


PROCEDURE WriteWindowString (Window : WindowPtr;
                             line,column : CARDINAL;
                             String : ARRAY OF CHAR);


PROCEDURE WriteWindowCard (Window : WindowPtr;
                           line,column : CARDINAL;
                           Number : LONGCARD;
                           Width : CARDINAL);


PROCEDURE WriteWindowInt (Window : WindowPtr;
                          line,column : CARDINAL;
                          Number : LONGINT;
                          Width : CARDINAL);


PROCEDURE GetKey (Window : WindowPtr) : CARDINAL;

(* Diese Funktion liefert die Zahl einer betätigten Taste. Dabei ist zu
   beachten, daß dies nicht der ASCII-Code ist. Dieser kann mit Hilfe der
   KEYMAP ermittelt werden, was jedoch sehr umständlich ist. Wenn ASCII-
   Zeichen gewünscht werden, empfiehlt sich die Funktion GetChar (vgl unten).
   Sinnvoll ist diese Funktion, wenn Cursor- oder Funktionstasten oder die
   Help-Taste oder Alt-, Ctrl-, Shift-, Amiga-Tasten alleine abgefragt werden
   sollen. Dabei ist zu beachten, daß es beim Drücken der Taste einen Code
   gibt und beim Loslassen einen weiteren, der genau um 128 größer ist.      *)


PROCEDURE GetChar (Window : WindowPtr) : CHAR;

(* Diese Funktion liefert alle ASCII-Zeichen einschließlich Control-Codes.
   Nicht erkannt werden Funktions- und Cursor-Tasten, sowie die Help-Taste.
   Diese Funktion ist Grundlage für die folgenden Prozeduren.
   (vgl Implementation)                                                      *)




(* Hinweise zu den Lese-Prozeduren
   -------------------------------
   Die Prozeduren akzeptieren nur soviele Zeichen, wie es der Datentyp erlaubt.
   Ist die maximale Länge erreicht haben nur noch Backspace- und Return-Taste
   eine Funktion. Bei Integer-Variablen ist außer Ziffern ein führendes
   Minuszeichen erlaubt.                                                     *)


PROCEDURE ReadWindowString (Window : WindowPtr;
                            line,column : CARDINAL;
                            VAR String : ARRAY OF CHAR);

(* Der String wird mit einem NULL-Code (CHR(0) abgeschlossen. Es werden alle
   druckbaren Zeichen einschließlich Anführungs- und Sonderzeichen angenommen.
   Führende und abschließende Leerzeichen werden NICHT abgetrennt.           *)




(* Die Prozeduren zur Eingabe von Zahlen haben eine Bereichskontrolle, um
   Laufzeitfehler zu vermeiden. Bei falscher Eingabe (z.B. 65536 als Cardinal)
   wird eine neue (hoffentlich gültige) Eingabe erwartet.                    *)


PROCEDURE ReadWindowCard (Window : WindowPtr;
                          line,column : CARDINAL;
                          VAR Number : CARDINAL);


PROCEDURE ReadWindowLongCard (Window : WindowPtr;
                              line,column : CARDINAL;
                              VAR Number : LONGCARD);


PROCEDURE ReadWindowInt (Window : WindowPtr;
                         line,column : CARDINAL;
                         VAR Number : INTEGER);


PROCEDURE ReadWindowLongInt (Window : WindowPtr;
                             line,column : CARDINAL;
                             VAR Number : LONGINT);


END WindowInOut.
