DTPUtilities.Mod 80 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165
  1. MODULE DTPUtilities; (** AUTHOR "PL"; PURPOSE "Utilities for simple DTP Editor"; *)
  2. IMPORT
  3. KernelLog, Files, XML, XMLParser, XMLScanner,
  4. WMStandardComponents, WMGraphics, WMGraphicUtilities, XMLObjects,
  5. WMComponents, WMRectangles, WMDialogs, Texts,
  6. WMEditors, Dates, Strings, WMGrids, WMStringGrids,
  7. WMWindowManager, WMPopups, Raster, WMEvents, WMRasterScale, DTPData;
  8. CONST
  9. VAR
  10. TYPE
  11. (* --- Generic Object Property Window ---------------------------- *)
  12. ObjectPropertyWindow* = OBJECT(WMComponents.FormWindow)
  13. VAR
  14. END ObjectPropertyWindow;
  15. (* --- Object Properties ---------------------------------------- *)
  16. PropertyEntry* = OBJECT
  17. VAR
  18. PROCEDURE Set*;
  19. END Set;
  20. PROCEDURE Get*;
  21. END Get;
  22. END PropertyEntry;
  23. StringPropertyEntry* = OBJECT(PropertyEntry)
  24. VAR name: ARRAY 16 OF CHAR;
  25. value: ARRAY 32 OF CHAR;
  26. onClick: WMEvents.EventSource;
  27. END StringPropertyEntry;
  28. RealPropertyEntry* = OBJECT(PropertyEntry)
  29. VAR name: ARRAY 16 OF CHAR;
  30. value: REAL;
  31. onClick: WMEvents.EventSource;
  32. END RealPropertyEntry;
  33. IntPropertyEntry* = OBJECT(PropertyEntry)
  34. VAR name: ARRAY 16 OF CHAR;
  35. value: LONGINT;
  36. onClick: WMEvents.EventSource;
  37. END IntPropertyEntry;
  38. BooleanPropertyEntry* = OBJECT(PropertyEntry)
  39. VAR name: ARRAY 16 OF CHAR;
  40. value: BOOLEAN;
  41. onClick: WMEvents.EventSource;
  42. END BooleanPropertyEntry;
  43. PropertyList* = OBJECT
  44. VAR list: ARRAY 16 OF PropertyEntry;
  45. PROCEDURE Add(entry: PropertyEntry);
  46. END Add;
  47. PROCEDURE Grow;
  48. END Grow;
  49. END PropertyList;
  50. (* --- List Chooser -------------------------------------------- *)
  51. ListChooserWindow* = OBJECT(WMComponents.FormWindow)
  52. END ListChooserWindow;
  53. ListChooser* = OBJECT(WMComponents.VisualComponent)
  54. END ListChooser;
  55. (* --- Color Chooser ------------------------------------------- *)
  56. ColorChooserWindow* = OBJECT(WMComponents.FormWindow)
  57. VAR
  58. chooser : ColorChooser;
  59. label : WMStandardComponents.Label;
  60. panel : WMStandardComponents.Panel;
  61. button : WMStandardComponents.Button;
  62. result: WORD; chosenColor* : WMGraphics.Color;
  63. shown : BOOLEAN;
  64. PROCEDURE CreateForm() : WMComponents.VisualComponent;
  65. BEGIN
  66. NEW(chooser); chooser.SetCaller(SELF);
  67. chooser.bounds.SetExtents(190, 70);
  68. RETURN chooser
  69. END CreateForm;
  70. PROCEDURE &New*;
  71. VAR vc : WMComponents.VisualComponent;
  72. BEGIN
  73. vc := CreateForm();
  74. Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), FALSE);
  75. SetContent(vc);
  76. (* SetTitle(Strings.NewString("Color Chooser")); *)
  77. END New;
  78. PROCEDURE Show*(x, y: LONGINT; VAR chosen: WMGraphics.Color):BOOLEAN;
  79. BEGIN
  80. IF ~shown THEN
  81. result := -1; shown := TRUE;
  82. manager := WMWindowManager.GetDefaultManager();
  83. manager.Add(x, y, SELF, {WMWindowManager.FlagStayOnTop});
  84. manager.SetFocus(SELF);
  85. BEGIN {EXCLUSIVE}
  86. AWAIT (result >= 0)
  87. END;
  88. manager.Remove(SELF); shown := FALSE;
  89. END;
  90. IF result = 0 THEN
  91. chosen := chosenColor;
  92. RETURN TRUE
  93. ELSE
  94. RETURN FALSE;
  95. END;
  96. END Show;
  97. PROCEDURE Hide*;
  98. BEGIN
  99. manager := WMWindowManager.GetDefaultManager();
  100. manager.Remove(SELF); shown := FALSE;
  101. END Hide;
  102. PROCEDURE FocusLost*;
  103. BEGIN
  104. SetResult(1);
  105. END FocusLost;
  106. PROCEDURE PressHandler(sender, data : ANY);
  107. VAR value : ARRAY 32 OF CHAR;
  108. BEGIN
  109. KernelLog.String("pressed: "); KernelLog.String(value); KernelLog.Ln;
  110. END PressHandler;
  111. PROCEDURE OKHandler(sender, data : ANY);
  112. BEGIN
  113. Hide;
  114. END OKHandler;
  115. PROCEDURE SetResult(res: WORD);
  116. BEGIN {EXCLUSIVE}
  117. result := res;
  118. END SetResult;
  119. PROCEDURE GetFieldContent(VAR string : ARRAY OF CHAR);
  120. END GetFieldContent;
  121. END ColorChooserWindow;
  122. ColorChooser* = OBJECT(WMComponents.VisualComponent)
  123. VAR
  124. colors : ARRAY 19 OF LONGINT;
  125. theCaller: ColorChooserWindow;
  126. PROCEDURE &Init*;
  127. BEGIN
  128. Init^;
  129. BuildPalette;
  130. END Init;
  131. PROCEDURE SetCaller(caller: ColorChooserWindow);
  132. BEGIN
  133. theCaller := caller;
  134. END SetCaller;
  135. PROCEDURE PointerDown*(x, y : LONGINT; keys : SET);
  136. VAR r, g, b, a, i, j: LONGINT; cColor: WMGraphics.Color;
  137. BEGIN
  138. i := y DIV 10; j := x DIV 10;
  139. IF (i>= 0) & (i<=2) THEN
  140. WMGraphics.ColorToRGBA(colors[j], r, g, b, a);
  141. r := ENTIER((i+1)/4*r); g:= ENTIER((i+1)/4*g); b:= ENTIER((i+1)/4*b);
  142. cColor := WMGraphics.RGBAToColor(r, g, b, a);
  143. ELSIF (i= 3) THEN
  144. cColor := colors[j];
  145. ELSIF (i>=4) & (i<=6) THEN
  146. i := i - 4;
  147. WMGraphics.ColorToRGBA(colors[j], r, g, b, a);
  148. r := 255-ENTIER((3-i)/4*(255-r)); g:= 255-ENTIER((3-i)/4*(255-g)); b:= 255-ENTIER((3-i)/4*(255-b));
  149. cColor := WMGraphics.RGBAToColor(r, g, b, a);
  150. ELSE
  151. END;
  152. IF (y<0) & (y>70) THEN
  153. theCaller.SetResult(1);
  154. ELSE
  155. theCaller.chosenColor := cColor;
  156. theCaller.SetResult(0);
  157. END;
  158. END PointerDown;
  159. (* PROCEDURE FocusLost;
  160. BEGIN
  161. FocusLost^;
  162. theCaller.SetResult(1);
  163. END FocusLost;
  164. *)
  165. PROCEDURE Draw*(canvas: WMGraphics.Canvas);
  166. VAR r, g, b, a, i, j: LONGINT; color: WMGraphics.Color;
  167. BEGIN
  168. Draw^(canvas);
  169. FOR i := 0 TO 2 DO
  170. FOR j := 0 TO 18 DO
  171. WMGraphics.ColorToRGBA(colors[j], r, g, b, a);
  172. r := ENTIER((i+1)/4*r); g:= ENTIER((i+1)/4*g); b:= ENTIER((i+1)/4*b);
  173. color := WMGraphics.RGBAToColor(r, g, b, a);
  174. canvas.Fill(WMRectangles.MakeRect(10*j,10*i,10*j+10,10*i+10),color , WMGraphics.ModeCopy);
  175. END;
  176. END;
  177. FOR j := 0 TO 18 DO
  178. color := colors[j];
  179. canvas.Fill(WMRectangles.MakeRect(10*j,30,10*j+10,10+30),color , WMGraphics.ModeCopy);
  180. END;
  181. FOR i := 0 TO 2 DO
  182. FOR j := 0 TO 18 DO
  183. WMGraphics.ColorToRGBA(colors[j], r, g, b, a);
  184. r := 255-ENTIER((3-i)/4*(255-r)); g:= 255-ENTIER((3-i)/4*(255-g)); b:= 255-ENTIER((3-i)/4*(255-b));
  185. color := WMGraphics.RGBAToColor(r, g, b, a);
  186. canvas.Fill(WMRectangles.MakeRect(10*j,10*i+40,10*j+10,10*i+10+40),color , WMGraphics.ModeCopy);
  187. END;
  188. END;
  189. END Draw;
  190. PROCEDURE BuildPalette;
  191. BEGIN
  192. colors[0] := LONGINT(0FF0000FFH); (* red *)
  193. colors[1] := LONGINT(0FF5500FFH);
  194. colors[2] := LONGINT(0FFAA00FFH);
  195. colors[3] := LONGINT(0FFFF00FFH); (* yellow *)
  196. colors[4] := LONGINT(0AAFF00FFH);
  197. colors[5] := 055FF00FFH;
  198. colors[6] := 000FF00FFH; (* green *)
  199. colors[7] := 000FF55FFH;
  200. colors[8] := 000FFAAFFH;
  201. colors[9] := 000FFFFFFH; (* cyan *)
  202. colors[10] := 000AAFFFFH;
  203. colors[11] := 00055FFFFH;
  204. colors[12] := 00000FFFFH; (* blue *)
  205. colors[13] := 05500FFFFH;
  206. colors[14] :=LONGINT( 0AA00FFFFH);
  207. colors[15] :=LONGINT( 0FF00FFFFH); (* magenta *)
  208. colors[16] :=LONGINT( 0FF00AAFFH);
  209. colors[17] :=LONGINT( 0FF0055FFH);
  210. colors[18] :=LONGINT( 0888888FFH); (* grey *)
  211. END BuildPalette;
  212. END ColorChooser;
  213. (* --- Style Editor ------------------------------------------- *)
  214. CONST
  215. AlignLeft = 0; AlignCenter = 1; AlignRight = 2; AlignJustified = 3;
  216. StyleRegular = 0; StyleBold = 1; StyleItalic = 2; StyleBoldItalic = 3;
  217. TYPE
  218. ContextMenuData = OBJECT
  219. VAR val: LONGINT;
  220. PROCEDURE &New*(val: LONGINT);
  221. BEGIN
  222. SELF.val := val;
  223. END New;
  224. END ContextMenuData;
  225. StyleEditor* = OBJECT(WMComponents.FormWindow)
  226. VAR
  227. document : DTPData.Document;
  228. pstyleButton, cstyleButton, gstyleButton, customButton, button, button1, button2, button3, button4 : WMStandardComponents.Button;
  229. shown : BOOLEAN; popup: WMPopups.Popup;
  230. currentPStyle, tempPStyle : DTPData.ParagraphStyleObject;
  231. currentCStyle, tempCStyle : DTPData.CharacterStyleObject;
  232. currentGStyle, tempGStyle : DTPData.GraphicStyleObject;
  233. currentCustomStyle, tempCustomStyle : DTPData.CustomStyleObject;
  234. oldPStyleName, oldCStyleName, oldGStyleName, oldCustomStyleName: ARRAY 256 OF CHAR;
  235. previewLabel: PreviewPanel; fontNotFound : WMStandardComponents.Label;
  236. tabPanel, buttonPanel : WMStandardComponents.Panel;
  237. tabColor, tabSelectedColor : LONGINT;
  238. UpdateProc* : PROCEDURE {DELEGATE};
  239. pstylePanel, cstylePanel, gstylePanel, customPanel : WMStandardComponents.Panel;
  240. pList, cList, gList, customList : WMStringGrids.StringGrid;
  241. pName, pAlign, pFirstIndent, pLeftIndent, pRightIndent, pSpaceBefore, pSpaceAfter, pDefCharStyle: WMEditors.Editor;
  242. cName, cFont, cSize, cStyle, cBaselineShift, cLeading, cColor, cBackColor, cTracking, cKerning, cStretchH, cStretchV: WMEditors.Editor;
  243. (* other Style EditorFields *)
  244. styleCounter : LONGINT;
  245. PROCEDURE CreateForm() : WMComponents.VisualComponent;
  246. VAR panel, mainPanel, gridPanel, propertyPanel : WMStandardComponents.Panel;
  247. borderPanel : CustomPanel;
  248. groupPanel : GroupPanel;
  249. label : WMStandardComponents.Label;
  250. labelWidth : LONGINT;
  251. lineP: LinePanel;
  252. manager : WMWindowManager.WindowManager;
  253. windowStyle : WMWindowManager.WindowStyle;
  254. panelColor : WMGraphics.Color;
  255. BEGIN
  256. labelWidth := 130;
  257. tabColor := 0008000FFH;
  258. tabSelectedColor := 000CC00FFH;
  259. manager := WMWindowManager.GetDefaultManager();
  260. windowStyle := manager.GetStyle();
  261. panelColor := windowStyle.bgColor;
  262. NEW(mainPanel); mainPanel.bounds.SetExtents(500, 420); mainPanel.fillColor.Set(panelColor);
  263. mainPanel.takesFocus.Set(TRUE);
  264. (* -- tabs -- *)
  265. NEW(tabPanel); tabPanel.bounds.SetHeight(20); tabPanel.fillColor.Set(LONGINT(0CCCCCCFFH));
  266. tabPanel.alignment.Set(WMComponents.AlignTop);
  267. NEW(pstyleButton); pstyleButton.caption.SetAOC("Paragraph"); pstyleButton.alignment.Set(WMComponents.AlignLeft);
  268. (* pstyleButton.SetExtPointerDownHandler(TabHandler); *)
  269. pstyleButton.onClick.Add(TabHandler); pstyleButton.clDefault.Set(tabSelectedColor);
  270. NEW(cstyleButton); cstyleButton.caption.SetAOC("Character"); cstyleButton.alignment.Set(WMComponents.AlignLeft);
  271. cstyleButton.onClick.Add(TabHandler); cstyleButton.clDefault.Set(tabColor);
  272. tabPanel.AddContent(pstyleButton);
  273. tabPanel.AddContent(cstyleButton);
  274. mainPanel.AddContent(tabPanel);
  275. (* -- paragraph style -- *)
  276. NEW(pstylePanel); pstylePanel.alignment.Set(WMComponents.AlignClient);
  277. mainPanel.AddContent(pstylePanel);
  278. NEW(borderPanel); borderPanel.bounds.SetWidth(200); borderPanel.alignment.Set(WMComponents.AlignLeft);
  279. borderPanel.hasInnerBevel := TRUE; borderPanel.innerBevelDown := TRUE; borderPanel.SetBorder(8,8,8,8);
  280. NEW(gridPanel); gridPanel.alignment.Set(WMComponents.AlignClient);
  281. gridPanel.fillColor.Set(LONGINT(0FFFFFFFFH));
  282. NEW(pList); pList.alignment.Set(WMComponents.AlignClient);
  283. pList.onClick.Add(PClickSelected);
  284. pList.model.Acquire;
  285. pList.model.SetNofCols(1);
  286. pList.model.SetNofRows(1);
  287. pList.SetSelectionMode(WMGrids.GridSelectRows);
  288. pList.model.Release;
  289. gridPanel.AddContent(pList);
  290. borderPanel.AddContent(gridPanel);
  291. pstylePanel.AddContent(borderPanel);
  292. NEW(propertyPanel); propertyPanel.alignment.Set(WMComponents.AlignClient);
  293. pstylePanel.AddContent(propertyPanel);
  294. NEW(lineP); lineP.bounds.SetHeight(13); lineP.alignment.Set(WMComponents.AlignTop);
  295. lineP.caption := "Paragraph Style:";
  296. propertyPanel.AddContent(lineP);
  297. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  298. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Paragraph Style Name:");
  299. label.alignment.Set(WMComponents.AlignLeft);
  300. NEW(pName); pName.alignment.Set(WMComponents.AlignClient);
  301. pName.multiLine.Set(FALSE); pName.fillColor.Set(LONGINT(0FFFFFFFFH)); pName.tv.showBorder.Set(TRUE);
  302. pName.tv.textAlignV.Set(WMGraphics.AlignCenter);
  303. pName.tv.borders.Set(WMRectangles.MakeRect(3,3,1,1)); pName.onEnter.Add(UpdateValueHandler);
  304. panel.AddContent(label);
  305. panel.AddContent(pName);
  306. propertyPanel.AddContent(panel);
  307. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  308. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Alignment:");
  309. label.alignment.Set(WMComponents.AlignLeft);
  310. NEW(button1); button1.caption.SetAOC("+"); button1.alignment.Set(WMComponents.AlignRight);
  311. button1.SetExtPointerDownHandler(AlignHandler); button1.bounds.SetWidth(20);
  312. NEW(pAlign); pAlign.alignment.Set(WMComponents.AlignClient);
  313. pAlign.multiLine.Set(FALSE); pAlign.fillColor.Set(LONGINT(0FFFFFFFFH)); pAlign.tv.showBorder.Set(TRUE);
  314. pAlign.tv.textAlignV.Set(WMGraphics.AlignCenter);
  315. pAlign.tv.borders.Set(WMRectangles.MakeRect(3,3,1,1)); pAlign.onEnter.Add(UpdateValueHandler);
  316. panel.AddContent(label); panel.AddContent(button1);
  317. panel.AddContent(pAlign);
  318. propertyPanel.AddContent(panel);
  319. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  320. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" First Line Indent:");
  321. label.alignment.Set(WMComponents.AlignLeft);
  322. NEW(pFirstIndent); pFirstIndent.alignment.Set(WMComponents.AlignClient);
  323. pFirstIndent.multiLine.Set(FALSE); pFirstIndent.fillColor.Set(LONGINT(0FFFFFFFFH)); pFirstIndent.tv.showBorder.Set(TRUE);
  324. pFirstIndent.tv.textAlignV.Set(WMGraphics.AlignCenter);
  325. pFirstIndent.tv.borders.Set(WMRectangles.MakeRect(3,3,1,1)); pFirstIndent.onEnter.Add(UpdateValueHandler);
  326. panel.AddContent(label);
  327. panel.AddContent(pFirstIndent);
  328. propertyPanel.AddContent(panel);
  329. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  330. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Left Line Indent:");
  331. label.alignment.Set(WMComponents.AlignLeft);
  332. NEW(pLeftIndent); pLeftIndent := CreateEditorField();
  333. panel.AddContent(label);
  334. panel.AddContent(pLeftIndent);
  335. propertyPanel.AddContent(panel);
  336. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  337. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Right Line Indent:");
  338. label.alignment.Set(WMComponents.AlignLeft);
  339. NEW(pRightIndent); pRightIndent := CreateEditorField();
  340. panel.AddContent(label);
  341. panel.AddContent(pRightIndent);
  342. propertyPanel.AddContent(panel);
  343. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  344. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Space Before:");
  345. label.alignment.Set(WMComponents.AlignLeft);
  346. NEW(pSpaceBefore); pSpaceBefore := CreateEditorField();
  347. panel.AddContent(label);
  348. panel.AddContent(pSpaceBefore);
  349. propertyPanel.AddContent(panel);
  350. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  351. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Space After:");
  352. label.alignment.Set(WMComponents.AlignLeft);
  353. NEW(pSpaceAfter); pSpaceAfter := CreateEditorField();
  354. panel.AddContent(label);
  355. panel.AddContent(pSpaceAfter);
  356. propertyPanel.AddContent(panel);
  357. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  358. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Default Char Style:");
  359. label.alignment.Set(WMComponents.AlignLeft);
  360. NEW(pDefCharStyle); pDefCharStyle := CreateEditorField();
  361. panel.AddContent(label);
  362. panel.AddContent(pDefCharStyle);
  363. propertyPanel.AddContent(panel);
  364. (* spacer panel *)
  365. (* NEW(panel); panel.bounds.SetHeight(15); panel.alignment.Set(WMComponents.AlignTop);
  366. propertyPanel.AddContent(panel);
  367. NEW(groupPanel); groupPanel.alignment.Set(WMComponents.AlignTop);
  368. groupPanel.SetCaption("Preview:"); groupPanel.bounds.SetHeight(80);
  369. NEW(previewLabel); previewLabel.fillColor.Set(0FFFFFFFFH); previewLabel.alignment.Set(WMComponents.AlignClient);
  370. previewLabel.caption.SetAOC("The quick brown Fox Jumped over the lazy Dog"); previewLabel.alignH.Set(1); previewLabel.alignV.Set(1);
  371. groupPanel.AddContent(previewLabel);
  372. propertyPanel.AddContent(groupPanel);
  373. NEW(check); check.bounds.SetHeight(20); check.alignment.Set(WMComponents.AlignTop);
  374. check.caption := "Checkbox";
  375. propertyPanel.AddContent(check);
  376. *)
  377. (* -- paragraph panel buttons -- *)
  378. NEW(buttonPanel); buttonPanel.bounds.SetHeight(30); buttonPanel.fillColor.Set(panelColor);
  379. buttonPanel.alignment.Set(WMComponents.AlignBottom);
  380. NEW(button); button.caption.SetAOC("Apply"); button.alignment.Set(WMComponents.AlignRight);
  381. button.onClick.Add(ApplyPHandler);
  382. buttonPanel.AddContent(button);
  383. NEW(button); button.caption.SetAOC("Delete"); button.alignment.Set(WMComponents.AlignRight);
  384. button.onClick.Add(RemovePHandler);
  385. buttonPanel.AddContent(button);
  386. NEW(button); button.caption.SetAOC("Import"); button.alignment.Set(WMComponents.AlignRight);
  387. button.onClick.Add(ImportPHandler);
  388. buttonPanel.AddContent(button);
  389. NEW(button); button.caption.SetAOC("New"); button.alignment.Set(WMComponents.AlignRight);
  390. button.onClick.Add(NewPHandler);
  391. buttonPanel.AddContent(button);
  392. propertyPanel.AddContent(buttonPanel);
  393. (* -- character style -- *)
  394. NEW(cstylePanel); cstylePanel.alignment.Set(WMComponents.AlignClient);
  395. cstylePanel.visible.Set(FALSE);
  396. mainPanel.AddContent(cstylePanel);
  397. NEW(borderPanel); borderPanel.bounds.SetWidth(200); borderPanel.alignment.Set(WMComponents.AlignLeft);
  398. borderPanel.hasInnerBevel := TRUE; borderPanel.innerBevelDown := TRUE; borderPanel.SetBorder(8,8,8,8);
  399. NEW(gridPanel); gridPanel.bounds.SetWidth(200); gridPanel.alignment.Set(WMComponents.AlignClient);
  400. gridPanel.fillColor.Set(LONGINT(0FFFFFFFFH));
  401. NEW(cList); cList.alignment.Set(WMComponents.AlignClient);
  402. cList.onClick.Add(CClickSelected);
  403. cList.model.Acquire;
  404. cList.model.SetNofCols(1);
  405. cList.model.SetNofRows(1);
  406. cList.SetSelectionMode(WMGrids.GridSelectRows);
  407. cList.model.Release;
  408. gridPanel.AddContent(cList);
  409. borderPanel.AddContent(gridPanel);
  410. cstylePanel.AddContent(borderPanel);
  411. NEW(propertyPanel); propertyPanel.alignment.Set(WMComponents.AlignClient);
  412. cstylePanel.AddContent(propertyPanel);
  413. NEW(lineP); lineP.bounds.SetHeight(13); lineP.alignment.Set(WMComponents.AlignTop);
  414. lineP.caption := "Character Style:";
  415. propertyPanel.AddContent(lineP);
  416. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  417. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Character Style Name:");
  418. label.alignment.Set(WMComponents.AlignLeft);
  419. NEW(cName); cName := CreateEditorField();
  420. panel.AddContent(label);
  421. panel.AddContent(cName);
  422. propertyPanel.AddContent(panel);
  423. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  424. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Font Name:");
  425. label.alignment.Set(WMComponents.AlignLeft);
  426. NEW(cFont); cFont := CreateEditorField();
  427. panel.AddContent(label);
  428. panel.AddContent(cFont);
  429. propertyPanel.AddContent(panel);
  430. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  431. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Font Style:");
  432. label.alignment.Set(WMComponents.AlignLeft);
  433. NEW(cStyle); cStyle := CreateEditorField();
  434. panel.AddContent(label);
  435. NEW(button2); button2.caption.SetAOC("+"); button2.alignment.Set(WMComponents.AlignRight);
  436. button2.SetExtPointerDownHandler(StyleHandler); button2.bounds.SetWidth(20);
  437. panel.AddContent(button2);
  438. panel.AddContent(cStyle);
  439. propertyPanel.AddContent(panel);
  440. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  441. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Font Size:");
  442. label.alignment.Set(WMComponents.AlignLeft);
  443. NEW(cSize); cSize := CreateEditorField();
  444. panel.AddContent(label);
  445. panel.AddContent(cSize);
  446. propertyPanel.AddContent(panel);
  447. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  448. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Leading:");
  449. label.alignment.Set(WMComponents.AlignLeft);
  450. NEW(cLeading); cLeading := CreateEditorField();
  451. panel.AddContent(label);
  452. panel.AddContent(cLeading);
  453. propertyPanel.AddContent(panel);
  454. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  455. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Baseline Shift:");
  456. label.alignment.Set(WMComponents.AlignLeft);
  457. NEW(cBaselineShift); cBaselineShift := CreateEditorField();
  458. panel.AddContent(label);
  459. panel.AddContent(cBaselineShift);
  460. propertyPanel.AddContent(panel);
  461. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  462. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Font Color:");
  463. label.alignment.Set(WMComponents.AlignLeft);
  464. NEW(cColor); cColor := CreateEditorField();
  465. panel.AddContent(label);
  466. NEW(button3); button3.caption.SetAOC("+"); button3.alignment.Set(WMComponents.AlignRight);
  467. button3.SetExtPointerDownHandler(ColorHandler); button3.bounds.SetWidth(20);
  468. panel.AddContent(button3);
  469. panel.AddContent(cColor);
  470. propertyPanel.AddContent(panel);
  471. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  472. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Font BG Color:");
  473. label.alignment.Set(WMComponents.AlignLeft);
  474. NEW(cBackColor); cBackColor := CreateEditorField();
  475. panel.AddContent(label);
  476. NEW(button4); button4.caption.SetAOC("+"); button4.alignment.Set(WMComponents.AlignRight);
  477. button4.SetExtPointerDownHandler(BGColorHandler); button4.bounds.SetWidth(20);
  478. panel.AddContent(button4);
  479. panel.AddContent(cBackColor);
  480. propertyPanel.AddContent(panel);
  481. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  482. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Tracking:");
  483. label.alignment.Set(WMComponents.AlignLeft);
  484. NEW(cTracking); cTracking := CreateEditorField();
  485. panel.AddContent(label);
  486. panel.AddContent(cTracking);
  487. (* propertyPanel.AddContent(panel); *)
  488. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  489. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Kerning:");
  490. label.alignment.Set(WMComponents.AlignLeft);
  491. NEW(cKerning); cKerning := CreateEditorField();
  492. panel.AddContent(label);
  493. panel.AddContent(cKerning);
  494. (* propertyPanel.AddContent(panel); *)
  495. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  496. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Stretch Horizontal:");
  497. label.alignment.Set(WMComponents.AlignLeft);
  498. NEW(cStretchH); cStretchH := CreateEditorField();
  499. panel.AddContent(label);
  500. panel.AddContent(cStretchH);
  501. (* propertyPanel.AddContent(panel); *)
  502. NEW(panel); panel.bounds.SetHeight(20); panel.alignment.Set(WMComponents.AlignTop);
  503. NEW(label); label.bounds.SetWidth(labelWidth); label.caption.SetAOC(" Stretch Vertical:");
  504. label.alignment.Set(WMComponents.AlignLeft);
  505. NEW(cStretchV); cStretchV := CreateEditorField();
  506. panel.AddContent(label);
  507. panel.AddContent(cStretchV);
  508. (* propertyPanel.AddContent(panel); *)
  509. (* spacer panel *)
  510. NEW(panel); panel.bounds.SetHeight(15); panel.alignment.Set(WMComponents.AlignTop);
  511. propertyPanel.AddContent(panel);
  512. NEW(groupPanel); groupPanel.alignment.Set(WMComponents.AlignTop);
  513. groupPanel.SetCaption("Preview:"); groupPanel.bounds.SetHeight(80);
  514. NEW(previewLabel); previewLabel.fillColor.Set(LONGINT(0FFFFFFFFH)); previewLabel.alignment.Set(WMComponents.AlignClient);
  515. previewLabel.caption.SetAOC("The quick brown Fox jumped over the lazy Dog"); previewLabel.alignH.Set(1); previewLabel.alignV.Set(1);
  516. groupPanel.AddContent(previewLabel);
  517. propertyPanel.AddContent(groupPanel);
  518. NEW(fontNotFound); fontNotFound.bounds.SetHeight(20); fontNotFound.alignment.Set(WMComponents.AlignTop);
  519. fontNotFound.caption.SetAOC(" ERROR: Font not found! - using DefaultFont"); fontNotFound.visible.Set(FALSE);
  520. propertyPanel.AddContent(fontNotFound); fontNotFound.textColor.Set(LONGINT(0FF0000FFH));
  521. (* -- character style buttons -- *)
  522. NEW(buttonPanel); buttonPanel.bounds.SetHeight(30); buttonPanel.fillColor.Set(panelColor);
  523. buttonPanel.alignment.Set(WMComponents.AlignBottom);
  524. NEW(button); button.caption.SetAOC("Apply"); button.alignment.Set(WMComponents.AlignRight);
  525. button.onClick.Add(ApplyCHandler);
  526. buttonPanel.AddContent(button);
  527. NEW(button); button.caption.SetAOC("Delete"); button.alignment.Set(WMComponents.AlignRight);
  528. button.onClick.Add(RemoveCHandler);
  529. buttonPanel.AddContent(button);
  530. NEW(button); button.caption.SetAOC("Import"); button.alignment.Set(WMComponents.AlignRight);
  531. button.onClick.Add(ImportCHandler);
  532. buttonPanel.AddContent(button);
  533. NEW(button); button.caption.SetAOC("New"); button.alignment.Set(WMComponents.AlignRight);
  534. button.onClick.Add(NewCHandler);
  535. buttonPanel.AddContent(button);
  536. propertyPanel.AddContent(buttonPanel);
  537. RETURN mainPanel;
  538. END CreateForm;
  539. PROCEDURE CreateEditorField(): WMEditors.Editor;
  540. VAR newEditor: WMEditors.Editor;
  541. BEGIN
  542. NEW(newEditor); newEditor.alignment.Set(WMComponents.AlignClient);
  543. newEditor.multiLine.Set(FALSE); newEditor.fillColor.Set(LONGINT(0FFFFFFFFH)); newEditor.tv.showBorder.Set(TRUE);
  544. newEditor.tv.textAlignV.Set(WMGraphics.AlignCenter);
  545. newEditor.tv.borders.Set(WMRectangles.MakeRect(3,3,1,1)); newEditor.onEnter.Add(UpdateValueHandler);
  546. newEditor.SetExtFocusHandler(FocusHandler);
  547. RETURN newEditor;
  548. END CreateEditorField;
  549. PROCEDURE &New*;
  550. VAR vc : WMComponents.VisualComponent;
  551. BEGIN
  552. vc := CreateForm();
  553. Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), FALSE);
  554. SetContent(vc);
  555. SetTitle(Strings.NewString("Style Editor"));
  556. IF styleCounter > 0 THEN
  557. ELSE styleCounter := 0; END;
  558. END New;
  559. PROCEDURE Show*(x, y: LONGINT);
  560. BEGIN
  561. IF ~shown THEN
  562. shown := TRUE;
  563. manager := WMWindowManager.GetDefaultManager();
  564. WMWindowManager.AddWindow(SELF, x, y);
  565. manager.SetFocus(SELF);
  566. END;
  567. END Show;
  568. PROCEDURE Hide*;
  569. BEGIN
  570. manager := WMWindowManager.GetDefaultManager();
  571. manager.Remove(SELF); shown := FALSE;
  572. END Hide;
  573. PROCEDURE Close*;
  574. BEGIN
  575. Close^;
  576. IF UpdateProc # NIL THEN UpdateProc END;
  577. END Close;
  578. PROCEDURE LoadStyleList*(VAR doc: DTPData.Document);
  579. VAR i : LONGINT;
  580. BEGIN
  581. document := doc;
  582. pList.model.Acquire;
  583. i := 0;
  584. WHILE ((i<LEN(doc.pStyles)) & (doc.pStyles[i] # NIL)) DO
  585. pList.model.SetNofRows(i+1);
  586. pList.model.SetCellText(0, i, Strings.NewString(doc.pStyles[i].name));
  587. pList.model.SetCellData(0, i, doc.pStyles[i]);
  588. INC(i);
  589. END;
  590. PClickSelected(NIL, pList.model.GetCellData(0, 0));
  591. pList.model.Release;
  592. cList.model.Acquire;
  593. i := 0;
  594. WHILE ((i<LEN(doc.cStyles)) & (doc.cStyles[i] # NIL)) DO
  595. cList.model.SetNofRows(i+1);
  596. cList.model.SetCellText(0, i, Strings.NewString(doc.cStyles[i].name));
  597. cList.model.SetCellData(0, i, doc.cStyles[i]);
  598. INC(i);
  599. END;
  600. CClickSelected(NIL, cList.model.GetCellData(0, 0));
  601. cList.model.Release;
  602. END LoadStyleList;
  603. PROCEDURE FocusHandler(hasFocus: BOOLEAN);
  604. END FocusHandler;
  605. PROCEDURE TabHandler(sender, data: ANY);
  606. BEGIN
  607. IF (sender # NIL) & (sender IS WMStandardComponents.Button) THEN
  608. IF sender = pstyleButton THEN
  609. cstylePanel.visible.Set(FALSE); cstyleButton.clDefault.Set(tabColor);
  610. pstylePanel.visible.Set(TRUE); pstyleButton.clDefault.Set(tabSelectedColor);
  611. ELSIF sender = cstyleButton THEN
  612. pstylePanel.visible.Set(FALSE); pstyleButton.clDefault.Set(tabColor);
  613. cstylePanel.visible.Set(TRUE); cstyleButton.clDefault.Set(tabSelectedColor);
  614. ELSIF sender = gstyleButton THEN
  615. ELSIF sender = customButton THEN
  616. ELSE
  617. END;
  618. END;
  619. END TabHandler;
  620. PROCEDURE PClickSelected(sender, data: ANY);
  621. VAR tempString: ARRAY 64 OF CHAR;
  622. BEGIN
  623. IF (data # NIL) THEN
  624. currentPStyle := data(DTPData.ParagraphStyleObject);
  625. tempPStyle := currentPStyle.Clone();
  626. pName.SetAsString(currentPStyle.name);
  627. IF (currentPStyle.alignment = 0) THEN tempString := "Left";
  628. ELSIF (currentPStyle.alignment = 1) THEN tempString := "Center";
  629. ELSIF (currentPStyle.alignment = 2) THEN tempString := "Right";
  630. ELSE tempString := "Justified";
  631. END;
  632. pAlign.SetAsString(tempString);
  633. Strings.FloatToStr(currentPStyle.firstIndent, 0,4,0, tempString);
  634. pFirstIndent.SetAsString(tempString);
  635. Strings.FloatToStr(currentPStyle.leftIndent, 0,4,0, tempString);
  636. pLeftIndent.SetAsString(tempString);
  637. Strings.FloatToStr(currentPStyle.rightIndent, 0,4,0, tempString);
  638. pRightIndent.SetAsString(tempString);
  639. Strings.FloatToStr(currentPStyle.spaceBefore, 0,4,0, tempString);
  640. pSpaceBefore.SetAsString(tempString);
  641. Strings.FloatToStr(currentPStyle.spaceAfter, 0,4,0, tempString);
  642. pSpaceAfter.SetAsString(tempString);
  643. pDefCharStyle.SetAsString(currentPStyle.charStyle.name);
  644. COPY(currentPStyle.name, oldPStyleName);
  645. END;
  646. END PClickSelected;
  647. PROCEDURE CClickSelected(sender, data: ANY);
  648. VAR tempString: ARRAY 64 OF CHAR;
  649. tempFont: WMGraphics.Font;
  650. BEGIN
  651. IF (data # NIL) THEN
  652. currentCStyle := data(DTPData.CharacterStyleObject);
  653. tempCStyle := currentCStyle.Clone();
  654. cName.SetAsString(currentCStyle.name);
  655. cFont.SetAsString(currentCStyle.family);
  656. IF (currentCStyle.style * {0, 1} = {}) THEN
  657. tempString := "Regular";
  658. ELSIF (currentCStyle.style * {0, 1} = {0}) THEN
  659. tempString := "Bold";
  660. ELSIF (currentCStyle.style * {0, 1} = {1}) THEN
  661. tempString := "Italic";
  662. ELSE
  663. tempString := "Bold Italic";
  664. END;
  665. cStyle.SetAsString(tempString);
  666. Strings.FloatToStr(currentCStyle.size, 0,4,0, tempString);
  667. cSize.SetAsString(tempString);
  668. Strings.FloatToStr(currentCStyle.leading, 0,4,0, tempString);
  669. cLeading.SetAsString(tempString);
  670. Strings.FloatToStr(currentCStyle.baselineShift, 0,4,0, tempString);
  671. cBaselineShift.SetAsString(tempString);
  672. Strings.IntToHexStr(currentCStyle.color, 7, tempString);
  673. cColor.SetAsString(tempString);
  674. Strings.IntToHexStr(currentCStyle.bgColor, 7, tempString);
  675. cBackColor.SetAsString(tempString);
  676. Strings.FloatToStr(currentCStyle.tracking, 0,4,0, tempString);
  677. cTracking.SetAsString(tempString);
  678. Strings.FloatToStr(currentCStyle.kerning, 0,4,0, tempString);
  679. cKerning.SetAsString(tempString);
  680. Strings.FloatToStr(currentCStyle.scaleHorizontal, 0,4,0, tempString);
  681. cStretchH.SetAsString(tempString);
  682. Strings.FloatToStr(currentCStyle.scaleVertical, 0,4,0, tempString);
  683. cStretchV.SetAsString(tempString);
  684. COPY(currentCStyle.name, oldCStyleName);
  685. (* update preview *)
  686. tempFont := WMGraphics.GetFont(tempCStyle.family, ENTIER(tempCStyle.size), tempCStyle.style);
  687. previewLabel.SetFont(tempFont); previewLabel.fillColor.Set(tempCStyle.bgColor);
  688. previewLabel.fontColor := tempCStyle.color; previewLabel.Invalidate;
  689. END;
  690. END CClickSelected;
  691. PROCEDURE GClickSelected(sender, data: ANY);
  692. END GClickSelected;
  693. PROCEDURE CustomClickSelected(sender, data: ANY);
  694. END CustomClickSelected;
  695. PROCEDURE UpdateValueHandler(sender, data: ANY);
  696. VAR tempString : ARRAY 64 OF CHAR;
  697. tempLReal : LONGREAL;
  698. tempInt : LONGINT; res: WORD;
  699. tempCharStyle: DTPData.CharacterStyleObject;
  700. tempFont: WMGraphics.Font;
  701. BEGIN
  702. (* set temp values, update preview *)
  703. IF (sender(WMEditors.Editor) = pName) THEN
  704. pName.GetAsString(tempString);
  705. COPY(tempString, tempPStyle.name);
  706. ELSIF (sender(WMEditors.Editor) = pAlign) THEN
  707. pAlign.GetAsString(tempString); Strings.LowerCase(tempString);
  708. IF (tempString = "left") THEN
  709. tempPStyle.alignment := 0;
  710. pAlign.SetAsString("Left");
  711. ELSIF (tempString = "center") THEN
  712. tempPStyle.alignment := 1;
  713. pAlign.SetAsString("Center");
  714. ELSIF (tempString = "right") THEN
  715. tempPStyle.alignment := 2;
  716. pAlign.SetAsString("Right");
  717. ELSIF (tempString = "justified") THEN
  718. tempPStyle.alignment := 3;
  719. pAlign.SetAsString("Justified");
  720. ELSE
  721. tempPStyle.alignment := 0;
  722. pAlign.SetAsString("Left");
  723. END;
  724. ELSIF (sender(WMEditors.Editor) = pFirstIndent) THEN
  725. pFirstIndent.GetAsString(tempString);
  726. Strings.StrToFloat(tempString, tempLReal);
  727. tempPStyle.firstIndent := SHORT(tempLReal);
  728. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  729. pFirstIndent.SetAsString(tempString);
  730. ELSIF (sender(WMEditors.Editor) = pLeftIndent) THEN
  731. pLeftIndent.GetAsString(tempString);
  732. Strings.StrToFloat(tempString, tempLReal);
  733. tempPStyle.leftIndent := SHORT(tempLReal);
  734. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  735. pLeftIndent.SetAsString(tempString);
  736. ELSIF (sender(WMEditors.Editor) = pRightIndent) THEN
  737. pRightIndent.GetAsString(tempString);
  738. Strings.StrToFloat(tempString, tempLReal);
  739. tempPStyle.rightIndent := SHORT(tempLReal);
  740. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  741. pRightIndent.SetAsString(tempString);
  742. ELSIF (sender(WMEditors.Editor) = pSpaceBefore) THEN
  743. pSpaceBefore.GetAsString(tempString);
  744. Strings.StrToFloat(tempString, tempLReal);
  745. tempPStyle.spaceBefore := SHORT(tempLReal);
  746. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  747. pSpaceBefore.SetAsString(tempString);
  748. ELSIF (sender(WMEditors.Editor) = pSpaceAfter) THEN
  749. pSpaceAfter.GetAsString(tempString);
  750. Strings.StrToFloat(tempString, tempLReal);
  751. tempPStyle.spaceAfter := SHORT(tempLReal);
  752. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  753. pSpaceAfter.SetAsString(tempString);
  754. ELSIF (sender(WMEditors.Editor) = pDefCharStyle) THEN
  755. pDefCharStyle.GetAsString(tempString);
  756. tempCharStyle := document.GetCharacterStyleByName(tempString);
  757. IF tempCharStyle # NIL THEN
  758. tempPStyle.charStyle := tempCharStyle;
  759. ELSE
  760. tempPStyle.charStyle := document.defaultCharacterStyle;
  761. pDefCharStyle.SetAsString(tempPStyle.charStyle.name);
  762. END;
  763. ELSIF (sender(WMEditors.Editor) = cName) THEN
  764. cName.GetAsString(tempString);
  765. COPY(tempString, tempCStyle.name);
  766. ELSIF (sender(WMEditors.Editor) = cFont) THEN
  767. cFont.GetAsString(tempString);
  768. COPY(tempString, tempCStyle.family);
  769. (* load font *)
  770. tempFont := WMGraphics.GetFont(tempCStyle.family, ENTIER(tempCStyle.size), tempCStyle.style);
  771. previewLabel.SetFont(tempFont); previewLabel.Invalidate;
  772. IF (tempFont.name # tempCStyle.family) OR (tempFont.size # ENTIER(tempCStyle.size)) THEN (* OR (tempFont.style # tempCStyle.style) *)
  773. fontNotFound.visible.Set(TRUE);
  774. ELSE
  775. fontNotFound.visible.Set(FALSE);
  776. END;
  777. ELSIF (sender(WMEditors.Editor) = cStyle) THEN
  778. cStyle.GetAsString(tempString); Strings.LowerCase(tempString);
  779. IF (tempString = "regular") THEN
  780. tempCStyle.style := {};
  781. cStyle.SetAsString("Regular");
  782. ELSIF (tempString = "bold") THEN
  783. tempCStyle.style := {0};
  784. cStyle.SetAsString("Bold");
  785. ELSIF (tempString = "italic") THEN
  786. tempCStyle.style := {1};
  787. cStyle.SetAsString("Italic");
  788. ELSIF (tempString = "bold italic") THEN
  789. tempCStyle.style := {0, 1};
  790. cStyle.SetAsString("Bold Italic");
  791. ELSE
  792. tempCStyle.style := {};
  793. cStyle.SetAsString("Regular");
  794. END;
  795. tempFont := WMGraphics.GetFont(tempCStyle.family, ENTIER(tempCStyle.size), tempCStyle.style);
  796. previewLabel.SetFont(tempFont); previewLabel.Invalidate;
  797. IF (tempFont.name # tempCStyle.family) OR (tempFont.size # ENTIER(tempCStyle.size)) THEN
  798. fontNotFound.visible.Set(TRUE);
  799. ELSE
  800. fontNotFound.visible.Set(FALSE);
  801. END;
  802. ELSIF (sender(WMEditors.Editor) = cSize) THEN
  803. cSize.GetAsString(tempString);
  804. Strings.StrToFloat(tempString, tempLReal);
  805. tempCStyle.size := SHORT(tempLReal);
  806. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  807. cSize.SetAsString(tempString);
  808. (* set leading to 120% of size *)
  809. tempLReal := tempLReal*1.2;
  810. tempCStyle.leading := SHORT(tempLReal);
  811. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  812. cLeading.SetAsString(tempString);
  813. tempFont := WMGraphics.GetFont(tempCStyle.family, ENTIER(tempCStyle.size), tempCStyle.style);
  814. previewLabel.SetFont(tempFont); previewLabel.Invalidate;
  815. IF (tempFont.name # tempCStyle.family) OR (tempFont.size # ENTIER(tempCStyle.size)) THEN
  816. fontNotFound.visible.Set(TRUE);
  817. ELSE
  818. fontNotFound.visible.Set(FALSE);
  819. END;
  820. ELSIF (sender(WMEditors.Editor) = cLeading) THEN
  821. cLeading.GetAsString(tempString);
  822. Strings.StrToFloat(tempString, tempLReal);
  823. tempCStyle.leading := SHORT(tempLReal);
  824. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  825. cLeading.SetAsString(tempString);
  826. ELSIF (sender(WMEditors.Editor) = cBaselineShift) THEN
  827. cBaselineShift.GetAsString(tempString);
  828. Strings.StrToFloat(tempString, tempLReal);
  829. tempCStyle.baselineShift := SHORT(tempLReal);
  830. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  831. cBaselineShift.SetAsString(tempString);
  832. ELSIF (sender(WMEditors.Editor) = cColor) THEN
  833. cColor.GetAsString(tempString);
  834. Strings.HexStrToInt(tempString, tempInt, res);
  835. tempCStyle.color := tempInt;
  836. Strings.IntToHexStr(tempInt, 7, tempString);
  837. cColor.SetAsString(tempString);
  838. previewLabel.fontColor := tempInt; previewLabel.Invalidate;
  839. ELSIF (sender(WMEditors.Editor) = cBackColor) THEN
  840. cBackColor.GetAsString(tempString);
  841. Strings.HexStrToInt(tempString, tempInt, res);
  842. tempCStyle.bgColor := tempInt;
  843. Strings.IntToHexStr(tempInt, 7, tempString);
  844. cBackColor.SetAsString(tempString);
  845. previewLabel.fillColor.Set(tempInt); previewLabel.Invalidate;
  846. ELSIF (sender(WMEditors.Editor) = cTracking) THEN
  847. cTracking.GetAsString(tempString);
  848. Strings.StrToFloat(tempString, tempLReal);
  849. tempCStyle.tracking := SHORT(tempLReal);
  850. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  851. cTracking.SetAsString(tempString);
  852. ELSIF (sender(WMEditors.Editor) = cKerning) THEN
  853. cKerning.GetAsString(tempString);
  854. Strings.StrToFloat(tempString, tempLReal);
  855. tempCStyle.kerning := SHORT(tempLReal);
  856. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  857. cKerning.SetAsString(tempString);
  858. ELSIF (sender(WMEditors.Editor) = cStretchH) THEN
  859. cStretchH.GetAsString(tempString);
  860. Strings.StrToFloat(tempString, tempLReal);
  861. tempCStyle.scaleHorizontal := SHORT(tempLReal);
  862. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  863. cStretchH.SetAsString(tempString);
  864. ELSIF (sender(WMEditors.Editor) = cStretchV) THEN
  865. cStretchV.GetAsString(tempString);
  866. Strings.StrToFloat(tempString, tempLReal);
  867. tempCStyle.scaleVertical := SHORT(tempLReal);
  868. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  869. cStretchV.SetAsString(tempString);
  870. ELSE
  871. END;
  872. END UpdateValueHandler;
  873. PROCEDURE UpdateList;
  874. VAR i : LONGINT;
  875. BEGIN
  876. pList.model.Acquire;
  877. i := 0;
  878. WHILE ((i<LEN(document.pStyles)) & (document.pStyles[i] # NIL)) DO
  879. pList.model.SetNofRows(i+1);
  880. pList.model.SetCellText(0, i, Strings.NewString(document.pStyles[i].name));
  881. pList.model.SetCellData(0, i, document.pStyles[i]);
  882. INC(i);
  883. END;
  884. pList.SetSelection(0,i-1, 0, i-1);
  885. PClickSelected(NIL, pList.model.GetCellData(0, i-1));
  886. pList.model.Release;
  887. cList.model.Acquire;
  888. i := 0;
  889. WHILE ((i<LEN(document.cStyles)) & (document.cStyles[i] # NIL)) DO
  890. cList.model.SetNofRows(i+1);
  891. cList.model.SetCellText(0, i, Strings.NewString(document.cStyles[i].name));
  892. cList.model.SetCellData(0, i, document.cStyles[i]);
  893. INC(i);
  894. END;
  895. CClickSelected(NIL, cList.model.GetCellData(0, i-1));
  896. cList.SetSelection(0,i-1, 0, i-1);
  897. cList.model.Release;
  898. END UpdateList;
  899. PROCEDURE NewPHandler(sender, data: ANY);
  900. VAR newPStyle: DTPData.ParagraphStyleObject;
  901. tempString: ARRAY 16 OF CHAR;
  902. BEGIN
  903. NEW(newPStyle);
  904. newPStyle.name := "newParagraphStyle";
  905. Strings.IntToStr(styleCounter, tempString);
  906. Strings.Append(newPStyle.name, tempString);
  907. newPStyle.alignment := 0; (* Left Align *)
  908. newPStyle.spaceBefore := 0;
  909. newPStyle.spaceAfter := 0;
  910. newPStyle.leftIndent := 0;
  911. newPStyle.rightIndent := 0;
  912. newPStyle.firstIndent := 0;
  913. newPStyle.charStyle := document.defaultCharacterStyle;
  914. INC(styleCounter);
  915. document.AddStyle(newPStyle);
  916. UpdateList;
  917. END NewPHandler;
  918. PROCEDURE ImportPHandler(sender, data: ANY);
  919. VAR filename: ARRAY 128 OF CHAR;
  920. BEGIN
  921. filename := "";
  922. IF WMDialogs.QueryString("Import Paragraph Styles from File:", filename) = WMDialogs.ResOk THEN
  923. ImportParagraphStyles(filename);
  924. END;
  925. UpdateList;
  926. END ImportPHandler;
  927. PROCEDURE ImportParagraphStyles(filename: ARRAY OF CHAR);
  928. VAR tempString : ARRAY 256 OF CHAR;
  929. tempReal : LONGREAL;
  930. reader : Files.Reader;
  931. parser : XMLParser.Parser;
  932. scanner : XMLScanner.Scanner;
  933. f : Files.File;
  934. XMLdocStyle : XML.Document;
  935. root: XML.Element;
  936. cont: XMLObjects.Enumerator;
  937. ptr: ANY;
  938. str: Strings.String;
  939. pStyle: DTPData.ParagraphStyleObject;
  940. cStyle: DTPData.CharacterStyleObject;
  941. BEGIN
  942. COPY(filename, tempString);
  943. Strings.Append(tempString, ".Style.XML");
  944. f := Files.Old(tempString);
  945. IF f = NIL THEN RETURN END;
  946. NEW(reader, f, 0);
  947. NEW(scanner, reader);
  948. NEW(parser, scanner);
  949. XMLdocStyle := parser.Parse();
  950. root := XMLdocStyle.GetRoot();
  951. cont := root.GetContents(); cont.Reset();
  952. WHILE cont.HasMoreElements() DO
  953. ptr := cont.GetNext();
  954. IF ptr IS XML.Element THEN
  955. str := ptr(XML.Element).GetName();
  956. IF (str # NIL) & (str^ = "paragraph-style") THEN (* paragraph styles *)
  957. NEW(pStyle);
  958. str := ptr(XML.Element).GetAttributeValue("name"); IF str # NIL THEN COPY(str^, pStyle.name) END;
  959. str := ptr(XML.Element).GetAttributeValue("alignment"); IF str # NIL THEN Strings.StrToInt(str^, pStyle.alignment) END;
  960. str := ptr(XML.Element).GetAttributeValue("first-indent"); IF str # NIL THEN Strings.StrToFloat(str^, tempReal); pStyle.firstIndent := SHORT(tempReal); END;
  961. str := ptr(XML.Element).GetAttributeValue("left-indent"); IF str # NIL THEN Strings.StrToFloat(str^, tempReal); pStyle.leftIndent := SHORT(tempReal); END;
  962. str := ptr(XML.Element).GetAttributeValue("right-indent"); IF str # NIL THEN Strings.StrToFloat(str^, tempReal); pStyle.rightIndent := SHORT(tempReal); END;
  963. str := ptr(XML.Element).GetAttributeValue("space-before"); IF str # NIL THEN Strings.StrToFloat(str^, tempReal); pStyle.spaceBefore := SHORT(tempReal); END;
  964. str := ptr(XML.Element).GetAttributeValue("space-after"); IF str # NIL THEN Strings.StrToFloat(str^, tempReal); pStyle.spaceAfter := SHORT(tempReal); END;
  965. str := ptr(XML.Element).GetAttributeValue("character-style");
  966. IF str # NIL THEN
  967. cStyle := document.GetCharacterStyleByName(str^);
  968. IF cStyle # NIL THEN pStyle.charStyle := cStyle; END;
  969. END;
  970. document.AddStyle(pStyle);
  971. END;
  972. END;
  973. END;
  974. END ImportParagraphStyles;
  975. PROCEDURE RemovePHandler(sender, data: ANY);
  976. BEGIN
  977. document.RemoveStyle(currentPStyle);
  978. UpdateList;
  979. END RemovePHandler;
  980. PROCEDURE ApplyPHandler(sender, data: ANY);
  981. VAR tempString : ARRAY 256 OF CHAR;
  982. tempLReal: LONGREAL;
  983. tempCharStyle : DTPData.CharacterStyleObject;
  984. BEGIN
  985. (* retrieve tempvalues first.. *)
  986. pName.GetAsString(tempString);
  987. COPY(tempString, tempPStyle.name);
  988. pAlign.GetAsString(tempString); Strings.LowerCase(tempString);
  989. IF (tempString = "left") THEN
  990. tempPStyle.alignment := 0;
  991. pAlign.SetAsString("Left");
  992. ELSIF (tempString = "center") THEN
  993. tempPStyle.alignment := 1;
  994. pAlign.SetAsString("Center");
  995. ELSIF (tempString = "right") THEN
  996. tempPStyle.alignment := 2;
  997. pAlign.SetAsString("Right");
  998. ELSIF (tempString = "justified") THEN
  999. tempPStyle.alignment := 3;
  1000. pAlign.SetAsString("Justified");
  1001. ELSE
  1002. tempPStyle.alignment := 0;
  1003. pAlign.SetAsString("Left");
  1004. END;
  1005. pFirstIndent.GetAsString(tempString);
  1006. Strings.StrToFloat(tempString, tempLReal);
  1007. tempPStyle.firstIndent := SHORT(tempLReal);
  1008. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  1009. pFirstIndent.SetAsString(tempString);
  1010. pLeftIndent.GetAsString(tempString);
  1011. Strings.StrToFloat(tempString, tempLReal);
  1012. tempPStyle.leftIndent := SHORT(tempLReal);
  1013. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  1014. pLeftIndent.SetAsString(tempString);
  1015. pRightIndent.GetAsString(tempString);
  1016. Strings.StrToFloat(tempString, tempLReal);
  1017. tempPStyle.rightIndent := SHORT(tempLReal);
  1018. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  1019. pRightIndent.SetAsString(tempString);
  1020. pSpaceBefore.GetAsString(tempString);
  1021. Strings.StrToFloat(tempString, tempLReal);
  1022. tempPStyle.spaceBefore := SHORT(tempLReal);
  1023. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  1024. pSpaceBefore.SetAsString(tempString);
  1025. pSpaceAfter.GetAsString(tempString);
  1026. Strings.StrToFloat(tempString, tempLReal);
  1027. tempPStyle.spaceAfter := SHORT(tempLReal);
  1028. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  1029. pSpaceAfter.SetAsString(tempString);
  1030. pDefCharStyle.GetAsString(tempString);
  1031. tempCharStyle := document.GetCharacterStyleByName(tempString);
  1032. IF tempCharStyle # NIL THEN
  1033. tempPStyle.charStyle := tempCharStyle;
  1034. ELSE
  1035. tempPStyle.charStyle := document.defaultCharacterStyle;
  1036. pDefCharStyle.SetAsString(tempPStyle.charStyle.name);
  1037. END;
  1038. (* update currentStyle with temp, refresh list *)
  1039. currentPStyle.name := tempPStyle.name;
  1040. currentPStyle.alignment := tempPStyle.alignment;
  1041. currentPStyle.firstIndent := tempPStyle.firstIndent;
  1042. currentPStyle.leftIndent := tempPStyle.leftIndent;
  1043. currentPStyle.rightIndent := tempPStyle.rightIndent;
  1044. currentPStyle.spaceBefore := tempPStyle.spaceBefore;
  1045. currentPStyle.spaceAfter := tempPStyle.spaceAfter;
  1046. currentPStyle.charStyle := tempPStyle.charStyle;
  1047. LoadParagraphStyle(currentPStyle);
  1048. UpdateList;
  1049. END ApplyPHandler;
  1050. PROCEDURE LoadParagraphStyle(pstyle : DTPData.ParagraphStyleObject);
  1051. VAR style : Texts.ParagraphStyle;
  1052. cstyle : Texts.CharacterStyle;
  1053. BEGIN
  1054. NEW(style);
  1055. (* COPY(pstyle.name, style.name); *)
  1056. COPY(oldPStyleName, style.name);
  1057. style.alignment := pstyle.alignment;
  1058. style.firstIndent := FloatToFixp(pstyle.firstIndent);
  1059. style.leftIndent := FloatToFixp(pstyle.leftIndent);
  1060. style.rightIndent := FloatToFixp(pstyle.rightIndent);
  1061. style.spaceBefore := FloatToFixp(pstyle.spaceBefore);
  1062. style.spaceAfter := FloatToFixp(pstyle.spaceAfter);
  1063. NEW(cstyle);
  1064. COPY(pstyle.charStyle.name, cstyle.name);
  1065. COPY(pstyle.charStyle.family, cstyle.family);
  1066. cstyle.style := pstyle.charStyle.style;
  1067. cstyle.size := FloatToFixp(pstyle.charStyle.size);
  1068. cstyle.leading := FloatToFixp(pstyle.charStyle.leading);
  1069. cstyle.baselineShift := FloatToFixp(pstyle.charStyle.baselineShift);
  1070. cstyle.color := pstyle.charStyle.color;
  1071. cstyle.bgColor := pstyle.charStyle.bgColor;
  1072. cstyle.tracking := FloatToFixp(pstyle.charStyle.tracking);
  1073. (* cstyle.kerning := pstyle.charStyle.kerning; *)
  1074. cstyle.scaleHorizontal := FloatToFixp(pstyle.charStyle.scaleHorizontal);
  1075. cstyle.scaleVertical := FloatToFixp(pstyle.charStyle.scaleVertical);
  1076. style.charStyle := cstyle;
  1077. Texts.AddParagraphStyle(style);
  1078. IF pstyle.name # oldPStyleName THEN
  1079. style := Texts.GetParagraphStyleByName(oldPStyleName);
  1080. IF style # NIL THEN COPY(pstyle.name, style.name); END;
  1081. END;
  1082. END LoadParagraphStyle;
  1083. PROCEDURE NewCHandler(sender, data: ANY);
  1084. VAR newCStyle: DTPData.CharacterStyleObject;
  1085. tempString: ARRAY 16 OF CHAR;
  1086. BEGIN
  1087. NEW(newCStyle);
  1088. newCStyle.name := "newCharacterStyle";
  1089. Strings.IntToStr(styleCounter, tempString);
  1090. Strings.Append(newCStyle.name, tempString);
  1091. newCStyle.family := "Oberon";
  1092. newCStyle.style := {};
  1093. newCStyle.size := 12;
  1094. newCStyle.leading := 14;
  1095. newCStyle.baselineShift := 0;
  1096. newCStyle.tracking := 0;
  1097. newCStyle.kerning := 0;
  1098. newCStyle.scaleHorizontal := 100;
  1099. newCStyle.scaleVertical := 100;
  1100. newCStyle.color := 0000000FFH;
  1101. newCStyle.bgColor := LONGINT(0FFFFFF00H);
  1102. INC(styleCounter);
  1103. document.AddStyle(newCStyle);
  1104. UpdateList;
  1105. END NewCHandler;
  1106. PROCEDURE ImportCHandler(sender, data: ANY);
  1107. VAR filename: ARRAY 128 OF CHAR;
  1108. BEGIN
  1109. filename := "";
  1110. IF WMDialogs.QueryString("Import Character Styles from File:", filename) = WMDialogs.ResOk THEN
  1111. ImportCharacterStyles(filename);
  1112. END;
  1113. UpdateList;
  1114. END ImportCHandler;
  1115. PROCEDURE ImportCharacterStyles(filename: ARRAY OF CHAR);
  1116. VAR tempString : ARRAY 256 OF CHAR;
  1117. tempReal: LONGREAL;
  1118. tempInt: LONGINT; res: WORD;
  1119. reader : Files.Reader;
  1120. parser : XMLParser.Parser;
  1121. scanner : XMLScanner.Scanner;
  1122. f : Files.File;
  1123. XMLdocStyle : XML.Document;
  1124. root: XML.Element;
  1125. cont: XMLObjects.Enumerator;
  1126. ptr: ANY;
  1127. str: Strings.String;
  1128. cStyle: DTPData.CharacterStyleObject;
  1129. BEGIN
  1130. COPY(filename, tempString);
  1131. Strings.Append(tempString, ".Style.XML");
  1132. f := Files.Old(tempString);
  1133. IF f = NIL THEN RETURN END;
  1134. NEW(reader, f, 0);
  1135. NEW(scanner, reader);
  1136. NEW(parser, scanner);
  1137. XMLdocStyle := parser.Parse();
  1138. root := XMLdocStyle.GetRoot();
  1139. cont := root.GetContents(); cont.Reset();
  1140. WHILE cont.HasMoreElements() DO
  1141. ptr := cont.GetNext();
  1142. IF ptr IS XML.Element THEN
  1143. str := ptr(XML.Element).GetName();
  1144. (* KernelLog.String(str^); KernelLog.Ln; *)
  1145. IF (str # NIL) & (str^ = "character-style") THEN (* character styles *)
  1146. NEW(cStyle);
  1147. str := ptr(XML.Element).GetAttributeValue("name"); IF str # NIL THEN COPY(str^, cStyle.name) END;
  1148. str := ptr(XML.Element).GetAttributeValue("font-family"); IF str # NIL THEN COPY(str^, cStyle.family) END;
  1149. str := ptr(XML.Element).GetAttributeValue("font-style");
  1150. IF str # NIL THEN
  1151. IF (str^ = "0") THEN cStyle.style := {};
  1152. ELSIF (str^ = "1") THEN cStyle.style := {0};
  1153. ELSIF (str^ = "2") THEN cStyle.style := {1};
  1154. ELSIF (str^ = "3") THEN cStyle.style := {0,1};
  1155. ELSE cStyle.style := {};
  1156. END;
  1157. END;
  1158. str := ptr(XML.Element).GetAttributeValue("font-size"); IF str # NIL THEN Strings.StrToFloat(str^, tempReal); cStyle.size := SHORT(tempReal); END;
  1159. str := ptr(XML.Element).GetAttributeValue("leading"); IF str # NIL THEN Strings.StrToFloat(str^, tempReal); cStyle.leading := SHORT(tempReal); END;
  1160. str := ptr(XML.Element).GetAttributeValue("baseline-shift"); IF str # NIL THEN Strings.StrToFloat(str^, tempReal); cStyle.baselineShift := SHORT(tempReal); END;
  1161. str := ptr(XML.Element).GetAttributeValue("color"); IF str # NIL THEN Strings.HexStrToInt(str^, tempInt, res); cStyle.color := tempInt; END;
  1162. str := ptr(XML.Element).GetAttributeValue("bgcolor"); IF str # NIL THEN Strings.HexStrToInt(str^, tempInt, res); cStyle.bgColor := tempInt; END;
  1163. str := ptr(XML.Element).GetAttributeValue("tracking"); IF str # NIL THEN Strings.StrToFloat(str^, tempReal); cStyle.tracking := SHORT(tempReal); END;
  1164. str := ptr(XML.Element).GetAttributeValue("kerning"); IF str # NIL THEN Strings.StrToFloat(str^, tempReal); cStyle.kerning := SHORT(tempReal); END;
  1165. str := ptr(XML.Element).GetAttributeValue("h-scale"); IF str # NIL THEN Strings.StrToFloat(str^, tempReal); cStyle.scaleHorizontal := SHORT(tempReal); END;
  1166. str := ptr(XML.Element).GetAttributeValue("v-scale"); IF str # NIL THEN Strings.StrToFloat(str^, tempReal); cStyle.scaleVertical := SHORT(tempReal); END;
  1167. document.AddStyle(cStyle);
  1168. END;
  1169. END;
  1170. END;
  1171. END ImportCharacterStyles;
  1172. PROCEDURE RemoveCHandler(sender, data: ANY);
  1173. BEGIN
  1174. document.RemoveStyle(currentCStyle);
  1175. UpdateList
  1176. END RemoveCHandler;
  1177. PROCEDURE ApplyCHandler(sender, data: ANY);
  1178. VAR tempString : ARRAY 256 OF CHAR;
  1179. tempLReal: LONGREAL;
  1180. tempInt: LONGINT; res: WORD;
  1181. tempFont : WMGraphics.Font;
  1182. BEGIN
  1183. (* retrieve tempvalues first for those who didn't press enter after changing a value... *)
  1184. cName.GetAsString(tempString);
  1185. COPY(tempString, tempCStyle.name);
  1186. cFont.GetAsString(tempString);
  1187. COPY(tempString, tempCStyle.family);
  1188. cStyle.GetAsString(tempString); Strings.LowerCase(tempString);
  1189. IF (tempString = "regular") THEN
  1190. tempCStyle.style := {};
  1191. cStyle.SetAsString("Regular");
  1192. ELSIF (tempString = "bold") THEN
  1193. tempCStyle.style := {0};
  1194. cStyle.SetAsString("Bold");
  1195. ELSIF (tempString = "italic") THEN
  1196. tempCStyle.style := {1};
  1197. cStyle.SetAsString("Italic");
  1198. ELSIF (tempString = "bold italic") THEN
  1199. tempCStyle.style := {0, 1};
  1200. cStyle.SetAsString("Bold Italic");
  1201. ELSE
  1202. tempCStyle.style := {};
  1203. cStyle.SetAsString("Regular");
  1204. END;
  1205. cSize.GetAsString(tempString);
  1206. Strings.StrToFloat(tempString, tempLReal);
  1207. tempCStyle.size := SHORT(tempLReal);
  1208. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  1209. cSize.SetAsString(tempString);
  1210. (* tempLReal := tempLReal*1.2; *)
  1211. (* tempCStyle.leading := SHORT(tempLReal); *)
  1212. cLeading.GetAsString(tempString);
  1213. Strings.StrToFloat(tempString, tempLReal);
  1214. tempCStyle.leading := SHORT(tempLReal);
  1215. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  1216. cLeading.SetAsString(tempString);
  1217. tempFont := WMGraphics.GetFont(tempCStyle.family, ENTIER(tempCStyle.size), tempCStyle.style);
  1218. previewLabel.SetFont(tempFont); previewLabel.Invalidate;
  1219. IF (tempFont.name # tempCStyle.family) OR (tempFont.size # ENTIER(tempCStyle.size)) THEN
  1220. fontNotFound.visible.Set(TRUE);
  1221. ELSE
  1222. fontNotFound.visible.Set(FALSE);
  1223. END;
  1224. cLeading.GetAsString(tempString);
  1225. Strings.StrToFloat(tempString, tempLReal);
  1226. tempCStyle.leading := SHORT(tempLReal);
  1227. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  1228. cLeading.SetAsString(tempString);
  1229. cBaselineShift.GetAsString(tempString);
  1230. Strings.StrToFloat(tempString, tempLReal);
  1231. tempCStyle.baselineShift := SHORT(tempLReal);
  1232. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  1233. cBaselineShift.SetAsString(tempString);
  1234. cColor.GetAsString(tempString);
  1235. Strings.HexStrToInt(tempString, tempInt, res);
  1236. tempCStyle.color := tempInt;
  1237. Strings.IntToHexStr(tempInt, 7, tempString);
  1238. cColor.SetAsString(tempString);
  1239. previewLabel.fontColor := tempInt; previewLabel.Invalidate;
  1240. cBackColor.GetAsString(tempString);
  1241. Strings.HexStrToInt(tempString, tempInt, res);
  1242. tempCStyle.bgColor := tempInt;
  1243. Strings.IntToHexStr(tempInt, 7, tempString);
  1244. cBackColor.SetAsString(tempString);
  1245. previewLabel.fillColor.Set(tempInt); previewLabel.Invalidate;
  1246. cTracking.GetAsString(tempString);
  1247. Strings.StrToFloat(tempString, tempLReal);
  1248. tempCStyle.tracking := SHORT(tempLReal);
  1249. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  1250. cTracking.SetAsString(tempString);
  1251. cKerning.GetAsString(tempString);
  1252. Strings.StrToFloat(tempString, tempLReal);
  1253. tempCStyle.kerning := SHORT(tempLReal);
  1254. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  1255. cKerning.SetAsString(tempString);
  1256. cStretchH.GetAsString(tempString);
  1257. Strings.StrToFloat(tempString, tempLReal);
  1258. tempCStyle.scaleHorizontal := SHORT(tempLReal);
  1259. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  1260. cStretchH.SetAsString(tempString);
  1261. cStretchV.GetAsString(tempString);
  1262. Strings.StrToFloat(tempString, tempLReal);
  1263. tempCStyle.scaleVertical := SHORT(tempLReal);
  1264. Strings.FloatToStr(tempLReal, 0,4,0, tempString);
  1265. cStretchV.SetAsString(tempString);
  1266. (* update currentStyle with temp, refresh list *)
  1267. currentCStyle.name := tempCStyle.name;
  1268. currentCStyle.family := tempCStyle.family;
  1269. currentCStyle.style := tempCStyle.style;
  1270. currentCStyle.size := tempCStyle.size;
  1271. currentCStyle.leading := tempCStyle.leading;
  1272. currentCStyle.baselineShift := tempCStyle.baselineShift;
  1273. currentCStyle.color := tempCStyle.color;
  1274. currentCStyle.bgColor := tempCStyle.bgColor;
  1275. currentCStyle.tracking := tempCStyle.tracking;
  1276. currentCStyle.kerning := tempCStyle.kerning;
  1277. currentCStyle.scaleHorizontal := tempCStyle.scaleHorizontal;
  1278. currentCStyle.scaleVertical := tempCStyle.scaleVertical;
  1279. LoadCharacterStyle(currentCStyle);
  1280. UpdateList;
  1281. END ApplyCHandler;
  1282. PROCEDURE LoadCharacterStyle(cstyle : DTPData.CharacterStyleObject);
  1283. VAR style : Texts.CharacterStyle;
  1284. BEGIN
  1285. NEW(style);
  1286. (* COPY(cstyle.name, style.name); *)
  1287. COPY(oldCStyleName, style.name);
  1288. COPY(cstyle.family, style.family);
  1289. style.style := cstyle.style;
  1290. style.size := FloatToFixp(cstyle.size);
  1291. style.leading := FloatToFixp(cstyle.leading);
  1292. style.baselineShift := FloatToFixp(cstyle.baselineShift);
  1293. style.color := cstyle.color;
  1294. style.bgColor := cstyle.bgColor;
  1295. style.tracking := FloatToFixp(cstyle.tracking);
  1296. (* style.kerning := cstyle.kerning; *)
  1297. style.scaleHorizontal := FloatToFixp(cstyle.scaleHorizontal);
  1298. style.scaleVertical := FloatToFixp(cstyle.scaleVertical);
  1299. Texts.AddCharacterStyle(style);
  1300. IF cstyle.name # oldCStyleName THEN
  1301. style := Texts.GetCharacterStyleByName(oldCStyleName);
  1302. IF style # NIL THEN COPY(cstyle.name, style.name); END;
  1303. END;
  1304. END LoadCharacterStyle;
  1305. PROCEDURE AlignHandler(x, y : LONGINT; keys : SET; VAR handled : BOOLEAN);
  1306. BEGIN
  1307. NEW(popup);
  1308. popup.AddParButton("Left", AlignPopupHandler, ctxAlignLeft);
  1309. popup.AddParButton("Center", AlignPopupHandler, ctxAlignCenter);
  1310. popup.AddParButton("Right", AlignPopupHandler, ctxAlignRight);
  1311. popup.AddParButton("Justified", AlignPopupHandler, ctxAlignJustified);
  1312. handled := TRUE;
  1313. popup.Popup(bounds.r-100, bounds.t+72);
  1314. END AlignHandler;
  1315. PROCEDURE AlignPopupHandler(sender, data: ANY);
  1316. BEGIN
  1317. IF (data # NIL) THEN
  1318. popup.Close;
  1319. IF data(ContextMenuData).val = 0 THEN
  1320. pAlign.SetAsString("Left"); tempPStyle.alignment := 0;
  1321. ELSIF data(ContextMenuData).val = 1 THEN
  1322. pAlign.SetAsString("Center"); tempPStyle.alignment := 1;
  1323. ELSIF data(ContextMenuData).val = 2 THEN
  1324. pAlign.SetAsString("Right"); tempPStyle.alignment := 2;
  1325. ELSIF data(ContextMenuData).val = 3 THEN
  1326. pAlign.SetAsString("Justified"); tempPStyle.alignment := 3;
  1327. ELSE
  1328. END;
  1329. END;
  1330. END AlignPopupHandler;
  1331. PROCEDURE StyleHandler(x, y : LONGINT; keys : SET; VAR handled : BOOLEAN);
  1332. BEGIN
  1333. NEW(popup);
  1334. popup.AddParButton("Regular", StylePopupHandler, ctxRegular);
  1335. popup.AddParButton("Bold", StylePopupHandler, ctxBold);
  1336. popup.AddParButton("Italic", StylePopupHandler, ctxItalic);
  1337. popup.AddParButton("Bold Italic", StylePopupHandler, ctxBoldItalic);
  1338. handled := TRUE;
  1339. popup.Popup(bounds.r-100, bounds.t+92);
  1340. END StyleHandler;
  1341. PROCEDURE StylePopupHandler(sender, data: ANY);
  1342. VAR tempFont : WMGraphics.Font;
  1343. BEGIN
  1344. IF (data # NIL) THEN
  1345. popup.Close;
  1346. IF data(ContextMenuData).val = 0 THEN
  1347. cStyle.SetAsString("Regular"); tempCStyle.style := {};
  1348. ELSIF data(ContextMenuData).val = 1 THEN
  1349. cStyle.SetAsString("Bold"); tempCStyle.style := {0};
  1350. ELSIF data(ContextMenuData).val = 2 THEN
  1351. cStyle.SetAsString("Italic"); tempCStyle.style := {1};
  1352. ELSIF data(ContextMenuData).val = 3 THEN
  1353. cStyle.SetAsString("Bold Italic"); tempCStyle.style := {0,1};
  1354. ELSE
  1355. END;
  1356. tempFont := WMGraphics.GetFont(tempCStyle.family, ENTIER(tempCStyle.size), tempCStyle.style);
  1357. previewLabel.SetFont(tempFont); previewLabel.Invalidate;
  1358. END;
  1359. END StylePopupHandler;
  1360. PROCEDURE ColorHandler(x, y : LONGINT; keys : SET; VAR handled : BOOLEAN);
  1361. VAR colorChooser: ColorChooserWindow;
  1362. result: WMGraphics.Color;
  1363. replaceColor: BOOLEAN;
  1364. colorString: ARRAY 16 OF CHAR;
  1365. BEGIN
  1366. NEW(colorChooser);
  1367. replaceColor := colorChooser.Show(bounds.r-190, bounds.t+172, result);
  1368. IF replaceColor THEN
  1369. Strings.IntToHexStr(result, 7, colorString);
  1370. cColor.SetAsString(colorString);
  1371. tempCStyle.color := result;
  1372. previewLabel.fontColor := result; previewLabel.Invalidate;
  1373. END;
  1374. handled := TRUE;
  1375. END ColorHandler;
  1376. PROCEDURE BGColorHandler(x, y : LONGINT; keys : SET; VAR handled : BOOLEAN);
  1377. VAR colorChooser: ColorChooserWindow;
  1378. result: WMGraphics.Color;
  1379. replaceColor: BOOLEAN;
  1380. colorString: ARRAY 16 OF CHAR;
  1381. BEGIN
  1382. NEW(colorChooser);
  1383. replaceColor := colorChooser.Show(bounds.r-190, bounds.t+192, result);
  1384. IF replaceColor THEN
  1385. Strings.IntToHexStr(result, 7, colorString);
  1386. cBackColor.SetAsString(colorString);
  1387. tempCStyle.bgColor := result;
  1388. previewLabel.fillColor.Set(result); previewLabel.Invalidate;
  1389. END;
  1390. handled := TRUE;
  1391. END BGColorHandler;
  1392. END StyleEditor;
  1393. (* -- Helper Components -- *)
  1394. CONST
  1395. BtnStyleSimple* = 0; BtnStyleRoundH* = 1; BtnStyleRoundV* = 2; BtnStyleGlass* = 3; BtnStyleElevator* = 4;
  1396. TYPE
  1397. Tab* = OBJECT(WMStandardComponents.Button)
  1398. VAR openSides* : SET;
  1399. PROCEDURE &Init*;
  1400. BEGIN
  1401. Init^;
  1402. openSides := {};
  1403. END Init;
  1404. (* PROCEDURE Draw(canvas : WMGraphics.Canvas);
  1405. VAR mode, ul, mid, borderWidth, lr, xpos, ypos : LONGINT;
  1406. tc : WMGraphics.Color; img : WMGraphics.Image; r, rect : WMGraphics.Rectangle; down : BOOLEAN;
  1407. str : Strings.String;
  1408. BEGIN
  1409. IF ~visible.Get() THEN RETURN END;
  1410. Acquire;
  1411. down := pressed & (mouseOver OR isToggle.Get() OR keyboardPressed);
  1412. IF down THEN mid := clPressed.Get(); tc := clTextPressed.Get(); img := imgPressed
  1413. ELSIF mouseOver THEN mid := clHover.Get(); tc := clTextHover.Get(); img := imgHover
  1414. ELSE mid := clDefault.Get(); tc := clTextDefault.Get(); img := imgDefault
  1415. END;
  1416. IF img = NIL THEN
  1417. IF invert3d THEN down := ~down END;
  1418. rect := GetClientRect();
  1419. mode := WMGraphics.ModeSrcOverDst;
  1420. borderWidth := 1;
  1421. CASE style.Get() OF
  1422. |BtnStyleRoundH : WMGraphicUtilities.FillRoundHorizontalBar(canvas, rect, down, mid, mode);
  1423. IF ~isFlat.Get() THEN WMGraphicUtilities.DrawBevel(canvas, WMRectangles.ResizeRect(rect, 0), borderWidth, down, mid, mode) END
  1424. |BtnStyleRoundV : WMGraphicUtilities.FillRoundVerticalBar(canvas, rect, down, mid, mode);
  1425. IF ~isFlat.Get() THEN WMGraphicUtilities.DrawBevel(canvas, WMRectangles.ResizeRect(rect, 0), borderWidth, down, mid, mode) END
  1426. |BtnStyleGlass : IF mid # 0 THEN canvas.Fill(rect, mid, mode) END
  1427. |BtnStyleElevator :
  1428. IF clDefault.Get() # 0 THEN
  1429. WMGraphicUtilities.DrawRect(canvas, WMRectangles.ResizeRect(rect, 0), clDefault.Get(), mode);
  1430. (* WMGraphicUtilities.DrawRect(canvas, WMRectangles.ResizeRect(rect, -1), clDefault.Get(), mode);
  1431. *) canvas.Fill(WMRectangles.ResizeRect(rect, -3), clDefault.Get(), mode);
  1432. END;
  1433. IF mid # 0 THEN
  1434. WMGraphicUtilities.DrawRect(canvas, WMRectangles.ResizeRect(rect, -1), mid, mode);
  1435. WMGraphicUtilities.DrawRect(canvas, WMRectangles.ResizeRect(rect, -2), mid, mode)
  1436. END
  1437. ELSE canvas.Fill(rect, mid, mode);
  1438. IF ~isFlat.Get() THEN WMGraphicUtilities.DrawBevel(canvas, WMRectangles.ResizeRect(rect, 0), borderWidth, down, mid, mode) END
  1439. END;
  1440. ELSE
  1441. canvas.DrawImage(0, 0, img, WMGraphics.ModeSrcOverDst)
  1442. END;
  1443. IF hasFocus THEN WMGraphicUtilities.DrawRect(canvas, WMRectangles.ResizeRect(rect, -1), 0FF000080H, mode) END;
  1444. IF image # NIL THEN canvas.DrawImage(0, 0, image, WMGraphics.ModeSrcOverDst) END;
  1445. str := caption.Get();
  1446. IF str # NIL THEN
  1447. r := GetClientRect();
  1448. IF down THEN
  1449. IF style.Get() IN {BtnStyleRoundH, BtnStyleRoundV, BtnStyleGlass} THEN
  1450. WMRectangles.MoveRel(r, 1, 1)
  1451. END
  1452. END;
  1453. canvas.SetColor(tc);
  1454. WMGraphics.DrawStringInRect(canvas, r, FALSE, 1, 1, str^)
  1455. END;
  1456. IF style.Get() = BtnStyleGlass THEN
  1457. IF effect3D.Get() > 0 THEN
  1458. WMGraphicUtilities.ExtRectGlassShade(canvas, rect, openSides, effect3D.Get(), down)
  1459. END
  1460. ELSIF style.Get() = BtnStyleElevator THEN
  1461. (* WMGraphicUtilities.RectGlassShade(canvas, WMRectangles.ResizeRect(rect, - 3), 1, down) *)
  1462. END;
  1463. Release
  1464. END Draw;
  1465. *)
  1466. END Tab;
  1467. Checkbox* = OBJECT(WMComponents.VisualComponent)
  1468. VAR caption* : ARRAY 64 OF CHAR;
  1469. leftBorder*: LONGINT;
  1470. font : WMGraphics.Font;
  1471. checked*, default*, hasThreeStates*, inactive*: BOOLEAN;
  1472. imgChecked, imgUnchecked, imgCheckedDefault, imgCheckedInactive, imgUncheckedInactive: WMGraphics.Image;
  1473. PROCEDURE &Init*;
  1474. BEGIN
  1475. Init^;
  1476. caption := "";
  1477. font := GetFont();
  1478. leftBorder := 5;
  1479. imgChecked := WMGraphics.LoadImage("checkboxchecked.gif" , TRUE);
  1480. imgUnchecked := WMGraphics.LoadImage("checkboxunchecked.gif" , TRUE);
  1481. imgCheckedDefault := WMGraphics.LoadImage("checkboxcheckedusedefault.gif" , TRUE);
  1482. imgCheckedInactive := WMGraphics.LoadImage("checkboxcheckedinactive.gif" , TRUE);
  1483. imgUncheckedInactive := WMGraphics.LoadImage("checkboxuncheckedinactive.gif" , TRUE);
  1484. checked := FALSE; hasThreeStates := FALSE; inactive := FALSE;
  1485. END Init;
  1486. PROCEDURE PointerDown*(x, y: LONGINT; keys: SET);
  1487. BEGIN
  1488. IF ~inactive THEN
  1489. IF hasThreeStates THEN
  1490. IF checked THEN checked := FALSE; default := FALSE;
  1491. ELSE
  1492. IF default THEN checked := TRUE; default := FALSE;
  1493. ELSE checked := FALSE; default := TRUE;
  1494. END;
  1495. END;
  1496. ELSE
  1497. IF checked THEN checked := FALSE; ELSE checked := TRUE; END;
  1498. END;
  1499. END;
  1500. Invalidate;
  1501. END PointerDown;
  1502. PROCEDURE Draw*(canvas: WMGraphics.Canvas);
  1503. VAR rect: WMRectangles.Rectangle;
  1504. BEGIN
  1505. Draw^(canvas);
  1506. rect := GetClientRect();
  1507. (* checkbox *)
  1508. IF inactive THEN
  1509. IF checked THEN
  1510. IF imgCheckedInactive # NIL THEN
  1511. canvas.DrawImage(leftBorder, ((rect.b-rect.t)-imgChecked.height) DIV 2, imgCheckedInactive, WMGraphics.ModeSrcOverDst);
  1512. END;
  1513. ELSE
  1514. IF imgUncheckedInactive # NIL THEN
  1515. canvas.DrawImage(leftBorder, ((rect.b-rect.t)-imgUnchecked.height) DIV 2, imgUncheckedInactive, WMGraphics.ModeSrcOverDst);
  1516. END;
  1517. END;
  1518. ELSE
  1519. IF hasThreeStates & default THEN
  1520. IF imgCheckedDefault # NIL THEN
  1521. canvas.DrawImage(leftBorder, ((rect.b-rect.t)-imgChecked.height) DIV 2, imgCheckedDefault, WMGraphics.ModeSrcOverDst);
  1522. END;
  1523. ELSE
  1524. IF checked THEN
  1525. IF imgChecked # NIL THEN
  1526. canvas.DrawImage(leftBorder, ((rect.b-rect.t)-imgChecked.height) DIV 2, imgChecked, WMGraphics.ModeSrcOverDst);
  1527. END;
  1528. ELSE
  1529. IF imgUnchecked # NIL THEN
  1530. canvas.DrawImage(leftBorder, ((rect.b-rect.t)-imgUnchecked.height) DIV 2, imgUnchecked, WMGraphics.ModeSrcOverDst);
  1531. END;
  1532. END;
  1533. END;
  1534. END;
  1535. (* caption *)
  1536. canvas.DrawString(leftBorder+30, (((rect.b-rect.t)-font.GetHeight()) DIV 2) + font.ascent+1, caption);
  1537. END Draw;
  1538. END Checkbox;
  1539. PreviewPanel* = OBJECT(WMStandardComponents.Label)
  1540. VAR fontColor*: WMGraphics.Color;
  1541. fontBackColor*: WMGraphics.Color;
  1542. oldFont : WMGraphics.Font;
  1543. PROCEDURE &Init*;
  1544. BEGIN
  1545. Init^;
  1546. fontColor := 0000000FFH;
  1547. fontBackColor := LONGINT(0FFFFFFFFH);
  1548. SetFont(WMGraphics.GetFont("Oberon", 16, {})); (* WMGraphics.FontBold *)
  1549. END Init;
  1550. PROCEDURE DrawBackground*(canvas: WMGraphics.Canvas);
  1551. VAR str : Strings.String;
  1552. BEGIN
  1553. DrawBackground^(canvas); str := caption.Get();
  1554. IF str # NIL THEN
  1555. canvas.SetColor(fontColor);
  1556. oldFont := canvas.GetFont(); canvas.SetFont(GetFont());
  1557. WMGraphics.DrawStringInRect(canvas, GetClientRect(), FALSE, alignH.Get(), alignV.Get(), str^);
  1558. canvas.SetFont(oldFont);
  1559. END;
  1560. END DrawBackground;
  1561. END PreviewPanel;
  1562. LinePanel* = OBJECT(WMStandardComponents.Panel)
  1563. VAR isHorizontal: BOOLEAN;
  1564. caption* : ARRAY 64 OF CHAR;
  1565. captionColor*: LONGINT;
  1566. captionFont : WMGraphics.Font;
  1567. PROCEDURE &Init*;
  1568. BEGIN
  1569. Init^;
  1570. caption := "";
  1571. captionFont := WMGraphics.GetFont("Oberon", 8, {});
  1572. captionColor := 0000000FFH;
  1573. isHorizontal := TRUE;
  1574. END Init;
  1575. PROCEDURE DrawBackground*(canvas: WMGraphics.Canvas);
  1576. VAR rect: WMRectangles.Rectangle;
  1577. highlight, shadow, w, h, dist : LONGINT;
  1578. BEGIN
  1579. highlight := LONGINT(0FFFFFF80H);
  1580. shadow := 000000080H;
  1581. rect := GetClientRect();
  1582. dist := (rect.b-rect.t) DIV 2;
  1583. IF (caption = "") THEN
  1584. canvas.Line(rect.l+3, dist, rect.r-4, dist, shadow, WMGraphics.ModeSrcOverDst);
  1585. canvas.Line(rect.l+3, dist+1, rect.r-4, dist+1, highlight, WMGraphics.ModeSrcOverDst);
  1586. ELSE
  1587. captionFont.GetStringSize(caption, w, h);
  1588. canvas.Line(rect.l+3, dist, rect.l+12, dist, shadow, WMGraphics.ModeSrcOverDst);
  1589. canvas.Line(rect.l+3, dist+1, rect.l+12, dist+1, highlight, WMGraphics.ModeSrcOverDst);
  1590. canvas.Line(rect.l+w+17, dist, rect.r-4, dist, shadow, WMGraphics.ModeSrcOverDst);
  1591. canvas.Line(rect.l+w+17, dist+1, rect.r-4, dist+1, highlight, WMGraphics.ModeSrcOverDst);
  1592. canvas.SetColor(captionColor);
  1593. captionFont.RenderString(canvas, rect.l+15, dist+4, caption);
  1594. END;
  1595. END DrawBackground;
  1596. END LinePanel;
  1597. GroupPanel* = OBJECT(WMStandardComponents.Panel)
  1598. VAR
  1599. border : WMRectangles.Rectangle;
  1600. caption*: ARRAY 64 OF CHAR;
  1601. captionFont : WMGraphics.Font;
  1602. centerContent, panel: WMStandardComponents.Panel;
  1603. spacerLeft, spacerTop, spacerRight, spacerBottom : WMStandardComponents.Panel;
  1604. PROCEDURE &Init*;
  1605. BEGIN
  1606. Init^;
  1607. border := WMRectangles.MakeRect(10,14,10,10);
  1608. caption := "";
  1609. captionFont := WMGraphics.GetFont("Oberon", 8, {});
  1610. CreateComponent;
  1611. END Init;
  1612. PROCEDURE CreateComponent;
  1613. BEGIN
  1614. (* build form with spacers *)
  1615. NEW(spacerLeft); spacerLeft.bounds.SetWidth(border.l); spacerLeft.alignment.Set(WMComponents.AlignLeft);
  1616. NEW(spacerTop); spacerTop.bounds.SetHeight(border.t); spacerTop.alignment.Set(WMComponents.AlignTop);
  1617. NEW(spacerRight); spacerRight.bounds.SetWidth(border.r); spacerRight.alignment.Set(WMComponents.AlignRight);
  1618. NEW(spacerBottom); spacerBottom.bounds.SetHeight(border.b); spacerBottom.alignment.Set(WMComponents.AlignBottom);
  1619. NEW(centerContent); centerContent.alignment.Set(WMComponents.AlignClient);
  1620. AddContent^(spacerTop);
  1621. AddContent^(spacerBottom);
  1622. NEW(panel); panel.alignment.Set(WMComponents.AlignClient);
  1623. panel.AddContent(spacerLeft); panel.AddContent(spacerRight); panel.AddContent(centerContent);
  1624. AddContent^(panel);
  1625. END CreateComponent;
  1626. PROCEDURE DrawBackground*(canvas: WMGraphics.Canvas);
  1627. VAR rect: WMRectangles.Rectangle;
  1628. highlight, shadow, w, h : LONGINT;
  1629. BEGIN
  1630. highlight := LONGINT(0FFFFFF80H);
  1631. shadow := 000000080H;
  1632. rect := GetClientRect();
  1633. (* canvas.Fill(rect, 0FF0000FFH, WMGraphics.ModeSrcOverDst); *)
  1634. IF (caption = "") THEN
  1635. canvas.Line(rect.l+3, rect.t+5, rect.r-4, rect.t+5, shadow, WMGraphics.ModeSrcOverDst);
  1636. canvas.Line(rect.l+4, rect.t+6, rect.r-5, rect.t+6, highlight, WMGraphics.ModeSrcOverDst);
  1637. ELSE
  1638. captionFont.GetStringSize(caption, w, h);
  1639. canvas.Line(rect.l+3, rect.t+5, rect.l+12, rect.t+5, shadow, WMGraphics.ModeSrcOverDst);
  1640. canvas.Line(rect.l+4, rect.t+6, rect.l+12, rect.t+6, highlight, WMGraphics.ModeSrcOverDst);
  1641. canvas.Line(rect.l+w+17, rect.t+5, rect.r-4, rect.t+5, shadow, WMGraphics.ModeSrcOverDst);
  1642. canvas.Line(rect.l+w+17, rect.t+6, rect.r-5, rect.t+6, highlight, WMGraphics.ModeSrcOverDst);
  1643. END;
  1644. canvas.Line(rect.l+3, rect.b-4, rect.r-4, rect.b-4, shadow, WMGraphics.ModeSrcOverDst);
  1645. canvas.Line(rect.l+3, rect.t+5, rect.l+3, rect.b-4, shadow, WMGraphics.ModeSrcOverDst);
  1646. canvas.Line(rect.r-4, rect.t+5, rect.r-4, rect.b-4, shadow, WMGraphics.ModeSrcOverDst);
  1647. canvas.Line(rect.l+3, rect.b-3, rect.r-3, rect.b-3, highlight, WMGraphics.ModeSrcOverDst);
  1648. canvas.Line(rect.l+4, rect.t+6, rect.l+4, rect.b-5, highlight, WMGraphics.ModeSrcOverDst);
  1649. canvas.Line(rect.r-3, rect.t+5, rect.r-3, rect.b-3, highlight, WMGraphics.ModeSrcOverDst);
  1650. IF (caption # "") THEN
  1651. captionFont.RenderString(canvas, rect.l+15, rect.t+9, caption);
  1652. END;
  1653. END DrawBackground;
  1654. PROCEDURE UpdateBorder;
  1655. BEGIN
  1656. spacerLeft.bounds.SetWidth(border.l); spacerRight.bounds.SetWidth(border.r);
  1657. spacerTop.bounds.SetHeight(border.t); spacerBottom.bounds.SetHeight(border.b);
  1658. Invalidate;
  1659. END UpdateBorder;
  1660. PROCEDURE SetCaption*(string: ARRAY OF CHAR);
  1661. BEGIN
  1662. COPY(string, caption);
  1663. END SetCaption;
  1664. PROCEDURE AddContent*(content: XML.Content);
  1665. BEGIN
  1666. centerContent.AddContent(content);
  1667. END AddContent;
  1668. END GroupPanel;
  1669. BorderPanel* = OBJECT(WMStandardComponents.Panel)
  1670. VAR
  1671. border* : WMRectangles.Rectangle;
  1672. centerContent, panel: WMStandardComponents.Panel;
  1673. spacerLeft, spacerTop, spacerRight, spacerBottom : WMStandardComponents.Panel;
  1674. PROCEDURE &Init*;
  1675. BEGIN
  1676. Init^;
  1677. border := WMRectangles.MakeRect(0,0,0,0);
  1678. CreateComponent;
  1679. END Init;
  1680. PROCEDURE CreateComponent;
  1681. BEGIN
  1682. (* build form with spacers *)
  1683. NEW(spacerLeft); spacerLeft.bounds.SetWidth(border.l); spacerLeft.alignment.Set(WMComponents.AlignLeft);
  1684. NEW(spacerTop); spacerTop.bounds.SetHeight(border.t); spacerTop.alignment.Set(WMComponents.AlignTop);
  1685. NEW(spacerRight); spacerRight.bounds.SetWidth(border.r); spacerRight.alignment.Set(WMComponents.AlignRight);
  1686. NEW(spacerBottom); spacerBottom.bounds.SetHeight(border.b); spacerBottom.alignment.Set(WMComponents.AlignBottom);
  1687. NEW(centerContent); centerContent.alignment.Set(WMComponents.AlignClient);
  1688. AddContent^(spacerTop);
  1689. AddContent^(spacerBottom);
  1690. NEW(panel); panel.alignment.Set(WMComponents.AlignClient);
  1691. panel.AddContent(spacerLeft); panel.AddContent(spacerRight); panel.AddContent(centerContent);
  1692. AddContent^(panel);
  1693. END CreateComponent;
  1694. PROCEDURE UpdateBorder;
  1695. BEGIN
  1696. spacerLeft.bounds.SetWidth(border.l); spacerRight.bounds.SetWidth(border.r);
  1697. spacerTop.bounds.SetHeight(border.t); spacerBottom.bounds.SetHeight(border.b);
  1698. Invalidate;
  1699. END UpdateBorder;
  1700. PROCEDURE SetBorder*(left, top, right, bottom: LONGINT);
  1701. BEGIN
  1702. border := WMRectangles.MakeRect(left, top, right, bottom);
  1703. UpdateBorder;
  1704. END SetBorder;
  1705. PROCEDURE GetBorder*(): WMRectangles.Rectangle;
  1706. BEGIN
  1707. RETURN border;
  1708. END GetBorder;
  1709. PROCEDURE AddContent*(content: XML.Content);
  1710. BEGIN
  1711. centerContent.AddContent(content);
  1712. END AddContent;
  1713. END BorderPanel;
  1714. CustomPanel* = OBJECT(WMStandardComponents.Panel)
  1715. VAR
  1716. border* : WMRectangles.Rectangle;
  1717. centerContent, panel : WMStandardComponents.Panel;
  1718. spacerLeft, spacerTop, spacerRight, spacerBottom : WMStandardComponents.Panel;
  1719. caption* : ARRAY 128 OF CHAR;
  1720. textColor* : WMGraphics.Color;
  1721. font*: WMGraphics.Font;
  1722. alignH*, alignV* : LONGINT; (* 0: AlignLeft/AlignTop *)
  1723. (* 1: AlignCenter *)
  1724. (* 2: AlignRight/Bottom *)
  1725. hasBevel* : BOOLEAN;
  1726. bevelWidth* : LONGINT;
  1727. bevelColor* : WMGraphics.Color;
  1728. bevelDown* : BOOLEAN;
  1729. hasInnerBevel* : BOOLEAN;
  1730. innerBevelWidth* : LONGINT;
  1731. innerBevelColor* : WMGraphics.Color;
  1732. innerBevelDown* : BOOLEAN;
  1733. hasGlass* : BOOLEAN;
  1734. glassWidth* : LONGINT;
  1735. glassDown* : BOOLEAN;
  1736. glassOpenSides* : SET;
  1737. img* : Raster.Image;
  1738. imgBorderWidth* : LONGINT;
  1739. altFillColor* : WMGraphics.Color;
  1740. fillMode* : LONGINT; (* 0: Solid *)
  1741. (* 1: Gradient Horizontal *)
  1742. (* 2: Gradient Vertical *)
  1743. (* 3: Gradient Reflected Horizontal *)
  1744. (* 4: Gradient Reflected Vertical *)
  1745. (* 5: Image Streched *)
  1746. (* 6: Image Repeating *)
  1747. (* 7: Image Special *)
  1748. (* 8: Image Border Special *)
  1749. PROCEDURE &Init*;
  1750. BEGIN
  1751. Init^;
  1752. border := WMRectangles.MakeRect(0,0,0,0);
  1753. caption := ""; textColor := 0000000FFH; alignH := 0; alignV := 0;
  1754. hasBevel := FALSE; bevelWidth := 5; bevelColor := LONGINT(088888888H); bevelDown := FALSE;
  1755. hasInnerBevel := FALSE; innerBevelWidth := 5; innerBevelColor := LONGINT(088888888H); innerBevelDown := TRUE;
  1756. hasGlass := FALSE; glassWidth := 5; glassDown := TRUE; glassOpenSides := {};
  1757. altFillColor := fillColor.Get(); fillMode := 0;
  1758. CreateComponent;
  1759. END Init;
  1760. PROCEDURE CreateComponent;
  1761. BEGIN
  1762. (* build form with spacers *)
  1763. NEW(spacerLeft); spacerLeft.bounds.SetWidth(border.l); spacerLeft.alignment.Set(WMComponents.AlignLeft);
  1764. NEW(spacerTop); spacerTop.bounds.SetHeight(border.t); spacerTop.alignment.Set(WMComponents.AlignTop);
  1765. NEW(spacerRight); spacerRight.bounds.SetWidth(border.r); spacerRight.alignment.Set(WMComponents.AlignRight);
  1766. NEW(spacerBottom); spacerBottom.bounds.SetHeight(border.b); spacerBottom.alignment.Set(WMComponents.AlignBottom);
  1767. NEW(centerContent); centerContent.alignment.Set(WMComponents.AlignClient); centerContent.fillColor.Set(LONGINT(0FF8800FFH));
  1768. AddContent^(spacerTop);
  1769. AddContent^(spacerBottom);
  1770. NEW(panel); panel.alignment.Set(WMComponents.AlignClient);
  1771. panel.AddContent(spacerLeft); panel.AddContent(spacerRight); panel.AddContent(centerContent);
  1772. AddContent^(panel);
  1773. END CreateComponent;
  1774. PROCEDURE UpdateBorder;
  1775. BEGIN
  1776. spacerLeft.bounds.SetWidth(border.l); spacerRight.bounds.SetWidth(border.r);
  1777. spacerTop.bounds.SetHeight(border.t); spacerBottom.bounds.SetHeight(border.b);
  1778. Invalidate;
  1779. END UpdateBorder;
  1780. PROCEDURE SetBorder*(left, top, right, bottom: LONGINT);
  1781. BEGIN
  1782. border := WMRectangles.MakeRect(left, top,right, bottom);
  1783. UpdateBorder;
  1784. END SetBorder;
  1785. PROCEDURE GetBorder*(): WMRectangles.Rectangle;
  1786. BEGIN
  1787. RETURN border;
  1788. END GetBorder;
  1789. PROCEDURE AddContent*(content: XML.Content);
  1790. BEGIN
  1791. centerContent.AddContent(content);
  1792. END AddContent;
  1793. PROCEDURE Draw*(canvas: WMGraphics.Canvas);
  1794. VAR rect, rect1, rect2: WMRectangles.Rectangle;
  1795. color: WMGraphics.Color; mode: LONGINT;
  1796. BEGIN
  1797. (* DrawBackground(canvas); *)
  1798. rect := GetClientRect(); color := fillColor.Get(); mode := WMGraphics.ModeSrcOverDst;
  1799. CASE fillMode OF
  1800. 0: canvas.Fill(rect, color, mode);
  1801. | 1: WMGraphicUtilities.FillGradientHorizontal(canvas, rect, color, altFillColor, mode);
  1802. | 2: WMGraphicUtilities.FillGradientVertical(canvas, rect, color, altFillColor, mode);
  1803. | 3: rect1 := WMRectangles.MakeRect(rect.l, rect.t, (rect.r-rect.l) DIV 2, rect.b);
  1804. rect2 := WMRectangles.MakeRect((rect.r-rect.l) DIV 2, rect.t, rect.r, rect.b);
  1805. WMGraphicUtilities.FillGradientHorizontal(canvas, rect1, color, altFillColor, mode);
  1806. WMGraphicUtilities.FillGradientHorizontal(canvas, rect2, altFillColor, color, mode);
  1807. | 4: rect1 := WMRectangles.MakeRect(rect.l, rect.t, rect.r, (rect.b-rect.t) DIV 2);
  1808. rect2 := WMRectangles.MakeRect(rect.l, (rect.b-rect.t) DIV 2, rect.r, rect.b);
  1809. WMGraphicUtilities.FillGradientHorizontal(canvas, rect1, color, altFillColor, mode);
  1810. WMGraphicUtilities.FillGradientHorizontal(canvas, rect2, altFillColor, color, mode);
  1811. | 5: IF img # NIL THEN
  1812. canvas.ScaleImage(img, WMRectangles.MakeRect(0,0, img.width, img.height), rect, mode, WMRasterScale.ScaleBox);
  1813. END;
  1814. | 6: DrawRepeating(canvas, rect, img, mode);
  1815. | 7: (* not yet implemented *)
  1816. | 8: (* not yet implemented *)
  1817. (* | 9: WMGraphicUtilities.FillRoundHorizontalBar(canvas, rect, TRUE, color, mode);
  1818. | 10: WMGraphicUtilities.FillRoundVerticalBar(canvas, rect, TRUE, color, mode);
  1819. | 11: WMGraphicUtilities.FillRoundHorizontalBar(canvas, rect, FALSE, color, mode);
  1820. | 12: WMGraphicUtilities.FillRoundVerticalBar(canvas, rect, FALSE, color, mode);
  1821. *) ELSE
  1822. END;
  1823. (* Draw Bevel *)
  1824. IF hasBevel THEN
  1825. WMGraphicUtilities.DrawBevel(canvas, rect, bevelWidth, bevelDown, bevelColor, mode);
  1826. END;
  1827. (* Draw Inner Bevel *)
  1828. IF hasInnerBevel THEN
  1829. rect1 := WMRectangles.MakeRect(rect.l+border.l-innerBevelWidth, rect.t+border.t-innerBevelWidth, rect.r-border.r+innerBevelWidth, rect.b-border.b+innerBevelWidth);
  1830. WMGraphicUtilities.DrawBevel(canvas, rect1, innerBevelWidth, innerBevelDown, innerBevelColor, mode);
  1831. END;
  1832. (* Draw Glass *)
  1833. IF hasGlass THEN
  1834. WMGraphicUtilities.ExtRectGlassShade(canvas, rect, glassOpenSides, glassWidth, glassDown);
  1835. END;
  1836. (* Draw Caption *)
  1837. IF caption # "" THEN
  1838. canvas.SetColor(textColor); canvas.SetFont(font);
  1839. WMGraphics.DrawStringInRect(canvas, rect, FALSE, alignH, alignV, caption);
  1840. END;
  1841. (* Draw Content *)
  1842. DrawSubComponents(canvas);
  1843. DrawForeground(canvas);
  1844. END Draw;
  1845. PROCEDURE DrawRepeating(canvas: WMGraphics.Canvas; rectangle: WMRectangles.Rectangle; image: Raster.Image; mode: LONGINT);
  1846. END DrawRepeating;
  1847. END CustomPanel;
  1848. (* ----------------------------------------------- *)
  1849. VAR
  1850. ctxAlignLeft, ctxAlignCenter, ctxAlignRight, ctxAlignJustified: ContextMenuData;
  1851. ctxRegular, ctxBold, ctxItalic, ctxBoldItalic: ContextMenuData;
  1852. PROCEDURE Inc*(VAR a, b: REAL);
  1853. BEGIN
  1854. a := a + b;
  1855. END Inc;
  1856. PROCEDURE Dec*(VAR a, b: REAL);
  1857. BEGIN
  1858. a := a - b;
  1859. END Dec;
  1860. (* converts a 16.16 fixpoint integer to float *)
  1861. PROCEDURE FixpToFloat*(x: LONGINT): REAL;
  1862. BEGIN
  1863. RETURN (x / 65536);
  1864. END FixpToFloat;
  1865. (* converts a float into a 16.16 fixpoint integer *)
  1866. PROCEDURE FloatToFixp*(x: REAL): LONGINT;
  1867. BEGIN
  1868. IF x > 65536 THEN x := 65536; RETURN ENTIER(x);
  1869. ELSE RETURN ENTIER(x * (65536));
  1870. END;
  1871. END FloatToFixp;
  1872. PROCEDURE OutReal*(input: REAL; digits: LONGINT);
  1873. VAR tempString: ARRAY 64 OF CHAR;
  1874. BEGIN
  1875. Strings.FloatToStr(input, 0, digits, 0, tempString);
  1876. KernelLog.String(tempString);
  1877. END OutReal;
  1878. PROCEDURE ROUND*(input: REAL): LONGINT;
  1879. VAR output: LONGINT;
  1880. BEGIN
  1881. output := ENTIER(input+0.5);
  1882. RETURN output;
  1883. END ROUND;
  1884. PROCEDURE RANDOM*(upperBound, lowerBound: LONGINT): LONGINT;
  1885. CONST
  1886. a = 16807; m = 2147483647; q = m DIV a; r = m MOD a;
  1887. VAR random, seed, unused, gamma: LONGINT;
  1888. BEGIN
  1889. (* get a seed *)
  1890. Dates.DateTimeToOberon(Dates.Now(), unused, seed);
  1891. (* calc *)
  1892. gamma := a*(seed MOD q) - r*(seed DIV q);
  1893. IF gamma > 0 THEN
  1894. seed := gamma;
  1895. ELSE
  1896. seed := gamma + m;
  1897. END;
  1898. random := ENTIER(seed/m*(upperBound-lowerBound)) + lowerBound;
  1899. RETURN random;
  1900. END RANDOM;
  1901. BEGIN
  1902. NEW(ctxAlignLeft, AlignLeft);
  1903. NEW(ctxAlignCenter, AlignCenter);
  1904. NEW(ctxAlignRight, AlignRight);
  1905. NEW(ctxAlignJustified, AlignJustified);
  1906. NEW(ctxRegular, StyleRegular);
  1907. NEW(ctxBold, StyleBold);
  1908. NEW(ctxItalic, StyleItalic);
  1909. NEW(ctxBoldItalic, StyleBoldItalic);
  1910. END DTPUtilities.
  1911. -----------------------------
  1912. Normal
  1913. Highlight
  1914. Types and Procedures
  1915. Lock Acquire / Lock Release
  1916. Preferred notation (comment)
  1917. Unsafe / Temporary / Stupid / requires attention
  1918. Permanent Comment
  1919. Assertion
  1920. Debug