TestMenu.Mod 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. MODULE TestMenu; (** AUTHOR "TF/staubesv" PURPOSE "Testbed for WMMenus.Mod" *)
  2. IMPORT
  3. KernelLog,
  4. Modules, Commands,Strings, Files, XML, XMLObjects, XMLScanner, XMLParser,
  5. WMGraphics, WMMessages, WM := WMWindowManager,
  6. WMComponents, WMStandardComponents, WMTrees, WMMenus;
  7. TYPE
  8. KillerMsg = OBJECT
  9. END KillerMsg;
  10. Window* = OBJECT (WMComponents.FormWindow)
  11. VAR
  12. menu : WMTrees.Tree;
  13. menuPanel : WMMenus.MenuPanel;
  14. hasErrors : BOOLEAN;
  15. PROCEDURE CreateForm() : WMComponents.VisualComponent;
  16. VAR
  17. panel : WMStandardComponents.Panel;
  18. root : WMTrees.TreeNode;
  19. BEGIN
  20. NEW(panel);
  21. panel.bounds.SetExtents(800, 700);
  22. panel.fillColor.Set(LONGINT(0FFFFFFFFH));
  23. panel.takesFocus.Set(TRUE);
  24. NEW(menu); NEW(root);
  25. NEW(menuPanel);
  26. menuPanel.fillColor.Set(LONGINT(WMGraphics.White));
  27. menuPanel.bounds.SetHeight(20);
  28. menuPanel.alignment.Set(WMComponents.AlignTop);
  29. menuPanel.horizontal.Set(TRUE);
  30. menuPanel.openDirection.Set(WMMenus.OpenDownRight);
  31. menuPanel.SetMenu(menu, root);
  32. menuPanel.onSelect.Add(Selected);
  33. panel.AddContent(menuPanel);
  34. RETURN panel
  35. END CreateForm;
  36. PROCEDURE &New*;
  37. VAR vc : WMComponents.VisualComponent;
  38. BEGIN
  39. IncCount;
  40. (* To create a multi language app, try loading the respective XML instead of CreateForm()
  41. if the XML was not found or does not contain all needed elements, use CreateForm as fallback *)
  42. vc := CreateForm();
  43. Init(vc.bounds.GetWidth(), vc.bounds.GetHeight(), FALSE);
  44. SetContent(vc);
  45. WM.DefaultAddWindow(SELF);
  46. SetTitle(Strings.NewString("Test Window"));
  47. END New;
  48. PROCEDURE AddMenuItem(node : WMTrees.TreeNode; xml : XML.Element);
  49. VAR newNode : WMTrees.TreeNode;
  50. BEGIN
  51. NEW(newNode);
  52. menu.AddChildNode(node, newNode);
  53. menu.SetNodeData(newNode, xml);
  54. menu.SetNodeCaption(newNode, xml.GetAttributeValue("caption"));
  55. END AddMenuItem;
  56. PROCEDURE Selected(sender, data : ANY);
  57. VAR s : Strings.String;
  58. BEGIN
  59. IF ~sequencer.IsCallFromSequencer() THEN
  60. sequencer.ScheduleEvent(SELF.Selected, sender, data)
  61. ELSE
  62. IF (data # NIL) & (data IS WMTrees.TreeNode) THEN
  63. menu.Acquire;
  64. s := menu.GetNodeCaption(data(WMTrees.TreeNode));
  65. IF s # NIL THEN KernelLog.String(s^); KernelLog.Ln; END;
  66. menu.Release;
  67. END
  68. END
  69. END Selected;
  70. PROCEDURE AddSubMenu(node : WMTrees.TreeNode; xml : XML.Element );
  71. VAR en : XMLObjects.Enumerator;
  72. p : ANY; s : Strings.String;
  73. newNode : WMTrees.TreeNode;
  74. BEGIN
  75. NEW(newNode);
  76. menu.AddChildNode(node, newNode);
  77. menu.SetNodeData(newNode, xml);
  78. menu.SetNodeCaption(newNode, xml.GetAttributeValue("caption"));
  79. en := xml.GetContents();
  80. WHILE en.HasMoreElements() DO
  81. p := en.GetNext();
  82. IF p IS XML.Element THEN
  83. s := p(XML.Element).GetName();
  84. IF s # NIL THEN
  85. IF s^ = "MenuItem" THEN AddMenuItem(newNode, p(XML.Element))
  86. ELSIF s^ = "SubMenu" THEN AddSubMenu(newNode, p(XML.Element))
  87. END
  88. END
  89. END
  90. END;
  91. END AddSubMenu;
  92. PROCEDURE SetDocument(xml : XML.Element);
  93. VAR en : XMLObjects.Enumerator;
  94. p : ANY; s : Strings.String;
  95. node : WMTrees.TreeNode;
  96. BEGIN
  97. NEW(node);
  98. menu.Acquire;
  99. menu.SetRoot(node);
  100. menu.SetNodeState(node, {WMTrees.NodeAlwaysExpanded});
  101. menu.SetNodeData(node, xml);
  102. en := xml.GetContents();
  103. WHILE en.HasMoreElements() DO
  104. p := en.GetNext();
  105. IF p IS XML.Element THEN
  106. s := p(XML.Element).GetName();
  107. IF s # NIL THEN
  108. IF s^ = "SubMenu" THEN AddSubMenu(node, p(XML.Element))
  109. ELSIF s^ = "MenuItem" THEN AddMenuItem(node, p(XML.Element))
  110. END
  111. END
  112. END
  113. END;
  114. menu.Release;
  115. menuPanel.SetMenu(menu, node)
  116. END SetDocument;
  117. PROCEDURE Error(pos, line, row : LONGINT; CONST msg : ARRAY OF CHAR);
  118. BEGIN
  119. KernelLog.String("Parse error at pos "); KernelLog.Int(pos, 5); KernelLog.String(" in line "); KernelLog.Int(line, 5);
  120. KernelLog.String(" row "); KernelLog.Int(row, 5); KernelLog.String(" - "); KernelLog.String(msg); KernelLog.Ln;
  121. hasErrors := TRUE
  122. END Error;
  123. PROCEDURE Read(CONST name : ARRAY OF CHAR);
  124. VAR f : Files.File;
  125. r : Files.Reader;
  126. scanner : XMLScanner.Scanner;
  127. parser : XMLParser.Parser;
  128. doc : XML.Document;
  129. BEGIN
  130. hasErrors := FALSE;
  131. f := Files.Old(name);
  132. IF f # NIL THEN
  133. Files.OpenReader(r, f, 0);
  134. NEW(scanner, r); scanner.reportError := Error;
  135. NEW(parser, scanner); parser.reportError := Error;
  136. doc := parser.Parse();
  137. IF hasErrors THEN KernelLog.String("menu not loaded"); KernelLog.Ln
  138. ELSE SetDocument(doc.GetRoot());
  139. END
  140. ELSE
  141. KernelLog.String("name = "); KernelLog.String(name); KernelLog.String(" not found"); KernelLog.Ln
  142. END
  143. END Read;
  144. PROCEDURE Close*;
  145. BEGIN
  146. Close^;
  147. DecCount
  148. END Close;
  149. PROCEDURE Handle*(VAR x : WMMessages.Message);
  150. BEGIN
  151. IF (x.msgType = WMMessages.MsgExt) & (x.ext # NIL) & (x.ext IS KillerMsg) THEN Close
  152. ELSE Handle^(x)
  153. END
  154. END Handle;
  155. END Window;
  156. TYPE
  157. Command = OBJECT
  158. VAR
  159. commandString : ARRAY 256 OF CHAR;
  160. PROCEDURE &Init(CONST commandString : ARRAY OF CHAR);
  161. BEGIN
  162. COPY(commandString, SELF.commandString);
  163. END Init;
  164. PROCEDURE Execute;
  165. VAR ignoreRes : WORD; ignoreMsg : ARRAY 1 OF CHAR;
  166. BEGIN
  167. Commands.Call(commandString, {}, ignoreRes, ignoreMsg);
  168. END Execute;
  169. END Command;
  170. VAR
  171. nofWindows : LONGINT;
  172. lastMenu : WMTrees.Tree; (* not thread-safe *)
  173. PROCEDURE Open*;
  174. VAR winstance : Window;
  175. BEGIN
  176. NEW(winstance);
  177. winstance.Read("Menu.XML");
  178. END Open;
  179. PROCEDURE HandleItemSelected(sender, data : ANY);
  180. VAR caption : Strings.String; menu : WMTrees.Tree;
  181. BEGIN
  182. IF (data # NIL) THEN
  183. IF (data IS Command) THEN
  184. data(Command).Execute;
  185. ELSE
  186. menu := lastMenu;
  187. IF (menu # NIL) THEN
  188. caption := WMMenus.GetCaption(data, menu);
  189. KernelLog.String("Selected node: ");
  190. IF (caption # NIL) THEN
  191. KernelLog.String(caption^);
  192. ELSE
  193. KernelLog.String("NIL");
  194. END;
  195. KernelLog.Ln;
  196. ELSE
  197. KernelLog.String("Test error: Menu not available"); KernelLog.Ln;
  198. END;
  199. END;
  200. END;
  201. END HandleItemSelected;
  202. PROCEDURE OpenPopup*(context : Commands.Context);
  203. VAR
  204. path, commandString : ARRAY 256 OF CHAR;
  205. menu : WMTrees.Tree; node : WMTrees.TreeNode;
  206. command : Command;
  207. BEGIN
  208. NEW(menu); lastMenu := menu;
  209. WHILE context.arg.GetString(path) DO
  210. IF context.arg.GetString(commandString) THEN
  211. NEW(command, commandString);
  212. node := WMMenus.AddItemNode(path, menu);
  213. menu.Acquire;
  214. menu.SetNodeData(node, command);
  215. menu.Release;
  216. END;
  217. END;
  218. WMMenus.Show(menu, 100, 100, HandleItemSelected);
  219. END OpenPopup;
  220. PROCEDURE IncCount;
  221. BEGIN {EXCLUSIVE}
  222. INC(nofWindows)
  223. END IncCount;
  224. PROCEDURE DecCount;
  225. BEGIN {EXCLUSIVE}
  226. DEC(nofWindows)
  227. END DecCount;
  228. PROCEDURE Cleanup;
  229. VAR die : KillerMsg;
  230. msg : WMMessages.Message;
  231. m : WM.WindowManager;
  232. BEGIN {EXCLUSIVE}
  233. NEW(die);
  234. msg.ext := die;
  235. msg.msgType := WMMessages.MsgExt;
  236. m := WM.GetDefaultManager();
  237. m.Broadcast(msg);
  238. AWAIT(nofWindows = 0)
  239. END Cleanup;
  240. BEGIN
  241. Modules.InstallTermHandler(Cleanup)
  242. END TestMenu.
  243. System.Free TestMenu WMMenus ~
  244. TestMenu.Open ~
  245. TestMenu.OpenPopup
  246. Inspect.Performance WMPerfMon.Open
  247. Inspect.Profiler WMProfiler.Open
  248. Inspect.Events WMEvents.Open
  249. Inspect.Components WMInspector.Open
  250. --- NoCommand
  251. Tools.Search WMSearchTool.Open
  252. Tools.Archiver WMArchives.Open
  253. Tools.Console WMShell.Open
  254. "Tools.Partition Manager" WMPartitions.Open
  255. "Tools.Partition Editor" WMPartitionEditor.Open
  256. --- NoCommand
  257. Commands.Files.ShowFS FSTools.Watch
  258. Commands.Files.Directory "FSTools.Directory *"
  259. Commands.Partitions.Show Partitions.Show
  260. ~~