home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / language / modula / windowba.def < prev    next >
Encoding:
Modula Definition  |  1993-10-23  |  12.7 KB  |  329 lines

  1. DEFINITION MODULE WindowBase;           (* Hans Endl  25. 09. 1986 *)
  2.                                         (*            02. 06. 1987 *)
  3.                                         (*            01. 10. 1987 *)
  4.  
  5. FROM SYSTEM     IMPORT ADDRESS;
  6. FROM GEMVDIbase IMPORT PxyArrayType;
  7.  
  8.  
  9. (*   Dieses Modul stellt eine Zwischenschicht zur Fensterprogrammierung
  10.      zur Verfügung, die etwas komfortablere Funktionen als die reinen
  11.      AES-Aufrufe enthält, aber nicht so sehr einschränkt wie die auf
  12.      MEDOS basierenden Moduln "Windows", "TextWindows" und "Graphic-
  13.      "Windows".
  14.  
  15.      Wichtige Bestandteile von "WindowBase" sind
  16.  
  17.      - die Struktur "windowtype", die die unter AES am häufigsten
  18.        benötigten Fensterdaten enthält
  19.  
  20.      - Prozeduren zum Setzen der Schieber
  21.  
  22.      - die automatische Abarbeitung der Rechteckliste bei Redraw-
  23.        Aufrufen
  24. *)
  25.  
  26.  
  27.  
  28. CONST
  29.   maxwindow  = 12;       (* 7 Fenster in GEM-AES möglich + 5 für Debugger *)
  30.   deskhandle = 0;
  31.  
  32. TYPE
  33.  
  34.   window         = INTEGER;
  35.  
  36.   (* Aus Gründen der Kompatibilität zu AES und MEDOS wird zur Iden-
  37.      tifikation eines Fensters nicht ein Zeiger auf den unten defi-
  38.      nierten Window-Record benutzt, sondern eine Integer-Zahl, die
  39.      mit dem AES-Window-Handle identisch ist und als Index eines
  40.      Feldes von Window-Records fungiert.
  41.   *)
  42.  
  43.  
  44.   rectangle      = RECORD
  45.                      x: INTEGER;  (* x-Koordinate der linken oberen Ecke *)
  46.                      y: INTEGER;  (* y-Koordinate der linken oberen Ecke *)
  47.                      w: INTEGER;  (* Breite *)
  48.                      h: INTEGER   (* Höhe   *)
  49.                    END;
  50.  
  51.   (* Definition eines Rechtecks in AES-spezifischer Form mit linker
  52.      oberer Ecke und Breite und Höhe in Pixeln, im Gegensatz zu der
  53.      vom VDI meist benutzten Form des PxyArrays, das durch zwei dia-
  54.      gonal gegenüberliegende Ecken definiert wird.
  55.   *)
  56.  
  57.   RedrawProcType = PROCEDURE (window, rectangle);
  58.  
  59.   WindowElement  = (Title, CloseButton, FullButton, Moveable,
  60.                     InfoLine, SizeButton, UpArrow, DownArrow,
  61.                     VertSlider, LeftArrow, RightArrow, HorizSlider);
  62.  
  63.   WindowElements = SET OF WindowElement;
  64.  
  65.  
  66. CONST
  67.   AllElements = WindowElements {Title..HorizSlider};
  68.   NoElements  = WindowElements{};
  69.  
  70.  
  71. TYPE
  72.  
  73.   wstring     = ARRAY [0..79] OF CHAR;  (* String für Titel und Info *)
  74.  
  75.   windowtype  = RECORD
  76.                   handle:     INTEGER;        (* AES-Fensternummer        *)
  77.                   max:        rectangle;      (* Maximale Fenstergröße    *)
  78.                   total:      rectangle;      (* Aussenmasse des Fensters *)
  79.                   work:       rectangle;      (* Innenmasse des Fensters  *)
  80.                   elements:   WindowElements; (* Menge der Fensterelemente*)
  81.                   fulled:     BOOLEAN;        (* Fenster auf max gesetzt  *)
  82.                   opened:     BOOLEAN;        (* Fenster geöffnet         *)
  83.                   ontop:      BOOLEAN;        (* TRUE, falls oberstes F.  *)
  84.                   text:       BOOLEAN;        (* TRUE, falls Textfenster  *)
  85.                   row, col:   INTEGER;        (* Zeile und Spalte bei Text*)
  86.                   maxrow:     INTEGER;        (* letzte sichtbare Zeile   *)
  87.                   maxcol:     INTEGER;        (* letzte sichtbare Spalte  *)
  88.                   colour:     INTEGER;        (* Hintergrundfarbe         *)
  89.                   style:      INTEGER;        (* Fülltyp für Hintergrund  *)
  90.                   textcolour: INTEGER;        (* Farbe des Textes         *)
  91.                   redrawproc: RedrawProcType; (* Redraw-Procedure         *)
  92.                   title:      wstring;        (* Titelzeile               *)
  93.                   info:       wstring;        (* Informationszeile        *)
  94.                   reference:  ADDRESS;        (* frei für Anwender        *)
  95.                 END;
  96.  
  97.   windowptr   = POINTER TO windowtype;
  98.  
  99.  
  100.  
  101. VAR
  102.   windowlist: ARRAY [0..maxwindow] OF windowtype;
  103.   handlelist: ARRAY [0..7] OF window;
  104.  
  105.   growbox:    BOOLEAN;    (* Wenn diese Variable auf TRUE gesetzt ist,
  106.                              wachsen bzw. schrumpfen die Fenster beim
  107.                              Öffnen bzw. Schliessen, default = TRUE *)
  108.  
  109.  
  110.  
  111.  
  112.   PROCEDURE createWindow (VAR u:      window;
  113.                           x, y, w, h: INTEGER;
  114.                           parts:      WindowElements;
  115.                           title:      ARRAY OF CHAR;
  116.                           textwindow: BOOLEAN;
  117.                           rdp:        RedrawProcType);
  118.  
  119.   (* Erzeugt die im AES und in diesem Modul notwendigen Datenstrukturen
  120.      zur Verwaltung eines Fensters, das jedoch noch nicht gezeichnet
  121.      wird.
  122.  
  123.      x, y, w und h beschreiben die maximale Grösse des äusseren Fenster-
  124.      randes. Sind w und h gleich 0, so wird die Grösse des Desktops
  125.      ohne Menüleiste übernommen.
  126.  
  127.      "parts" ist ein Set aus den gewünschten Fensterelementen.
  128.  
  129.      "title" ist der Fenstertitel.
  130.  
  131.      "textwindow" soll bei Textfenstern auf TRUE gesetzt werden,
  132.      der Fensterursprung wird dann an das Textraster angepaßt.
  133.  
  134.      "rdp" ist die Redraw-Prozedur, also die Prozedur, die den Inhalt
  135.      des Fensters zeichnet. Sie wird beim Aufruf der Prozedur "DoRedraw"
  136.      (siehe unten) so oft aufgerufen wird, bis die Rechteckliste, die
  137.      die sichtbaren Teile des Fensters angibt, abgearbeitet worden ist.
  138.      An "rdp" wird beim Aufruf ein Rechteck übergeben, das die neu
  139.      zu zeichnende Fläche angibt. Wurde beim Aufruf von "DoRedraw"
  140.      der Paramter "clip" auf FALSE gesetzt, muss "rdp" alle Ausgaben
  141.      selbst auf diese Fläche begrenzen, was die Ausgabe vor allem bei
  142.      Text stark beschleunigen kann, aber bei teilweise verdeckten Fen-
  143.      stern kaum durchführbar ist. Beim Zeichnen von Objektbäumen wird
  144.      das Begrenzungsrechteck direkt beim "ObjectDraw"-Aufruf angegeben.
  145.   *)
  146.  
  147.   PROCEDURE activate     (u: window);
  148.  
  149.   (* aktiviert ein deaktiviertes Fenster wieder *)
  150.  
  151.   PROCEDURE deactivate   (u: window);
  152.  
  153.   (* Deaktiviert ein Fenster, indem ein AES.WindowDelete durchgeführt
  154.      wird. Das Fenster existiert dann für GEM-AES nicht mehr, der Fen-
  155.      sterdeskriptor wird jedoch nicht freigegeben, so daß das Fenster
  156.      später mit "activate" mit den alten Parametern wieder aktiviert
  157.      werden kann. Dadurch können mehr als die sieben von GEM-AES zuge-
  158.      lassenen Fenster verwaltet werden, es können jedoch immer nur
  159.      maximal sieben aktiv sein. *)
  160.  
  161.   PROCEDURE clearWindow  (u: window);
  162.  
  163.   PROCEDURE closeWindow  (u: window);
  164.  
  165.   PROCEDURE deleteWindow (u: window);
  166.  
  167.   PROCEDURE fullWindow   (u: window);
  168.  
  169.   PROCEDURE openWindow   (u: window; x, y, w, h: INTEGER);
  170.  
  171.   PROCEDURE setWindow    (u: window; x, y, w, h: INTEGER);
  172.  
  173.   PROCEDURE topWindow    (u: window);
  174.  
  175.   PROCEDURE MouseOn;
  176.  
  177.   PROCEDURE MouseOff;
  178.  
  179.   (* Vor Ausgaben auf den Bildschirm muss die Maus ausgeschaltet werden,
  180.      da sonst das Maussymbol überschrieben wird und bei der nächsten
  181.      Bewegung der Maus der alte, zuvor von der Maus verdeckte Bildschirm-
  182.      inhalt wieder restauriert wird. Alle Prozeduren in diesem Modul, die
  183.      den Bildschirm verändern, schalten die Maus während der Ausgabe aus.
  184.      Während des Aufrufs der vom Benutzer bereitgestellten Redraw-Prozedur
  185.      beim Abarbeiten der Rechteckliste in "DoRedraw" wird die Maus eben-
  186.      falls ausgeschaltet, ruft der Benutzer dagegen selbst seine Redraw-
  187.      Prozedur auf oder benutzt er die weiter unten beschriebenen Textaus-
  188.      gabeprozeduren, muss er sich selbst um die Maus kümmern.
  189.  
  190.      Achtung:  Ein- und Ausschalten der Maus wird vom Betriebssystem
  191.                mitgezählt. Wird die Maus mehrmals ausgeschaltet, muß
  192.                sie genausooft wieder eingeschaltet werden, damit sie
  193.                sichtbar wird. Wird die Maus zu oft eingeschaltet, dann
  194.                entstehen beim Bewegen von Fenstern und Schiebern Schmutz-
  195.                effekte.
  196.   *)
  197.  
  198.  
  199.   PROCEDURE SetHorSlider (u: window; wpos, wsize, total: INTEGER);
  200.  
  201.   (* siehe "SetVertSlider", setzt den horizontalen Schieber entsprechend
  202.      der horizontalen Position des Fensters im Gesamtdokument.
  203.   *)
  204.  
  205.   PROCEDURE SetInfo      (u: window; s: ARRAY OF CHAR);
  206.  
  207.   (* Schreibt einen Text in die Info-Zeile des Fensters *)
  208.  
  209.  
  210.   PROCEDURE SetTitle     (u: window; s: ARRAY OF CHAR);
  211.  
  212.   (* Schreibt einen Text in die Titel-Zeile des Fensters. Der Text
  213.      bleibt beim Schliessen erhalten und wird beim Öffnen wieder
  214.      angezeigt
  215.    *)
  216.  
  217.   PROCEDURE SetVertSlider (u: window; wpos, wsize, total: INTEGER);
  218.  
  219.   (* Berechnet die korrekte Position und -grösse des vertikalen
  220.      Schiebers aus den Parametern, die die vertikale Position des
  221.      Fensters im Gesamtdokument beschreiben, und setzt den Schieber.
  222.      Die Schieber müssen, falls vorhanden, nach jeder Veränderung
  223.      der Fenstergrösse oder des Fensterinhalts neu gesetzt werden.
  224.  
  225.      Bedeutung der Parameter:
  226.  
  227.      wpos:   Anfangsposition des Fensters im Gesamtdokument
  228.      wsize:  Grösse des im Fenster dargestellten Teils des Gesamtdokuments
  229.      total:  Grösse des Gesamtdokuments
  230.   *)
  231.  
  232.   PROCEDURE clearrect (u: window; rect: rectangle);
  233.  
  234.   (* Löscht einen Rechteckbereich innerhalb des Fensters "u" in
  235.      Fensterkoordinaten *)
  236.  
  237.  
  238.   PROCEDURE copyrect (u: window; source, dest: rectangle);
  239.  
  240.   (* Kopiert innerhalb eines Fensters den Rechteckbereich "source" in
  241.      den Rechteckbereich "dest" (Koordinaten relativ zum Fensterursprung
  242.      links oben). Der freiwerdende Bereich von "source" muss bei Bedarf
  243.      gelöscht werden. Mit dieser Prozedur lassen sich Scroll-,
  244.      Insert- und Deletefunktionen in Textfenstern realisieren *)
  245.      
  246.  
  247.   PROCEDURE scrollup (u: window);
  248.  
  249.   (* Schiebt den Inhalt eines Textfensters eine Zeile nach oben, die
  250.      oberste Zeile verschwindet, die unterste wird gelöscht. "row"
  251.      wird auf "maxrow", "col" auf 0 gesetzt *)
  252.  
  253.  
  254.   PROCEDURE scrolldown (u: window);
  255.  
  256.   (* Schiebt den Inhalt eines Textfenster eine Zeile nach unten, die
  257.      unterste Zeile verschwindet, die oberste wird gelöscht. "row"
  258.      und "col" werden auf 0 gesetzt *)
  259.  
  260.  
  261.   PROCEDURE DrawCursor (u: window; row, col: INTEGER);
  262.  
  263.   (* Zeichnet ein Rechteck in der Grösse eines Zeichenfeldes an die
  264.      angegebene Stelle innerhalb des Fensters. Da alle Pixel inver-
  265.      tiert werden, nimmt ein zweiter Aufruf mit denselben Parametern
  266.      den Cursor wieder weg. *)
  267.  
  268.  
  269.   PROCEDURE WriteStr (u: window; row, col: INTEGER; s: ARRAY OF CHAR);
  270.  
  271.   (* Gibt einen String ab der durch "row" (Zeile) und "col" (Spalte)
  272.      angegebenen Stelle aus. Zeile und Spalte beziehen sich auf den
  273.      Arbeitsbereich des Fensters. Das Zeichen in der linken oberen
  274.      Ecke hat die Koordinaten (0,0).  *)
  275.  
  276.  
  277.   PROCEDURE WriteTextBlock (u: window; row, col: INTEGER;
  278.                             adr: ADDRESS; count: INTEGER);
  279.  
  280.   (* Wie "WriteStr", nur wird der auszugebende String durch die Adresse
  281.      des ersten Zeichens und die Länge angegeben
  282.   *)
  283.  
  284.   PROCEDURE WriteTextBuffer (u: window; adr: ADDRESS;
  285.                              count, offset: INTEGER);
  286.  
  287.   (* Gibt den ab der Adresse "adr" liegenden Text ins Fenster "u" ab
  288.      der Position (0,0) aus, bis entweder 0C im Text auftritt, "count"
  289.      erreicht wird oder das Fenster voll ist. Als Zeilenende wird lf
  290.      erkannt, cr wird ignoriert. Falls "offset" > 0, werden die ersten
  291.      "offset" Zeichen in jeder Zeile übersprungen, so dass sich hori-
  292.      zontale Fensterverschiebungen realisieren lassen. Diese Prozedur
  293.      eignet sich gut für das Redrawing von Textfensterpuffern.
  294.   *)
  295.  
  296.  
  297.   PROCEDURE RectToPxy (VAR rect: rectangle; VAR pxy: PxyArrayType);
  298.  
  299.   (* Wandelt die Koordinaten eines Rechtecks von der "rectangle"-Form
  300.      "PxyArray"-Form um (siehe obige Definition)
  301.   *)
  302.      
  303.  
  304.   PROCEDURE DoRedraw (u: window; x, y, w, h: INTEGER; clip: BOOLEAN);
  305.  
  306.   (* Holt sich von AES die Rechteckliste des Fensters w, schneidet die
  307.      erhaltenen Rechtecke mit dem Desktop und der als Parameter über-
  308.      gebenen Fläche und führt dann die erforderliche Anzahl von Auf-
  309.      rufen der Redraw-Prozedur, die beim Create-Aufruf angegeben wurde,
  310.      aus. "DoRedraw" ist somit die Aktion auf eine Redraw-Message. Mit
  311.      "clip" kann angegeben werden, ob "DoRedraw" selbst den Clipping-
  312.      Aufruf für VDI-Funktionen durchführen soll. In jedem Fall wird
  313.      während des Ablaufs von "DoRedraw" das Window-Update-Flag gesetzt
  314.      und die Maus ausgeschaltet.
  315.   *)
  316.  
  317.  
  318.   PROCEDURE wd (handle: INTEGER): window;
  319.  
  320.   (* Findet anhand der AES-Fenster-Handle den zugehörigen Fenster-
  321.      deskriptor. Wird benötigt, wenn vom AES Ereignismeldung kommen,
  322.      die ein Fenster betreffen.
  323.   *)
  324.  
  325.  
  326.   PROCEDURE wp (u: window): windowptr;
  327.  
  328. END WindowBase.
  329.