š“Syntax10.Scn.Fntš’’’ £Zą„ParcElemsAlloc Ęź ¼żSyntax12m.Scn.Fnt'Syntax12b.Scn.Fntš’’’ £Zą„ Ęź ¼ż ż’’’ £Z'LineElemsAllocSyntax10i.Scn.Fnt‘  ż’’’ £Z'š’’’š¹õą„ Ęź ¼żSyntax10b.Scn.Fnt ī’’’š¹õą„ ž €Čß ¼ż=?š’’’š¹õą„ Ęź ¼ż ī’’’š¹õą„ ž €Čß ¼żuP7š’’’ £Zą„ Ęź ¼ż ī’’’ £Zą„ ž €Čß ¼żtš’’’ £Zą„ Ęź ¼żī’’’ £Zą„ ž €Čß ¼ż /   B Mī’’’ £Zą„ą•Ą°Ņ ¼ż?:^(#  6 "6 "')"2 "(8'# ) ‰C% #ī’’’˜ Ńą„ ž €Čß ¼ż K N < s ī’’’˜ Ńą„ą•Ą°Ņ ¼ż4+8i.# e€@1  *V"8 ,A  ¤/Ioī’’’˜ Ńą„ ž €Čß ¼ż Ö3 ī’’’˜ Ńą„ą•Ą°Ņ ¼żSfYź’’’˜ Ńą„ą•Ą°Ņ ¼ż ‹Ś"#ī’’’˜ Ńą„ą•Ą°Ņ ¼ż)$ > Qi!7 .*  $  #\/  Z,E*,K*S)0BQK?t B2+&    #_0 ] 0L Q+"3*3/Iøš’’’˜ Ńą„ Ęź ¼ż ī’’’˜ Ńą„ ž €Čß ¼ż4k'.B! †Ń’’’˜ Ńą„ Ęź ¼ż  ž Ąüąś €ł+ ÷6ĄõĮąóĢ€ņ× šā ż’’’ £ZI 'z% ś7$A(T?'  ż’’’ £Z;Anhang: Beschreibung des Moduls Frames  DEFINITION Frames; (* 27.9.91 *) IMPORT Fonts, Display, Texts; CONST black = 0; white = 15; invert = 255; mm = 36000; TYPE GraphicPort = POINTER TO GraphicPortDesc; GraphicPortDesc = RECORD unit-: LONGINT; X-, Y-, W-, H-: INTEGER; PROCEDURE (P: GraphicPort) Block (X, Y, W, H, col, X0, Y0: INTEGER); PROCEDURE (P: GraphicPort) Char (X, Y, col: INTEGER; font: Fonts.Font; ch: CHAR); PROCEDURE (P: GraphicPort) Dot (X, Y, col: INTEGER); PROCEDURE (P: GraphicPort) HairEllipse (X, Y, A, B, col: INTEGER); PROCEDURE (P: GraphicPort) HairLine (X1, Y1, X2, Y2, col: INTEGER); PROCEDURE (P: GraphicPort) MoveBlock (X, Y, W, H, dX, dY: INTEGER); PROCEDURE (P: GraphicPort) Open (X, Y, W, H: INTEGER); PROCEDURE (P: GraphicPort) String (X, Y, col: INTEGER; font: Fonts.Font; VAR s: ARRAY OF CHAR); END ; DisplayPort = POINTER TO DisplayPortDesc; DisplayPortDesc = RECORD (GraphicPortDesc) END ; ColorPort = POINTER TO ColorPortDesc; ColorPortDesc = RECORD (GraphicPortDesc) END ; PrinterPort = POINTER TO PrinterPortDesc; PrinterPortDesc = RECORD (GraphicPortDesc) END ; Frame = POINTER TO FrameDesc; FrameDesc = RECORD (Display.FrameDesc) PROCEDURE (F: Frame) Consume (ch: CHAR; fnt: Fonts.Font; col, voff: SHORTINT); PROCEDURE (F: Frame) Copy (): Frame; PROCEDURE (F: Frame) CopyOver (text: Texts.Text; beg, end: LONGINT); PROCEDURE (F: Frame) Defocus; PROCEDURE (F: Frame) GetSelection (VAR text: Texts.Text; VAR beg, end, time: LONGINT); PROCEDURE (F: Frame) Handle (VAR msg: Display.FrameMsg); PROCEDURE (F: Frame) Modify (Y, H: INTEGER); PROCEDURE (F: Frame) Neutralize; PROCEDURE (F: Frame) TrackMouse (VAR X, Y: INTEGER; VAR keySum: SET); END ; GraphicFrame = POINTER TO GraphicFrameDesc; GraphicFrameDesc = RECORD (FrameDesc) port-: GraphicPort; X0-, Y0-: INTEGER; scale-: LONGINT; PROCEDURE (F: GraphicFrame) Block (x, y, w, h: LONGINT; col: INTEGER); PROCEDURE (F: GraphicFrame) Char (x, y: LONGINT; col: INTEGER; font: Fonts.Font; ch: CHAR); PROCEDURE (F: GraphicFrame) Copy (): Frame; PROCEDURE (F: GraphicFrame) Dot (x, y: LONGINT; col: INTEGER); PROCEDURE (F: GraphicFrame) Ellipse (x, y, a, b, d: LONGINT; col: INTEGER); PROCEDURE (F: GraphicFrame) Line (x1, y1, x2, y2, d: LONGINT; col: INTEGER); PROCEDURE (F: GraphicFrame) Modify (Y, H: INTEGER); PROCEDURE (F: GraphicFrame) MoveOrigin (dX, dY: INTEGER); PROCEDURE (F: GraphicFrame) Open (handle: Display.Handler; port: GraphicPort; X0, Y0: INTEGER; scale: LONGINT); PROCEDURE (F: GraphicFrame) Place (handle: Display.Handler; port: GraphicPort; x0, y0, scale: LONGINT); PROCEDURE (F: GraphicFrame) Quadrangle (x1, y1, x2, y2, x3, y3, x4, y4: LONGINT; col: INTEGER); PROCEDURE (F: GraphicFrame) Rect (x, y, w, h, d: LONGINT; col: INTEGER); PROCEDURE (F: GraphicFrame) Restore (X, Y, W, H: INTEGER); PROCEDURE (F: GraphicFrame) String (x, y: LONGINT; col: INTEGER; font: Fonts.Font; VAR s: ARRAY OF CHAR); PROCEDURE (F: GraphicFrame) ToGlobal (X, Y: INTEGER; VAR x, y: LONGINT); PROCEDURE (F: GraphicFrame) ToLocal (x, y: LONGINT; VAR X, Y: INTEGER); PROCEDURE (F: GraphicFrame) TrackMouse (VAR X, Y: INTEGER; VAR keySum: SET); END ; VAR DisplayUnit-: LONGINT; PrinterUnit-: LONGINT; PROCEDURE Handle (F: Display.Frame; VAR msg: Display.FrameMsg); PROCEDURE NewColor (col, patNo: INTEGER): INTEGER; PROCEDURE NewPort (X: INTEGER): GraphicPort; END Frames.  Konvention: Variablen die mit einem Grossbuchstaben beginnen, bezeichnen Device-Koordinaten. Variablen die mit einem Kleinbuchstaben beginnen, bezeichnen Weltkoordinaten. Konstanten: black white invert Basis-Farben, k„nnen …berall als Farb-Attribute angegeben werden. Texturen (Patterns) k„nnen durch ‚berlagerung mit NewColor erreicht werden. invert bewirkt, dass die zum aktuellen Untergrung komplementƒre Farbe gewƒhlt wird. mm Units pro mm. Gr„ssenangaben k„nnen in Vielfachen von mm gemacht werden. Variablen: DisplayUnit PrinterUnit Units pro Display-Pixel resp. Printer-Dot. Gr„ssenangaben k„nnen in Vielfachen von diesen Werten gemacht werden. Typen: GraphicPort Abstrakte Port-Klasse. Implementierungen sind DisplayPort, ColorPort und PrinterPort. Alle untenstehenden Zeichenmethoden werden am Clipping-Rechteck (X, Y, W, H) geklippt. Diese Werte liegen immer innerhalb des Device-Koordinatenraumes. unit Units pro Device-Pixel. Erst definiert nach ffnen des Ports (Open). X Y W H Clipping-Rechteck. Erst definiert nach ffnen des Ports (Open). Das Clipping-Rechteck ist immer innerhalb der (physischen) Koordinatenraumes des Devices. Block (X, Y, W, H, col, X0, Y0: INTEGER) Zeichnet ein mit col gef…lltes Rechteck der Ausdehnung (X, Y, W, H). Besitzt die Farbe col eine Textur (siehe NewColor), so ist (X0, Y0), der Fixpunkt der Textur. Char (X, Y, col: INTEGER; font: Fonts.Font; ch: CHAR) Zeichnet ein Zeichen ch an der Stelle (X, Y) mit Schrifttyp font und Farbe col. Farbtexturen werden ignoriert. Dot (X, Y, col: INTEGER) Zeichnet einen Punkt (genau ein Pixel) an der Stelle (X, Y) mit Farbe col. Farbtexturen werden ignoriert. HairEllipse (X, Y, A, B, col: INTEGER) Zeichnet eine Ellipse mit Mittelpunkt in (X, Y) und Halbachsen A und B mit Farbe col und einem Pixel Dicke. Der Durchmesser betrƒgt 2*A resp. 2*B. Farbtexturen werden ignoriert. HairLine (X1, Y1, X2, Y2, col: INTEGER) Zeichnet eine Linie von (X1, Y1) nach (X2, Y2) inklusive mit Farbe col und einem Pixel Dicke. Farbtexturen werden ignoriert. MoveBlock (X, Y, W, H, dX, dY: INTEGER) Kopiert den Inhalt des Rechteckes (X, Y, W, H) in das Rechteck (X+dX, Y+dY, W, H). Open (X, Y, W, H: INTEGER) Er„ffnet den Port mit Clipping-Rechteck (X, Y, W, H). Das Clipping-Rechteck wird gegebenenfalls so korrigiert, dass es immer innerhalb der (physischen) Koordinatenraumes des Devices liegt. String (X, Y, col: INTEGER; font: Fonts.Font; VAR s: ARRAY OF CHAR) Zeichnet den String s an der Stelle (X, Y) mit Schrifttyp font und Farbe col. Farbtexturen werden ignoriert. DisplayPort Device-Treiber f…r Standard Oberon Display. Enthƒlt Background-Display. ColorPort Device-Treiber f…r Standard Oberon Color-Display. Ohne Background-Display. PrinterPort Device-Treiber f…r Standard Oberon Printer. Einschrƒnkung: MoveBlock ist nicht implementiert. Frame Abstrakte Frame-Klasse f…r Standard Oberon Frames. Die Standard Oberon Messages werden mittels des Frame-Handlers handle in Methodenaufrufe …bersetzt. X Y W H Ausdehnung des Frames. Geerbt von Display.Frame. handle Frame-Handler. Geerbt von Display.Frame. Consume (ch: CHAR; fnt: Fonts.Font; col, voff: SHORTINT) Frame empfƒngt ein Zeichen ch mit Schrifttyp fnt, Farbe col und vertikalem Offset voff. Wird vom System aufgerufen. Copy (): Frame Erzeugt eine identische Kopie des Frames. Wird vom System aufgerufen. Muss immer …berschrieben werden. CopyOver (text: Texts.Text; beg, end: LONGINT) Frame empfƒngt ein Text-Intervall [beg, end[ aus dem Text text (…blicherweise um es an der Caret-Position einzuf…gen). Wird von anderen Applikationen aufgerufen. Defocus Im folgenden empfƒngt der Frame keine weiteren Zeichen mehr und hat deshalb ev. Carets oder andere Markierungen zu entfernen. GetSelection (VAR text: Texts.Text; VAR beg, end, time: LONGINT) Falls der Frame ein selektiertes Text-Intervall [beg, end[ im Text text besitzt, dessen Selektion j…nger ist als time, so wird sie zur…ckgegeben. Der Selektions-Timestamp wird mit Oberon.Time gemessen. Handle (VAR msg: Display.FrameMsg) Wird aufgerufen, falls (unverstandene) Oberon-Messages msg ankommen. Modify (Y, H: INTEGER) Wird aufgerufen, falls sich die Ausdehnung Y und H des Frames ƒndert. Die alten Werte sind in den Instanzvariablen Y und H zu finden. Neutralize Wird aufgerufen, falls die Taste ESCape gedr…ckt wurde. Verlangt, dass sƒmtliche Markierungen des Frames, wie Markers, Carets und Selektionen entfernt werden. TrackMouse (VAR X, Y: INTEGER; VAR keySum: SET) Wird aufgerufen, falls sich die Maus innerhalb des Frames an die Stelle (X, Y) bewegt hat, oder Maustasten keySum gedr…ckt wurden. Die letzten Koordinaten sowie die Summe aller gedr…ckten Maus-Kn„pfe werden zur…ckgegeben. GraphicFrame Konkrete Frame-Klasse: Erlaubt Darstellungen von Graphiken innerhalb eines universellen Koordinatensystems (globale Koordinaten). ‚bernimmt Koordinaten-Transformation in die Device-Koordinaten des aktuellen Ports port (lokale Koordinaten). F…hrt dabei eine Skalierung scale durch. port Sƒmtliche Graphik-Operationen werden auf Operationen dieses Ports zur…ckgef…hrt. X0 Y0 Bezeichnet Ursprung des globalen Koordinatensystem (Welt-Koordinaten) relativ zur linken oberen Ecke (X, Y+H) des Frames in Device-Koordinaten (d.h. abhƒngig vom Port). Der Ursprung liegt also bei (X+X0, Y+H+Y0). scale Aktueller Scaling-Factor: scale > 0: Vergr„sserung um den Factor scale scale < 0: Verkleinerung um den Factor -scale Block (x, y, w, h: LONGINT; col: INTEGER) Zeichnet ein mit col gef…lltes Rechteck der Ausdehnung (x, y, w, h). Char (x, y: LONGINT; col: INTEGER; font: Fonts.Font; ch: CHAR) Zeichnet ein Zeichen ch an der Stelle (x, y) mit Schrifttyp font und Farbe col. Falls scale < 0 wird nichts gezeichnet. Zeichen werden weder verkleinert noch vergr„ssert. Copy (): Frame Erzeugt eine identische Kopie des Frames. Wird vom System aufgerufen. Muss immer …berschrieben werden. Dot (x, y: LONGINT; col: INTEGER) Zeichnet einen Punkt (genau ein Pixel) an der Stelle (x, y) mit Farbe col. Ellipse (x, y, a, b, d: LONGINT; col: INTEGER) Zeichnet eine Ellipse mit Mittelpunkt in (x, y) und Halbachsen a und b und Dicke d mit Farbe col. Der ƒussere Durchmesser betrƒgt 2*a resp. 2*b, der innere 2*(a-d) resp. 2*(b-d). Ist d > a oder d > b, so wird die Ellipse gef…llt. Ist d = 0 so wird die d…nnst-m„gliche Ellipse auf dem aktuellen Port gezeichnet (Hair-Ellipse). Line (x1, y1, x2, y2, d: LONGINT; col: INTEGER) Zeichnet eine Linie von (x1, y1) nach (x2, y2) und Dicke d mit Farbe col. Ist d = 0 so wird die d…nnst-m„gliche Linie auf dem aktuellen Port gezeichnet (Hair-Line). Modify (Y, H: INTEGER) Wird aufgerufen, falls sich die Ausdehnung Y und H des Frames ƒndert. Verschiebt automatisch den Frame-Inhalt und ruft Restore auf, um ev. neue Teile zu restaurieren. MoveOrigin (dX, dY: INTEGER) Verschiebt den Weltkoordinaten-Ursprung um (dX, dY) (in Device-Koordinaten). Verschiebt automatisch den Frame-Inhalt und ruft Restore auf, um ev. neue Teile zu restaurieren. Open (handle: Display.Handler; port: GraphicPort; X0, Y0: INTEGER; scale: LONGINT); ffnet den Frame mit Handler handle und setzt den Port port. Der Weltkoordinaten-Ursprung liegt bei (X0, Y0) relativ zur linken, oberen Ecke des Frames und scale wird gesetzt. Die Frame-Ausdehnung muss noch nicht bekannt sein. port darf NIL sein, wenn der Frame auf das Standard-Oberon Display aufgesetzt wird. Place (handle: Display.Handler; port: GraphicPort; x0, y0, scale: LONGINT) ffnet den Frame mit Handler handle und setzt den Port port. Der Weltkoordinaten-Ursprung wird so gesetzt, dass der Punkt (x0, y0) bei Zooming um scale in die linke, obere Ecke des Frames zu liegen kommt. Der Frame wird zu diesem Zweck genau auf die Gr„sse des Ports port gesetzt. port darf nicht NIL sein. Quadrangle (x1, y1, x2, y2, x3, y3, x4, y4: LONGINT; col: INTEGER) Zeichnet ein gef…lltes Viereck mit Eckpunkten in (x1, y1), (x2, y2), (x3, y3) und (x4, y4). Rect (x, y, w, h, d: LONGINT; col: INTEGER) Zeichnet ein Rechteck mit Ausdehnung (x, y, w, h) und Dicke d mit Farbe col. Ist 2*d > w oder 2*d > h so wird das Rechteck gef…llt. Ist d = 0 so wird das d…nnst-m„gliche Rechteck auf dem aktuellen Port gezeichnet (Hair-Rectangle). Restore (X, Y, W, H: INTEGER) Wird aufgerufen, falls der rechteckige Bereich (X, Y, W, H) neu gezeichnet werden muss. Standard-Verhalten: Entfernt alle Marks innerhalb des Rechtecks (X, Y, W, H), „ffnet den Port port an derselben Stelle und l„scht den Bereich mit black. String (x, y: LONGINT; col: INTEGER; font: Fonts.Font; VAR s: ARRAY OF CHAR) Zeichnet einen String s an der Stelle (x, y) mit Schrifttyp font und Farbe col. Falls scale < 0 wird nichts gezeichnet. Zeichen werden weder verkleinert noch vergr„ssert. ToGlobal (X, Y: INTEGER; VAR x, y: LONGINT) Berechnet aus Device-Koordinaten (X, Y) Weltkoordinaten (x, y). Die Umrechnung ist abhƒngig von aktuellem Device port, dem Weltkoordinaten-Ursprung (X0, Y0) und dem Zoom-Factor scale. ToLocal (x, y: LONGINT; VAR X, Y: INTEGER) Berechnet aus Weltkoordinaten (x, y) Device-Koordinaten (X, Y). Die Umrechnung ist abhƒngig von aktuellem Device port, dem Weltkoordinaten-Ursprung (X0, Y0) und dem Zoom-Factor scale. TrackMouse (VAR X, Y: INTEGER; VAR keySum: SET) Wird aufgerufen, falls sich die Maus innerhalb des Frames an die Stelle (X, Y) bewegt hat, oder Maustasten keySum gedr…ckt wurden. Standardverhalten: MausTracking bis keine Maus-Taste mehr gedr…ckt wird. Die letzten Koordinaten sowie die Summe aller gedr…ckten Maus-Kn„pfe werden zur…ckgegeben. Prozeduren: Handle (F: Display.Frame; VAR msg: Display.FrameMsg) Standard-Handler f…r Display-Frames. Ubersetzt Oberon-Messages in entsprechende Frame Methoden-Aufrufe. NewColor (col, patNo: INTEGER): INTEGER ‚berlagert einer Farbe col (ev. mit Textur) eine neue Textur (Pattern) patNo und gibt die Farbe zur…ck. Ist das Pattern nicht definiert, wird col zur…ckgegeben. NewPort (X: INTEGER): GraphicPort Bestimmt den an der Stelle X liegenden GraphikPort-Typ (Display- oder ColorPort). Kann verwendet werden, um einem Frame unabhƒngig von der Position (Schwarz-weiss oder Farb-Schirm) den richtigen Port zuzuweisen.  Anwendungsbeispiele: ‚berschreiben eines GraphicFrames: minimal zu …berschreibende Methoden: TYPE Frame = POINTER TO FrameDesc; FrameDesc = RECORD (Frames.FrameDesc); myModel: myData END; PROCEDURE (F: Frame) Copy (): Frames.Frame; VAR CopyOfF: Frame; BEGIN NEW(CopyOfF); CopyOfF.Open(F.handle, Frames.NewPort(F.X), F.X0, F.Y0, F.scale); (* geerbte Daten kopieren *) CopyOfF.myModel := F.myModel; (* neue Daten kopieren *) RETURN CopyOfF END Copy; PROCEDURE (F: Frame) Restore (X, Y, W, H: INTEGER); BEGIN F.Restore^(X, Y, W, H); (* Port aufsetzen und Untergrund l„schen *) (* F.MyModel zeichnen *) END Restore; Falls Editing notwendig ist: PROCEDURE (F: Frame) TrackMouse (VAR X, Y: INTEGER; VAR keySum: SET); VAR keys: SET; BEGIN IF ML in keySum THEN REPEAT Input.Mouse(keys, X, Y); keySum := keySum+keys; Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, X, Y); (* Mouse-Info verarbeiten *) UNTIL keys = {} ELSIF MM IN keySum THEN (* ... *) ELSIF MR IN keySum THEN (* ... *) ELSE F.TrackMouse^(X, Y, keySum) END END TrackMouse; ffnen eines neuen Frames: VAR F: Frame; BEGIN NEW(F); (* Bei Bedarf Frame-Koordinaten festlegen; wird normalerweise vom Viewer-System gemacht *) F.Open(Frames.Handle, Frames.NewPort(F.X), 0, 0, 1); (* Ursprung links oben, keine Vergr„sserung *) ...