Headers.txt 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. MODULE StdHeaders;
  2. (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 Std/Mod/Headers.odc *)
  3. (* DO NOT EDIT *)
  4. (* headers / footers support the following macros:
  5. &p - replaced by current page number as arabic numeral
  6. &r - replaced by current page number as roman numeral
  7. &R - replaced by current page number as capital roman numeral
  8. &a - replaced by current page number as alphanumeric character
  9. &A - replaced by current page number as capital alphanumeric character
  10. &d - replaced by printing date
  11. &t - replaced by printing time
  12. &&- replaced by & character
  13. &; - specifies split point
  14. &f - filename with path/title
  15. *)
  16. IMPORT
  17. Stores, Ports, Models, Views, Properties, Printing, TextModels, Fonts, Dialog,
  18. TextViews, Dates, Windows, Controllers, Containers;
  19. CONST
  20. minVersion = 0; maxVersion = 2;
  21. mm = Ports.mm; point = Ports.point;
  22. maxWidth = 10000 * mm;
  23. alternate* = 0; number* = 1; head* = 2; foot* = 3; showFoot* = 4;
  24. TYPE
  25. Banner* = RECORD
  26. left*, right*: ARRAY 128 OF CHAR;
  27. gap*: INTEGER
  28. END;
  29. NumberInfo* = RECORD
  30. new*: BOOLEAN;
  31. first*: INTEGER
  32. END;
  33. View = POINTER TO RECORD (Views.View)
  34. alternate: BOOLEAN; (* alternate left/right *)
  35. number: NumberInfo; (* new page number *)
  36. head, foot: Banner;
  37. font: Fonts.Font;
  38. showFoot: BOOLEAN;
  39. END;
  40. Prop* = POINTER TO RECORD (Properties.Property)
  41. alternate*, showFoot*: BOOLEAN;
  42. number*: NumberInfo;
  43. head*, foot*: Banner
  44. END;
  45. ChangeFontOp = POINTER TO RECORD (Stores.Operation)
  46. header: View;
  47. font: Fonts.Font
  48. END;
  49. ChangeAttrOp = POINTER TO RECORD (Stores.Operation)
  50. header: View;
  51. alternate, showFoot: BOOLEAN;
  52. number: NumberInfo;
  53. head, foot: Banner
  54. END;
  55. VAR
  56. dialog*: RECORD
  57. view: View;
  58. alternate*, showFoot*: BOOLEAN;
  59. number*: NumberInfo;
  60. head*, foot*: Banner;
  61. END;
  62. PROCEDURE (p: Prop) IntersectWith* (q: Properties.Property; OUT equal: BOOLEAN);
  63. VAR valid: SET;
  64. PROCEDURE Equal(IN b1, b2: Banner): BOOLEAN;
  65. BEGIN
  66. RETURN (b1.left = b2.left) & (b1.right = b2.right) & (b1.gap = b2.gap)
  67. END Equal;
  68. BEGIN
  69. WITH q: Prop DO
  70. valid := p.valid * q.valid; equal := TRUE;
  71. IF p.alternate # q.alternate THEN EXCL(valid, alternate) END;
  72. IF p.showFoot # q.showFoot THEN EXCL(valid, showFoot) END;
  73. IF (p.number.new # q.number.new) OR (p.number.first # q.number.first) THEN EXCL(valid, number) END;
  74. IF ~Equal(p.head, q.head) THEN EXCL(valid, head) END;
  75. IF ~Equal(p.foot, q.foot) THEN EXCL(valid, foot) END;
  76. IF p.valid # valid THEN p.valid := valid; equal := FALSE END
  77. END
  78. END IntersectWith;
  79. (* SetAttrOp *)
  80. PROCEDURE (op: ChangeFontOp) Do;
  81. VAR v: View; font: Fonts.Font; asc, dsc, w: INTEGER; c: Models.Context;
  82. BEGIN
  83. v := op.header;
  84. font := op.font; op.font := v.font; v.font := font;
  85. font.GetBounds(asc, dsc, w);
  86. c := v.context;
  87. c.SetSize(maxWidth, asc + dsc + 2*point);
  88. Views.Update(v, Views.keepFrames)
  89. END Do;
  90. PROCEDURE DoChangeFontOp (v: View; font: Fonts.Font);
  91. VAR op: ChangeFontOp;
  92. BEGIN
  93. IF v.font # font THEN
  94. NEW(op); op.header := v; op.font := font;
  95. Views.Do(v, "#System:SetProp", op)
  96. END
  97. END DoChangeFontOp;
  98. PROCEDURE (op: ChangeAttrOp) Do;
  99. VAR v: View; alternate, showFoot: BOOLEAN; number: NumberInfo; head, foot: Banner;
  100. BEGIN
  101. v := op.header;
  102. alternate := op.alternate; showFoot := op.showFoot; number := op.number; head := op.head; foot := op.foot;
  103. op.alternate := v.alternate; op.showFoot := v.showFoot; op.number := v.number; op.head := v.head;
  104. op.foot := v.foot;
  105. v.alternate := alternate; v.showFoot := showFoot; v.number := number; v.head := head; v.foot := foot;
  106. Views.Update(v, Views.keepFrames)
  107. END Do;
  108. PROCEDURE DoChangeAttrOp (v: View; alternate, showFoot: BOOLEAN; number: NumberInfo;
  109. head, foot: Banner);
  110. VAR op: ChangeAttrOp;
  111. BEGIN
  112. NEW(op); op.header := v; op.alternate := alternate; op.showFoot := showFoot;
  113. op.number := number; op.head := head; op.foot := foot;
  114. Views.Do(v, "#Std:HeaderChange", op)
  115. END DoChangeAttrOp;
  116. PROCEDURE (v: View) CopyFromSimpleView (source: Views.View);
  117. BEGIN
  118. WITH source: View DO
  119. v.alternate := source.alternate;
  120. v.number.new := source.number.new; v.number.first := source.number.first;
  121. v.head := source.head;
  122. v.foot := source.foot;
  123. v.font := source.font;
  124. v.showFoot := source.showFoot
  125. END
  126. END CopyFromSimpleView;
  127. PROCEDURE (v: View) Externalize (VAR wr: Stores.Writer);
  128. BEGIN
  129. v.Externalize^(wr);
  130. wr.WriteVersion(maxVersion);
  131. wr.WriteString(v.head.left);
  132. wr.WriteString(v.head.right);
  133. wr.WriteInt(v.head.gap);
  134. wr.WriteString(v.foot.left);
  135. wr.WriteString(v.foot.right);
  136. wr.WriteInt(v.foot.gap);
  137. wr.WriteString(v.font.typeface);
  138. wr.WriteInt(v.font.size);
  139. wr.WriteSet(v.font.style);
  140. wr.WriteInt(v.font.weight);
  141. wr.WriteBool(v.alternate);
  142. wr.WriteBool(v.number.new);
  143. wr.WriteInt(v.number.first);
  144. wr.WriteBool(v.showFoot);
  145. END Externalize;
  146. PROCEDURE (v: View) Internalize (VAR rd: Stores.Reader);
  147. VAR version: INTEGER; typeface: Fonts.Typeface; size: INTEGER; style: SET; weight: INTEGER;
  148. BEGIN
  149. v.Internalize^(rd);
  150. IF ~rd.cancelled THEN
  151. rd.ReadVersion(minVersion, maxVersion, version);
  152. IF ~rd.cancelled THEN
  153. IF version = 0 THEN
  154. rd.ReadXString(v.head.left);
  155. rd.ReadXString(v.head.right);
  156. v.head.gap := 5*mm;
  157. rd.ReadXString(v.foot.left);
  158. rd.ReadXString(v.foot.right);
  159. v.foot.gap := 5*mm;
  160. rd.ReadXString(typeface);
  161. rd.ReadXInt(size);
  162. v.font := Fonts.dir.This(typeface, size * point, {}, Fonts.normal);
  163. rd.ReadXInt(v.number.first);
  164. rd.ReadBool(v.number.new);
  165. rd.ReadBool(v.alternate)
  166. ELSE
  167. rd.ReadString(v.head.left);
  168. rd.ReadString(v.head.right);
  169. rd.ReadInt(v.head.gap);
  170. rd.ReadString(v.foot.left);
  171. rd.ReadString(v.foot.right);
  172. rd.ReadInt(v.foot.gap);
  173. rd.ReadString(typeface);
  174. rd.ReadInt(size);
  175. rd.ReadSet(style);
  176. rd.ReadInt(weight);
  177. v.font := Fonts.dir.This(typeface, size, style, weight);
  178. rd.ReadBool(v.alternate);
  179. rd.ReadBool(v.number.new);
  180. rd.ReadInt(v.number.first);
  181. IF version = 2 THEN rd.ReadBool(v.showFoot) ELSE v.showFoot := FALSE END
  182. END
  183. END
  184. END
  185. END Internalize;
  186. PROCEDURE SetProp(v: View; msg: Properties.SetMsg);
  187. VAR p: Properties.Property;
  188. typeface: Fonts.Typeface; size: INTEGER; style: SET; weight: INTEGER;
  189. alt, sf: BOOLEAN; num: NumberInfo; h, f: Banner;
  190. BEGIN
  191. p := msg.prop;
  192. WHILE p # NIL DO
  193. WITH p: Properties.StdProp DO
  194. IF Properties.typeface IN p.valid THEN typeface := p.typeface
  195. ELSE typeface := v.font.typeface
  196. END;
  197. IF Properties.size IN p.valid THEN size := p.size
  198. ELSE size := v.font.size
  199. END;
  200. IF Properties.style IN p.valid THEN style := p.style.val
  201. ELSE style := v.font.style
  202. END;
  203. IF Properties.weight IN p.valid THEN weight := p.weight
  204. ELSE weight := v.font.weight
  205. END;
  206. DoChangeFontOp (v, Fonts.dir.This(typeface, size, style, weight) );
  207. | p: Prop DO
  208. IF alternate IN p.valid THEN alt := p.alternate ELSE alt := v.alternate END;
  209. IF showFoot IN p.valid THEN sf := p.showFoot ELSE sf := v.showFoot END;
  210. IF number IN p.valid THEN num := p.number ELSE num := v.number END;
  211. IF head IN p.valid THEN h := p.head ELSE h := v.head END;
  212. IF foot IN p.valid THEN f := p.foot ELSE f := v.foot END;
  213. DoChangeAttrOp(v, alt, sf, num, h, f)
  214. ELSE
  215. END;
  216. p := p.next
  217. END
  218. END SetProp;
  219. PROCEDURE PollProp(v: View; VAR msg: Properties.PollMsg);
  220. VAR sp: Properties.StdProp; p: Prop;
  221. BEGIN
  222. NEW(sp);
  223. sp.known := {Properties.size, Properties.typeface, Properties.style, Properties.weight};
  224. sp.valid := sp.known;
  225. sp.size := v.font.size; sp.typeface := v.font.typeface;
  226. sp.style.val := v.font.style; sp.style.mask := {Fonts.italic, Fonts.underline, Fonts.strikeout};
  227. sp.weight := v.font.weight;
  228. Properties.Insert(msg.prop, sp);
  229. NEW(p);
  230. p.known := {alternate, number, head, foot, showFoot}; p.valid := p.known;
  231. p.head := v.head; p.foot := v.foot;
  232. p.alternate := v.alternate;
  233. p.showFoot := v.showFoot;
  234. p.number := v.number;
  235. Properties.Insert(msg.prop, p)
  236. END PollProp;
  237. PROCEDURE PageMsg(v: View; msg: TextViews.PageMsg);
  238. BEGIN
  239. IF Printing.par # NIL THEN
  240. Dialog.MapString(v.head.left, Printing.par.header.left);
  241. Dialog.MapString(v.head.right, Printing.par.header.right);
  242. Dialog.MapString(v.foot.left, Printing.par.footer.left);
  243. Dialog.MapString(v.foot.right, Printing.par.footer.right);
  244. Printing.par.header.font := v.font;
  245. Printing.par.footer.font := v.font;
  246. Printing.par.page.alternate := v.alternate;
  247. IF v.number.new THEN
  248. Printing.par.page.first := v.number.first - msg.current
  249. END;
  250. Printing.par.header.gap := 5*Ports.mm;
  251. Printing.par.footer.gap := 5*Ports.mm
  252. END
  253. END PageMsg;
  254. PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER);
  255. VAR d, w, h: INTEGER; (*line: Line; *)asc, dsc, x0, x1, y: INTEGER;
  256. win: Windows.Window; title: Views.Title; dec: BOOLEAN;
  257. pw, ph: INTEGER;
  258. date: Dates.Date; time: Dates.Time; pageInfo: Printing.PageInfo; banner: Printing.Banner;
  259. BEGIN
  260. IF Views.IsPrinterFrame(f) THEN (* am drucken *) END;
  261. v.font.GetBounds(asc, dsc, w);
  262. win := Windows.dir.First();
  263. WHILE (win # NIL) & (win.doc.Domain() # v.Domain()) DO win := Windows.dir.Next(win) END;
  264. IF win = NIL THEN title := "(" + Dialog.appName + ")"
  265. ELSE win.GetTitle(title)
  266. END;
  267. d := f.dot;
  268. v.context.GetSize(w, h);
  269. win.doc.PollPage(pw, ph, l, t, r, b, dec);
  270. w := r - l;
  271. f.DrawRect(0, 0, w, h, Ports.fill, Ports.grey25);
  272. f.DrawRect(0, 0, w, h, 0, Ports.black);
  273. x0 := d; x1 := w-2*d; y := asc + d;
  274. Dates.GetDate(date);
  275. Dates.GetTime(time);
  276. pageInfo.alternate := FALSE;
  277. pageInfo.title := title;
  278. banner.font := v.font;
  279. IF v.showFoot THEN
  280. banner.gap := v.foot.gap;
  281. Dialog.MapString(v.foot.left, banner.left); Dialog.MapString(v.foot.right, banner.right)
  282. ELSE
  283. banner.gap := v.head.gap;
  284. Dialog.MapString(v.head.left, banner.left); Dialog.MapString(v.head.right, banner.right)
  285. END;
  286. Printing.PrintBanner(f, pageInfo, banner, date, time, x0, x1, y)
  287. END Restore;
  288. PROCEDURE (v: View) HandlePropMsg (VAR msg: Properties.Message);
  289. VAR asc, dsc, w: INTEGER;
  290. BEGIN
  291. WITH msg: Properties.SizePref DO
  292. msg.w := maxWidth;
  293. IF msg.h = Views.undefined THEN
  294. v.font.GetBounds(asc, dsc, w);
  295. msg.h := asc + dsc + 2*point
  296. END
  297. | msg: Properties.ResizePref DO
  298. msg.fixed := TRUE
  299. | msg: TextModels.Pref DO
  300. msg.opts := {TextModels.hideable}
  301. | msg: Properties.PollMsg DO
  302. PollProp(v, msg)
  303. | msg: Properties.SetMsg DO
  304. SetProp(v, msg)
  305. | msg: TextViews.PageMsg DO
  306. PageMsg(v, msg)
  307. ELSE
  308. END
  309. END HandlePropMsg;
  310. PROCEDURE (v: View) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message;
  311. VAR focus: Views.View);
  312. BEGIN
  313. WITH msg: Properties.EmitMsg DO Views.HandlePropMsg(v, msg.set)
  314. | msg: Properties.CollectMsg DO Views.HandlePropMsg(v, msg.poll)
  315. ELSE
  316. END
  317. END HandleCtrlMsg;
  318. PROCEDURE New*(p: Prop; f: Fonts.Font): Views.View;
  319. VAR v: View;
  320. BEGIN
  321. NEW(v);
  322. v.head := p.head;
  323. v.foot := p.foot;
  324. v.number := p.number;
  325. v.alternate := p.alternate;
  326. v.font := f;
  327. v.showFoot := FALSE;
  328. RETURN v;
  329. END New;
  330. PROCEDURE Deposit*;
  331. VAR v: View;
  332. BEGIN
  333. NEW(v);
  334. v.head.left := ""; v.head.right := "&d&;&p"; v.head.gap := 5*mm;
  335. v.foot.left := ""; v.foot.right := ""; v.foot.gap := 5*mm;
  336. v.font := Fonts.dir.Default();
  337. v.number.first := 1; v.number.new := FALSE; v.alternate := FALSE; v.showFoot := FALSE;
  338. Views.Deposit(v)
  339. END Deposit;
  340. (* property dialog *)
  341. PROCEDURE InitDialog*;
  342. VAR p: Properties.Property;
  343. BEGIN
  344. Properties.CollectProp(p);
  345. WHILE p # NIL DO
  346. WITH p: Properties.StdProp DO
  347. | p: Prop DO
  348. dialog.alternate := p.alternate; dialog.showFoot := p.showFoot;
  349. dialog.number := p.number;
  350. dialog.head := p.head; dialog.head.gap := dialog.head.gap DIV point;
  351. dialog.foot := p.foot; dialog.foot.gap := dialog.foot.gap DIV point;
  352. Dialog.Update(dialog)
  353. ELSE
  354. END;
  355. p := p.next
  356. END
  357. END InitDialog;
  358. PROCEDURE Set*;
  359. VAR p: Prop;
  360. BEGIN
  361. NEW(p); p.valid := {alternate, number, head, foot, showFoot};
  362. p.alternate := dialog.alternate; p.showFoot := dialog.showFoot;
  363. p.number := dialog.number;
  364. p.head := dialog.head; p.head.gap := p.head.gap * point;
  365. p.foot := dialog.foot; p.foot.gap := p.foot.gap * point;
  366. Properties.EmitProp(NIL, p)
  367. END Set;
  368. PROCEDURE HeaderGuard* (VAR par: Dialog.Par);
  369. VAR v: Views.View;
  370. BEGIN
  371. v := Containers.FocusSingleton();
  372. IF (v # NIL) & (v IS View) THEN
  373. par.disabled := FALSE;
  374. IF (dialog.view = NIL) OR (dialog.view # v) THEN
  375. dialog.view := v(View);
  376. InitDialog
  377. END
  378. ELSE
  379. par.disabled := TRUE;
  380. dialog.view := NIL
  381. END
  382. END HeaderGuard;
  383. PROCEDURE AlternateGuard* (VAR par: Dialog.Par);
  384. BEGIN
  385. HeaderGuard(par);
  386. IF ~par.disabled THEN par.disabled := ~ dialog.alternate END
  387. END AlternateGuard;
  388. PROCEDURE NewNumberGuard* (VAR par: Dialog.Par);
  389. BEGIN
  390. HeaderGuard(par);
  391. IF ~par.disabled THEN par.disabled := ~ dialog.number.new END
  392. END NewNumberGuard;
  393. END StdHeaders.