Windows.Oberon.PrinterInfo.Mod 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. (* ETH Oberon, Copyright 2001 ETH Zuerich Institut fuer Computersysteme, ETH Zentrum, CH-8092 Zuerich.
  2. Refer to the "General ETH Oberon System Source License" contract available at: http://www.oberon.ethz.ch/ *)
  3. MODULE PrinterInfo IN Oberon; (** portable *) (* ejz *)
  4. IMPORT Objects, Display, Fonts, Printer, Pictures, Strings, Texts, Oberon, Attributes, Gadgets;
  5. VAR
  6. W: Texts.Writer;
  7. PROCEDURE Int(name: ARRAY OF CHAR; val: LONGINT);
  8. VAR obj: Objects.Object;
  9. BEGIN
  10. obj := Gadgets.FindObj(Gadgets.context, name);
  11. IF obj # NIL THEN
  12. Attributes.SetInt(obj, "Value", val);
  13. Gadgets.Update(obj)
  14. END
  15. END Int;
  16. PROCEDURE FixedStr(val: REAL; VAR str: ARRAY OF CHAR);
  17. VAR v, i: LONGINT;
  18. BEGIN
  19. v := ENTIER(val*100.0+0.5); i := 1;
  20. IF v >= 1000 THEN
  21. str[0] := CHR(ORD("0")+v DIV 1000)
  22. ELSE
  23. COPY(" ", str)
  24. END;
  25. str[i] := CHR(ORD("0")+(v DIV 100) MOD 10); INC(i);
  26. str[i] := "."; INC(i);
  27. str[i] := CHR(ORD("0")+(v DIV 10) MOD 10); INC(i);
  28. str[i] := CHR(ORD("0")+v MOD 10); INC(i);
  29. str[i] := 0X
  30. END FixedStr;
  31. PROCEDURE Fixed(name: ARRAY OF CHAR; val: REAL);
  32. VAR
  33. obj: Objects.Object;
  34. str: ARRAY 8 OF CHAR;
  35. BEGIN
  36. obj := Gadgets.FindObj(Gadgets.context, name);
  37. IF obj # NIL THEN
  38. FixedStr(val, str);
  39. Attributes.SetString(obj, "Value", str);
  40. Gadgets.Update(obj)
  41. END
  42. END Fixed;
  43. PROCEDURE Str(name, val: ARRAY OF CHAR);
  44. VAR obj: Objects.Object;
  45. BEGIN
  46. obj := Gadgets.FindObj(Gadgets.context, name);
  47. IF obj # NIL THEN
  48. Attributes.SetString(obj, "Value", val);
  49. Gadgets.Update(obj)
  50. END
  51. END Str;
  52. PROCEDURE unit(VAR cm: BOOLEAN);
  53. VAR
  54. obj: Objects.Object;
  55. i: LONGINT;
  56. BEGIN
  57. obj := Gadgets.FindObj(Gadgets.context, "unit");
  58. IF obj # NIL THEN
  59. Attributes.GetInt(obj, "Value", i);
  60. cm := i = 0
  61. ELSE
  62. cm := TRUE
  63. END
  64. END unit;
  65. PROCEDURE PrInfo;
  66. VAR
  67. P: Printer.Printer;
  68. cm: BOOLEAN;
  69. BEGIN
  70. unit(cm);
  71. P := Printer.current;
  72. IF P # NIL THEN
  73. Str("driver", P.gen);
  74. Int("res", 914400 DIV P.Unit);
  75. IF cm THEN
  76. Fixed("width", P.Unit*P.Width / 360000.0);
  77. Fixed("height", P.Unit*P.Height / 360000.0)
  78. ELSE
  79. Fixed("width", P.Unit*P.Width / 36000.0 / 25.4);
  80. Fixed("height", P.Unit*P.Height / 36000.0 / 25.4)
  81. END
  82. ELSE
  83. Str("driver", "no printer installed");
  84. Fixed("width", 0.0); Fixed("height", 0.0);
  85. Fixed("res", 0.0)
  86. END
  87. END PrInfo;
  88. PROCEDURE PgInfo;
  89. VAR
  90. P: Printer.Printer;
  91. cm: BOOLEAN;
  92. BEGIN
  93. unit(cm);
  94. P := Printer.current;
  95. IF P # NIL THEN
  96. IF cm THEN
  97. Fixed("left", P.Unit*P.FrameX / 360000.0);
  98. Fixed("bottom", P.Unit*P.FrameY / 360000.0);
  99. Fixed("right", P.Unit*(P.Width-P.FrameW-P.FrameX) / 360000.0);
  100. Fixed("top", P.Unit*(P.Height-P.FrameH-P.FrameY) / 360000.0)
  101. ELSE
  102. Fixed("left", P.Unit*P.FrameX / 36000.0 / 25.4);
  103. Fixed("bottom", P.Unit*P.FrameY / 36000.0 / 25.4);
  104. Fixed("right", P.Unit*(P.Width-P.FrameW-P.FrameX) / 36000.0 / 25.4);
  105. Fixed("top", P.Unit*(P.Height-P.FrameH-P.FrameY) / 36000.0 / 25.4)
  106. END
  107. ELSE
  108. Fixed("left", 0.0); Fixed("right", 0.0);
  109. Fixed("top", 0.0); Fixed("bottom", 0.0)
  110. END
  111. END PgInfo;
  112. PROCEDURE Update*;
  113. VAR
  114. S: Texts.Scanner;
  115. res: INTEGER;
  116. BEGIN
  117. Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos);
  118. Texts.Scan(S);
  119. IF S.class = Texts.Name THEN
  120. Oberon.Call(S.s, Oberon.Par, FALSE, res);
  121. Gadgets.context := Gadgets.context.dlink
  122. END;
  123. PrInfo(); PgInfo()
  124. END Update;
  125. PROCEDURE Print*;
  126. VAR
  127. S: Texts.Scanner;
  128. fnt: Fonts.Font;
  129. str: ARRAY 256 OF CHAR;
  130. printer: ARRAY 64 OF CHAR;
  131. P: Printer.Printer;
  132. t, d: LONGINT;
  133. pict: Pictures.Picture;
  134. cm1, cm4, left, left1, left2, FrameTop, y, dy, i, r, g, b: INTEGER;
  135. cm: BOOLEAN;
  136. BEGIN
  137. Texts.OpenScanner(S, Oberon.Par.text, Oberon.Par.pos);
  138. Texts.Scan(S);
  139. IF S.class IN {Texts.Name, Texts.String} THEN
  140. COPY(S.s, printer); Texts.Scan(S);
  141. IF S.class IN {Texts.Name, Texts.String} THEN
  142. COPY(S.s, str)
  143. ELSE
  144. str := ""
  145. END;
  146. Strings.AppendCh(str, Oberon.OptionChar);
  147. Strings.Append(str, "ETH Oberon Printer Test Page");
  148. Printer.Open(printer, str);
  149. IF Printer.res = 0 THEN
  150. P := Printer.current; unit(cm);
  151. Texts.WriteString(W, "Printing test page on "); Texts.WriteString(W, str);
  152. Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf);
  153. IF S.s # "" THEN
  154. Texts.WriteString(W, ", options: "); Texts.WriteString(W, S.s)
  155. END;
  156. FrameTop := P.FrameY+P.FrameH;
  157. Printer.ReplConst(P.FrameX, P.FrameY, P.FrameW, 1);
  158. Printer.ReplConst(P.FrameX, P.FrameY, 1, P.FrameH);
  159. Printer.ReplConst(P.FrameX, FrameTop-1, P.FrameW, 1);
  160. Printer.ReplConst(P.FrameX+P.FrameW-1, P.FrameY, 1, P.FrameH);
  161. cm1 := SHORT(ENTIER((360000.0 / P.Unit)+0.5));
  162. left := SHORT(ENTIER(P.FrameX+0.5*cm1+0.5));
  163. left1 := SHORT(ENTIER(left+0.5*cm1+0.5)); left2 := SHORT(ENTIER(left+3.0*cm1+0.5));
  164. fnt := Fonts.This("Default24.Scn.Fnt");
  165. Printer.String(left, SHORT(ENTIER(FrameTop-1.25*cm1+0.5)), "ETH Oberon Printer Test Page", fnt);
  166. Printer.ReplConst(P.FrameX, SHORT(ENTIER(FrameTop-2.0*cm1+0.5)), P.FrameW, 1);
  167. y := SHORT(ENTIER(FrameTop-3.0*cm1+0.5)); dy := SHORT(ENTIER(0.5*cm1+0.5));
  168. fnt := Fonts.This("Default12m.Scn.Fnt");
  169. Printer.String(left, y, "Printer Information", fnt); DEC(y, dy);
  170. fnt := Fonts.This("Default12.Scn.Fnt");
  171. Printer.String(left1, y, "Printer Driver:", fnt);
  172. Printer.String(left2, y, P.gen, fnt); DEC(y, dy);
  173. Printer.String(left1, y, "Resolution:", fnt);
  174. Strings.IntToStr(914400 DIV P.Unit, str); Strings.Append(str, " dpi");
  175. Printer.String(left2, y, str, fnt); DEC(y, dy);
  176. IF cm THEN
  177. Printer.String(left1, y, "Page Width:", fnt);
  178. FixedStr(P.Unit*P.Width / 360000.0, str); Strings.Append(str, " cm");
  179. Printer.String(left2, y, str, fnt); DEC(y, dy);
  180. Printer.String(left1, y, "Page Height:", fnt);
  181. FixedStr(P.Unit*P.Height / 360000.0, str); Strings.Append(str, " cm");
  182. Printer.String(left2, y, str, fnt); DEC(y, dy);
  183. ELSE
  184. Printer.String(left1, y, "Page Width:", fnt);
  185. FixedStr(P.Unit*P.Width / 36000.0 / 25.4, str); Strings.Append(str, " inch");
  186. Printer.String(left2, y, str, fnt); DEC(y, dy);
  187. Printer.String(left1, y, "Page Height:", fnt);
  188. FixedStr(P.Unit*P.Height / 36000.0, str); Strings.Append(str, " inch");
  189. Printer.String(left2, y, str, fnt); DEC(y, dy)
  190. END;
  191. y := SHORT(ENTIER(FrameTop-3.0*cm1+0.5)); left := SHORT(ENTIER(P.FrameX+P.FrameW/2.0+0.5));
  192. left1 := SHORT(ENTIER(left+0.5*cm1+0.5)); left2 := SHORT(ENTIER(left+3.0*cm1+0.5));
  193. fnt := Fonts.This("Default12m.Scn.Fnt");
  194. Printer.String(left, y, "Page Setup", fnt);
  195. fnt := Fonts.This("Default12.Scn.Fnt"); DEC(y, dy);
  196. IF cm THEN
  197. Printer.String(left1, y, "Left Margin:", fnt);
  198. FixedStr(P.Unit*P.FrameX / 360000.0, str); Strings.Append(str, " cm");
  199. Printer.String(left2, y, str, fnt); DEC(y, dy);
  200. Printer.String(left1, y, "Right Margin:", fnt);
  201. FixedStr(P.Unit*(P.Width-P.FrameW-P.FrameX) / 360000.0, str); Strings.Append(str, " cm");
  202. Printer.String(left2, y, str, fnt); DEC(y, dy);
  203. Printer.String(left1, y, "Bottom Margin:", fnt);
  204. FixedStr(P.Unit*P.FrameY / 360000.0, str); Strings.Append(str, " cm");
  205. Printer.String(left2, y, str, fnt); DEC(y, dy);
  206. Printer.String(left1, y, "Top Margin:", fnt);
  207. FixedStr(P.Unit*(P.Height-P.FrameH-P.FrameY) / 360000.0, str); Strings.Append(str, " cm");
  208. Printer.String(left2, y, str, fnt); DEC(y, dy)
  209. ELSE
  210. Printer.String(left1, y, "Left Margin:", fnt);
  211. FixedStr(P.Unit*P.FrameX / 36000.0 / 25.4, str); Strings.Append(str, " inch");
  212. Printer.String(left2, y, str, fnt); DEC(y, dy);
  213. Printer.String(left1, y, "Right Margin:", fnt);
  214. FixedStr(P.Unit*(P.Width-P.FrameW-P.FrameX) / 36000.0 / 25.4, str); Strings.Append(str, " inch");
  215. Printer.String(left2, y, str, fnt); DEC(y, dy);
  216. Printer.String(left1, y, "Bottom Margin:", fnt);
  217. FixedStr(P.Unit*P.FrameY / 36000.0 / 25.4, str); Strings.Append(str, " inch");
  218. Printer.String(left2, y, str, fnt); DEC(y, dy);
  219. Printer.String(left1, y, "Top Margin:", fnt);
  220. FixedStr(P.Unit*(P.Height-P.FrameH-P.FrameY) / 36000.0 / 25.4, str); Strings.Append(str, " inch");
  221. Printer.String(left2, y, str, fnt); DEC(y, dy)
  222. END;
  223. left := SHORT(ENTIER(P.FrameX+0.5*cm1+0.5));
  224. DEC(y, dy); fnt := Fonts.This("Default12m.Scn.Fnt");
  225. Printer.String(left, y, "Font Test", fnt);
  226. DEC(y, dy); DEC(y, dy);
  227. fnt := Fonts.This("Default10.Scn.Fnt"); Printer.String(left, y, "Default10", fnt);
  228. fnt := Fonts.This("Default12.Scn.Fnt"); Printer.ContString("Default12", fnt);
  229. fnt := Fonts.This("Default14.Scn.Fnt"); Printer.ContString("Default14", fnt);
  230. fnt := Fonts.This("Default16.Scn.Fnt"); Printer.ContString("Default16", fnt);
  231. fnt := Fonts.This("Default20.Scn.Fnt"); Printer.ContString("Default20", fnt);
  232. fnt := Fonts.This("Default24.Scn.Fnt"); Printer.ContString("Default24", fnt);
  233. DEC(y, dy); DEC(y, dy);
  234. fnt := Fonts.This("Default10i.Scn.Fnt"); Printer.String(left, y, "Default10i", fnt);
  235. fnt := Fonts.This("Default12i.Scn.Fnt"); Printer.ContString("Default12", fnt);
  236. fnt := Fonts.This("Default14i.Scn.Fnt"); Printer.ContString("Default14i", fnt);
  237. fnt := Fonts.This("Default16i.Scn.Fnt"); Printer.ContString("Default16i", fnt);
  238. fnt := Fonts.This("Default20i.Scn.Fnt"); Printer.ContString("Default20i", fnt);
  239. fnt := Fonts.This("Default24i.Scn.Fnt"); Printer.ContString("Default24i", fnt);
  240. DEC(y, dy); DEC(y, dy);
  241. fnt := Fonts.This("Default10m.Scn.Fnt"); Printer.String(left, y, "Default10m", fnt);
  242. fnt := Fonts.This("Default12m.Scn.Fnt"); Printer.ContString("Default12m", fnt);
  243. fnt := Fonts.This("Default14m.Scn.Fnt"); Printer.ContString("Default14m", fnt);
  244. fnt := Fonts.This("Default16m.Scn.Fnt"); Printer.ContString("Default16m", fnt);
  245. fnt := Fonts.This("Default20m.Scn.Fnt"); Printer.ContString("Default20m", fnt);
  246. fnt := Fonts.This("Default24m.Scn.Fnt"); Printer.ContString("Default24m", fnt);
  247. DEC(y, dy); DEC(y, dy);
  248. fnt := Fonts.This("Default10b.Scn.Fnt"); Printer.String(left, y, "Default10b", fnt);
  249. fnt := Fonts.This("Default12b.Scn.Fnt"); Printer.ContString("Default12b", fnt);
  250. fnt := Fonts.This("Default14b.Scn.Fnt"); Printer.ContString("Default14b", fnt);
  251. fnt := Fonts.This("Default16b.Scn.Fnt"); Printer.ContString("Default16b", fnt);
  252. fnt := Fonts.This("Default20b.Scn.Fnt"); Printer.ContString("Default20b", fnt);
  253. fnt := Fonts.This("Default24b.Scn.Fnt"); Printer.ContString("Default24b", fnt);
  254. DEC(y, dy);
  255. DEC(y, dy); fnt := Fonts.This("Default12m.Scn.Fnt");
  256. Printer.String(left, y, "Font Color Test", fnt);
  257. DEC(y, dy); DEC(y, dy);
  258. fnt := Fonts.This("Default12.Scn.Fnt");
  259. Printer.String(left, y, "", fnt);
  260. FOR i := 0 TO 15 DO
  261. Display.GetColor(i, r, g, b);
  262. Printer.UseColor(r, g, b);
  263. Strings.IntToStr(i, str); Strings.AppendCh(str, " ");
  264. Printer.ContString(str, fnt)
  265. END;
  266. Printer.UseColor(0, 0, 0);
  267. DEC(y, dy);
  268. DEC(y, dy); fnt := Fonts.This("Default12m.Scn.Fnt");
  269. Printer.String(left, y, "Pattern Test", fnt);
  270. DEC(y, dy); DEC(y, dy); DEC(y, dy);
  271. left1 := SHORT(ENTIER(P.FrameX+(P.FrameW-16*cm1)/2.0+0.5));
  272. FOR i := 0 TO 15 DO
  273. Printer.ReplPattern(left1+i*cm1, y, cm1, cm1, i)
  274. END; DEC(y, dy);
  275. DEC(y, dy); fnt := Fonts.This("Default12m.Scn.Fnt");
  276. Printer.String(left, y, "Color Test", fnt); DEC(y, dy); DEC(y, cm1);
  277. cm4 := SHORT(ENTIER((360000.0 / P.Unit / 4.0)+0.5));
  278. FOR i := 0 TO 255 DO
  279. Display.GetColor(i, r, g, b);
  280. Printer.UseColor(r, g, b);
  281. Printer.ReplConst(left1+(i MOD 64)*cm4, y+(i DIV 64)*cm4, cm4, cm4)
  282. END;
  283. Printer.UseColor(0, 0, 0);
  284. DEC(y, dy); DEC(y, dy); fnt := Fonts.This("Default12m.Scn.Fnt");
  285. Printer.String(left, y, "Miscellaneous Test", fnt); DEC(y, dy);
  286. Printer.Line(left1, y-cm1, left1, y); Printer.Line(left1+16*cm1, y-cm1,left1+16*cm1, y);
  287. Printer.Line(left1, y-cm1, left1+16*cm1, y); Printer.Line(left1, y, left1+16*cm1, y-cm1);
  288. Printer.Line(left1, y, left1+16*cm1, y); Printer.Line(left1, y-cm1, left1+16*cm1, y-cm1);
  289. Printer.Circle(left1+8*cm1, SHORT(ENTIER(y-cm1/2.0+0.5)), SHORT(ENTIER(cm1/2.0+0.5)));
  290. FOR i := 1 TO 8 DO
  291. Printer.Ellipse(left1+8*cm1, SHORT(ENTIER(y-cm1/2.0+0.5)), i*cm1, SHORT(ENTIER(cm1/2.0+0.5)))
  292. END;
  293. NEW(pict); Pictures.Open(pict, "Default.Pict", TRUE);
  294. Printer.Picture(pict, 0, 0, pict.width, pict.height, left1, SHORT(ENTIER(P.FrameY+1.5*cm1+0.5)), 16*cm1, y-P.FrameY-3*cm1, Display.replace);
  295. Printer.ReplConst(P.FrameX, P.FrameY+cm1, P.FrameW, 1);
  296. fnt := Fonts.This("Default12.Scn.Fnt"); str := "Printed on ";
  297. Strings.Append(str, printer);
  298. IF S.s # "" THEN
  299. Strings.Append(str, ", options: "); Strings.Append(str, S.s)
  300. END;
  301. Printer.String(left, SHORT(ENTIER(P.FrameY+0.3*cm1+0.5)), str, fnt);
  302. Oberon.GetClock(t, d);
  303. Strings.TimeToStr(t, str); Strings.DateToStr(d, printer);
  304. Strings.AppendCh(str, " "); Strings.Append(str, printer);
  305. Printer.String(SHORT(ENTIER(Printer.FrameX+P.FrameW-3.5*cm1+0.5)), SHORT(ENTIER(P.FrameY+0.3*cm1+0.5)), str, fnt);
  306. Printer.Page(1); Printer.Close()
  307. ELSE
  308. Texts.WriteString(W, "Printer.Open failed")
  309. END;
  310. Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf)
  311. END
  312. END Print;
  313. BEGIN
  314. Texts.OpenWriter(W)
  315. END PrinterInfo.
  316. PrinterInfo.Panel
  317. System.Free PrinterInfo ~