Printing.txt 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. MODULE Printing;
  2. (* THIS IS TEXT COPY OF BlackBox 1.6-rc6 System/Mod/Printing.odc *)
  3. (* DO NOT EDIT *)
  4. IMPORT Kernel, Fonts, Ports, Dates, Printers, Views, Dialog, Strings;
  5. CONST maxNrOfSegments = 16;
  6. TYPE
  7. PageInfo* = RECORD
  8. first*, from*, to*: INTEGER; (** current IN **)
  9. (** first, from, to: OUT, preset to (0, 0, 9999) **)
  10. alternate*: BOOLEAN;
  11. title*: Views.Title
  12. END;
  13. Banner* = RECORD
  14. font*: Fonts.Font;
  15. gap*: INTEGER; (** OUT, prest to (0,0) **)
  16. left*, right*: ARRAY 128 OF CHAR (** OUT, preset to "", "" **)
  17. (** anywhere in header or footer:
  18. &p - replaced by current page number as arabic numeral
  19. &r - replaced by current page number as roman numeral
  20. &R - replaced by current page number as capital roman numeral
  21. &a - replaced by current page number as alphanumeric character
  22. &A - replaced by current page number as capital alphanumeric character
  23. &d - replaced by printing date
  24. &t - replaced by printing time
  25. &&- replaced by & character
  26. &; - specifies split point
  27. &f - filename without path/title
  28. **)
  29. END;
  30. Par* = POINTER TO LIMITED RECORD
  31. page*: PageInfo;
  32. header*, footer*: Banner;
  33. copies-: INTEGER
  34. END;
  35. Line = RECORD
  36. buf: ARRAY 256 OF CHAR;
  37. beg: ARRAY maxNrOfSegments OF BYTE;
  38. len: INTEGER
  39. END;
  40. Hook* = POINTER TO ABSTRACT RECORD (Kernel.Hook) END;
  41. VAR
  42. par*: Par;
  43. month: ARRAY 12 * 3 + 1 OF CHAR;
  44. printingHook: Hook;
  45. PROCEDURE (h: Hook) Print* (v: Views.View; par: Par), NEW, ABSTRACT;
  46. PROCEDURE (h: Hook) Current* (): INTEGER, NEW, ABSTRACT;
  47. PROCEDURE SetHook* (p: Hook);
  48. BEGIN
  49. printingHook := p
  50. END SetHook;
  51. PROCEDURE NewPar* (IN page: PageInfo; IN header, footer: Banner; copies: INTEGER): Par;
  52. VAR par: Par;
  53. BEGIN
  54. NEW(par);
  55. par.page := page;
  56. par.header := header;
  57. par.footer := footer;
  58. par.copies := copies;
  59. IF par.header.font = NIL THEN par.header.font := Fonts.dir.Default() END;
  60. IF par.footer.font = NIL THEN par.footer.font := Fonts.dir.Default() END;
  61. RETURN par
  62. END NewPar;
  63. PROCEDURE NewDefaultPar* (title: Views.Title): Par;
  64. VAR par: Par;
  65. BEGIN
  66. NEW(par);
  67. par.page.first := 1;
  68. par.page.from := 0;
  69. par.page.to := 9999;
  70. par.page.alternate := FALSE;
  71. par.copies := 1;
  72. par.header.gap := 0; par.header.left := ""; par.header.right := ""; par.header.font := Fonts.dir.Default();
  73. par.footer.gap := 0; par.footer.left := ""; par.footer.right := ""; par.header.font := Fonts.dir.Default();
  74. par.page.title := title;
  75. RETURN par
  76. END NewDefaultPar;
  77. PROCEDURE PrintView* (view: Views.View; p: Par);
  78. BEGIN
  79. ASSERT(view # NIL, 20); ASSERT(p # NIL, 21);
  80. ASSERT(par = NIL, 22); (* no recursive printing *)
  81. IF Printers.dir.Available() THEN
  82. ASSERT(p.page.first >= 0, 23);
  83. ASSERT(p.page.from >= 0, 24);
  84. ASSERT(p.page.to >= p.page.from, 25);
  85. ASSERT(printingHook # NIL, 100);
  86. printingHook.Print(view, p)
  87. ELSE Dialog.ShowMsg("#System:NoPrinterFound")
  88. END
  89. END PrintView;
  90. PROCEDURE GetDateAndTime (IN date: Dates.Date; IN time: Dates.Time;
  91. VAR d, t: ARRAY OF CHAR);
  92. VAR i, j, k: INTEGER; s: ARRAY 8 OF CHAR;
  93. BEGIN
  94. Strings.IntToStringForm (date.day, Strings.decimal, 0, "0", FALSE, d);
  95. j := date.month * 3; i := j - 3; k := 0;
  96. WHILE i < j DO s[k] := month[i]; INC(k); INC(i) END; s[k] := 0X;
  97. d := d + "-" + s;
  98. Strings.IntToStringForm (date.year, Strings.decimal, 0, "0", FALSE, s);
  99. d := d + "-" + s;
  100. Strings.IntToStringForm (time.hour, Strings.decimal, 0, "0", FALSE, t);
  101. Strings.IntToStringForm (time.minute, Strings.decimal, 2, "0", FALSE, s);
  102. t := t + ":" + s;
  103. END GetDateAndTime;
  104. PROCEDURE Expand (s: ARRAY OF CHAR; IN date: Dates.Date; IN time: Dates.Time;
  105. IN title: Views.Title; pno: INTEGER; printing: BOOLEAN; VAR line: Line);
  106. VAR i, l: INTEGER; ch: CHAR; j: BYTE;
  107. p, d, t, r, rl: ARRAY 32 OF CHAR;
  108. BEGIN
  109. IF printing THEN
  110. Strings.IntToStringForm (pno, Strings.decimal, 0, "0", FALSE, p);
  111. IF (0 < pno) & (pno < 4000) THEN
  112. Strings.IntToStringForm(pno, Strings.roman, 0, " ", FALSE, r)
  113. ELSE
  114. r := p
  115. END;
  116. ELSE p := "#"; r := "#"
  117. END;
  118. GetDateAndTime(date, time, d, t);
  119. i := 0; ch := s[i]; line.len := 0; j := 0;
  120. WHILE ch # 0X DO
  121. IF ch = "&" THEN
  122. INC(i); ch := s[i];
  123. IF ch = "p" THEN
  124. l := 0; WHILE p[l] # 0X DO line.buf[j] := p[l]; INC(j); INC(l) END
  125. ELSIF ch = "r" THEN
  126. Strings.ToLower(r, rl);
  127. l := 0; WHILE rl[l] # 0X DO line.buf[j] := rl[l]; INC(j); INC(l) END
  128. ELSIF ch = "R" THEN
  129. l := 0; WHILE r[l] # 0X DO line.buf[j] := r[l]; INC(j); INC(l) END
  130. ELSIF (ch = "a") OR (ch = "A") THEN
  131. IF printing & (0 < pno) & (pno <= 26) THEN line.buf[j] := CHR(pno + ORD(ch) - 1); INC(j)
  132. ELSE l := 0; WHILE p[l] # 0X DO line.buf[j] := p[l]; INC(j); INC(l) END
  133. END
  134. ELSIF ch = "d" THEN
  135. l := 0; WHILE d[l] # 0X DO line.buf[j] := d[l]; INC(j); INC(l) END
  136. ELSIF ch = "t" THEN
  137. l := 0; WHILE t[l] # 0X DO line.buf[j] := t[l]; INC(j); INC(l) END
  138. ELSIF ch = "f" THEN
  139. l := 0; WHILE title[l] # 0X DO line.buf[j] := title[l]; INC(j); INC(l) END
  140. ELSIF ch = ";" THEN
  141. IF (line.len < maxNrOfSegments-1) THEN line.beg[line.len] := j; INC(line.len)
  142. ELSE line.buf[j] := " "; INC(j)
  143. END
  144. ELSIF ch = "&" THEN
  145. line.buf[j] := "&"; INC(j)
  146. END;
  147. IF ch # 0X THEN INC(i); ch := s[i] END
  148. ELSE line.buf[j] := ch; INC(j); INC(i); ch := s[i]
  149. END
  150. END;
  151. line.buf[j] := 0X; line.beg[line.len] := j; INC(line.len)
  152. END Expand;
  153. PROCEDURE PrintLine (f: Views.Frame; font: Fonts.Font;
  154. x0, x1, y: INTEGER; VAR line: Line);
  155. VAR sp, dx, x: INTEGER; i, j, k: INTEGER; buf: ARRAY 128 OF CHAR;
  156. BEGIN
  157. sp := (x1 - x0 - font.StringWidth(line.buf));
  158. IF line.len = 1 THEN (* center *)
  159. f.DrawString(x0 + sp DIV 2, y, Ports.defaultColor, line.buf, font)
  160. ELSE
  161. IF sp > 0 THEN dx := sp DIV (line.len - 1) ELSE dx := 0 END;
  162. k := 0; j := 0; x := x0;
  163. WHILE k < line.len DO
  164. i := 0;
  165. WHILE j < line.beg[k] DO
  166. buf[i] := line.buf[j]; INC(i); INC(j)
  167. END;
  168. buf[i] := 0X;
  169. f.DrawString(x, y, Ports.defaultColor, buf, font);
  170. x := x + font.StringWidth(buf) + dx;
  171. INC(k)
  172. END
  173. END
  174. END PrintLine;
  175. PROCEDURE PrintBanner* (f: Views.Frame; IN p: PageInfo; IN b: Banner;
  176. IN date: Dates.Date; IN time: Dates.Time; x0, x1, y: INTEGER);
  177. VAR line: Line; printing: BOOLEAN;
  178. BEGIN
  179. printing := par # NIL;
  180. IF printing THEN
  181. ASSERT(printingHook # NIL, 100);
  182. IF p.alternate & ~ODD(p.first + printingHook.Current()) THEN
  183. Expand(b.left, date, time, p.title, p.first + printingHook.Current(), printing, line)
  184. ELSE
  185. Expand(b.right, date, time, p.title, p.first + printingHook.Current(), printing, line)
  186. END
  187. ELSE
  188. Expand(b.right, date, time, p.title, 0, printing, line)
  189. END;
  190. PrintLine(f, b.font, x0, x1, y, line)
  191. END PrintBanner;
  192. PROCEDURE Current*(): INTEGER;
  193. BEGIN
  194. ASSERT(par # NIL, 21);
  195. ASSERT(printingHook # NIL, 100);
  196. RETURN printingHook.Current()
  197. END Current;
  198. BEGIN
  199. month := "JanFebMarAprMayJunJulAugSepOctNovDec"
  200. END Printing.