123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- MODULE StdClocks;
- (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Std/Mod/Clocks.odc *)
- (* DO NOT EDIT *)
- IMPORT
- Dates, Math, Domains := Stores, Ports, Stores, Models, Views, Services, Properties,
- TextModels;
- CONST
- minSize = 25 * Ports.point; niceSize = 42 * Ports.point;
- minVersion = 0; maxVersion = 0;
- TYPE
- StdView = POINTER TO RECORD (Views.View)
- time: Dates.Time
- END;
- TickAction = POINTER TO RECORD (Services.Action) END;
- Msg = RECORD (Models.Message)
- consumed: BOOLEAN;
- time: Dates.Time
- END;
- VAR
- clockTime: Dates.Time;
- action: TickAction;
- actionIsAlive: BOOLEAN;
- PROCEDURE Cos (r, g: INTEGER): INTEGER;
- BEGIN
- RETURN SHORT(ENTIER(r * Math.Cos(2 * Math.Pi() * g / 60) + 0.5))
- END Cos;
- PROCEDURE Sin (r, g: INTEGER): INTEGER;
- BEGIN
- RETURN SHORT(ENTIER(r * Math.Sin(2 * Math.Pi() * g / 60) + 0.5))
- END Sin;
- PROCEDURE (a: TickAction) Do;
- VAR msg: Msg; time: Dates.Time;
- BEGIN
- Dates.GetTime(time);
- IF clockTime.second = time.second THEN
- Services.DoLater(action, Services.Ticks() + Services.resolution DIV 2)
- ELSE
- clockTime := time;
- msg.consumed := FALSE;
- msg.time := time;
- Views.Omnicast(msg);
- IF msg.consumed THEN
- Services.DoLater(action, Services.Ticks() + Services.resolution DIV 2)
- ELSE
- actionIsAlive := FALSE
- END
- END
- END Do;
- (* View *)
- PROCEDURE DrawTick (f: Views.Frame; m, d0, d1, s, g: INTEGER; c: Ports.Color);
- BEGIN
- f.DrawLine(m + Sin(d0, g), m - Cos(d0, g), m + Sin(d1, g), m - Cos(d1, g), s, c)
- END DrawTick;
- PROCEDURE (v: StdView) Externalize (VAR wr: Stores.Writer);
- BEGIN
- v.Externalize^(wr);
- wr.WriteVersion(maxVersion);
- wr.WriteByte(9)
- END Externalize;
- PROCEDURE (v: StdView) Internalize (VAR rd: Stores.Reader);
- VAR thisVersion: INTEGER; format: BYTE;
- BEGIN
- v.Internalize^(rd);
- IF ~rd.cancelled THEN
- rd.ReadVersion(minVersion, maxVersion, thisVersion);
- IF ~rd.cancelled THEN
- rd.ReadByte(format);
- v.time.second := -1
- END
- END
- END Internalize;
- PROCEDURE (v: StdView) CopyFromSimpleView (source: Views.View);
- BEGIN
- WITH source: StdView DO
- v.time.second := -1
- END
- END CopyFromSimpleView;
- PROCEDURE (v: StdView) Restore (f: Views.Frame; l, t, r, b: INTEGER);
- VAR c: Models.Context; a: TextModels.Attributes; color: Ports.Color;
- time: Dates.Time;
- i, m, d, u, hs, hd1, ms, md1, ss, sd0, sd1, w, h: INTEGER;
- BEGIN
- IF ~actionIsAlive THEN
- actionIsAlive := TRUE; Services.DoLater(action, Services.now)
- END;
- IF v.time.second = -1 THEN Dates.GetTime(v.time) END;
- c := v.context; c.GetSize(w, h);
- WITH c: TextModels.Context DO a := c.Attr(); color := a.color
- ELSE color := Ports.defaultColor
- END;
- u := f.unit;
- d := h DIV u * u;
- IF ~ODD(d DIV u) THEN DEC(d, u) END;
- m := (h - u) DIV 2;
- IF d >= niceSize - 2 * Ports.point THEN
- hs := 3 * u; ms := 3 * u; ss := u;
- hd1 := m * 4 DIV 6; md1 := m * 5 DIV 6; sd0 := -(m DIV 6); sd1 := m - 4 * u;
- i := 0; WHILE i < 12 DO DrawTick(f, m, m * 11 DIV 12, m, u, i * 5, color); INC(i) END
- ELSE
- hd1 := m * 2 DIV 4; hs := u; ms := u; ss := u;
- md1 := m * 3 DIV 4; sd0 := 0; sd1 := 3 * u
- END;
- time := v.time;
- f.DrawOval(0, 0, d, d, u, color);
- DrawTick(f, m, 0, m * 4 DIV 6, hs, time.hour MOD 12 * 5 + time.minute DIV 12, color);
- DrawTick(f, m, 0, md1, ms, time.minute, color);
- DrawTick(f, m, sd0, sd1, ss, time.second, color)
- END Restore;
- PROCEDURE (v: StdView) HandleModelMsg (VAR msg: Models.Message);
- VAR w, h: INTEGER;
- BEGIN
- WITH msg: Msg DO
- msg.consumed := TRUE;
- IF v.time.second # msg.time.second THEN (* execute only once per view *)
- Views.Update(v, Views.keepFrames);
- v.time := msg.time
- END
- ELSE
- END
- END HandleModelMsg;
- PROCEDURE SizePref (v: StdView; VAR p: Properties.SizePref);
- BEGIN
- IF (p.w > Views.undefined) & (p.h > Views.undefined) THEN
- Properties.ProportionalConstraint(1, 1, p.fixedW, p.fixedH, p.w, p.h);
- IF p.w < minSize THEN p.w := minSize; p.h := minSize END
- ELSE
- p.w := niceSize; p.h := niceSize
- END
- END SizePref;
- PROCEDURE (v: StdView) HandlePropMsg (VAR msg: Properties.Message);
- BEGIN
- WITH msg: Properties.Preference DO
- WITH msg: Properties.SizePref DO
- SizePref(v, msg)
- ELSE
- END
- ELSE
- END
- END HandlePropMsg;
- (** allocation **)
- PROCEDURE New* (): Views.View;
- VAR v: StdView;
- BEGIN
- NEW(v); v.time.second := -1; RETURN v
- END New;
- PROCEDURE Deposit*;
- BEGIN
- Views.Deposit(New())
- END Deposit;
- BEGIN
- clockTime.second := -1;
- NEW(action); actionIsAlive := FALSE
- CLOSE
- IF actionIsAlive THEN Services.RemoveAction(action) END
- END StdClocks.
|