WMTextTool.Mod 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784
  1. MODULE WMTextTool; (** AUTHOR "TF"; PURPOSE "Text Tool"; *)
  2. IMPORT
  3. Modules, Streams, Commands, Texts, Strings, WMComponents, WMRestorable, WMEditors, WMPopups, WMRectangles,
  4. WMGraphics, WMMessages, WMStandardComponents,
  5. WM := WMWindowManager, XML, XMLObjects;
  6. CONST
  7. WindowWidth = 122; WindowHeight = 220;
  8. (* field parameter for Change procedure *)
  9. ChangeFont = {0};
  10. ChangeSize = {1};
  11. ChangeStyle = {2};
  12. ChangeFgColor = {3};
  13. ChangeBgColor = {4};
  14. (* mode parameter for Change procedure *)
  15. Absolute = 0;
  16. IncrementBy = 1;
  17. DecrementBy = 2;
  18. (* Linefeed character *)
  19. LF = 0AX;
  20. TYPE
  21. ChangeInfo = OBJECT(Texts.Attributes);
  22. VAR
  23. name : ARRAY 128 OF CHAR; (* font name *)
  24. fgColor, bgColor : WMGraphics.Color; (* foreground and background color *)
  25. deltaSize : LONGINT; (* new font size, interpretation depends on deltaSizeMode field *)
  26. deltaSizeMode : LONGINT; (* Absolute, IncrementBy or DecrementBy *)
  27. style : SET; (* font style *)
  28. fields : SET; (* What should be changed? *)
  29. END ChangeInfo;
  30. TYPE
  31. KillerMsg = OBJECT
  32. END KillerMsg;
  33. Window* = OBJECT (WMComponents.FormWindow)
  34. VAR
  35. bold, lock, comment, stupid, assert, preferred, debug, normal, incSize, decSize, get, apply: WMStandardComponents.Button;
  36. famEdit, sizeEdit, styleEdit, colorEdit, bgColEdit: WMEditors.TextField;
  37. famCheck, sizeCheck, styleCheck, colorCheck, bgColCheck: WMStandardComponents.Checkbox;
  38. styleB, colB, bgColB : WMStandardComponents.Button;
  39. popup : WMPopups.Popup;
  40. PROCEDURE CreateForm(): WMComponents.VisualComponent;
  41. VAR
  42. label : WMStandardComponents.Label;
  43. panel : WMStandardComponents.Panel;
  44. toolbar: WMStandardComponents.Panel;
  45. manager : WM.WindowManager;
  46. windowStyle : WM.WindowStyle;
  47. PROCEDURE AB(panel : WMStandardComponents.Panel; btn: WMStandardComponents.Button);
  48. BEGIN
  49. btn.alignment.Set(WMComponents.AlignLeft);
  50. btn.fillColor.Set(0FFFFFFFFH);
  51. btn.clDefault.Set(windowStyle.bgColor);
  52. btn.clTextDefault.Set(WMGraphics.Black);
  53. btn.bounds.SetWidth(WindowWidth DIV 2); panel.AddContent(btn)
  54. END AB;
  55. PROCEDURE AL(panel : WMStandardComponents.Panel; lbl : WMStandardComponents.Label);
  56. BEGIN
  57. lbl.alignment.Set(WMComponents.AlignLeft); lbl.bounds.SetWidth(31); label.textColor.Set(0000000FFH);
  58. panel.AddContent(lbl)
  59. END AL;
  60. PROCEDURE AC(panel : WMStandardComponents.Panel; chk : WMStandardComponents.Checkbox);
  61. BEGIN
  62. chk.bounds.SetWidth(16); chk.state.Set(1); chk.bearing.Set(WMRectangles.MakeRect(2, 2, 2, 2));
  63. chk.alignment.Set(WMComponents.AlignRight); chk.bounds.SetWidth(20);
  64. panel.AddContent(chk)
  65. END AC;
  66. PROCEDURE AE(panel : WMStandardComponents.Panel; edtr : WMEditors.TextField);
  67. BEGIN
  68. edtr.alignment.Set(WMComponents.AlignClient); edtr.fillColor.Set(0FFFFFF88H);
  69. panel.AddContent(edtr)
  70. END AE;
  71. PROCEDURE AD(panel : WMStandardComponents.Panel; btn : WMStandardComponents.Button);
  72. BEGIN
  73. btn.alignment.Set(WMComponents.AlignRight); btn.bounds.SetWidth(17); panel.AddContent(btn)
  74. END AD;
  75. BEGIN
  76. manager := WM.GetDefaultManager();
  77. windowStyle := manager.GetStyle();
  78. IF (windowStyle.bgColor = 0) THEN windowStyle.bgColor := WMGraphics.White; END;
  79. NEW(panel); panel.bounds.SetExtents(WindowWidth, WindowHeight); panel.takesFocus.Set(TRUE);
  80. NEW(toolbar); toolbar.bounds.SetHeight(20); toolbar.alignment.Set(WMComponents.AlignTop);
  81. panel.AddContent(toolbar);
  82. NEW(bold); bold.caption.SetAOC("Bold"); AB(toolbar, bold);
  83. NEW(lock); lock.caption.SetAOC("Lock"); AB(toolbar, lock);
  84. NEW(toolbar); toolbar.bounds.SetHeight(20); toolbar.alignment.Set(WMComponents.AlignTop);
  85. panel.AddContent(toolbar);
  86. NEW(comment); comment.caption.SetAOC("Comment"); AB(toolbar, comment);
  87. NEW(debug); debug.caption.SetAOC("Debug"); AB(toolbar, debug);
  88. NEW(toolbar); toolbar.bounds.SetHeight(20); toolbar.alignment.Set(WMComponents.AlignTop);
  89. panel.AddContent(toolbar);
  90. NEW(stupid); stupid.caption.SetAOC("Stupid"); AB(toolbar, stupid);
  91. NEW(assert); assert.caption.SetAOC("Assert"); AB(toolbar, assert);
  92. NEW(toolbar); toolbar.bounds.SetHeight(20); toolbar.alignment.Set(WMComponents.AlignTop);
  93. panel.AddContent(toolbar);
  94. NEW(preferred); preferred.caption.SetAOC("Preferred"); AB(toolbar, preferred);
  95. NEW(normal); normal.caption.SetAOC("Normal"); AB(toolbar, normal);
  96. NEW(toolbar); toolbar.bounds.SetHeight(20); toolbar.alignment.Set(WMComponents.AlignTop);
  97. panel.AddContent(toolbar);
  98. NEW(incSize); incSize.caption.SetAOC("Inc Size"); AB(toolbar, incSize);
  99. NEW(decSize); decSize.caption.SetAOC("Dec Size"); AB(toolbar, decSize);
  100. (* Get/Apply *)
  101. NEW(toolbar); toolbar.bounds.SetHeight(20); toolbar.alignment.Set(WMComponents.AlignTop);
  102. panel.AddContent(toolbar);
  103. NEW(get); get.caption.SetAOC("Get"); AB(toolbar, get);
  104. get.clDefault.Set(088000088H); get.clTextDefault.Set(WMGraphics.White);
  105. NEW(apply); apply.caption.SetAOC("Apply"); AB(toolbar, apply);
  106. apply.clDefault.Set(088000088H); apply.clTextDefault.Set(WMGraphics.White);
  107. NEW(toolbar); toolbar.bounds.SetHeight(20); toolbar.alignment.Set(WMComponents.AlignTop);
  108. toolbar.fillColor.Set(windowStyle.bgColor);
  109. panel.AddContent(toolbar);
  110. NEW(label); label.caption.SetAOC("Font:"); AL(toolbar, label);
  111. NEW(famCheck); AC(toolbar, famCheck);
  112. NEW(famEdit); famEdit.SetAsString(Texts.defaultAttributes.fontInfo.name); AE(toolbar, famEdit);
  113. NEW(toolbar); toolbar.bounds.SetHeight(20); toolbar.alignment.Set(WMComponents.AlignTop);
  114. toolbar.fillColor.Set(windowStyle.bgColor);
  115. panel.AddContent(toolbar);
  116. NEW(label); label.caption.SetAOC("Size:"); AL(toolbar, label);
  117. NEW(sizeCheck); AC(toolbar, sizeCheck);
  118. NEW(sizeEdit); sizeEdit.SetAsString("10"); AE(toolbar, sizeEdit);
  119. NEW(toolbar); toolbar.bounds.SetHeight(20); toolbar.alignment.Set(WMComponents.AlignTop);
  120. toolbar.fillColor.Set(windowStyle.bgColor);
  121. panel.AddContent(toolbar);
  122. NEW(label); label.caption.SetAOC("Style:"); AL(toolbar, label);
  123. NEW(styleCheck); AC(toolbar, styleCheck);
  124. NEW(styleB); styleB.caption.SetAOC("+"); AD(toolbar, styleB);
  125. NEW(styleEdit); styleEdit.SetAsString("Regular"); AE(toolbar, styleEdit);
  126. NEW(toolbar); toolbar.bounds.SetHeight(20); toolbar.alignment.Set(WMComponents.AlignTop);
  127. toolbar.fillColor.Set(windowStyle.bgColor);
  128. panel.AddContent(toolbar);
  129. NEW(label); label.caption.SetAOC("Color:"); AL(toolbar, label);
  130. NEW(colorCheck); AC(toolbar, colorCheck);
  131. NEW(colB); colB.caption.SetAOC("+"); AD(toolbar, colB);
  132. NEW(colorEdit); colorEdit.SetAsString("000000FF"); colorEdit.onChanged.Add(UpdateColors);
  133. AE(toolbar, colorEdit);
  134. NEW(toolbar); toolbar.bounds.SetHeight(20); toolbar.alignment.Set(WMComponents.AlignTop);
  135. toolbar.fillColor.Set(windowStyle.bgColor);
  136. panel.AddContent(toolbar);
  137. NEW(label); label.caption.SetAOC("BCol:"); AL(toolbar, label);
  138. NEW(bgColCheck); AC(toolbar, bgColCheck);
  139. NEW(bgColB); bgColB.caption.SetAOC("+"); AD(toolbar, bgColB);
  140. NEW(bgColEdit); bgColEdit.SetAsString("00000000"); bgColEdit.onChanged.Add(UpdateColors);
  141. AE(toolbar, bgColEdit);
  142. UpdateColors(NIL, NIL);
  143. RETURN panel
  144. END CreateForm;
  145. PROCEDURE &New*(c : WMRestorable.Context);
  146. VAR vc : WMComponents.VisualComponent;
  147. BEGIN
  148. scaling := TRUE;
  149. IncCount;
  150. vc := CreateForm();
  151. bold.onClick.Add(SetStyle);
  152. lock.onClick.Add(SetStyle);
  153. comment.onClick.Add(SetStyle);
  154. debug.onClick.Add(SetStyle);
  155. stupid.onClick.Add(SetStyle);
  156. assert.onClick.Add(SetStyle);
  157. preferred.onClick.Add(SetStyle);
  158. normal.onClick.Add(SetStyle);
  159. incSize.onClick.Add(SetStyle);
  160. decSize.onClick.Add(SetStyle);
  161. get.onClick.Add(GetStyle);
  162. apply.onClick.Add(SetCustomStyle);
  163. styleB.SetExtPointerDownHandler(StyleDrop);
  164. colB.SetExtPointerDownHandler(ColorHandler);
  165. bgColB.SetExtPointerDownHandler(BGColorHandler);
  166. Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), FALSE);
  167. SetContent(vc);
  168. SetTitle(Strings.NewString("Text Styles"));
  169. SetIcon(WMGraphics.LoadImage("WMIcons.tar://WMTextTool.png", TRUE));
  170. IF c # NIL THEN
  171. IF c.appData # NIL THEN
  172. DisableUpdate;
  173. LoadData(c.appData(XML.Element));
  174. EnableUpdate;
  175. END;
  176. vc.Invalidate;
  177. WMRestorable.AddByContext(SELF, c)
  178. ELSE
  179. WM.ExtAddWindow(SELF, 50, 120, {WM.FlagStayOnTop, WM.FlagFrame, WM.FlagClose, WM.FlagMinimize})
  180. END;
  181. END New;
  182. PROCEDURE GetStyle(sender, data : ANY);
  183. VAR
  184. text : Texts.Text; from, to : Texts.TextPosition;
  185. utilreader : Texts.TextReader; tempString : ARRAY 256 OF CHAR;
  186. a, b, ch : LONGINT;
  187. BEGIN
  188. IF Texts.GetLastSelection(text, from, to) THEN
  189. text.AcquireWrite;
  190. a := MIN(from.GetPosition(), to.GetPosition());
  191. b := MAX(from.GetPosition(), to.GetPosition());
  192. NEW(utilreader, text);
  193. utilreader.SetPosition(a);
  194. utilreader.ReadCh(ch);
  195. IF utilreader.attributes = NIL THEN
  196. famEdit.SetAsString("vera");
  197. sizeEdit.SetAsString("20");
  198. styleEdit.SetAsString("regular");
  199. colorEdit.SetAsString("000000FF");
  200. bgColEdit.SetAsString("00000000");
  201. ELSE
  202. famEdit.SetAsString(utilreader.attributes.fontInfo.name);
  203. Strings.IntToStr(utilreader.attributes.fontInfo.size, tempString);
  204. sizeEdit.SetAsString(tempString);
  205. IF utilreader.attributes.fontInfo.style = {} THEN
  206. styleEdit.SetAsString("Regular");
  207. ELSIF utilreader.attributes.fontInfo.style = {0} THEN
  208. styleEdit.SetAsString("Bold");
  209. ELSIF utilreader.attributes.fontInfo.style = {1} THEN
  210. styleEdit.SetAsString("Italic");
  211. ELSIF utilreader.attributes.fontInfo.style = {0,1} THEN
  212. styleEdit.SetAsString("Bold Italic");
  213. ELSE
  214. styleEdit.SetAsString("Regular");
  215. END;
  216. Strings.IntToHexStr(utilreader.attributes.color, 7, tempString);
  217. colorEdit.SetAsString(tempString);
  218. Strings.IntToHexStr(utilreader.attributes.bgcolor, 7, tempString);
  219. bgColEdit.SetAsString(tempString);
  220. END;
  221. text.ReleaseWrite
  222. END;
  223. END GetStyle;
  224. PROCEDURE SetStyle(sender, data : ANY);
  225. VAR changeInfo : ChangeInfo;
  226. BEGIN
  227. NEW(changeInfo);
  228. IF sender = bold THEN
  229. changeInfo.style := {WMGraphics.FontBold};
  230. changeInfo.fgColor := WMGraphics.RGBAToColor(0, 0, 0, 0FFH);
  231. changeInfo.fields := ChangeStyle + ChangeFgColor;
  232. ELSIF sender = lock THEN
  233. changeInfo.style := {};
  234. changeInfo.fgColor := WMGraphics.RGBAToColor(0FFH, 0, 0FFH, 0FFH);
  235. changeInfo.fields := ChangeStyle + ChangeFgColor;
  236. ELSIF sender = preferred THEN
  237. changeInfo.style := {WMGraphics.FontBold};
  238. changeInfo.fgColor := WMGraphics.RGBAToColor(0FFH, 0, 0FFH, 0FFH);
  239. changeInfo.fields := ChangeStyle + ChangeFgColor;
  240. ELSIF sender = assert THEN
  241. changeInfo.style := {WMGraphics.FontBold};
  242. changeInfo.fgColor := WMGraphics.RGBAToColor(0, 0, 0FFH, 0FFH);
  243. changeInfo.fields := ChangeStyle + ChangeFgColor;
  244. ELSIF sender = comment THEN
  245. changeInfo.style := {};
  246. changeInfo.fgColor := WMGraphics.RGBAToColor(80H, 80H, 080H, 0FFH);
  247. changeInfo.fields := ChangeStyle + ChangeFgColor;
  248. ELSIF sender = debug THEN
  249. changeInfo.style := {};
  250. changeInfo.fgColor := WMGraphics.RGBAToColor(0H, 0H, 0FFH, 0FFH);
  251. changeInfo.fields := ChangeStyle + ChangeFgColor;
  252. ELSIF sender = stupid THEN
  253. changeInfo.style := {};
  254. changeInfo.fgColor := WMGraphics.RGBAToColor(0FFH, 0H, 0H, 0FFH);
  255. changeInfo.fields := ChangeStyle + ChangeFgColor;
  256. ELSIF sender = normal THEN
  257. changeInfo.style := {};
  258. changeInfo.fgColor := WMGraphics.RGBAToColor(0H, 0H, 0H, 0FFH);
  259. changeInfo.fields := ChangeStyle + ChangeFgColor;
  260. ELSIF sender = incSize THEN
  261. changeInfo.deltaSize := 1;
  262. changeInfo.deltaSizeMode := IncrementBy;
  263. changeInfo.fields := ChangeSize;
  264. ELSIF sender = decSize THEN
  265. changeInfo.deltaSize := 1;
  266. changeInfo.deltaSizeMode := DecrementBy;
  267. changeInfo.fields := ChangeSize;
  268. END;
  269. ApplyChange(changeInfo);
  270. END SetStyle;
  271. PROCEDURE SetCustomStyle(sender, data: ANY);
  272. VAR
  273. changeInfo : ChangeInfo;
  274. string: ARRAY 32 OF CHAR;
  275. res : WORD;
  276. BEGIN
  277. NEW(changeInfo);
  278. IF (famCheck.state.Get() = 1) THEN
  279. famEdit.GetAsString(string); COPY(string, changeInfo.name);
  280. changeInfo.fields := changeInfo.fields + ChangeFont;
  281. END;
  282. IF (sizeCheck.state.Get() = 1) THEN
  283. sizeEdit.GetAsString(string); Strings.StrToInt(string, changeInfo.deltaSize); changeInfo.deltaSizeMode := Absolute;
  284. changeInfo.fields := changeInfo.fields + ChangeSize;
  285. END;
  286. IF (styleCheck.state.Get() = 1) THEN
  287. styleEdit.GetAsString(string); Strings.LowerCase(string);
  288. IF (string = "0") OR (string = "regular") THEN changeInfo.style := {};
  289. ELSIF (string = "1") OR (string = "bold") THEN changeInfo.style := {0};
  290. ELSIF (string = "2") OR (string = "italic") THEN changeInfo.style := {1};
  291. ELSIF (string = "3") OR (string = "bold italic") THEN changeInfo.style := {0,1};
  292. ELSE changeInfo.style := {};
  293. END;
  294. changeInfo.fields := changeInfo.fields + ChangeStyle;
  295. END;
  296. IF (colorCheck.state.Get() = 1) THEN
  297. colorEdit.GetAsString(string); Strings.HexStrToInt(string, changeInfo.fgColor, res);
  298. changeInfo.fields := changeInfo.fields + ChangeFgColor;
  299. END;
  300. IF (bgColCheck.state.Get() = 1) THEN
  301. bgColEdit.GetAsString(string); Strings.HexStrToInt(string, changeInfo.bgColor, res);
  302. changeInfo.fields := changeInfo.fields + ChangeBgColor;
  303. END;
  304. ApplyChange(changeInfo);
  305. END SetCustomStyle;
  306. PROCEDURE StyleDrop(x, y : LONGINT; keys : SET; VAR handled : BOOLEAN);
  307. BEGIN
  308. NEW(popup);
  309. popup.Add("Regular", StylePopupHandler);
  310. popup.Add("Bold", StylePopupHandler);
  311. popup.Add("Italic", StylePopupHandler);
  312. popup.Add("Bold Italic", StylePopupHandler);
  313. handled := TRUE;
  314. popup.Popup(bounds.r-120, bounds.t+180);
  315. END StyleDrop;
  316. PROCEDURE StylePopupHandler(sender, data: ANY);
  317. VAR button: WMStandardComponents.Button;
  318. tempString: Strings.String;
  319. BEGIN
  320. popup.Close;
  321. IF sender IS WMStandardComponents.Button THEN
  322. button := sender(WMStandardComponents.Button);
  323. tempString := button.caption.Get();
  324. IF (tempString^ = "Regular") THEN
  325. styleEdit.SetAsString("Regular");
  326. ELSIF (tempString^ = "Bold") THEN
  327. styleEdit.SetAsString("Bold");
  328. ELSIF (tempString^ = "Italic") THEN
  329. styleEdit.SetAsString("Italic");
  330. ELSIF (tempString^ = "Bold Italic") THEN
  331. styleEdit.SetAsString("Bold Italic");
  332. ELSE
  333. styleEdit.SetAsString("Regular");
  334. END;
  335. END;
  336. END StylePopupHandler;
  337. PROCEDURE ColorHandler(x, y : LONGINT; keys : SET; VAR handled : BOOLEAN);
  338. VAR colorPanel : WMPopups.ColorSwatchPopup;
  339. BEGIN
  340. NEW(colorPanel);
  341. colorPanel.onColorChosen := ColorPopupHandler;
  342. colorPanel.Popup(bounds.r-190, bounds.t+200);
  343. handled := TRUE;
  344. END ColorHandler;
  345. PROCEDURE ColorPopupHandler(result: WMGraphics.Color);
  346. VAR
  347. colorString: ARRAY 16 OF CHAR;
  348. BEGIN
  349. Strings.IntToHexStr(result, 7, colorString);
  350. colorEdit.SetAsString(colorString);
  351. colB.clDefault.Set(result);
  352. END ColorPopupHandler;
  353. PROCEDURE BGColorHandler(x, y : LONGINT; keys : SET; VAR handled : BOOLEAN);
  354. VAR colorPanel: WMPopups.ColorSwatchPopup;
  355. BEGIN
  356. NEW(colorPanel);
  357. colorPanel.onColorChosen := BGColorPopupHandler;
  358. colorPanel.Popup(bounds.r-190, bounds.t+220);
  359. handled := TRUE;
  360. END BGColorHandler;
  361. PROCEDURE BGColorPopupHandler(result: WMGraphics.Color);
  362. VAR
  363. colorString: ARRAY 16 OF CHAR;
  364. BEGIN
  365. Strings.IntToHexStr(result, 7, colorString);
  366. bgColEdit.SetAsString(colorString);
  367. bgColB.clDefault.Set(result);
  368. END BGColorPopupHandler;
  369. PROCEDURE UpdateColors(sender, data : ANY);
  370. VAR colorString : ARRAY 16 OF CHAR; caption : ARRAY 2 OF CHAR; color: LONGINT; res: WORD;
  371. BEGIN
  372. colorEdit.GetAsString(colorString);
  373. Strings.HexStrToInt(colorString, color, res);
  374. IF (res = Strings.Ok) THEN caption := "+"; ELSE caption := "E"; END;
  375. colB.caption.SetAOC(caption);
  376. colB.clDefault.Set(color);
  377. bgColEdit.GetAsString(colorString);
  378. Strings.HexStrToInt(colorString, color, res);
  379. IF (res = Strings.Ok) THEN caption := "+"; ELSE caption := "E"; END;
  380. bgColB.caption.SetAOC(caption);
  381. bgColB.clDefault.Set(color);
  382. END UpdateColors;
  383. PROCEDURE Close*;
  384. BEGIN
  385. Close^;
  386. colorEdit.onChanged.Remove(UpdateColors);
  387. bgColEdit.onChanged.Remove(UpdateColors);
  388. DecCount;
  389. END Close;
  390. PROCEDURE LoadData(elem: XML.Element);
  391. VAR i: LONGINT; str: ARRAY 128 OF CHAR;
  392. BEGIN
  393. WMRestorable.LoadLongint(elem, "famCheck", i); famCheck.state.Set(i);
  394. WMRestorable.LoadLongint(elem, "sizeCheck", i); sizeCheck.state.Set(i);
  395. WMRestorable.LoadLongint(elem, "styleCheck", i); styleCheck.state.Set(i);
  396. WMRestorable.LoadLongint(elem, "colorCheck", i); colorCheck.state.Set(i);
  397. WMRestorable.LoadLongint(elem, "bgColCheck", i); bgColCheck.state.Set(i);
  398. WMRestorable.LoadString(elem,"famEdit", str); famEdit.SetAsString(str);
  399. WMRestorable.LoadString(elem,"sizeEdit", str); sizeEdit.SetAsString(str);
  400. WMRestorable.LoadString(elem,"styleEdit", str); styleEdit.SetAsString(str);
  401. WMRestorable.LoadString(elem,"colorEdit", str); colorEdit.SetAsString(str);
  402. WMRestorable.LoadString(elem,"bgColEdit", str); bgColEdit.SetAsString(str);
  403. END LoadData;
  404. PROCEDURE StoreData(): XML.Element;
  405. VAR elem: XML.Element; string: ARRAY 128 OF CHAR;
  406. BEGIN
  407. NEW(elem); elem.SetName("Style");
  408. WMRestorable.StoreLongint(elem, "famCheck", famCheck.state.Get());
  409. famEdit.GetAsString(string);
  410. WMRestorable.StoreString(elem, "famEdit", string);
  411. WMRestorable.StoreLongint(elem, "sizeCheck", sizeCheck.state.Get());
  412. sizeEdit.GetAsString(string);
  413. WMRestorable.StoreString(elem, "sizeEdit", string);
  414. WMRestorable.StoreLongint(elem, "styleCheck", styleCheck.state.Get());
  415. styleEdit.GetAsString(string);
  416. WMRestorable.StoreString(elem, "styleEdit", string);
  417. WMRestorable.StoreLongint(elem, "colorCheck", colorCheck.state.Get());
  418. colorEdit.GetAsString(string);
  419. WMRestorable.StoreString(elem, "colorEdit", string);
  420. WMRestorable.StoreLongint(elem, "bgColCheck", bgColCheck.state.Get());
  421. bgColEdit.GetAsString(string);
  422. WMRestorable.StoreString(elem, "bgColEdit", string);
  423. RETURN elem;
  424. END StoreData;
  425. PROCEDURE Handle*(VAR x: WMMessages.Message);
  426. VAR data: XML.Element;
  427. BEGIN
  428. IF (x.msgType = WMMessages.MsgExt) & (x.ext # NIL) THEN
  429. IF (x.ext IS KillerMsg) THEN Close
  430. ELSIF (x.ext IS WMRestorable.Storage) THEN
  431. data := StoreData();
  432. x.ext(WMRestorable.Storage).Add("WMTextTool", "WMTextTool.Restore", SELF, data)
  433. ELSE Handle^(x)
  434. END
  435. ELSE Handle^(x)
  436. END
  437. END Handle;
  438. END Window;
  439. VAR
  440. nofWindows : LONGINT;
  441. (* Actually, this is a hack... but for now, do it. *)
  442. PROCEDURE GetNewSize(CONST fontname : ARRAY OF CHAR; mode, value, currentSize : LONGINT; VAR newSize : LONGINT);
  443. BEGIN
  444. ASSERT((mode = Absolute) OR (mode = IncrementBy) OR (mode = DecrementBy));
  445. IF (mode = Absolute) THEN
  446. newSize := value;
  447. ELSE
  448. IF (fontname = "Oberon") THEN
  449. IF (mode = IncrementBy) THEN
  450. IF (currentSize = 8) THEN newSize := 10;
  451. ELSIF (currentSize = 10) THEN newSize := 12;
  452. ELSIF (currentSize = 12) THEN newSize := 14;
  453. ELSIF (currentSize = 14) THEN newSize := 16;
  454. ELSIF (currentSize = 16) THEN newSize := 20;
  455. ELSIF (currentSize = 20) THEN newSize := 24;
  456. ELSIF (currentSize = 24) THEN newSize := 24;
  457. ELSE (* go to default *)
  458. newSize := 12; (* max. size of Oberon font *)
  459. END;
  460. ELSE
  461. IF (currentSize = 8) THEN newSize := 8;
  462. ELSIF (currentSize = 10) THEN newSize := 8;
  463. ELSIF (currentSize = 12) THEN newSize := 10;
  464. ELSIF (currentSize = 14) THEN newSize := 12;
  465. ELSIF (currentSize = 16) THEN newSize := 14;
  466. ELSIF (currentSize = 20) THEN newSize := 16;
  467. ELSIF (currentSize = 24) THEN newSize := 20;
  468. ELSE
  469. newSize := 12;
  470. END;
  471. END;
  472. ELSIF (fontname = "Courier") THEN
  473. IF (mode = IncrementBy) THEN
  474. IF (currentSize = 10) THEN newSize := 12;
  475. ELSE
  476. newSize := 12;
  477. END;
  478. ELSE
  479. IF (currentSize = 12) THEN newSize := 10;
  480. ELSE
  481. newSize := 12;
  482. END;
  483. END;
  484. ELSE
  485. IF (mode = IncrementBy) THEN newSize := currentSize + value; ELSE newSize := currentSize - value; END;
  486. END;
  487. END;
  488. IF (newSize < 8) THEN newSize := 8; END;
  489. END GetNewSize;
  490. PROCEDURE EnsureAttribute(VAR attr : Texts.Attributes);
  491. BEGIN
  492. IF (attr = NIL) THEN
  493. attr := Texts.defaultAttributes.Clone();
  494. END
  495. END EnsureAttribute;
  496. PROCEDURE ChangeAttribute(VAR attr : Texts.Attributes; userData : ANY);
  497. VAR changeInfo : ChangeInfo;
  498. BEGIN
  499. IF (userData # NIL) & (userData IS ChangeInfo) THEN
  500. changeInfo := userData (ChangeInfo);
  501. EnsureAttribute(attr);
  502. IF (changeInfo.fields * ChangeFont # {}) THEN (* font change *)
  503. COPY(changeInfo.name, attr.fontInfo.name);
  504. END;
  505. IF (changeInfo.fields * ChangeSize # {}) THEN (* font size change *)
  506. GetNewSize(attr.fontInfo.name, changeInfo.deltaSizeMode, changeInfo.deltaSize, attr.fontInfo.size, attr.fontInfo.size);
  507. END;
  508. IF (changeInfo.fields * ChangeFgColor # {}) THEN attr.color := changeInfo.fgColor; END;
  509. IF (changeInfo.fields * ChangeBgColor # {}) THEN attr.bgcolor := changeInfo.bgColor; END;
  510. IF (changeInfo.fields * ChangeStyle # {}) THEN attr.fontInfo.style := changeInfo.style; END;
  511. attr.fontInfo.fontcache := NIL;
  512. END;
  513. END ChangeAttribute;
  514. (* Apply text formatting changes described by <changeInfo> to the currently selected text *)
  515. PROCEDURE ApplyChange(changeInfo : ChangeInfo);
  516. VAR
  517. text : Texts.Text;
  518. from, to : Texts.TextPosition;
  519. utilreader : Texts.TextReader;
  520. a, b : LONGINT;
  521. ch : Texts.Char32;
  522. BEGIN
  523. ASSERT(changeInfo # NIL);
  524. IF Texts.GetLastSelection(text, from, to) THEN
  525. text.AcquireWrite;
  526. a := MIN(from.GetPosition(), to.GetPosition());
  527. b := MAX(from.GetPosition(), to.GetPosition());
  528. NEW(utilreader, text);
  529. utilreader.SetPosition(a);
  530. utilreader.ReadCh(ch);
  531. text.UpdateAttributes(a, b - a, ChangeAttribute, changeInfo);
  532. text.ReleaseWrite;
  533. END;
  534. END ApplyChange;
  535. (* Set the font size of the currently selected text either relativ or absolute *)
  536. PROCEDURE SetFontSize*(context : Commands.Context); (** ("Absolute"|"IncrementBy" |"DecrementBy") [value] ~*)
  537. VAR changeInfo : ChangeInfo; modeStr : ARRAY 16 OF CHAR; mode, value : LONGINT;
  538. BEGIN
  539. context.arg.SkipWhitespace; context.arg.String(modeStr);
  540. context.arg.SkipWhitespace; context.arg.Int(value, FALSE);
  541. Strings.UpperCase(modeStr);
  542. IF (modeStr = "ABSOLUTE") THEN mode := Absolute;
  543. ELSIF (modeStr = "INCREMENTBY") THEN mode := IncrementBy;
  544. ELSIF (modeStr = "DECREMENTBY") THEN mode := DecrementBy;
  545. ELSE
  546. context.error.String("WMTextStyleTool.SetFontSize: Unknown mode parameter"); context.error.Ln;
  547. RETURN;
  548. END;
  549. NEW(changeInfo);
  550. changeInfo.fields := ChangeSize;
  551. changeInfo.deltaSizeMode := mode;
  552. changeInfo.deltaSize := value;
  553. IF (mode # Absolute) & (value = 0) THEN changeInfo.deltaSize := 1; (* default increment/ decrement *) END;
  554. ApplyChange(changeInfo);
  555. END SetFontSize;
  556. (** Set the font style of the currently selected text. Default: Normal *)
  557. PROCEDURE SetFontStyle*(context : Commands.Context);
  558. VAR styleStr : ARRAY 16 OF CHAR; style : SET; changeInfo : ChangeInfo;
  559. BEGIN
  560. context.arg.SkipWhitespace; context.arg.String(styleStr);
  561. Strings.UpperCase(styleStr);
  562. IF (styleStr = "BOLD") THEN style := {WMGraphics.FontBold};
  563. ELSIF (styleStr = "ITALIC") THEN style := {WMGraphics.FontItalic};
  564. ELSIF (styleStr = "NORMAL") OR (styleStr = "") THEN style := {};
  565. ELSE
  566. context.error.String("WMTextStyleTool.SetFontStyle: Unknown font style parameter."); context.error.Ln;
  567. RETURN;
  568. END;
  569. NEW(changeInfo);
  570. changeInfo.fields := ChangeStyle;
  571. changeInfo.style := style;
  572. ApplyChange(changeInfo);
  573. END SetFontStyle;
  574. (** Set the font color of the currently selected text. If not parameter is specified, fgColor is black, bgColor is unchanged *)
  575. PROCEDURE SetFontColor*(context : Commands.Context); (** [fgColor] [bgColor] ~ *)
  576. VAR fgColor, bgColor : LONGINT; changeInfo : ChangeInfo;
  577. BEGIN
  578. context.arg.SkipWhitespace; context.arg.Int(fgColor, TRUE);
  579. context.arg.SkipWhitespace; context.arg.Int(bgColor, TRUE);
  580. NEW(changeInfo);
  581. changeInfo.fields := ChangeFgColor;
  582. changeInfo.fgColor := fgColor;
  583. IF (context.arg.res = Streams.Ok) THEN
  584. changeInfo.bgColor := bgColor;
  585. changeInfo.fields := changeInfo.fields + ChangeBgColor;
  586. END;
  587. ApplyChange(changeInfo);
  588. END SetFontColor;
  589. (** Set the font for the currently selected text. Default: default font name *)
  590. PROCEDURE SetFontName*(context : Commands.Context); (** [fontname] ~ *)
  591. VAR name : ARRAY 128 OF CHAR; changeInfo : ChangeInfo;
  592. BEGIN
  593. IF ~context.arg.GetString(name) THEN COPY(Texts.defaultAttributes.fontInfo.name, name ); END;
  594. NEW(changeInfo);
  595. COPY(name, changeInfo.name);
  596. changeInfo.fields := ChangeFont;
  597. ApplyChange(changeInfo);
  598. END SetFontName;
  599. PROCEDURE CountWords*(context : Commands.Context);
  600. VAR wordCount : LONGINT; ch : CHAR;
  601. PROCEDURE SkipWord(r : Streams.Reader);
  602. VAR ch : CHAR;
  603. BEGIN
  604. REPEAT
  605. ch := r.Get();
  606. UNTIL (r.res # Streams.Ok) OR (ORD(ch) <= 32);
  607. END SkipWord;
  608. BEGIN
  609. wordCount := 0;
  610. context.arg.SkipWhitespace;
  611. ch := context.arg.Get();
  612. WHILE (ch # 0X) & (context.arg.res = Streams.Ok) DO
  613. INC(wordCount);
  614. SkipWord(context.arg);
  615. context.arg.SkipWhitespace;
  616. ch := context.arg.Peek();
  617. END;
  618. context.out.String("Number of words: "); context.out.Int(wordCount, 0); context.out.Ln;
  619. END CountWords;
  620. PROCEDURE CountLines*(context : Commands.Context);
  621. VAR nofLines : LONGINT; ch : CHAR;
  622. BEGIN
  623. nofLines := 1;
  624. REPEAT
  625. ch := context.arg.Get();
  626. IF (ch = LF) THEN INC(nofLines); END;
  627. UNTIL (context.arg.res # Streams.Ok);
  628. context.out.String("Number of lines: "); context.out.Int(nofLines, 0); context.out.Ln;
  629. END CountLines;
  630. PROCEDURE CountCharacters*(context : Commands.Context);
  631. VAR nofCharacters : LONGINT; ch : CHAR;
  632. BEGIN
  633. nofCharacters := 0;
  634. REPEAT
  635. ch := context.arg.Get();
  636. IF (ch # 0X) THEN INC(nofCharacters); END;
  637. UNTIL (context.arg.res # Streams.Ok);
  638. context.out.String("Number of characters: "); context.out.Int(nofCharacters, 0); context.out.Ln;
  639. END CountCharacters;
  640. PROCEDURE CountAll*(context : Commands.Context);
  641. BEGIN
  642. CountCharacters(context);
  643. context.arg.SetPos(0); CountWords(context);
  644. context.arg.SetPos(0); CountLines(context);
  645. END CountAll;
  646. PROCEDURE Open*;
  647. VAR winstance : Window;
  648. BEGIN
  649. NEW(winstance, NIL);
  650. END Open;
  651. PROCEDURE Restore*(context : WMRestorable.Context);
  652. VAR w : Window;
  653. BEGIN
  654. NEW(w, context)
  655. END Restore;
  656. PROCEDURE IncCount;
  657. BEGIN {EXCLUSIVE}
  658. INC(nofWindows)
  659. END IncCount;
  660. PROCEDURE DecCount;
  661. BEGIN {EXCLUSIVE}
  662. DEC(nofWindows)
  663. END DecCount;
  664. PROCEDURE Cleanup;
  665. VAR die : KillerMsg;
  666. msg : WMMessages.Message;
  667. m : WM.WindowManager;
  668. BEGIN {EXCLUSIVE}
  669. NEW(die);
  670. msg.ext := die;
  671. msg.msgType := WMMessages.MsgExt;
  672. m := WM.GetDefaultManager();
  673. m.Broadcast(msg);
  674. AWAIT(nofWindows = 0)
  675. END Cleanup;
  676. BEGIN
  677. Modules.InstallTermHandler(Cleanup)
  678. END WMTextTool.
  679. System.Free WMTextTool ~
  680. WMTextTool.Open ~
  681. WMTextTool.SetFontSize Absolute 20 ~ WMTextTool.SetFontSize Absolute 12 ~
  682. WMTextTool.SetFontStyle normal ~ WMTextTool.SetFontStyle bold ~
  683. WMTextTool.SetFontName Courier ~ WMTextTool.SetFontName Oberon ~
  684. WMTextTool.SetFontColor 0FF0000FFH ~ WMTextTool.SetFontColor 0FFH ~
  685. WMTextTool.CountLines ^ ~
  686. WMTextTool.CountWords ^ ~
  687. WMTextTool.CountCharacters ^ ~
  688. WMTextTool.CountAll ^ ~