home *** CD-ROM | disk | FTP | other *** search
Modula Definition | 1993-10-23 | 12.7 KB | 329 lines |
- DEFINITION MODULE WindowBase; (* Hans Endl 25. 09. 1986 *)
- (* 02. 06. 1987 *)
- (* 01. 10. 1987 *)
-
- FROM SYSTEM IMPORT ADDRESS;
- FROM GEMVDIbase IMPORT PxyArrayType;
-
-
- (* Dieses Modul stellt eine Zwischenschicht zur Fensterprogrammierung
- zur Verfügung, die etwas komfortablere Funktionen als die reinen
- AES-Aufrufe enthält, aber nicht so sehr einschränkt wie die auf
- MEDOS basierenden Moduln "Windows", "TextWindows" und "Graphic-
- "Windows".
-
- Wichtige Bestandteile von "WindowBase" sind
-
- - die Struktur "windowtype", die die unter AES am häufigsten
- benötigten Fensterdaten enthält
-
- - Prozeduren zum Setzen der Schieber
-
- - die automatische Abarbeitung der Rechteckliste bei Redraw-
- Aufrufen
- *)
-
-
-
- CONST
- maxwindow = 12; (* 7 Fenster in GEM-AES möglich + 5 für Debugger *)
- deskhandle = 0;
-
- TYPE
-
- window = INTEGER;
-
- (* Aus Gründen der Kompatibilität zu AES und MEDOS wird zur Iden-
- tifikation eines Fensters nicht ein Zeiger auf den unten defi-
- nierten Window-Record benutzt, sondern eine Integer-Zahl, die
- mit dem AES-Window-Handle identisch ist und als Index eines
- Feldes von Window-Records fungiert.
- *)
-
-
- rectangle = RECORD
- x: INTEGER; (* x-Koordinate der linken oberen Ecke *)
- y: INTEGER; (* y-Koordinate der linken oberen Ecke *)
- w: INTEGER; (* Breite *)
- h: INTEGER (* Höhe *)
- END;
-
- (* Definition eines Rechtecks in AES-spezifischer Form mit linker
- oberer Ecke und Breite und Höhe in Pixeln, im Gegensatz zu der
- vom VDI meist benutzten Form des PxyArrays, das durch zwei dia-
- gonal gegenüberliegende Ecken definiert wird.
- *)
-
- RedrawProcType = PROCEDURE (window, rectangle);
-
- WindowElement = (Title, CloseButton, FullButton, Moveable,
- InfoLine, SizeButton, UpArrow, DownArrow,
- VertSlider, LeftArrow, RightArrow, HorizSlider);
-
- WindowElements = SET OF WindowElement;
-
-
- CONST
- AllElements = WindowElements {Title..HorizSlider};
- NoElements = WindowElements{};
-
-
- TYPE
-
- wstring = ARRAY [0..79] OF CHAR; (* String für Titel und Info *)
-
- windowtype = RECORD
- handle: INTEGER; (* AES-Fensternummer *)
- max: rectangle; (* Maximale Fenstergröße *)
- total: rectangle; (* Aussenmasse des Fensters *)
- work: rectangle; (* Innenmasse des Fensters *)
- elements: WindowElements; (* Menge der Fensterelemente*)
- fulled: BOOLEAN; (* Fenster auf max gesetzt *)
- opened: BOOLEAN; (* Fenster geöffnet *)
- ontop: BOOLEAN; (* TRUE, falls oberstes F. *)
- text: BOOLEAN; (* TRUE, falls Textfenster *)
- row, col: INTEGER; (* Zeile und Spalte bei Text*)
- maxrow: INTEGER; (* letzte sichtbare Zeile *)
- maxcol: INTEGER; (* letzte sichtbare Spalte *)
- colour: INTEGER; (* Hintergrundfarbe *)
- style: INTEGER; (* Fülltyp für Hintergrund *)
- textcolour: INTEGER; (* Farbe des Textes *)
- redrawproc: RedrawProcType; (* Redraw-Procedure *)
- title: wstring; (* Titelzeile *)
- info: wstring; (* Informationszeile *)
- reference: ADDRESS; (* frei für Anwender *)
- END;
-
- windowptr = POINTER TO windowtype;
-
-
-
- VAR
- windowlist: ARRAY [0..maxwindow] OF windowtype;
- handlelist: ARRAY [0..7] OF window;
-
- growbox: BOOLEAN; (* Wenn diese Variable auf TRUE gesetzt ist,
- wachsen bzw. schrumpfen die Fenster beim
- Öffnen bzw. Schliessen, default = TRUE *)
-
-
-
-
- PROCEDURE createWindow (VAR u: window;
- x, y, w, h: INTEGER;
- parts: WindowElements;
- title: ARRAY OF CHAR;
- textwindow: BOOLEAN;
- rdp: RedrawProcType);
-
- (* Erzeugt die im AES und in diesem Modul notwendigen Datenstrukturen
- zur Verwaltung eines Fensters, das jedoch noch nicht gezeichnet
- wird.
-
- x, y, w und h beschreiben die maximale Grösse des äusseren Fenster-
- randes. Sind w und h gleich 0, so wird die Grösse des Desktops
- ohne Menüleiste übernommen.
-
- "parts" ist ein Set aus den gewünschten Fensterelementen.
-
- "title" ist der Fenstertitel.
-
- "textwindow" soll bei Textfenstern auf TRUE gesetzt werden,
- der Fensterursprung wird dann an das Textraster angepaßt.
-
- "rdp" ist die Redraw-Prozedur, also die Prozedur, die den Inhalt
- des Fensters zeichnet. Sie wird beim Aufruf der Prozedur "DoRedraw"
- (siehe unten) so oft aufgerufen wird, bis die Rechteckliste, die
- die sichtbaren Teile des Fensters angibt, abgearbeitet worden ist.
- An "rdp" wird beim Aufruf ein Rechteck übergeben, das die neu
- zu zeichnende Fläche angibt. Wurde beim Aufruf von "DoRedraw"
- der Paramter "clip" auf FALSE gesetzt, muss "rdp" alle Ausgaben
- selbst auf diese Fläche begrenzen, was die Ausgabe vor allem bei
- Text stark beschleunigen kann, aber bei teilweise verdeckten Fen-
- stern kaum durchführbar ist. Beim Zeichnen von Objektbäumen wird
- das Begrenzungsrechteck direkt beim "ObjectDraw"-Aufruf angegeben.
- *)
-
- PROCEDURE activate (u: window);
-
- (* aktiviert ein deaktiviertes Fenster wieder *)
-
- PROCEDURE deactivate (u: window);
-
- (* Deaktiviert ein Fenster, indem ein AES.WindowDelete durchgeführt
- wird. Das Fenster existiert dann für GEM-AES nicht mehr, der Fen-
- sterdeskriptor wird jedoch nicht freigegeben, so daß das Fenster
- später mit "activate" mit den alten Parametern wieder aktiviert
- werden kann. Dadurch können mehr als die sieben von GEM-AES zuge-
- lassenen Fenster verwaltet werden, es können jedoch immer nur
- maximal sieben aktiv sein. *)
-
- PROCEDURE clearWindow (u: window);
-
- PROCEDURE closeWindow (u: window);
-
- PROCEDURE deleteWindow (u: window);
-
- PROCEDURE fullWindow (u: window);
-
- PROCEDURE openWindow (u: window; x, y, w, h: INTEGER);
-
- PROCEDURE setWindow (u: window; x, y, w, h: INTEGER);
-
- PROCEDURE topWindow (u: window);
-
- PROCEDURE MouseOn;
-
- PROCEDURE MouseOff;
-
- (* Vor Ausgaben auf den Bildschirm muss die Maus ausgeschaltet werden,
- da sonst das Maussymbol überschrieben wird und bei der nächsten
- Bewegung der Maus der alte, zuvor von der Maus verdeckte Bildschirm-
- inhalt wieder restauriert wird. Alle Prozeduren in diesem Modul, die
- den Bildschirm verändern, schalten die Maus während der Ausgabe aus.
- Während des Aufrufs der vom Benutzer bereitgestellten Redraw-Prozedur
- beim Abarbeiten der Rechteckliste in "DoRedraw" wird die Maus eben-
- falls ausgeschaltet, ruft der Benutzer dagegen selbst seine Redraw-
- Prozedur auf oder benutzt er die weiter unten beschriebenen Textaus-
- gabeprozeduren, muss er sich selbst um die Maus kümmern.
-
- Achtung: Ein- und Ausschalten der Maus wird vom Betriebssystem
- mitgezählt. Wird die Maus mehrmals ausgeschaltet, muß
- sie genausooft wieder eingeschaltet werden, damit sie
- sichtbar wird. Wird die Maus zu oft eingeschaltet, dann
- entstehen beim Bewegen von Fenstern und Schiebern Schmutz-
- effekte.
- *)
-
-
- PROCEDURE SetHorSlider (u: window; wpos, wsize, total: INTEGER);
-
- (* siehe "SetVertSlider", setzt den horizontalen Schieber entsprechend
- der horizontalen Position des Fensters im Gesamtdokument.
- *)
-
- PROCEDURE SetInfo (u: window; s: ARRAY OF CHAR);
-
- (* Schreibt einen Text in die Info-Zeile des Fensters *)
-
-
- PROCEDURE SetTitle (u: window; s: ARRAY OF CHAR);
-
- (* Schreibt einen Text in die Titel-Zeile des Fensters. Der Text
- bleibt beim Schliessen erhalten und wird beim Öffnen wieder
- angezeigt
- *)
-
- PROCEDURE SetVertSlider (u: window; wpos, wsize, total: INTEGER);
-
- (* Berechnet die korrekte Position und -grösse des vertikalen
- Schiebers aus den Parametern, die die vertikale Position des
- Fensters im Gesamtdokument beschreiben, und setzt den Schieber.
- Die Schieber müssen, falls vorhanden, nach jeder Veränderung
- der Fenstergrösse oder des Fensterinhalts neu gesetzt werden.
-
- Bedeutung der Parameter:
-
- wpos: Anfangsposition des Fensters im Gesamtdokument
- wsize: Grösse des im Fenster dargestellten Teils des Gesamtdokuments
- total: Grösse des Gesamtdokuments
- *)
-
- PROCEDURE clearrect (u: window; rect: rectangle);
-
- (* Löscht einen Rechteckbereich innerhalb des Fensters "u" in
- Fensterkoordinaten *)
-
-
- PROCEDURE copyrect (u: window; source, dest: rectangle);
-
- (* Kopiert innerhalb eines Fensters den Rechteckbereich "source" in
- den Rechteckbereich "dest" (Koordinaten relativ zum Fensterursprung
- links oben). Der freiwerdende Bereich von "source" muss bei Bedarf
- gelöscht werden. Mit dieser Prozedur lassen sich Scroll-,
- Insert- und Deletefunktionen in Textfenstern realisieren *)
-
-
- PROCEDURE scrollup (u: window);
-
- (* Schiebt den Inhalt eines Textfensters eine Zeile nach oben, die
- oberste Zeile verschwindet, die unterste wird gelöscht. "row"
- wird auf "maxrow", "col" auf 0 gesetzt *)
-
-
- PROCEDURE scrolldown (u: window);
-
- (* Schiebt den Inhalt eines Textfenster eine Zeile nach unten, die
- unterste Zeile verschwindet, die oberste wird gelöscht. "row"
- und "col" werden auf 0 gesetzt *)
-
-
- PROCEDURE DrawCursor (u: window; row, col: INTEGER);
-
- (* Zeichnet ein Rechteck in der Grösse eines Zeichenfeldes an die
- angegebene Stelle innerhalb des Fensters. Da alle Pixel inver-
- tiert werden, nimmt ein zweiter Aufruf mit denselben Parametern
- den Cursor wieder weg. *)
-
-
- PROCEDURE WriteStr (u: window; row, col: INTEGER; s: ARRAY OF CHAR);
-
- (* Gibt einen String ab der durch "row" (Zeile) und "col" (Spalte)
- angegebenen Stelle aus. Zeile und Spalte beziehen sich auf den
- Arbeitsbereich des Fensters. Das Zeichen in der linken oberen
- Ecke hat die Koordinaten (0,0). *)
-
-
- PROCEDURE WriteTextBlock (u: window; row, col: INTEGER;
- adr: ADDRESS; count: INTEGER);
-
- (* Wie "WriteStr", nur wird der auszugebende String durch die Adresse
- des ersten Zeichens und die Länge angegeben
- *)
-
- PROCEDURE WriteTextBuffer (u: window; adr: ADDRESS;
- count, offset: INTEGER);
-
- (* Gibt den ab der Adresse "adr" liegenden Text ins Fenster "u" ab
- der Position (0,0) aus, bis entweder 0C im Text auftritt, "count"
- erreicht wird oder das Fenster voll ist. Als Zeilenende wird lf
- erkannt, cr wird ignoriert. Falls "offset" > 0, werden die ersten
- "offset" Zeichen in jeder Zeile übersprungen, so dass sich hori-
- zontale Fensterverschiebungen realisieren lassen. Diese Prozedur
- eignet sich gut für das Redrawing von Textfensterpuffern.
- *)
-
-
- PROCEDURE RectToPxy (VAR rect: rectangle; VAR pxy: PxyArrayType);
-
- (* Wandelt die Koordinaten eines Rechtecks von der "rectangle"-Form
- "PxyArray"-Form um (siehe obige Definition)
- *)
-
-
- PROCEDURE DoRedraw (u: window; x, y, w, h: INTEGER; clip: BOOLEAN);
-
- (* Holt sich von AES die Rechteckliste des Fensters w, schneidet die
- erhaltenen Rechtecke mit dem Desktop und der als Parameter über-
- gebenen Fläche und führt dann die erforderliche Anzahl von Auf-
- rufen der Redraw-Prozedur, die beim Create-Aufruf angegeben wurde,
- aus. "DoRedraw" ist somit die Aktion auf eine Redraw-Message. Mit
- "clip" kann angegeben werden, ob "DoRedraw" selbst den Clipping-
- Aufruf für VDI-Funktionen durchführen soll. In jedem Fall wird
- während des Ablaufs von "DoRedraw" das Window-Update-Flag gesetzt
- und die Maus ausgeschaltet.
- *)
-
-
- PROCEDURE wd (handle: INTEGER): window;
-
- (* Findet anhand der AES-Fenster-Handle den zugehörigen Fenster-
- deskriptor. Wird benötigt, wenn vom AES Ereignismeldung kommen,
- die ein Fenster betreffen.
- *)
-
-
- PROCEDURE wp (u: window): windowptr;
-
- END WindowBase.
-