MenuEdit.Mod 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. MODULE MenuEdit; (** AUTHOR "TF"; PURPOSE "Template/Example for component windows"; *)
  2. (** This program shows the implementation of a multi instance component containing window *)
  3. IMPORT
  4. Strings, WMGraphics, WMMessages, WMComponents, WMStandardComponents,
  5. Modules, KernelLog, WMRectangles,
  6. Streams, MultiLogger, Random, WMDialogs, XML, XMLObjects,
  7. WM := WMWindowManager;
  8. TYPE
  9. KillerMsg = OBJECT
  10. END KillerMsg;
  11. Window* = OBJECT (WMComponents.FormWindow)
  12. VAR add, store, delete, edit, toFront : WMStandardComponents.Button;
  13. panel, toolbar : WMStandardComponents.Panel;
  14. selectedObj : WMComponents.VisualComponent;
  15. lx, ly : LONGINT;
  16. generator : Random.Generator;
  17. PROCEDURE CreateForm() : WMComponents.VisualComponent;
  18. VAR e : WMStandardComponents.Panel;
  19. BEGIN
  20. NEW(e); e.bounds.SetExtents(500, 520); e.fillColor.Set(0); e.takesFocus.Set(TRUE);
  21. NEW(toolbar); toolbar.bounds.SetHeight(20); toolbar.fillColor.Set(0); toolbar.takesFocus.Set(TRUE);
  22. toolbar.alignment.Set(WMComponents.AlignTop);
  23. e.AddContent(toolbar);
  24. NEW(add); add.caption.SetAOC("Add"); add.onClick.Add(AddButton); add.alignment.Set(WMComponents.AlignLeft);
  25. toolbar.AddContent(add);
  26. NEW(store); store.caption.SetAOC("Get XML"); store.onClick.Add(Store); store.alignment.Set(WMComponents.AlignLeft);
  27. toolbar.AddContent(store);
  28. NEW(delete); delete.caption.SetAOC("Delete"); delete.onClick.Add(Delete); delete.alignment.Set(WMComponents.AlignLeft);
  29. toolbar.AddContent(delete);
  30. NEW(edit); edit.caption.SetAOC("Edit"); edit.onClick.Add(Edit); edit.alignment.Set(WMComponents.AlignLeft);
  31. toolbar.AddContent(edit);
  32. NEW(toFront); toFront.caption.SetAOC("To Front"); toFront.onClick.Add(ToFront); toFront.alignment.Set(WMComponents.AlignLeft);
  33. toolbar.AddContent(toFront);
  34. NEW(panel); panel.bounds.SetExtents(500, 500); panel.fillColor.Set(0); panel.alignment.Set(WMComponents.AlignTop); panel.takesFocus.Set(TRUE);
  35. e.AddContent(panel);
  36. RETURN e
  37. END CreateForm;
  38. PROCEDURE &New*;
  39. VAR vc : WMComponents.VisualComponent;
  40. BEGIN
  41. NEW(generator);
  42. IncCount;
  43. (* To create a multi language app, try loading the respective XML instead of CreateForm()
  44. if the XML was not found or does not contain all needed elements, use CreateForm as fallback *)
  45. vc := CreateForm();
  46. Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), TRUE);
  47. SetContent(vc);
  48. WM.DefaultAddWindow(SELF);
  49. SetTitle(Strings.NewString("Menu Edit"));
  50. END New;
  51. PROCEDURE PointerDown*(x, y : LONGINT; keys : SET);
  52. VAR button : WMStandardComponents.Button;
  53. BEGIN
  54. IF 1 IN keys THEN
  55. NEW(button);
  56. button.bounds.SetExtents(64, 64);
  57. panel.AddContent(button);
  58. panel.Invalidate;
  59. Select(button);
  60. END;
  61. END PointerDown;
  62. PROCEDURE AddButton(sender, data : ANY);
  63. VAR button : WMStandardComponents.Button;
  64. name, nameD, nameH, str : ARRAY 64 OF CHAR;
  65. type, direction : LONGINT;
  66. img : WMGraphics.Image;
  67. sc : WMStandardComponents.SystemCommand;
  68. BEGIN
  69. name := "present.tar://present";
  70. type := generator.Dice(5) + 1; direction := generator.Dice(3) + 1;
  71. Strings.IntToStr(type, str); Strings.Append(name, str);
  72. Strings.Append(name, "-");
  73. Strings.IntToStr(direction, str); Strings.Append(name, str);
  74. COPY(name, nameD); Strings.Append(nameD, ".png");
  75. COPY(name, nameH); Strings.Append(nameH, "h.png");
  76. img := WMGraphics.LoadImage(nameD, TRUE);
  77. IF img # NIL THEN
  78. NEW(button);
  79. button.bounds.SetExtents(img.width, img.height);
  80. button.imgDefaultName.SetAOC(nameD);
  81. button.imgHoverName.SetAOC(nameH);
  82. button.clTextDefault.Set(0FFFFH);
  83. button.useBgBitmaps.Set(TRUE);
  84. button.onClick.Add(SelectPresent);
  85. button.onClickHandler.SetAOC("X Run");
  86. NEW(sc);
  87. sc.id.SetAOC("X");
  88. button.AddContent(sc);
  89. panel.AddContent(button);
  90. button.Reset(NIL, NIL);
  91. panel.Invalidate;
  92. Select(button);
  93. END
  94. END AddButton;
  95. PROCEDURE Delete(sender, data : ANY);
  96. BEGIN
  97. IF selectedObj # NIL THEN
  98. panel.RemoveContent(selectedObj);
  99. selectedObj := NIL;
  100. panel.Invalidate
  101. END
  102. END Delete;
  103. PROCEDURE ToFront(sender, data : ANY);
  104. BEGIN
  105. IF selectedObj # NIL THEN
  106. panel.RemoveContent(selectedObj);
  107. panel.AddContent(selectedObj);
  108. panel.Invalidate
  109. END
  110. END ToFront;
  111. PROCEDURE Edit(sender, data : ANY);
  112. VAR caption, command : ARRAY 1024 OF CHAR;
  113. s : Strings.String;
  114. sc : WMStandardComponents.SystemCommand;
  115. e : XMLObjects.Enumerator; c : ANY;
  116. BEGIN
  117. IF selectedObj # NIL THEN
  118. s := selectedObj(WMStandardComponents.Button).caption.Get();
  119. IF s # NIL THEN COPY(s^, caption) END;
  120. IF WMDialogs.QueryString("Caption", caption) = WMDialogs.ResOk THEN
  121. selectedObj(WMStandardComponents.Button).caption.SetAOC(caption);
  122. END;
  123. sc := NIL;
  124. e := selectedObj.GetContents();
  125. IF e.HasMoreElements() THEN
  126. c := e.GetNext();
  127. s := c(XML.Element).GetName(); KernelLog.String("s^= "); KernelLog.String(s^); KernelLog.Ln;
  128. IF (c IS WMStandardComponents.SystemCommand) THEN sc := c(WMStandardComponents.SystemCommand) END;
  129. END;
  130. IF sc # NIL THEN
  131. s := sc.commandString.Get();
  132. IF s # NIL THEN COPY(s^, command) END;
  133. IF WMDialogs.QueryString("Command", command) = WMDialogs.ResOk THEN
  134. sc.commandString.SetAOC(command);
  135. END;
  136. END;
  137. panel.Invalidate
  138. END
  139. END Edit;
  140. PROCEDURE Store(sender, data : ANY);
  141. VAR ml : MultiLogger.LogWindow;
  142. w : Streams.Writer;
  143. BEGIN
  144. NEW(ml, "XML", w);
  145. panel.Write(w, NIL, 0);
  146. w.Update;
  147. END Store;
  148. PROCEDURE Select(vc : WMComponents.VisualComponent);
  149. BEGIN
  150. IF selectedObj # NIL THEN
  151. selectedObj.SetExtPointerDownHandler(NIL);
  152. selectedObj.SetExtPointerMoveHandler(NIL)
  153. END;
  154. selectedObj := vc;
  155. selectedObj.SetExtPointerMoveHandler(HandlePointerMove);
  156. selectedObj.SetExtPointerDownHandler(HandlePointerDown);
  157. END Select;
  158. PROCEDURE SelectPresent(sender, data : ANY);
  159. BEGIN
  160. IF (sender # NIL) & (sender IS WMComponents.VisualComponent) THEN
  161. Select(sender(WMComponents.VisualComponent))
  162. END
  163. END SelectPresent;
  164. PROCEDURE HandlePointerDown(x, y : LONGINT; keys : SET; VAR handled : BOOLEAN);
  165. BEGIN
  166. lx := x; ly := y; handled := TRUE
  167. END HandlePointerDown;
  168. PROCEDURE HandlePointerMove(x, y : LONGINT; keys : SET; VAR handled : BOOLEAN);
  169. VAR dx, dy : LONGINT; r : WMRectangles.Rectangle;
  170. BEGIN
  171. IF 0 IN keys THEN
  172. IF selectedObj # NIL THEN
  173. dy := y - ly; dx := x - lx;
  174. r := selectedObj.bounds.Get();
  175. WMRectangles.MoveRel(r, dx, dy);
  176. selectedObj.bounds.Set(r);
  177. panel.Invalidate;
  178. END
  179. END;
  180. handled := TRUE
  181. END HandlePointerMove;
  182. PROCEDURE Close*;
  183. BEGIN
  184. Close^;
  185. DecCount
  186. END Close;
  187. PROCEDURE Handle*(VAR x : WMMessages.Message);
  188. BEGIN
  189. IF (x.msgType = WMMessages.MsgExt) & (x.ext # NIL) & (x.ext IS KillerMsg) THEN Close
  190. ELSE Handle^(x)
  191. END
  192. END Handle;
  193. END Window;
  194. VAR
  195. nofWindows : LONGINT;
  196. PROCEDURE Open*;
  197. VAR winstance : Window;
  198. BEGIN
  199. NEW(winstance);
  200. END Open;
  201. PROCEDURE IncCount;
  202. BEGIN {EXCLUSIVE}
  203. INC(nofWindows)
  204. END IncCount;
  205. PROCEDURE DecCount;
  206. BEGIN {EXCLUSIVE}
  207. DEC(nofWindows)
  208. END DecCount;
  209. PROCEDURE Cleanup;
  210. VAR die : KillerMsg;
  211. msg : WMMessages.Message;
  212. m : WM.WindowManager;
  213. BEGIN {EXCLUSIVE}
  214. NEW(die);
  215. msg.ext := die;
  216. msg.msgType := WMMessages.MsgExt;
  217. m := WM.GetDefaultManager();
  218. m.Broadcast(msg);
  219. AWAIT(nofWindows = 0)
  220. END Cleanup;
  221. BEGIN
  222. Modules.InstallTermHandler(Cleanup)
  223. END MenuEdit.
  224. SystemTools.Free MenuEdit ~
  225. MenuEdit.Open ~