DEADSOFTWARE

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