WMTextTool.Mod 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  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("14"); 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(Texts.defaultAttributes.fontInfo.name);
  197. Strings.IntToStr(Texts.defaultAttributes.fontInfo.size, tempString);
  198. sizeEdit.SetAsString(tempString);
  199. styleEdit.SetAsString("regular");
  200. Strings.IntToHexStr(Texts.defaultAttributes.color, 7, tempString);
  201. colorEdit.SetAsString(tempString);
  202. Strings.IntToHexStr(Texts.defaultAttributes.bgcolor, 7, tempString);
  203. bgColEdit.SetAsString(tempString);
  204. ELSE
  205. famEdit.SetAsString(utilreader.attributes.fontInfo.name);
  206. Strings.IntToStr(utilreader.attributes.fontInfo.size, tempString);
  207. sizeEdit.SetAsString(tempString);
  208. IF utilreader.attributes.fontInfo.style = {} THEN
  209. styleEdit.SetAsString("Regular");
  210. ELSIF utilreader.attributes.fontInfo.style = {0} THEN
  211. styleEdit.SetAsString("Bold");
  212. ELSIF utilreader.attributes.fontInfo.style = {1} THEN
  213. styleEdit.SetAsString("Italic");
  214. ELSIF utilreader.attributes.fontInfo.style = {0,1} THEN
  215. styleEdit.SetAsString("Bold Italic");
  216. ELSE
  217. styleEdit.SetAsString("Regular");
  218. END;
  219. Strings.IntToHexStr(utilreader.attributes.color, 7, tempString);
  220. colorEdit.SetAsString(tempString);
  221. Strings.IntToHexStr(utilreader.attributes.bgcolor, 7, tempString);
  222. bgColEdit.SetAsString(tempString);
  223. END;
  224. text.ReleaseWrite
  225. END;
  226. END GetStyle;
  227. PROCEDURE SetStyle(sender, data : ANY);
  228. VAR changeInfo : ChangeInfo;
  229. BEGIN
  230. NEW(changeInfo);
  231. IF sender = bold THEN
  232. changeInfo.style := {WMGraphics.FontBold};
  233. changeInfo.fgColor := WMGraphics.RGBAToColor(0, 0, 0, 0FFH);
  234. changeInfo.fields := ChangeStyle + ChangeFgColor;
  235. ELSIF sender = lock THEN
  236. changeInfo.style := {};
  237. changeInfo.fgColor := WMGraphics.RGBAToColor(0FFH, 0, 0FFH, 0FFH);
  238. changeInfo.fields := ChangeStyle + ChangeFgColor;
  239. ELSIF sender = preferred THEN
  240. changeInfo.style := {WMGraphics.FontBold};
  241. changeInfo.fgColor := WMGraphics.RGBAToColor(0FFH, 0, 0FFH, 0FFH);
  242. changeInfo.fields := ChangeStyle + ChangeFgColor;
  243. ELSIF sender = assert THEN
  244. changeInfo.style := {WMGraphics.FontBold};
  245. changeInfo.fgColor := WMGraphics.RGBAToColor(0, 0, 0FFH, 0FFH);
  246. changeInfo.fields := ChangeStyle + ChangeFgColor;
  247. ELSIF sender = comment THEN
  248. changeInfo.style := {};
  249. changeInfo.fgColor := WMGraphics.RGBAToColor(80H, 80H, 080H, 0FFH);
  250. changeInfo.fields := ChangeStyle + ChangeFgColor;
  251. ELSIF sender = debug THEN
  252. changeInfo.style := {};
  253. changeInfo.fgColor := WMGraphics.RGBAToColor(0H, 0H, 0FFH, 0FFH);
  254. changeInfo.fields := ChangeStyle + ChangeFgColor;
  255. ELSIF sender = stupid THEN
  256. changeInfo.style := {};
  257. changeInfo.fgColor := WMGraphics.RGBAToColor(0FFH, 0H, 0H, 0FFH);
  258. changeInfo.fields := ChangeStyle + ChangeFgColor;
  259. ELSIF sender = normal THEN
  260. changeInfo.style := {};
  261. changeInfo.fgColor := WMGraphics.RGBAToColor(0H, 0H, 0H, 0FFH);
  262. changeInfo.fields := ChangeStyle + ChangeFgColor;
  263. ELSIF sender = incSize THEN
  264. changeInfo.deltaSize := 1;
  265. changeInfo.deltaSizeMode := IncrementBy;
  266. changeInfo.fields := ChangeSize;
  267. ELSIF sender = decSize THEN
  268. changeInfo.deltaSize := 1;
  269. changeInfo.deltaSizeMode := DecrementBy;
  270. changeInfo.fields := ChangeSize;
  271. END;
  272. ApplyChange(changeInfo);
  273. END SetStyle;
  274. PROCEDURE SetCustomStyle(sender, data: ANY);
  275. VAR
  276. changeInfo : ChangeInfo;
  277. string: ARRAY 32 OF CHAR;
  278. res : WORD;
  279. BEGIN
  280. NEW(changeInfo);
  281. IF (famCheck.state.Get() = 1) THEN
  282. famEdit.GetAsString(string); COPY(string, changeInfo.name);
  283. changeInfo.fields := changeInfo.fields + ChangeFont;
  284. END;
  285. IF (sizeCheck.state.Get() = 1) THEN
  286. sizeEdit.GetAsString(string); Strings.StrToInt(string, changeInfo.deltaSize); changeInfo.deltaSizeMode := Absolute;
  287. changeInfo.fields := changeInfo.fields + ChangeSize;
  288. END;
  289. IF (styleCheck.state.Get() = 1) THEN
  290. styleEdit.GetAsString(string); Strings.LowerCase(string);
  291. IF (string = "0") OR (string = "regular") THEN changeInfo.style := {};
  292. ELSIF (string = "1") OR (string = "bold") THEN changeInfo.style := {0};
  293. ELSIF (string = "2") OR (string = "italic") THEN changeInfo.style := {1};
  294. ELSIF (string = "3") OR (string = "bold italic") THEN changeInfo.style := {0,1};
  295. ELSE changeInfo.style := {};
  296. END;
  297. changeInfo.fields := changeInfo.fields + ChangeStyle;
  298. END;
  299. IF (colorCheck.state.Get() = 1) THEN
  300. colorEdit.GetAsString(string); Strings.HexStrToInt(string, changeInfo.fgColor, res);
  301. changeInfo.fields := changeInfo.fields + ChangeFgColor;
  302. END;
  303. IF (bgColCheck.state.Get() = 1) THEN
  304. bgColEdit.GetAsString(string); Strings.HexStrToInt(string, changeInfo.bgColor, res);
  305. changeInfo.fields := changeInfo.fields + ChangeBgColor;
  306. END;
  307. ApplyChange(changeInfo);
  308. END SetCustomStyle;
  309. PROCEDURE StyleDrop(x, y : LONGINT; keys : SET; VAR handled : BOOLEAN);
  310. BEGIN
  311. NEW(popup);
  312. popup.Add("Regular", StylePopupHandler);
  313. popup.Add("Bold", StylePopupHandler);
  314. popup.Add("Italic", StylePopupHandler);
  315. popup.Add("Bold Italic", StylePopupHandler);
  316. handled := TRUE;
  317. popup.Popup(bounds.r-120, bounds.t+180);
  318. END StyleDrop;
  319. PROCEDURE StylePopupHandler(sender, data: ANY);
  320. VAR button: WMStandardComponents.Button;
  321. tempString: Strings.String;
  322. BEGIN
  323. popup.Close;
  324. IF sender IS WMStandardComponents.Button THEN
  325. button := sender(WMStandardComponents.Button);
  326. tempString := button.caption.Get();
  327. IF (tempString^ = "Regular") THEN
  328. styleEdit.SetAsString("Regular");
  329. ELSIF (tempString^ = "Bold") THEN
  330. styleEdit.SetAsString("Bold");
  331. ELSIF (tempString^ = "Italic") THEN
  332. styleEdit.SetAsString("Italic");
  333. ELSIF (tempString^ = "Bold Italic") THEN
  334. styleEdit.SetAsString("Bold Italic");
  335. ELSE
  336. styleEdit.SetAsString("Regular");
  337. END;
  338. END;
  339. END StylePopupHandler;
  340. PROCEDURE ColorHandler(x, y : LONGINT; keys : SET; VAR handled : BOOLEAN);
  341. VAR colorPanel : WMPopups.ColorSwatchPopup;
  342. BEGIN
  343. NEW(colorPanel);
  344. colorPanel.onColorChosen := ColorPopupHandler;
  345. colorPanel.Popup(bounds.r-190, bounds.t+200);
  346. handled := TRUE;
  347. END ColorHandler;
  348. PROCEDURE ColorPopupHandler(result: WMGraphics.Color);
  349. VAR
  350. colorString: ARRAY 16 OF CHAR;
  351. BEGIN
  352. Strings.IntToHexStr(result, 7, colorString);
  353. colorEdit.SetAsString(colorString);
  354. colB.clDefault.Set(result);
  355. END ColorPopupHandler;
  356. PROCEDURE BGColorHandler(x, y : LONGINT; keys : SET; VAR handled : BOOLEAN);
  357. VAR colorPanel: WMPopups.ColorSwatchPopup;
  358. BEGIN
  359. NEW(colorPanel);
  360. colorPanel.onColorChosen := BGColorPopupHandler;
  361. colorPanel.Popup(bounds.r-190, bounds.t+220);
  362. handled := TRUE;
  363. END BGColorHandler;
  364. PROCEDURE BGColorPopupHandler(result: WMGraphics.Color);
  365. VAR
  366. colorString: ARRAY 16 OF CHAR;
  367. BEGIN
  368. Strings.IntToHexStr(result, 7, colorString);
  369. bgColEdit.SetAsString(colorString);
  370. bgColB.clDefault.Set(result);
  371. END BGColorPopupHandler;
  372. PROCEDURE UpdateColors(sender, data : ANY);
  373. VAR colorString : ARRAY 16 OF CHAR; caption : ARRAY 2 OF CHAR; color: LONGINT; res: WORD;
  374. BEGIN
  375. colorEdit.GetAsString(colorString);
  376. Strings.HexStrToInt(colorString, color, res);
  377. IF (res = Strings.Ok) THEN caption := "+"; ELSE caption := "E"; END;
  378. colB.caption.SetAOC(caption);
  379. colB.clDefault.Set(color);
  380. bgColEdit.GetAsString(colorString);
  381. Strings.HexStrToInt(colorString, color, res);
  382. IF (res = Strings.Ok) THEN caption := "+"; ELSE caption := "E"; END;
  383. bgColB.caption.SetAOC(caption);
  384. bgColB.clDefault.Set(color);
  385. END UpdateColors;
  386. PROCEDURE Close*;
  387. BEGIN
  388. Close^;
  389. colorEdit.onChanged.Remove(UpdateColors);
  390. bgColEdit.onChanged.Remove(UpdateColors);
  391. DecCount;
  392. END Close;
  393. PROCEDURE LoadData(elem: XML.Element);
  394. VAR i: LONGINT; str: ARRAY 128 OF CHAR;
  395. BEGIN
  396. WMRestorable.LoadLongint(elem, "famCheck", i); famCheck.state.Set(i);
  397. WMRestorable.LoadLongint(elem, "sizeCheck", i); sizeCheck.state.Set(i);
  398. WMRestorable.LoadLongint(elem, "styleCheck", i); styleCheck.state.Set(i);
  399. WMRestorable.LoadLongint(elem, "colorCheck", i); colorCheck.state.Set(i);
  400. WMRestorable.LoadLongint(elem, "bgColCheck", i); bgColCheck.state.Set(i);
  401. WMRestorable.LoadString(elem,"famEdit", str); famEdit.SetAsString(str);
  402. WMRestorable.LoadString(elem,"sizeEdit", str); sizeEdit.SetAsString(str);
  403. WMRestorable.LoadString(elem,"styleEdit", str); styleEdit.SetAsString(str);
  404. WMRestorable.LoadString(elem,"colorEdit", str); colorEdit.SetAsString(str);
  405. WMRestorable.LoadString(elem,"bgColEdit", str); bgColEdit.SetAsString(str);
  406. END LoadData;
  407. PROCEDURE StoreData(): XML.Element;
  408. VAR elem: XML.Element; string: ARRAY 128 OF CHAR;
  409. BEGIN
  410. NEW(elem); elem.SetName("Style");
  411. WMRestorable.StoreLongint(elem, "famCheck", famCheck.state.Get());
  412. famEdit.GetAsString(string);
  413. WMRestorable.StoreString(elem, "famEdit", string);
  414. WMRestorable.StoreLongint(elem, "sizeCheck", sizeCheck.state.Get());
  415. sizeEdit.GetAsString(string);
  416. WMRestorable.StoreString(elem, "sizeEdit", string);
  417. WMRestorable.StoreLongint(elem, "styleCheck", styleCheck.state.Get());
  418. styleEdit.GetAsString(string);
  419. WMRestorable.StoreString(elem, "styleEdit", string);
  420. WMRestorable.StoreLongint(elem, "colorCheck", colorCheck.state.Get());
  421. colorEdit.GetAsString(string);
  422. WMRestorable.StoreString(elem, "colorEdit", string);
  423. WMRestorable.StoreLongint(elem, "bgColCheck", bgColCheck.state.Get());
  424. bgColEdit.GetAsString(string);
  425. WMRestorable.StoreString(elem, "bgColEdit", string);
  426. RETURN elem;
  427. END StoreData;
  428. PROCEDURE Handle*(VAR x: WMMessages.Message);
  429. VAR data: XML.Element;
  430. BEGIN
  431. IF (x.msgType = WMMessages.MsgExt) & (x.ext # NIL) THEN
  432. IF (x.ext IS KillerMsg) THEN Close
  433. ELSIF (x.ext IS WMRestorable.Storage) THEN
  434. data := StoreData();
  435. x.ext(WMRestorable.Storage).Add("WMTextTool", "WMTextTool.Restore", SELF, data)
  436. ELSE Handle^(x)
  437. END
  438. ELSE Handle^(x)
  439. END
  440. END Handle;
  441. END Window;
  442. VAR
  443. nofWindows : LONGINT;
  444. (* Actually, this is a hack... but for now, do it. *)
  445. PROCEDURE GetNewSize(CONST fontname : ARRAY OF CHAR; mode, value, currentSize : LONGINT; VAR newSize : LONGINT);
  446. BEGIN
  447. ASSERT((mode = Absolute) OR (mode = IncrementBy) OR (mode = DecrementBy));
  448. IF (mode = Absolute) THEN
  449. newSize := value;
  450. ELSE
  451. IF (fontname = "Oberon") THEN
  452. IF (mode = IncrementBy) THEN
  453. IF (currentSize = 8) THEN newSize := 10;
  454. ELSIF (currentSize = 10) THEN newSize := 12;
  455. ELSIF (currentSize = 12) THEN newSize := 14;
  456. ELSIF (currentSize = 14) THEN newSize := 16;
  457. ELSIF (currentSize = 16) THEN newSize := 20;
  458. ELSIF (currentSize = 20) THEN newSize := 24;
  459. ELSIF (currentSize = 24) THEN newSize := 24;
  460. ELSE (* go to default *)
  461. newSize := 12; (* max. size of Oberon font *)
  462. END;
  463. ELSE
  464. IF (currentSize = 8) THEN newSize := 8;
  465. ELSIF (currentSize = 10) THEN newSize := 8;
  466. ELSIF (currentSize = 12) THEN newSize := 10;
  467. ELSIF (currentSize = 14) THEN newSize := 12;
  468. ELSIF (currentSize = 16) THEN newSize := 14;
  469. ELSIF (currentSize = 20) THEN newSize := 16;
  470. ELSIF (currentSize = 24) THEN newSize := 20;
  471. ELSE
  472. newSize := 12;
  473. END;
  474. END;
  475. ELSIF (fontname = "Courier") THEN
  476. IF (mode = IncrementBy) THEN
  477. IF (currentSize = 10) THEN newSize := 12;
  478. ELSE
  479. newSize := 12;
  480. END;
  481. ELSE
  482. IF (currentSize = 12) THEN newSize := 10;
  483. ELSE
  484. newSize := 12;
  485. END;
  486. END;
  487. ELSE
  488. IF (mode = IncrementBy) THEN newSize := currentSize + value; ELSE newSize := currentSize - value; END;
  489. END;
  490. END;
  491. IF (newSize < 8) THEN newSize := 8; END;
  492. END GetNewSize;
  493. PROCEDURE EnsureAttribute(VAR attr : Texts.Attributes);
  494. BEGIN
  495. IF (attr = NIL) THEN
  496. attr := Texts.defaultAttributes.Clone();
  497. END
  498. END EnsureAttribute;
  499. PROCEDURE ChangeAttribute(VAR attr : Texts.Attributes; userData : ANY);
  500. VAR changeInfo : ChangeInfo;
  501. BEGIN
  502. IF (userData # NIL) & (userData IS ChangeInfo) THEN
  503. changeInfo := userData (ChangeInfo);
  504. EnsureAttribute(attr);
  505. IF (changeInfo.fields * ChangeFont # {}) THEN (* font change *)
  506. COPY(changeInfo.name, attr.fontInfo.name);
  507. END;
  508. IF (changeInfo.fields * ChangeSize # {}) THEN (* font size change *)
  509. GetNewSize(attr.fontInfo.name, changeInfo.deltaSizeMode, changeInfo.deltaSize, attr.fontInfo.size, attr.fontInfo.size);
  510. END;
  511. IF (changeInfo.fields * ChangeFgColor # {}) THEN attr.color := changeInfo.fgColor; END;
  512. IF (changeInfo.fields * ChangeBgColor # {}) THEN attr.bgcolor := changeInfo.bgColor; END;
  513. IF (changeInfo.fields * ChangeStyle # {}) THEN attr.fontInfo.style := changeInfo.style; END;
  514. attr.fontInfo.fontcache := NIL;
  515. END;
  516. END ChangeAttribute;
  517. (* Apply text formatting changes described by <changeInfo> to the currently selected text *)
  518. PROCEDURE ApplyChange(changeInfo : ChangeInfo);
  519. VAR
  520. text : Texts.Text;
  521. from, to : Texts.TextPosition;
  522. utilreader : Texts.TextReader;
  523. a, b : LONGINT;
  524. ch : Texts.Char32;
  525. BEGIN
  526. ASSERT(changeInfo # NIL);
  527. IF Texts.GetLastSelection(text, from, to) THEN
  528. text.AcquireWrite;
  529. a := MIN(from.GetPosition(), to.GetPosition());
  530. b := MAX(from.GetPosition(), to.GetPosition());
  531. NEW(utilreader, text);
  532. utilreader.SetPosition(a);
  533. utilreader.ReadCh(ch);
  534. text.UpdateAttributes(a, b - a, ChangeAttribute, changeInfo);
  535. text.ReleaseWrite;
  536. END;
  537. END ApplyChange;
  538. (* Set the font size of the currently selected text either relativ or absolute *)
  539. PROCEDURE SetFontSize*(context : Commands.Context); (** ("Absolute"|"IncrementBy" |"DecrementBy") [value] ~*)
  540. VAR changeInfo : ChangeInfo; modeStr : ARRAY 16 OF CHAR; mode, value : LONGINT;
  541. BEGIN
  542. context.arg.SkipWhitespace; context.arg.String(modeStr);
  543. context.arg.SkipWhitespace; context.arg.Int(value, FALSE);
  544. Strings.UpperCase(modeStr);
  545. IF (modeStr = "ABSOLUTE") THEN mode := Absolute;
  546. ELSIF (modeStr = "INCREMENTBY") THEN mode := IncrementBy;
  547. ELSIF (modeStr = "DECREMENTBY") THEN mode := DecrementBy;
  548. ELSE
  549. context.error.String("WMTextStyleTool.SetFontSize: Unknown mode parameter"); context.error.Ln;
  550. RETURN;
  551. END;
  552. NEW(changeInfo);
  553. changeInfo.fields := ChangeSize;
  554. changeInfo.deltaSizeMode := mode;
  555. changeInfo.deltaSize := value;
  556. IF (mode # Absolute) & (value = 0) THEN changeInfo.deltaSize := 1; (* default increment/ decrement *) END;
  557. ApplyChange(changeInfo);
  558. END SetFontSize;
  559. (** Set the font style of the currently selected text. Default: Normal *)
  560. PROCEDURE SetFontStyle*(context : Commands.Context);
  561. VAR styleStr : ARRAY 16 OF CHAR; style : SET; changeInfo : ChangeInfo;
  562. BEGIN
  563. context.arg.SkipWhitespace; context.arg.String(styleStr);
  564. Strings.UpperCase(styleStr);
  565. IF (styleStr = "BOLD") THEN style := {WMGraphics.FontBold};
  566. ELSIF (styleStr = "ITALIC") THEN style := {WMGraphics.FontItalic};
  567. ELSIF (styleStr = "NORMAL") OR (styleStr = "") THEN style := {};
  568. ELSE
  569. context.error.String("WMTextStyleTool.SetFontStyle: Unknown font style parameter."); context.error.Ln;
  570. RETURN;
  571. END;
  572. NEW(changeInfo);
  573. changeInfo.fields := ChangeStyle;
  574. changeInfo.style := style;
  575. ApplyChange(changeInfo);
  576. END SetFontStyle;
  577. (** Set the font color of the currently selected text. If not parameter is specified, fgColor is black, bgColor is unchanged *)
  578. PROCEDURE SetFontColor*(context : Commands.Context); (** [fgColor] [bgColor] ~ *)
  579. VAR fgColor, bgColor : LONGINT; changeInfo : ChangeInfo;
  580. BEGIN
  581. context.arg.SkipWhitespace; context.arg.Int(fgColor, TRUE);
  582. context.arg.SkipWhitespace; context.arg.Int(bgColor, TRUE);
  583. NEW(changeInfo);
  584. changeInfo.fields := ChangeFgColor;
  585. changeInfo.fgColor := fgColor;
  586. IF (context.arg.res = Streams.Ok) THEN
  587. changeInfo.bgColor := bgColor;
  588. changeInfo.fields := changeInfo.fields + ChangeBgColor;
  589. END;
  590. ApplyChange(changeInfo);
  591. END SetFontColor;
  592. (** Set the font for the currently selected text. Default: default font name *)
  593. PROCEDURE SetFontName*(context : Commands.Context); (** [fontname] ~ *)
  594. VAR name : ARRAY 128 OF CHAR; changeInfo : ChangeInfo;
  595. BEGIN
  596. IF ~context.arg.GetString(name) THEN COPY(Texts.defaultAttributes.fontInfo.name, name ); END;
  597. NEW(changeInfo);
  598. COPY(name, changeInfo.name);
  599. changeInfo.fields := ChangeFont;
  600. ApplyChange(changeInfo);
  601. END SetFontName;
  602. PROCEDURE CountWords*(context : Commands.Context);
  603. VAR wordCount : LONGINT; ch : CHAR;
  604. PROCEDURE SkipWord(r : Streams.Reader);
  605. VAR ch : CHAR;
  606. BEGIN
  607. REPEAT
  608. ch := r.Get();
  609. UNTIL (r.res # Streams.Ok) OR (ORD(ch) <= 32);
  610. END SkipWord;
  611. BEGIN
  612. wordCount := 0;
  613. context.arg.SkipWhitespace;
  614. ch := context.arg.Get();
  615. WHILE (ch # 0X) & (context.arg.res = Streams.Ok) DO
  616. INC(wordCount);
  617. SkipWord(context.arg);
  618. context.arg.SkipWhitespace;
  619. ch := context.arg.Peek();
  620. END;
  621. context.out.String("Number of words: "); context.out.Int(wordCount, 0); context.out.Ln;
  622. END CountWords;
  623. PROCEDURE CountLines*(context : Commands.Context);
  624. VAR nofLines : LONGINT; ch : CHAR;
  625. BEGIN
  626. nofLines := 1;
  627. REPEAT
  628. ch := context.arg.Get();
  629. IF (ch = LF) THEN INC(nofLines); END;
  630. UNTIL (context.arg.res # Streams.Ok);
  631. context.out.String("Number of lines: "); context.out.Int(nofLines, 0); context.out.Ln;
  632. END CountLines;
  633. PROCEDURE CountCharacters*(context : Commands.Context);
  634. VAR nofCharacters : LONGINT; ch : CHAR;
  635. BEGIN
  636. nofCharacters := 0;
  637. REPEAT
  638. ch := context.arg.Get();
  639. IF (ch # 0X) THEN INC(nofCharacters); END;
  640. UNTIL (context.arg.res # Streams.Ok);
  641. context.out.String("Number of characters: "); context.out.Int(nofCharacters, 0); context.out.Ln;
  642. END CountCharacters;
  643. PROCEDURE CountAll*(context : Commands.Context);
  644. BEGIN
  645. CountCharacters(context);
  646. context.arg.SetPos(0); CountWords(context);
  647. context.arg.SetPos(0); CountLines(context);
  648. END CountAll;
  649. PROCEDURE Open*;
  650. VAR winstance : Window;
  651. BEGIN
  652. NEW(winstance, NIL);
  653. END Open;
  654. PROCEDURE Restore*(context : WMRestorable.Context);
  655. VAR w : Window;
  656. BEGIN
  657. NEW(w, context)
  658. END Restore;
  659. PROCEDURE IncCount;
  660. BEGIN {EXCLUSIVE}
  661. INC(nofWindows)
  662. END IncCount;
  663. PROCEDURE DecCount;
  664. BEGIN {EXCLUSIVE}
  665. DEC(nofWindows)
  666. END DecCount;
  667. PROCEDURE Cleanup;
  668. VAR die : KillerMsg;
  669. msg : WMMessages.Message;
  670. m : WM.WindowManager;
  671. BEGIN {EXCLUSIVE}
  672. NEW(die);
  673. msg.ext := die;
  674. msg.msgType := WMMessages.MsgExt;
  675. m := WM.GetDefaultManager();
  676. m.Broadcast(msg);
  677. AWAIT(nofWindows = 0)
  678. END Cleanup;
  679. BEGIN
  680. Modules.InstallTermHandler(Cleanup)
  681. END WMTextTool.
  682. System.Free WMTextTool ~
  683. WMTextTool.Open ~
  684. WMTextTool.SetFontSize Absolute 20 ~ WMTextTool.SetFontSize Absolute 12 ~
  685. WMTextTool.SetFontStyle normal ~ WMTextTool.SetFontStyle bold ~
  686. WMTextTool.SetFontName Courier ~ WMTextTool.SetFontName Oberon ~
  687. WMTextTool.SetFontColor 0FF0000FFH ~ WMTextTool.SetFontColor 0FFH ~
  688. WMTextTool.CountLines ^ ~
  689. WMTextTool.CountWords ^ ~
  690. WMTextTool.CountCharacters ^ ~
  691. WMTextTool.CountAll ^ ~