chatwindow.py 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  1. """
  2. Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
  3. Date: Wed Nov 15 08:57:11 2017
  4. Model author: Yentl Van Tendeloo
  5. Model name: ChatWindow- Tkinter Version
  6. Model description:
  7. TkInter chatwindow over STDIN and STDOUT
  8. """
  9. from sccd.runtime.statecharts_core import *
  10. import Tkinter as tk
  11. import ttk
  12. from sccd_widget import SCCDWidget, ImageVisual, TextVisual, ToolTip
  13. import uuid
  14. import json
  15. import urllib
  16. import subprocess
  17. import sys
  18. # package "ChatWindow- Tkinter Version "
  19. class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
  20. def __init__(self, controller):
  21. RuntimeClassBase.__init__(self, controller)
  22. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  23. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  24. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  25. self.semantics.priority = StatechartSemantics.SourceParent
  26. self.semantics.concurrency = StatechartSemantics.Single
  27. # build Statechart structure
  28. self.build_statechart_structure()
  29. # call user defined constructor
  30. ChatWindow.user_defined_constructor(self)
  31. def user_defined_constructor(self):
  32. tk.Toplevel.__init__(self)
  33. SCCDWidget.__init__(self)
  34. self.input_value = ""
  35. def user_defined_destructor(self):
  36. self.destroy()
  37. # call super class destructors
  38. if hasattr(tk.Toplevel, "__del__"):
  39. tk.Toplevel.__del__(self)
  40. if hasattr(SCCDWidget, "__del__"):
  41. SCCDWidget.__del__(self)
  42. # builds Statechart structure
  43. def build_statechart_structure(self):
  44. # state <root>
  45. self.states[""] = State(0, "", self)
  46. # state /init
  47. self.states["/init"] = State(1, "/init", self)
  48. # state /init/init_entry_log
  49. self.states["/init/init_entry_log"] = State(2, "/init/init_entry_log", self)
  50. # state /init/init_entry_log/create
  51. self.states["/init/init_entry_log/create"] = State(3, "/init/init_entry_log/create", self)
  52. self.states["/init/init_entry_log/create"].setEnter(self._init_init_entry_log_create_enter)
  53. # state /init/init_entry_log/wait_for_packing
  54. self.states["/init/init_entry_log/wait_for_packing"] = State(4, "/init/init_entry_log/wait_for_packing", self)
  55. # state /init/init_entry_input
  56. self.states["/init/init_entry_input"] = State(5, "/init/init_entry_input", self)
  57. # state /init/init_entry_input/create
  58. self.states["/init/init_entry_input/create"] = State(6, "/init/init_entry_input/create", self)
  59. self.states["/init/init_entry_input/create"].setEnter(self._init_init_entry_input_create_enter)
  60. # state /init/init_entry_input/wait_for_packing
  61. self.states["/init/init_entry_input/wait_for_packing"] = State(7, "/init/init_entry_input/wait_for_packing", self)
  62. # state /init/init_button_send
  63. self.states["/init/init_button_send"] = State(8, "/init/init_button_send", self)
  64. # state /init/init_button_send/create
  65. self.states["/init/init_button_send/create"] = State(9, "/init/init_button_send/create", self)
  66. self.states["/init/init_button_send/create"].setEnter(self._init_init_button_send_create_enter)
  67. # state /init/init_button_send/wait_for_packing
  68. self.states["/init/init_button_send/wait_for_packing"] = State(10, "/init/init_button_send/wait_for_packing", self)
  69. # state /root
  70. self.states["/root"] = State(11, "/root", self)
  71. # state /closing
  72. self.states["/closing"] = State(12, "/closing", self)
  73. self.states["/closing"].setEnter(self._closing_enter)
  74. # state /close
  75. self.states["/close"] = State(13, "/close", self)
  76. # add children
  77. self.states[""].addChild(self.states["/init"])
  78. self.states[""].addChild(self.states["/root"])
  79. self.states[""].addChild(self.states["/closing"])
  80. self.states[""].addChild(self.states["/close"])
  81. self.states["/init"].addChild(self.states["/init/init_entry_log"])
  82. self.states["/init"].addChild(self.states["/init/init_entry_input"])
  83. self.states["/init"].addChild(self.states["/init/init_button_send"])
  84. self.states["/init/init_entry_log"].addChild(self.states["/init/init_entry_log/create"])
  85. self.states["/init/init_entry_log"].addChild(self.states["/init/init_entry_log/wait_for_packing"])
  86. self.states["/init/init_entry_input"].addChild(self.states["/init/init_entry_input/create"])
  87. self.states["/init/init_entry_input"].addChild(self.states["/init/init_entry_input/wait_for_packing"])
  88. self.states["/init/init_button_send"].addChild(self.states["/init/init_button_send/create"])
  89. self.states["/init/init_button_send"].addChild(self.states["/init/init_button_send/wait_for_packing"])
  90. self.states[""].fixTree()
  91. self.states[""].default_state = self.states["/init"]
  92. self.states["/init"].default_state = self.states["/init/init_entry_log"]
  93. self.states["/init/init_entry_log"].default_state = self.states["/init/init_entry_log/create"]
  94. self.states["/init/init_entry_input"].default_state = self.states["/init/init_entry_input/create"]
  95. self.states["/init/init_button_send"].default_state = self.states["/init/init_button_send/create"]
  96. # transition /init/init_entry_log/create
  97. _init_init_entry_log_create_0 = Transition(self, self.states["/init/init_entry_log/create"], [self.states["/init/init_entry_log/wait_for_packing"]])
  98. _init_init_entry_log_create_0.setAction(self._init_init_entry_log_create_0_exec)
  99. _init_init_entry_log_create_0.setTrigger(Event("instance_created", None))
  100. self.states["/init/init_entry_log/create"].addTransition(_init_init_entry_log_create_0)
  101. # transition /init/init_entry_log/wait_for_packing
  102. _init_init_entry_log_wait_for_packing_0 = Transition(self, self.states["/init/init_entry_log/wait_for_packing"], [self.states["/init/init_entry_input"]])
  103. _init_init_entry_log_wait_for_packing_0.setAction(self._init_init_entry_log_wait_for_packing_0_exec)
  104. _init_init_entry_log_wait_for_packing_0.setTrigger(Event("tk_widget", None))
  105. self.states["/init/init_entry_log/wait_for_packing"].addTransition(_init_init_entry_log_wait_for_packing_0)
  106. # transition /init/init_entry_input/create
  107. _init_init_entry_input_create_0 = Transition(self, self.states["/init/init_entry_input/create"], [self.states["/init/init_entry_input/wait_for_packing"]])
  108. _init_init_entry_input_create_0.setAction(self._init_init_entry_input_create_0_exec)
  109. _init_init_entry_input_create_0.setTrigger(Event("instance_created", None))
  110. self.states["/init/init_entry_input/create"].addTransition(_init_init_entry_input_create_0)
  111. # transition /init/init_entry_input/wait_for_packing
  112. _init_init_entry_input_wait_for_packing_0 = Transition(self, self.states["/init/init_entry_input/wait_for_packing"], [self.states["/init/init_button_send"]])
  113. _init_init_entry_input_wait_for_packing_0.setAction(self._init_init_entry_input_wait_for_packing_0_exec)
  114. _init_init_entry_input_wait_for_packing_0.setTrigger(Event("tk_widget", None))
  115. self.states["/init/init_entry_input/wait_for_packing"].addTransition(_init_init_entry_input_wait_for_packing_0)
  116. # transition /init/init_button_send/create
  117. _init_init_button_send_create_0 = Transition(self, self.states["/init/init_button_send/create"], [self.states["/init/init_button_send/wait_for_packing"]])
  118. _init_init_button_send_create_0.setAction(self._init_init_button_send_create_0_exec)
  119. _init_init_button_send_create_0.setTrigger(Event("instance_created", None))
  120. self.states["/init/init_button_send/create"].addTransition(_init_init_button_send_create_0)
  121. # transition /init/init_button_send/wait_for_packing
  122. _init_init_button_send_wait_for_packing_0 = Transition(self, self.states["/init/init_button_send/wait_for_packing"], [self.states["/root"]])
  123. _init_init_button_send_wait_for_packing_0.setAction(self._init_init_button_send_wait_for_packing_0_exec)
  124. _init_init_button_send_wait_for_packing_0.setTrigger(Event("tk_widget", None))
  125. self.states["/init/init_button_send/wait_for_packing"].addTransition(_init_init_button_send_wait_for_packing_0)
  126. # transition /root
  127. _root_0 = Transition(self, self.states["/root"], [self.states["/root"]])
  128. _root_0.setAction(self._root_0_exec)
  129. _root_0.setTrigger(Event("button_pressed", None))
  130. _root_0.setGuard(self._root_0_guard)
  131. self.states["/root"].addTransition(_root_0)
  132. _root_1 = Transition(self, self.states["/root"], [self.states["/root"]])
  133. _root_1.setAction(self._root_1_exec)
  134. _root_1.setTrigger(Event("stdin_input", "stdin_port"))
  135. self.states["/root"].addTransition(_root_1)
  136. _root_2 = Transition(self, self.states["/root"], [self.states["/root"]])
  137. _root_2.setAction(self._root_2_exec)
  138. _root_2.setTrigger(Event("changed_entry", None))
  139. _root_2.setGuard(self._root_2_guard)
  140. self.states["/root"].addTransition(_root_2)
  141. _root_3 = Transition(self, self.states["/root"], [self.states["/closing"]])
  142. _root_3.setTrigger(Event("close_window", None))
  143. self.states["/root"].addTransition(_root_3)
  144. # transition /closing
  145. _closing_0 = Transition(self, self.states["/closing"], [self.states["/close"]])
  146. _closing_0.setTrigger(Event("instance_deleted", None))
  147. self.states["/closing"].addTransition(_closing_0)
  148. def _init_init_entry_log_create_enter(self):
  149. self.big_step.outputEventOM(Event("create_instance", None, [self, 'entries', 'Text', {'parent': self, 'name': 'history'}]))
  150. def _init_init_entry_input_create_enter(self):
  151. self.big_step.outputEventOM(Event("create_instance", None, [self, 'entries', 'Entry', {'parent': self, 'value': self.input_value, 'name': 'input_value'}]))
  152. def _init_init_button_send_create_enter(self):
  153. self.big_step.outputEventOM(Event("create_instance", None, [self, 'buttons', 'Button', {'parent': self, 'visual': TextVisual('send'), 'tooltip_text': 'Send data to active activity.', 'event_parameters': 'send'}]))
  154. def _closing_enter(self):
  155. self.big_step.outputEventOM(Event("delete_instance", None, [self, 'buttons']))
  156. self.big_step.outputEventOM(Event("delete_instance", None, [self, 'entries']))
  157. def _init_init_entry_log_create_0_exec(self, parameters):
  158. association_name = parameters[0]
  159. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  160. self.entry_log = association_name
  161. def _init_init_entry_log_wait_for_packing_0_exec(self, parameters):
  162. tk_elem = parameters[0]
  163. tk_elem.pack()
  164. def _init_init_entry_input_create_0_exec(self, parameters):
  165. association_name = parameters[0]
  166. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  167. self.entry_input = association_name
  168. def _init_init_entry_input_wait_for_packing_0_exec(self, parameters):
  169. tk_elem = parameters[0]
  170. tk_elem.pack()
  171. def _init_init_button_send_create_0_exec(self, parameters):
  172. association_name = parameters[0]
  173. self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
  174. self.button = association_name
  175. def _init_init_button_send_wait_for_packing_0_exec(self, parameters):
  176. tk_elem = parameters[0]
  177. tk_elem.pack()
  178. def _root_0_exec(self, parameters):
  179. event_name = parameters[0]
  180. self.big_step.outputEvent(Event("stdout_output", "stdout_port", [self.input_value]))
  181. self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.entry_input, Event("change_value", None, [''])]))
  182. self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.entry_log, Event("append_value", None, ['< ' + self.input_value + '\n'])]))
  183. def _root_0_guard(self, parameters):
  184. event_name = parameters[0]
  185. return event_name == 'send'
  186. def _root_1_exec(self, parameters):
  187. value = parameters[0]
  188. self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.entry_log, Event("append_value", None, ['> ' + value + '\n'])]))
  189. def _root_2_exec(self, parameters):
  190. name = parameters[0]
  191. value = parameters[1]
  192. self.input_value = value
  193. def _root_2_guard(self, parameters):
  194. name = parameters[0]
  195. value = parameters[1]
  196. return name == 'input_value'
  197. def initializeStatechart(self):
  198. # enter default state
  199. self.default_targets = self.states["/init"].getEffectiveTargetStates()
  200. RuntimeClassBase.initializeStatechart(self)
  201. class Text(RuntimeClassBase):
  202. def __init__(self, controller, constructor_parameters = None):
  203. if constructor_parameters == None: constructor_parameters = {}
  204. RuntimeClassBase.__init__(self, controller)
  205. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  206. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  207. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  208. self.semantics.priority = StatechartSemantics.SourceParent
  209. self.semantics.concurrency = StatechartSemantics.Single
  210. # build Statechart structure
  211. self.build_statechart_structure()
  212. # call user defined constructor
  213. Text.user_defined_constructor(self, constructor_parameters)
  214. def user_defined_constructor(self, constructor_parameters = None):
  215. if constructor_parameters == None: constructor_parameters = {}
  216. self.name = constructor_parameters['name']
  217. self.entry = tk.Text(constructor_parameters['parent'])
  218. self.entry.config(state=tk.DISABLED)
  219. def user_defined_destructor(self):
  220. self.entry.destroy()
  221. # builds Statechart structure
  222. def build_statechart_structure(self):
  223. # state <root>
  224. self.states[""] = State(0, "", self)
  225. # state /main
  226. self.states["/main"] = State(1, "/main", self)
  227. # state /main/initializing
  228. self.states["/main/initializing"] = State(2, "/main/initializing", self)
  229. # state /main/ready
  230. self.states["/main/ready"] = State(3, "/main/ready", self)
  231. # add children
  232. self.states[""].addChild(self.states["/main"])
  233. self.states["/main"].addChild(self.states["/main/initializing"])
  234. self.states["/main"].addChild(self.states["/main/ready"])
  235. self.states[""].fixTree()
  236. self.states[""].default_state = self.states["/main"]
  237. self.states["/main"].default_state = self.states["/main/initializing"]
  238. # transition /main/initializing
  239. _main_initializing_0 = Transition(self, self.states["/main/initializing"], [self.states["/main/ready"]])
  240. _main_initializing_0.setAction(self._main_initializing_0_exec)
  241. _main_initializing_0.setTrigger(None)
  242. self.states["/main/initializing"].addTransition(_main_initializing_0)
  243. # transition /main/ready
  244. _main_ready_0 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
  245. _main_ready_0.setAction(self._main_ready_0_exec)
  246. _main_ready_0.setTrigger(Event("append_value", None))
  247. self.states["/main/ready"].addTransition(_main_ready_0)
  248. def _main_initializing_0_exec(self, parameters):
  249. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("tk_widget", None, [self.entry])]))
  250. def _main_ready_0_exec(self, parameters):
  251. new_value = parameters[0]
  252. self.entry.config(state=tk.NORMAL)
  253. self.entry.insert(tk.END, new_value)
  254. self.entry.config(state=tk.DISABLED)
  255. self.entry.see(tk.END)
  256. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("changed_value", None, [self.name, self.entry.get(1.0, tk.END)])]))
  257. def initializeStatechart(self):
  258. # enter default state
  259. self.default_targets = self.states["/main"].getEffectiveTargetStates()
  260. RuntimeClassBase.initializeStatechart(self)
  261. class Entry(RuntimeClassBase):
  262. def __init__(self, controller, constructor_parameters = None):
  263. if constructor_parameters == None: constructor_parameters = {}
  264. RuntimeClassBase.__init__(self, controller)
  265. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  266. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  267. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  268. self.semantics.priority = StatechartSemantics.SourceParent
  269. self.semantics.concurrency = StatechartSemantics.Single
  270. # build Statechart structure
  271. self.build_statechart_structure()
  272. # call user defined constructor
  273. Entry.user_defined_constructor(self, constructor_parameters)
  274. def user_defined_constructor(self, constructor_parameters = None):
  275. if constructor_parameters == None: constructor_parameters = {}
  276. self.name = constructor_parameters['name']
  277. self.entry = tk.Entry(constructor_parameters['parent'], textvariable=self.construct_strvar(constructor_parameters['parent'], constructor_parameters['value']))
  278. if constructor_parameters.get('readonly', False):
  279. self.entry.config(state=tk.DISABLED)
  280. def user_defined_destructor(self):
  281. self.entry.destroy()
  282. # user defined method
  283. def construct_strvar(self, parent, value):
  284. self.strvar = tk.StringVar(parent)
  285. self.strvar.set(value)
  286. self.strvar.trace('w', lambda a, b, c: self.controller.addInput(Event("change_entry", "input", [id(self), self.strvar.get()])))
  287. return self.strvar
  288. # builds Statechart structure
  289. def build_statechart_structure(self):
  290. # state <root>
  291. self.states[""] = State(0, "", self)
  292. # state /main
  293. self.states["/main"] = State(1, "/main", self)
  294. # state /main/initializing
  295. self.states["/main/initializing"] = State(2, "/main/initializing", self)
  296. # state /main/ready
  297. self.states["/main/ready"] = State(3, "/main/ready", self)
  298. # add children
  299. self.states[""].addChild(self.states["/main"])
  300. self.states["/main"].addChild(self.states["/main/initializing"])
  301. self.states["/main"].addChild(self.states["/main/ready"])
  302. self.states[""].fixTree()
  303. self.states[""].default_state = self.states["/main"]
  304. self.states["/main"].default_state = self.states["/main/initializing"]
  305. # transition /main/initializing
  306. _main_initializing_0 = Transition(self, self.states["/main/initializing"], [self.states["/main/ready"]])
  307. _main_initializing_0.setAction(self._main_initializing_0_exec)
  308. _main_initializing_0.setTrigger(None)
  309. self.states["/main/initializing"].addTransition(_main_initializing_0)
  310. # transition /main/ready
  311. _main_ready_0 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
  312. _main_ready_0.setAction(self._main_ready_0_exec)
  313. _main_ready_0.setTrigger(Event("change_entry", "input"))
  314. _main_ready_0.setGuard(self._main_ready_0_guard)
  315. self.states["/main/ready"].addTransition(_main_ready_0)
  316. _main_ready_1 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
  317. _main_ready_1.setAction(self._main_ready_1_exec)
  318. _main_ready_1.setTrigger(Event("change_bg", None))
  319. self.states["/main/ready"].addTransition(_main_ready_1)
  320. _main_ready_2 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
  321. _main_ready_2.setAction(self._main_ready_2_exec)
  322. _main_ready_2.setTrigger(Event("change_event_name", None))
  323. self.states["/main/ready"].addTransition(_main_ready_2)
  324. _main_ready_3 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
  325. _main_ready_3.setAction(self._main_ready_3_exec)
  326. _main_ready_3.setTrigger(Event("change_value", None))
  327. self.states["/main/ready"].addTransition(_main_ready_3)
  328. _main_ready_4 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
  329. _main_ready_4.setAction(self._main_ready_4_exec)
  330. _main_ready_4.setTrigger(Event("disable", None))
  331. self.states["/main/ready"].addTransition(_main_ready_4)
  332. def _main_initializing_0_exec(self, parameters):
  333. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("tk_widget", None, [self.entry])]))
  334. def _main_ready_0_exec(self, parameters):
  335. tagorid = parameters[0]
  336. new_value = parameters[1]
  337. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("changed_entry", None, [self.name, new_value])]))
  338. def _main_ready_0_guard(self, parameters):
  339. tagorid = parameters[0]
  340. new_value = parameters[1]
  341. return tagorid == id(self)
  342. def _main_ready_1_exec(self, parameters):
  343. colour = parameters[0]
  344. self.entry.configure(bg=colour, disabledbackground=colour)
  345. def _main_ready_2_exec(self, parameters):
  346. new_name = parameters[0]
  347. self.name = new_name
  348. def _main_ready_3_exec(self, parameters):
  349. new_value = parameters[0]
  350. self.strvar.set(new_value)
  351. def _main_ready_4_exec(self, parameters):
  352. self.entry.config(state=tk.DISABLED)
  353. def initializeStatechart(self):
  354. # enter default state
  355. self.default_targets = self.states["/main"].getEffectiveTargetStates()
  356. RuntimeClassBase.initializeStatechart(self)
  357. class Button(RuntimeClassBase, tk.Button, SCCDWidget):
  358. def __init__(self, controller, constructor_parameters = None):
  359. if constructor_parameters == None: constructor_parameters = {}
  360. RuntimeClassBase.__init__(self, controller)
  361. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  362. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  363. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  364. self.semantics.priority = StatechartSemantics.SourceParent
  365. self.semantics.concurrency = StatechartSemantics.Single
  366. # build Statechart structure
  367. self.build_statechart_structure()
  368. # call user defined constructor
  369. Button.user_defined_constructor(self, constructor_parameters)
  370. def user_defined_constructor(self, constructor_parameters = None):
  371. if constructor_parameters == None: constructor_parameters = {}
  372. tk.Button.__init__(self, constructor_parameters['parent'], **(constructor_parameters['visual'].get_params()))
  373. SCCDWidget.__init__(self)
  374. self.event_parameters = constructor_parameters["event_parameters"]
  375. if "tooltip_text" in constructor_parameters:
  376. self.tooltip = ToolTip(self, constructor_parameters["tooltip_text"])
  377. else:
  378. self.tooltip = None
  379. self.visual = constructor_parameters["visual"]
  380. def user_defined_destructor(self):
  381. self.destroy()
  382. # call super class destructors
  383. if hasattr(tk.Button, "__del__"):
  384. tk.Button.__del__(self)
  385. if hasattr(SCCDWidget, "__del__"):
  386. SCCDWidget.__del__(self)
  387. # builds Statechart structure
  388. def build_statechart_structure(self):
  389. # state <root>
  390. self.states[""] = State(0, "", self)
  391. # state /main
  392. self.states["/main"] = State(1, "/main", self)
  393. # state /main/initializing
  394. self.states["/main/initializing"] = State(2, "/main/initializing", self)
  395. # state /main/ready
  396. self.states["/main/ready"] = State(3, "/main/ready", self)
  397. # add children
  398. self.states[""].addChild(self.states["/main"])
  399. self.states["/main"].addChild(self.states["/main/initializing"])
  400. self.states["/main"].addChild(self.states["/main/ready"])
  401. self.states[""].fixTree()
  402. self.states[""].default_state = self.states["/main"]
  403. self.states["/main"].default_state = self.states["/main/initializing"]
  404. # transition /main/initializing
  405. _main_initializing_0 = Transition(self, self.states["/main/initializing"], [self.states["/main/ready"]])
  406. _main_initializing_0.setAction(self._main_initializing_0_exec)
  407. _main_initializing_0.setTrigger(None)
  408. self.states["/main/initializing"].addTransition(_main_initializing_0)
  409. # transition /main/ready
  410. _main_ready_0 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
  411. _main_ready_0.setAction(self._main_ready_0_exec)
  412. _main_ready_0.setTrigger(Event("left-click", "input"))
  413. _main_ready_0.setGuard(self._main_ready_0_guard)
  414. self.states["/main/ready"].addTransition(_main_ready_0)
  415. _main_ready_1 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
  416. _main_ready_1.setAction(self._main_ready_1_exec)
  417. _main_ready_1.setTrigger(Event("enter", "input"))
  418. _main_ready_1.setGuard(self._main_ready_1_guard)
  419. self.states["/main/ready"].addTransition(_main_ready_1)
  420. _main_ready_2 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
  421. _main_ready_2.setAction(self._main_ready_2_exec)
  422. _main_ready_2.setTrigger(Event("leave", "input"))
  423. _main_ready_2.setGuard(self._main_ready_2_guard)
  424. self.states["/main/ready"].addTransition(_main_ready_2)
  425. _main_ready_3 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
  426. _main_ready_3.setAction(self._main_ready_3_exec)
  427. _main_ready_3.setTrigger(Event("activate", None))
  428. self.states["/main/ready"].addTransition(_main_ready_3)
  429. _main_ready_4 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
  430. _main_ready_4.setAction(self._main_ready_4_exec)
  431. _main_ready_4.setTrigger(Event("deactivate", None))
  432. self.states["/main/ready"].addTransition(_main_ready_4)
  433. def _main_initializing_0_exec(self, parameters):
  434. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("tk_widget", None, [self])]))
  435. def _main_ready_0_exec(self, parameters):
  436. tagorid = parameters[0]
  437. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("button_pressed", None, [self.event_parameters])]))
  438. def _main_ready_0_guard(self, parameters):
  439. tagorid = parameters[0]
  440. return tagorid == id(self)
  441. def _main_ready_1_exec(self, parameters):
  442. tagorid = parameters[0]
  443. self.tooltip.showtip()
  444. def _main_ready_1_guard(self, parameters):
  445. tagorid = parameters[0]
  446. return tagorid == id(self) and self.tooltip is not None
  447. def _main_ready_2_exec(self, parameters):
  448. tagorid = parameters[0]
  449. self.tooltip.hidetip()
  450. def _main_ready_2_guard(self, parameters):
  451. tagorid = parameters[0]
  452. return tagorid == id(self) and self.tooltip is not None
  453. def _main_ready_3_exec(self, parameters):
  454. self.configure(state=tk.ACTIVE, relief=tk.SUNKEN)
  455. print("Activate " + str(self.event_parameters))
  456. def _main_ready_4_exec(self, parameters):
  457. self.configure(state=tk.NORMAL, relief=tk.RAISED)
  458. print("Deactivate " + str(self.event_parameters))
  459. def initializeStatechart(self):
  460. # enter default state
  461. self.default_targets = self.states["/main"].getEffectiveTargetStates()
  462. RuntimeClassBase.initializeStatechart(self)
  463. class Label(RuntimeClassBase, tk.Label, SCCDWidget):
  464. def __init__(self, controller, constructor_parameters = None):
  465. if constructor_parameters == None: constructor_parameters = {}
  466. RuntimeClassBase.__init__(self, controller)
  467. self.semantics.big_step_maximality = StatechartSemantics.TakeMany
  468. self.semantics.internal_event_lifeline = StatechartSemantics.Queue
  469. self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
  470. self.semantics.priority = StatechartSemantics.SourceParent
  471. self.semantics.concurrency = StatechartSemantics.Single
  472. # build Statechart structure
  473. self.build_statechart_structure()
  474. # call user defined constructor
  475. Label.user_defined_constructor(self, constructor_parameters)
  476. def user_defined_constructor(self, constructor_parameters = None):
  477. if constructor_parameters == None: constructor_parameters = {}
  478. tk.Label.__init__(self, constructor_parameters['parent'], **({'text': constructor_parameters['text'], 'bg': 'white'}))
  479. SCCDWidget.__init__(self)
  480. def user_defined_destructor(self):
  481. self.destroy()
  482. # call super class destructors
  483. if hasattr(tk.Label, "__del__"):
  484. tk.Label.__del__(self)
  485. if hasattr(SCCDWidget, "__del__"):
  486. SCCDWidget.__del__(self)
  487. # user defined method
  488. def set_text(self, text):
  489. self.config(text=text)
  490. # builds Statechart structure
  491. def build_statechart_structure(self):
  492. # state <root>
  493. self.states[""] = State(0, "", self)
  494. # state /root
  495. self.states["/root"] = State(1, "/root", self)
  496. # state /root/initializing
  497. self.states["/root/initializing"] = State(2, "/root/initializing", self)
  498. # state /root/ready
  499. self.states["/root/ready"] = State(3, "/root/ready", self)
  500. # add children
  501. self.states[""].addChild(self.states["/root"])
  502. self.states["/root"].addChild(self.states["/root/initializing"])
  503. self.states["/root"].addChild(self.states["/root/ready"])
  504. self.states[""].fixTree()
  505. self.states[""].default_state = self.states["/root"]
  506. self.states["/root"].default_state = self.states["/root/initializing"]
  507. # transition /root/initializing
  508. _root_initializing_0 = Transition(self, self.states["/root/initializing"], [self.states["/root/ready"]])
  509. _root_initializing_0.setAction(self._root_initializing_0_exec)
  510. _root_initializing_0.setTrigger(None)
  511. self.states["/root/initializing"].addTransition(_root_initializing_0)
  512. # transition /root/ready
  513. _root_ready_0 = Transition(self, self.states["/root/ready"], [self.states["/root/ready"]])
  514. _root_ready_0.setAction(self._root_ready_0_exec)
  515. _root_ready_0.setTrigger(Event("left-click", "input"))
  516. _root_ready_0.setGuard(self._root_ready_0_guard)
  517. self.states["/root/ready"].addTransition(_root_ready_0)
  518. _root_ready_1 = Transition(self, self.states["/root/ready"], [self.states["/root/ready"]])
  519. _root_ready_1.setAction(self._root_ready_1_exec)
  520. _root_ready_1.setTrigger(Event("highlight", None))
  521. self.states["/root/ready"].addTransition(_root_ready_1)
  522. _root_ready_2 = Transition(self, self.states["/root/ready"], [self.states["/root/ready"]])
  523. _root_ready_2.setAction(self._root_ready_2_exec)
  524. _root_ready_2.setTrigger(Event("unhighlight", None))
  525. self.states["/root/ready"].addTransition(_root_ready_2)
  526. def _root_initializing_0_exec(self, parameters):
  527. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("tk_widget", None, [self])]))
  528. def _root_ready_0_exec(self, parameters):
  529. tagorid = parameters[0]
  530. self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("label_pressed", None, [self.cget('text')])]))
  531. def _root_ready_0_guard(self, parameters):
  532. tagorid = parameters[0]
  533. return tagorid == id(self)
  534. def _root_ready_1_exec(self, parameters):
  535. self.config(bg="yellow")
  536. def _root_ready_2_exec(self, parameters):
  537. self.config(bg="white")
  538. def initializeStatechart(self):
  539. # enter default state
  540. self.default_targets = self.states["/root"].getEffectiveTargetStates()
  541. RuntimeClassBase.initializeStatechart(self)
  542. class ObjectManager(ObjectManagerBase):
  543. def __init__(self, controller):
  544. ObjectManagerBase.__init__(self, controller)
  545. def instantiate(self, class_name, construct_params):
  546. if class_name == "ChatWindow":
  547. instance = ChatWindow(self.controller)
  548. instance.associations = {}
  549. instance.associations["buttons"] = Association("Button", 0, -1)
  550. instance.associations["entries"] = Association("Entry", 0, -1)
  551. instance.associations["parent"] = Association("A", 0, -1)
  552. elif class_name == "Text":
  553. instance = Text(self.controller, construct_params[0])
  554. instance.associations = {}
  555. instance.associations["parent"] = Association("A", 0, -1)
  556. elif class_name == "Entry":
  557. instance = Entry(self.controller, construct_params[0])
  558. instance.associations = {}
  559. instance.associations["parent"] = Association("A", 0, -1)
  560. elif class_name == "Button":
  561. instance = Button(self.controller, construct_params[0])
  562. instance.associations = {}
  563. instance.associations["parent"] = Association("A", 0, -1)
  564. elif class_name == "Label":
  565. instance = Label(self.controller, construct_params[0])
  566. instance.associations = {}
  567. instance.associations["parent"] = Association("A", 1, 1)
  568. else:
  569. raise Exception("Cannot instantiate class " + class_name)
  570. return instance
  571. class Controller(EventLoopControllerBase):
  572. def __init__(self, event_loop_callbacks, finished_callback = None, behind_schedule_callback = None):
  573. if finished_callback == None: finished_callback = None
  574. if behind_schedule_callback == None: behind_schedule_callback = None
  575. EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback, behind_schedule_callback)
  576. self.addInputPort("input")
  577. self.addInputPort("stdin_port")
  578. self.addOutputPort("stdout_port")
  579. self.object_manager.createInstance("ChatWindow", [])