(*---------------------------------------------------------------------------
  :Program.       PrinterSupport.def
  :Contents.      Hilfsroutinen für Druckerprogrammierung
  :Author.        !!! Original von Fritz Cizmarov & AMIGA DOS (Ausgabe 7'90)
  :Author.        Thomas Clever
  :Address.       Bürhausen 9, D-5883 Kierspe 3
  :Phone.         02269/7084
  :ShortCut.      [tcl]
  :Version.       3.0  (zur Unterscheidung von  PrinterSupport auf AMOK #8)
  :Date.          01. Oktober 1990
  :Copyright.     PD
  :Language.      MODULA-II
  :Translator.    M2Amiga V3.3
  :History.       Original AmigaDOS 7'90
  :Update.        V3.0 [tcl] 01.Okt.90 (Erweiterungen, Änderungen,
  :Update.             Optimierungen, bessere Fehlerbehandlung)
  :Remark.        Ich hoffe, daß ich nicht gegen ein Copyright verstoße!
---------------------------------------------------------------------------*)

DEFINITION MODULE PrinterSupport;

FROM Exec      IMPORT Byte, UByte;
FROM Graphics  IMPORT ColorMapPtr, RastPortPtr, ViewModeSet;
FROM Intuition IMPORT WindowPtr, ScreenPtr;
FROM Printer   IMPORT SpecialSet;
FROM SYSTEM    IMPORT BYTE;

CONST

  (* Rückgabewerte von PrinterError() *)

  badLength       = -4;  (* IOStdReq.length enthält ungültigen Wert *)
  noCmd           = -3;  (* Ungültiger Befehl                       *)
  aborted         = -2;  (* Befehl wurde mit AbortIO() abgebrochen  *)
  openFail        = -1;  (* Device konnte nicht geöffnet werden     *)
  noErr           =  0;  (* Kein Fehler, alles OK!                  *)
  cancel          =  1;  (* Druckvorgang wurde unterbrochen         *)
  notGraphics     =  2;  (* Drucker unterstützt keinen Graphikdruck *)
  inverHam        =  3;  (* HAM-Bild kann nicht invertiert werden   *)
  badDimension    =  4;  (* Werte für Druckgröße fehlerhaft         *)
  dimensionOvflow =  5;  (* Werte für Druckgröße zu groß            *)
  internalMemory  =  6;  (* Zu wenig Speicher für interne Variablen *)
  bufferMemory    =  7;  (* Zu wenig Speicher für Druckpuffer       *)
  tookControl     =  8;  (* ??? *)


PROCEDURE OpenPrinter(): BOOLEAN;
  (* :Result.   TRUE, wenn Drucker bereit                 *)
  (* :Semantic. öffnet Printer.device und testet, ob      *)
  (* :Semantic. Drucker bereit ist; erst wenn OpenPrinter *)
  (* :Semantic. erfolgreich war, können die nachfolgenden *)
  (* :Semantic. Prozeduren benutzt werden                 *)
  (* :Note.     Es kann zum Rechnerabsturz führen, wenn   *)
  (* :Note.     der Drucker ausgeschaltet ist. Wer weiß   *)
  (* :Note.     wieso??                                   *)

PROCEDURE ClosePrinter;
  (* :Semantic. schließt Printerdevice                    *)
  (* :Note.     ClosePrinter wird zwar am Programmende    *)
  (* :Note.     automatisch aufgerufen, jedoch sollte     *)
  (* :Note.     man Drucker nach verrichteter Arbeit      *)
  (* :Note.     sofort freigeben                          *)

PROCEDURE PrinterReady(): BOOLEAN;
  (* :Result.   TRUE, wenn Drucker ONLINE                 *)
  (* :Semantic. testet, ob Drucker ONLINE o. OFFLINE ist  *)
  (* :Note.     wird bei OpenPrinter() automatisch auf-   *)
  (* :Note.     gerufen                                   *)

PROCEDURE PrinterError(): Byte;
  (* :Result.   Fehlercode (siehe Konstantendefinition)   *)
  (* :Semantic. holt Fehlercode der letzten Operation     *)

PROCEDURE PWriteString( str: ARRAY OF CHAR );
  (* :Input.    Zeichenkette, die ausgegeben werden soll  *)
  (* :Semantic. gibt eine Zeichenkette aus, wobei Steuer- *)
  (* :Semantic. sequenzen vorher ausgewertet werden       *)

PROCEDURE PWrite( ch: CHAR );
  (* :Input.    Zeichen, das ausgegeben werden soll       *)
  (* :Semantic. wie PWriteString für einzelnes Zeichen    *)

PROCEDURE PWriteLn;
  (* :Semantic. sendet Linefeed an Drucker                *)

PROCEDURE PWriteCard( val: LONGCARD; width: INTEGER );
  (* :Input.    val   : Zahl, die ausgegeben werden soll  *)
  (* :Input.    width : Größe des Feldes  [-32..+32]      *)
  (* :Semantic. es werden ABS(width) Zeichen ausgegeben   *)
  (* :Semantic. oder soviel wie minimal nötig sind; wenn  *)
  (* :Semantic. width < 0, dann wird die Zahl linksbündig,*)
  (* :Semantic. sonst rechtsbündig ausgegeben             *)

PROCEDURE PWriteInt( val: LONGINT; width: INTEGER );
  (* :Input.    val   : Zahl, die ausgegeben werden soll  *)
  (* :Input.    width : Größe des Feldes [-32..+32]       *)
  (* :Semantic. wie PWriteCard, nur für LONGINT-Zahlen    *)

PROCEDURE PRawWrite( str: ARRAY OF BYTE; len: INTEGER );
  (* :Input.    str: Zeichenkette                         *)
  (* :Input.    len: Anzahl der Zeichen                   *)
  (* :Semantic. sendet 'len' Zeichen von 'str' unverän-   *)
  (* :Semantic. dert an den Drucker; man kann so drucker- *)
  (* :Semantic. spezifische Steuersequenzen an den        *)
  (* :Semantic. Drucker schicken, die dem Printer.device  *)
  (* :Semantic. nicht bekannt sein müssen                 *)

PROCEDURE PCommand( com: CARDINAL; p0, p1, p2, p3: UByte );
  (* :Input.    com: Printer Command (siehe Printer.def)  *)
  (* :Input.    p0..p3: Parameter für Befehl 'com' (nicht *)
  (* :Input.            benötigte Param. auf Null setzen) *)
  (* :Semantic. sendet Drucker-Kommandos wie slrm (set    *)
  (* :Semantic. left & right margin) mit ihren Parametern *)
  (* :Semantic. an den Drucker                            *)

PROCEDURE DumpRPort( rPort: RastPortPtr; cMap: ColorMapPtr;
                     mod: ViewModeSet; x, y, w, h: CARDINAL;
                     destW, destH: LONGINT; spec: SpecialSet );
  (* :Input.    rPort : Zeiger auf RastPort               *)
  (* :Input.    cMap  : Zeiger auf ColorMap               *)
  (* :Input.    mod   : ViewModes                         *)
  (* :Input.    x, y  : Linke obere Ecke des Ausschnitts  *)
  (* :Input.    w, h  : Breite und Höhe des Ausschnitts   *)
  (* :Input.    destW : Breite des Ausdrucks              *)
  (* :Input.    destH : Höhe des Ausdrucks                *)
  (* :Input.    spec  : Flags für Ausdruck                *)
  (* :Semantic. gibt beliebigen Ausschnitt eines RastPorts*)
  (* :Semantic. als Hardcopy auf dem Drucker aus          *)

PROCEDURE DumpScreen( screen: ScreenPtr );
  (* :Input.    Zeiger auf geöffneten Screen              *)
  (* :Semantic. erstellt Hardcopy des Screens             *)

PROCEDURE DumpWindow( window: WindowPtr );
  (* :Input.    Zeiger auf geöffnetes Window              *)
  (* :Semantic. erstellt Hardcopy des Fensters            *)

(* ---------------------------------------------------------------- *)
(* --------------- F e h l e r b e h a n d l u n g ---------------- *)
(* ---------------------------------------------------------------- *)

(* Um eine vollständige und immer korrekte Fehlerbehandlung zu ge-  *)
(* währleisten, müßte ein Programm nach jedem Aufruf einer der      *)
(* obigen Prozeduren durch Aufruf von PrinterError() testen, ob ein *)
(* Fehler aufgetreten ist und wenn ja, dann darauf reagieren.       *)
(* Um dies zu vereinfachen, kann man PrinterSupport eine Prozedur   *)
(* zuweisen, die immer dann automatisch aufgerufen wird, wenn ein   *)
(* Druckerfehler aufgetreten ist - außer bei Aufruf von OpenPrinter.*)

PROCEDURE InstallErrorProc( p: PROC );
  (* :Input.    eine parameterlose Procedur               *)
  (* :Semantic. die Prozedur p wird immer dann aufgerufen,*)
  (* :Semantic. wenn beim Aufruf einer Prozedur (außer    *)
  (* :Semantic. OpenPrinter) ein Druckerfehler aufgetreten*)
  (* :Semantic. ist, d.h. PrinterError() # noErr ist      *)

PROCEDURE RemoveErrorProc;
  (* :Semantic. macht den Aufruf von InstallErrorProc     *)
  (* :Semantic. wieder rückgängig; der Benutzer dieses    *)
  (* :Semantic. Moduls muß nun selbst mit PrinterError()  *)
  (* :Semantic. testen, ob Fehler aufgetreten sind und    *)
  (* :Semantic. entsprechend darauf reagieren             *)

PROCEDURE BreakOnError;
  (* :Semantic. diese Prozedur bricht das laufende        *)
  (* :Semantic. Programm mit folgendem Requester ab:      *)
  (* :Semantic.    ---------------------------            *)
  (* :Semantic.    | Modula-2 error message: |            *)
  (* :Semantic.    | Printer-trouble         |            *)
  (* :Semantic.    |               --------  |            *)
  (* :Semantic.    |               | Abort | |            *)
  (* :Semantic.    |               --------  |            *)
  (* :Semantic.    ---------------------------            *)
  (* :Semantic. Diese Prozedur kann als Parameter beim    *)
  (* :Semantic. Aufruf von InstallErrorProc benutzt werden*)

END PrinterSupport.def

