MODULE ObxPatterns;
(**

   project   = "BlackBox"
   organization   = "www.oberon.ch"
   contributors   = "Oberon microsystems"
   version   = "System/Rsrc/About"
   copyright   = "System/Rsrc/About"
   license   = "Docu/BB-License"
   changes   = ""
   issues   = ""

**)

   IMPORT Ports, Stores, Views, Properties;

   CONST minVersion = 0; maxVersion = 0;

   TYPE View = POINTER TO RECORD (Views.View) END;

   PROCEDURE (v: View) Internalize (VAR rd: Stores.Reader);

      VAR version: INTEGER;
   BEGIN
      rd.ReadVersion(minVersion, maxVersion, version)
   END Internalize;
   PROCEDURE (v: View) Externalize (VAR wr: Stores.Writer);

   BEGIN
      wr.WriteVersion(maxVersion)
   END Externalize;
   PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER);

      VAR w, h, d: INTEGER; col: INTEGER; colors: ARRAY 3 OF Ports.Color;
   BEGIN
      colors[0] := Ports.red; colors[1] := Ports.green; colors[2] := Ports.blue;
      v.context.GetSize(w, h);
      d := 4 * f.dot; col := 0;
      l := 0; t := 0; r := w; b := h;
      WHILE (r> l) & (b > t) DO
         f.DrawRect(l, t, r, b, f.dot, colors[col]);
         INC(l, d); INC(t, d); DEC(r, d); DEC(b, d); col := (col + 1) MOD 3
      END
   END Restore;
   PROCEDURE (v: View) HandlePropMsg (VAR p: Properties.Message);

      CONST min = 10 * Ports.mm; max = 160 * Ports.mm; pref = 90 * Ports.mm;
   BEGIN
      WITH p: Properties.SizePref DO   (* prevent illegal sizes *)
         IF p.w = Views.undefined THEN   (* no preference for width -> skip *)
         ELSIF p.w < min THEN p.w := min
         ELSIF p.w > max THEN p.w := max
         END;
         IF p.h = Views.undefined THEN p.h := pref
         ELSIF p.h < min THEN p.h := min
         ELSIF p.h > max THEN p.h := max
         END
      ELSE
      END
   END HandlePropMsg;
   PROCEDURE Deposit*;

      VAR v: View;
   BEGIN
      NEW(v); Views.Deposit(v)
   END Deposit;
END ObxPatterns.