DEADSOFTWARE

Port, TODO
[bbcp.git] / new / Std / Mod / Clocks.txt
1 MODULE StdClocks;
3 (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Std/Mod/Clocks.odc *)
4 (* DO NOT EDIT *)
6 IMPORT
7 Dates, Math, Domains := Stores, Ports, Stores, Models, Views, Services, Properties,
8 TextModels;
10 CONST
11 minSize = 25 * Ports.point; niceSize = 42 * Ports.point;
12 minVersion = 0; maxVersion = 0;
14 TYPE
15 StdView = POINTER TO RECORD (Views.View)
16 time: Dates.Time
17 END;
19 TickAction = POINTER TO RECORD (Services.Action) END;
21 Msg = RECORD (Models.Message)
22 consumed: BOOLEAN;
23 time: Dates.Time
24 END;
26 VAR
27 clockTime: Dates.Time;
28 action: TickAction;
29 actionIsAlive: BOOLEAN;
32 PROCEDURE Cos (r, g: INTEGER): INTEGER;
33 BEGIN
34 RETURN SHORT(ENTIER(r * Math.Cos(2 * Math.Pi() * g / 60) + 0.5))
35 END Cos;
37 PROCEDURE Sin (r, g: INTEGER): INTEGER;
38 BEGIN
39 RETURN SHORT(ENTIER(r * Math.Sin(2 * Math.Pi() * g / 60) + 0.5))
40 END Sin;
42 PROCEDURE (a: TickAction) Do;
43 VAR msg: Msg; time: Dates.Time;
44 BEGIN
45 Dates.GetTime(time);
46 IF clockTime.second = time.second THEN
47 Services.DoLater(action, Services.Ticks() + Services.resolution DIV 2)
48 ELSE
49 clockTime := time;
50 msg.consumed := FALSE;
51 msg.time := time;
52 Views.Omnicast(msg);
53 IF msg.consumed THEN
54 Services.DoLater(action, Services.Ticks() + Services.resolution DIV 2)
55 ELSE
56 actionIsAlive := FALSE
57 END
58 END
59 END Do;
62 (* View *)
64 PROCEDURE DrawTick (f: Views.Frame; m, d0, d1, s, g: INTEGER; c: Ports.Color);
65 BEGIN
66 f.DrawLine(m + Sin(d0, g), m - Cos(d0, g), m + Sin(d1, g), m - Cos(d1, g), s, c)
67 END DrawTick;
70 PROCEDURE (v: StdView) Externalize (VAR wr: Stores.Writer);
71 BEGIN
72 v.Externalize^(wr);
73 wr.WriteVersion(maxVersion);
74 wr.WriteByte(9)
75 END Externalize;
77 PROCEDURE (v: StdView) Internalize (VAR rd: Stores.Reader);
78 VAR thisVersion: INTEGER; format: BYTE;
79 BEGIN
80 v.Internalize^(rd);
81 IF ~rd.cancelled THEN
82 rd.ReadVersion(minVersion, maxVersion, thisVersion);
83 IF ~rd.cancelled THEN
84 rd.ReadByte(format);
85 v.time.second := -1
86 END
87 END
88 END Internalize;
90 PROCEDURE (v: StdView) CopyFromSimpleView (source: Views.View);
91 BEGIN
92 WITH source: StdView DO
93 v.time.second := -1
94 END
95 END CopyFromSimpleView;
97 PROCEDURE (v: StdView) Restore (f: Views.Frame; l, t, r, b: INTEGER);
98 VAR c: Models.Context; a: TextModels.Attributes; color: Ports.Color;
99 time: Dates.Time;
100 i, m, d, u, hs, hd1, ms, md1, ss, sd0, sd1, w, h: INTEGER;
101 BEGIN
102 IF ~actionIsAlive THEN
103 actionIsAlive := TRUE; Services.DoLater(action, Services.now)
104 END;
105 IF v.time.second = -1 THEN Dates.GetTime(v.time) END;
106 c := v.context; c.GetSize(w, h);
107 WITH c: TextModels.Context DO a := c.Attr(); color := a.color
108 ELSE color := Ports.defaultColor
109 END;
110 u := f.unit;
111 d := h DIV u * u;
112 IF ~ODD(d DIV u) THEN DEC(d, u) END;
113 m := (h - u) DIV 2;
114 IF d >= niceSize - 2 * Ports.point THEN
115 hs := 3 * u; ms := 3 * u; ss := u;
116 hd1 := m * 4 DIV 6; md1 := m * 5 DIV 6; sd0 := -(m DIV 6); sd1 := m - 4 * u;
117 i := 0; WHILE i < 12 DO DrawTick(f, m, m * 11 DIV 12, m, u, i * 5, color); INC(i) END
118 ELSE
119 hd1 := m * 2 DIV 4; hs := u; ms := u; ss := u;
120 md1 := m * 3 DIV 4; sd0 := 0; sd1 := 3 * u
121 END;
122 time := v.time;
123 f.DrawOval(0, 0, d, d, u, color);
124 DrawTick(f, m, 0, m * 4 DIV 6, hs, time.hour MOD 12 * 5 + time.minute DIV 12, color);
125 DrawTick(f, m, 0, md1, ms, time.minute, color);
126 DrawTick(f, m, sd0, sd1, ss, time.second, color)
127 END Restore;
129 PROCEDURE (v: StdView) HandleModelMsg (VAR msg: Models.Message);
130 VAR w, h: INTEGER;
131 BEGIN
132 WITH msg: Msg DO
133 msg.consumed := TRUE;
134 IF v.time.second # msg.time.second THEN (* execute only once per view *)
135 Views.Update(v, Views.keepFrames);
136 v.time := msg.time
137 END
138 ELSE
139 END
140 END HandleModelMsg;
142 PROCEDURE SizePref (v: StdView; VAR p: Properties.SizePref);
143 BEGIN
144 IF (p.w > Views.undefined) & (p.h > Views.undefined) THEN
145 Properties.ProportionalConstraint(1, 1, p.fixedW, p.fixedH, p.w, p.h);
146 IF p.w < minSize THEN p.w := minSize; p.h := minSize END
147 ELSE
148 p.w := niceSize; p.h := niceSize
149 END
150 END SizePref;
152 PROCEDURE (v: StdView) HandlePropMsg (VAR msg: Properties.Message);
153 BEGIN
154 WITH msg: Properties.Preference DO
155 WITH msg: Properties.SizePref DO
156 SizePref(v, msg)
157 ELSE
158 END
159 ELSE
160 END
161 END HandlePropMsg;
164 (** allocation **)
166 PROCEDURE New* (): Views.View;
167 VAR v: StdView;
168 BEGIN
169 NEW(v); v.time.second := -1; RETURN v
170 END New;
172 PROCEDURE Deposit*;
173 BEGIN
174 Views.Deposit(New())
175 END Deposit;
178 BEGIN
179 clockTime.second := -1;
180 NEW(action); actionIsAlive := FALSE
181 CLOSE
182 IF actionIsAlive THEN Services.RemoveAction(action) END
183 END StdClocks.