Clocks.txt 4.5 KB

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