MODULE XhtmlTextTableMarkers;
(**
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, Controllers, Properties, TextModels;
CONST minVersion = 0; maxVersion = 1;
TYPE
View = POINTER TO RECORD (Views.View)
openMark: BOOLEAN
END;
(* View *)
PROCEDURE (v: View) Internalize (VAR rd: Stores.Reader);
VAR version: INTEGER;
BEGIN
(* v is not initialized *)
(* v.Domain() = NIL *)
IF ~rd.cancelled THEN
rd.ReadVersion(minVersion, maxVersion, version);
IF ~rd.cancelled THEN
rd.ReadBool(v.openMark)
END
END
END Internalize;
PROCEDURE (v: View) Externalize (VAR wr: Stores.Writer);
BEGIN
(* v is initialized *)
wr.WriteVersion(maxVersion);
wr.WriteBool(v.openMark)
END Externalize;
PROCEDURE (v: View) CopyFromSimpleView (source: Views.View);
BEGIN
(* v is not initialized *)
(* v.Domain() = NIL *)
(* source # NIL *)
(* source is initialized *)
(* TYP(v) = TYP(source) *)
WITH source: View DO
v.openMark := source.openMark
END
END CopyFromSimpleView;
PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER);
VAR w, h, s: INTEGER;
BEGIN
(* f # NIL *)
IF ~Views.IsPrinterFrame(f) THEN
v.context.GetSize(w, h); w := f.r - f.l;
s := 2 * f.dot;
f.DrawRect(0, 0, s, h, Ports.fill, Ports.grey25); (* left border *)
f.DrawRect(w - s, 0, w, h, Ports.fill, Ports.grey25); (* right border *)
IF v.openMark THEN
f.DrawRect(s, 0, w - s, s, Ports.fill, Ports.grey25); (* top border *)
f.DrawRect(s, s, w - s, h, Ports.fill, Ports.grey12) (* interior *)
ELSE
f.DrawRect(s, h - s, w - s, h, Ports.fill, Ports.grey25); (* bottom border *)
f.DrawRect(s, 0, w - s, h - s, Ports.fill, Ports.grey12) (* interior *)
END
END
END Restore;
PROCEDURE (v: View) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message; VAR focus: Views.View);
BEGIN
(* f # NIL *)
(* focus = NIL *)
WITH msg: Controllers.PollOpsMsg DO
(* specify which editing operations are supported *)
| msg: Controllers.TrackMsg DO
(* implement mouse tracking *)
| msg: Controllers.EditMsg DO
(* implement editing operations *)
ELSE (* ignore other messages *)
END
END HandleCtrlMsg;
PROCEDURE (v: View) HandlePropMsg (VAR msg: Properties.Message);
CONST viewHeight = 2 * Ports.mm;
BEGIN
WITH msg: Properties.SizePref DO
msg.w := 10000 * Ports.mm; msg.h := viewHeight
| msg: Properties.ResizePref DO
msg.fixed := TRUE
| msg: TextModels.Pref DO
(*msg.opts := {TextModels.maskChar};
msg.mask := TextModels.para*)
ELSE (* ignore other messages *)
END
END HandlePropMsg;
(** miscellaneous **)
PROCEDURE IsOpenMark* (v: Views.View): BOOLEAN;
BEGIN
RETURN (v # NIL) & (v IS View) & v(View).openMark
END IsOpenMark;
PROCEDURE IsCloseMark* (v: Views.View): BOOLEAN;
BEGIN
RETURN (v # NIL) & (v IS View) & ~v(View).openMark
END IsCloseMark;
PROCEDURE New* (openMark: BOOLEAN): Views.View;
VAR v: View;
BEGIN
NEW(v); v.openMark := openMark; RETURN v
END New;
PROCEDURE DepositOpenMark*;
BEGIN
Views.Deposit(New(TRUE))
END DepositOpenMark;
PROCEDURE DepositCloseMark*;
BEGIN
Views.Deposit(New(FALSE))
END DepositCloseMark;
END XhtmlTextTableMarkers.