home *** CD-ROM | disk | FTP | other *** search
/ TopWare Tools / TOOLS.iso / tools / top1654 / gepackt.exe / MEM.MOD < prev    next >
Encoding:
Text File  |  1994-01-28  |  5.4 KB  |  189 lines

  1. MODULE MemInfoElems; (* CS/MH/RG c't 3/94 *)
  2. (* Textelement, das den zur Verfügung stehenden Heap-Speicher *)
  3. (* anzeigt. Version ohne Ticker (Aktualisierung nur durch     *)
  4. (* Kommando-Klick auf das Textelement) *)
  5.  
  6. IMPORT
  7.    Kernel, Files, Input, Display, Viewers, Fonts, Texts, Oberon,
  8.    TextFrames;
  9.  
  10. TYPE
  11.    (* Wenn das Textelement Daten speichert, braucht man einen *)
  12.    (* eigenen, von Texts.ElemDesc abgeleiteten Typ. *)
  13.  
  14.    MemInfoElem* = POINTER TO MemInfoElemDesc;
  15.    MemInfoElemDesc* = RECORD (Texts.ElemDesc)
  16.       (* Praktischerweise müßte memavail eine globale Variable *)
  17.       (* sein, weil der zu Verfügung stehende Heap-Speicher    *)
  18.       (* eine globale Größe ist. Hier lokal, damit das Text-   *)
  19.       (* element seinen Wert speichert. *)
  20.  
  21.       memavail: LONGINT;
  22.    END;
  23.  
  24. (* Manipulatoren *)
  25.  
  26. PROCEDURE ^Handle (e: Texts.Elem; VAR msg: Texts.ElemMsg);
  27.    (* Das ist eine Forward-Deklaration. *)
  28.  
  29. PROCEDURE Open* (e: MemInfoElem);
  30. BEGIN
  31.    (* "Konstruktor" *)
  32.    (* Initialisiert die Werte eines MemInfoElems-Records. *)
  33.  
  34.    e.W := 5 * TextFrames.mm;     (* 5 mm Breite/Höhe *)
  35.    e.H := e.W;
  36.    e.handle := Handle;           (* Handler für Interaktionen *)
  37.    e.memavail := 0
  38. END Open;
  39.  
  40. PROCEDURE Copy* (se, de: MemInfoElem);
  41. BEGIN
  42.    (* "Kopier-Konstruktor" *)
  43.    (* Erzeugt ein neues MemInfo-Element durch Kopie eines alten. *)
  44.  
  45.    Texts.CopyElem(se, de);
  46.    de.memavail := 0;
  47. END Copy;
  48.  
  49. PROCEDURE Alloc*;
  50. VAR
  51.    e: MemInfoElem;
  52. BEGIN
  53.    (* "new MemInfoElem" *)
  54.    (* Erzeugt ein neues MemInfo-Element. *)
  55.  
  56.    NEW(e); Open(e);
  57.    Texts.new := e;
  58. END Alloc;
  59.  
  60. (* Zeichner *)
  61.  
  62. PROCEDURE PrepDraw* (e: MemInfoElem; fnt: Fonts.Font);
  63. VAR
  64.    dx, x, y, w, h: INTEGER;
  65.    pat: Display.Pattern;
  66. BEGIN
  67.    (* Bereitet Zeichnen vor, indem es die tatsächliche Breite/Höhe *)
  68.    (* berechnet. Display.GetChar liefert Informationen zu einem    *)
  69.    (* Zeichen eines best. Fonts. *)
  70.  
  71.    Display.GetChar(fnt.raster, '0', dx, x, y, w, h, pat);
  72.    e.W := 8 * LONG(dx) * TextFrames.Unit;
  73.    e.H := LONG(fnt.height) * TextFrames.Unit;
  74. END PrepDraw;
  75.  
  76. PROCEDURE Draw* (e: MemInfoElem; msg: TextFrames.DisplayMsg);
  77. VAR
  78.    p: TextFrames.Parc;
  79.    pat: Display.Pattern;
  80.    beg, memavail: LONGINT;
  81.    x, y, w, h, cx, cy, dx: INTEGER;
  82. BEGIN
  83.    (* Zeichnet ein MemInfo-Element, nachdem es sich vergewissert hat, *)
  84.    (* dass sich die Daten geändert haben. *)
  85.  
  86.    memavail := Kernel.Available();
  87.    IF memavail # e.memavail THEN
  88.       e.memavail := memavail;
  89.       (* Vorbereitung: holt den für das Element gültige Parcn *)
  90.       (* und berechnet Position/Breite/Hähe in Pixeln. *)
  91.  
  92.       TextFrames.ParcBefore(Texts.ElemBase(e), msg.pos, p, beg);
  93.       w := SHORT(e.W DIV TextFrames.Unit);
  94.       h := SHORT(p.dsr DIV TextFrames.Unit);
  95.       x := msg.X0 + w;
  96.       y := msg.Y0 + h;
  97.  
  98.       (* Zeichnet Ziffer für Ziffer (von rechts nach links) *)
  99.       (* Display.CopyPattern zeichnet ein Muster im angegebenen *)
  100.       (* Modus (replace). *)
  101.  
  102.       WHILE memavail # 0 DO
  103.          Display.GetChar(msg.fnt.raster, CHR(memavail MOD 10 + ORD('0')),
  104.             dx, cx, cy, w, h, pat);
  105.          DEC(x, dx);
  106.          Display.CopyPattern(msg.col, pat, x + cx, y + cy,
  107.             Display.replace);
  108.          memavail := memavail DIV 10;
  109.       END;
  110.    END;
  111. END Draw;
  112.  
  113. PROCEDURE Track* (e: MemInfoElem; msg: TextFrames.TrackMsg);
  114. VAR
  115.    keysum, keys: SET;
  116. BEGIN
  117.    (* Zeichnet den Mauszeiger, solange mind. eine Taste gedrückt ist. *)
  118.  
  119.    IF msg.keys = {1} THEN keysum := msg.keys END;
  120.    REPEAT
  121.       Oberon.DrawCursor(Oberon.Mouse, Oberon.Arrow, msg.X, msg.Y);
  122.       Input.Mouse(keys, msg.X, msg.Y);
  123.       keysum := keysum + keys;
  124.    UNTIL keys = {};
  125.  
  126.    IF keysum = {1} THEN
  127.       (* Nur die mittlere Taste wurde gedràckt => Zeichne MemInfo- *)
  128.       (* Element neu. Texts.ChangeLooks schickt dem Element eine   *)
  129.       (* Display-Nachricht. *)
  130.  
  131.       Texts.ChangeLooks(Texts.ElemBase(e), msg.pos, msg.pos + 1, {},
  132.          NIL, 0, 0);
  133.    END;
  134. END Track;
  135.  
  136. (* Handler *)
  137.  
  138. PROCEDURE Handle (e: Texts.Elem; VAR msg: Texts.ElemMsg);
  139. VAR
  140.    copy: MemInfoElem;
  141. BEGIN
  142.    (* Der Interaktions-Handler fàr die MemInfo-Elemente. *)
  143.    (* Reagiert auf die Nachrichten "Copy", "Identify",   *)
  144.    (* "Display" und "Track". *)
  145.  
  146.    WITH e: MemInfoElem DO
  147.       IF msg IS Texts.CopyMsg THEN
  148.          NEW(copy); Copy(e, copy); msg(Texts.CopyMsg).e := copy;
  149.       ELSIF msg IS Texts.IdentifyMsg THEN
  150.          WITH msg: Texts.IdentifyMsg DO
  151.             msg.mod := "MemInfoElems"; msg.proc := "Alloc";
  152.          END
  153.       ELSIF msg IS TextFrames.DisplayMsg THEN
  154.          WITH msg: TextFrames.DisplayMsg DO
  155.             IF msg.prepare THEN PrepDraw(e, msg.fnt)
  156.             ELSE Draw(e, msg) END;
  157.          END;
  158.       ELSIF msg IS TextFrames.TrackMsg THEN
  159.          WITH msg: TextFrames.TrackMsg DO Track(e, msg) END;
  160.       END;
  161.    END;
  162. END Handle;
  163.  
  164. (* Anwender-Kommandos *)
  165.  
  166. PROCEDURE Insert*;
  167. VAR
  168.    e: MemInfoElem;
  169.    M: TextFrames.InsertElemMsg;
  170. BEGIN
  171.    (* Implementiert das Kommando "MemInfoElems.Insert". Nach der *)
  172.    (* Aktivierung wird ein MemInfo-Element an die Stelle des     *)
  173.    (* Carets eingefàgt. *)
  174.  
  175.    NEW(e); Open(e);
  176.    M.e := e;
  177.  
  178.    (* Schickt dem fokussierten Viewer (das Fenster, das das Caret *)
  179.    (* enthält) die Nachricht "InsertElem". *)
  180.  
  181.    Oberon.FocusViewer.handle(Oberon.FocusViewer, M);
  182. END Insert;
  183.  
  184. (* Initialisierung *)
  185.  
  186. BEGIN
  187.    (* ohne Initialisierung *)
  188. END MemInfoElems.
  189.