ソースを参照

Split off a chatwindow which redirects stdin and stdout

Yentl Van Tendeloo 7 年 前
コミット
3a579bdf39
7 ファイル変更796 行追加29 行削除
  1. 725 0
      chatwindow.py
  2. 26 0
      chatwindow.xml
  3. 0 4
      classes/widgets/entry.xml
  4. 0 1
      classes/widgets/text.xml
  5. 4 24
      classes/window/chatwindow.xml
  6. 39 0
      run_chatwindow.py
  7. 2 0
      run_chatwindow.sh

+ 725 - 0
chatwindow.py

@@ -0,0 +1,725 @@
+"""
+Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
+
+Date:   Wed Nov 15 08:57:11 2017
+
+Model author: Yentl Van Tendeloo
+Model name:   ChatWindow- Tkinter Version 
+Model description:
+TkInter chatwindow over STDIN and STDOUT
+"""
+
+from sccd.runtime.statecharts_core import *
+import Tkinter as tk
+import ttk
+from sccd_widget import SCCDWidget, ImageVisual, TextVisual, ToolTip
+import uuid
+import json
+import urllib
+import subprocess
+import sys
+
+# package "ChatWindow- Tkinter Version "
+
+class ChatWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
+    def __init__(self, controller):
+        RuntimeClassBase.__init__(self, controller)
+        
+        self.semantics.big_step_maximality = StatechartSemantics.TakeMany
+        self.semantics.internal_event_lifeline = StatechartSemantics.Queue
+        self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
+        self.semantics.priority = StatechartSemantics.SourceParent
+        self.semantics.concurrency = StatechartSemantics.Single
+        
+        # build Statechart structure
+        self.build_statechart_structure()
+        
+        # call user defined constructor
+        ChatWindow.user_defined_constructor(self)
+    
+    def user_defined_constructor(self):
+        tk.Toplevel.__init__(self)
+        SCCDWidget.__init__(self)
+        self.input_value = ""
+    
+    def user_defined_destructor(self):
+        self.destroy()
+        # call super class destructors
+        if hasattr(tk.Toplevel, "__del__"):
+            tk.Toplevel.__del__(self)
+        if hasattr(SCCDWidget, "__del__"):
+            SCCDWidget.__del__(self)
+    
+    
+    # builds Statechart structure
+    def build_statechart_structure(self):
+        
+        # state <root>
+        self.states[""] = State(0, "", self)
+        
+        # state /init
+        self.states["/init"] = State(1, "/init", self)
+        
+        # state /init/init_entry_log
+        self.states["/init/init_entry_log"] = State(2, "/init/init_entry_log", self)
+        
+        # state /init/init_entry_log/create
+        self.states["/init/init_entry_log/create"] = State(3, "/init/init_entry_log/create", self)
+        self.states["/init/init_entry_log/create"].setEnter(self._init_init_entry_log_create_enter)
+        
+        # state /init/init_entry_log/wait_for_packing
+        self.states["/init/init_entry_log/wait_for_packing"] = State(4, "/init/init_entry_log/wait_for_packing", self)
+        
+        # state /init/init_entry_input
+        self.states["/init/init_entry_input"] = State(5, "/init/init_entry_input", self)
+        
+        # state /init/init_entry_input/create
+        self.states["/init/init_entry_input/create"] = State(6, "/init/init_entry_input/create", self)
+        self.states["/init/init_entry_input/create"].setEnter(self._init_init_entry_input_create_enter)
+        
+        # state /init/init_entry_input/wait_for_packing
+        self.states["/init/init_entry_input/wait_for_packing"] = State(7, "/init/init_entry_input/wait_for_packing", self)
+        
+        # state /init/init_button_send
+        self.states["/init/init_button_send"] = State(8, "/init/init_button_send", self)
+        
+        # state /init/init_button_send/create
+        self.states["/init/init_button_send/create"] = State(9, "/init/init_button_send/create", self)
+        self.states["/init/init_button_send/create"].setEnter(self._init_init_button_send_create_enter)
+        
+        # state /init/init_button_send/wait_for_packing
+        self.states["/init/init_button_send/wait_for_packing"] = State(10, "/init/init_button_send/wait_for_packing", self)
+        
+        # state /root
+        self.states["/root"] = State(11, "/root", self)
+        
+        # state /closing
+        self.states["/closing"] = State(12, "/closing", self)
+        self.states["/closing"].setEnter(self._closing_enter)
+        
+        # state /close
+        self.states["/close"] = State(13, "/close", self)
+        
+        # add children
+        self.states[""].addChild(self.states["/init"])
+        self.states[""].addChild(self.states["/root"])
+        self.states[""].addChild(self.states["/closing"])
+        self.states[""].addChild(self.states["/close"])
+        self.states["/init"].addChild(self.states["/init/init_entry_log"])
+        self.states["/init"].addChild(self.states["/init/init_entry_input"])
+        self.states["/init"].addChild(self.states["/init/init_button_send"])
+        self.states["/init/init_entry_log"].addChild(self.states["/init/init_entry_log/create"])
+        self.states["/init/init_entry_log"].addChild(self.states["/init/init_entry_log/wait_for_packing"])
+        self.states["/init/init_entry_input"].addChild(self.states["/init/init_entry_input/create"])
+        self.states["/init/init_entry_input"].addChild(self.states["/init/init_entry_input/wait_for_packing"])
+        self.states["/init/init_button_send"].addChild(self.states["/init/init_button_send/create"])
+        self.states["/init/init_button_send"].addChild(self.states["/init/init_button_send/wait_for_packing"])
+        self.states[""].fixTree()
+        self.states[""].default_state = self.states["/init"]
+        self.states["/init"].default_state = self.states["/init/init_entry_log"]
+        self.states["/init/init_entry_log"].default_state = self.states["/init/init_entry_log/create"]
+        self.states["/init/init_entry_input"].default_state = self.states["/init/init_entry_input/create"]
+        self.states["/init/init_button_send"].default_state = self.states["/init/init_button_send/create"]
+        
+        # transition /init/init_entry_log/create
+        _init_init_entry_log_create_0 = Transition(self, self.states["/init/init_entry_log/create"], [self.states["/init/init_entry_log/wait_for_packing"]])
+        _init_init_entry_log_create_0.setAction(self._init_init_entry_log_create_0_exec)
+        _init_init_entry_log_create_0.setTrigger(Event("instance_created", None))
+        self.states["/init/init_entry_log/create"].addTransition(_init_init_entry_log_create_0)
+        
+        # transition /init/init_entry_log/wait_for_packing
+        _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"]])
+        _init_init_entry_log_wait_for_packing_0.setAction(self._init_init_entry_log_wait_for_packing_0_exec)
+        _init_init_entry_log_wait_for_packing_0.setTrigger(Event("tk_widget", None))
+        self.states["/init/init_entry_log/wait_for_packing"].addTransition(_init_init_entry_log_wait_for_packing_0)
+        
+        # transition /init/init_entry_input/create
+        _init_init_entry_input_create_0 = Transition(self, self.states["/init/init_entry_input/create"], [self.states["/init/init_entry_input/wait_for_packing"]])
+        _init_init_entry_input_create_0.setAction(self._init_init_entry_input_create_0_exec)
+        _init_init_entry_input_create_0.setTrigger(Event("instance_created", None))
+        self.states["/init/init_entry_input/create"].addTransition(_init_init_entry_input_create_0)
+        
+        # transition /init/init_entry_input/wait_for_packing
+        _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"]])
+        _init_init_entry_input_wait_for_packing_0.setAction(self._init_init_entry_input_wait_for_packing_0_exec)
+        _init_init_entry_input_wait_for_packing_0.setTrigger(Event("tk_widget", None))
+        self.states["/init/init_entry_input/wait_for_packing"].addTransition(_init_init_entry_input_wait_for_packing_0)
+        
+        # transition /init/init_button_send/create
+        _init_init_button_send_create_0 = Transition(self, self.states["/init/init_button_send/create"], [self.states["/init/init_button_send/wait_for_packing"]])
+        _init_init_button_send_create_0.setAction(self._init_init_button_send_create_0_exec)
+        _init_init_button_send_create_0.setTrigger(Event("instance_created", None))
+        self.states["/init/init_button_send/create"].addTransition(_init_init_button_send_create_0)
+        
+        # transition /init/init_button_send/wait_for_packing
+        _init_init_button_send_wait_for_packing_0 = Transition(self, self.states["/init/init_button_send/wait_for_packing"], [self.states["/root"]])
+        _init_init_button_send_wait_for_packing_0.setAction(self._init_init_button_send_wait_for_packing_0_exec)
+        _init_init_button_send_wait_for_packing_0.setTrigger(Event("tk_widget", None))
+        self.states["/init/init_button_send/wait_for_packing"].addTransition(_init_init_button_send_wait_for_packing_0)
+        
+        # transition /root
+        _root_0 = Transition(self, self.states["/root"], [self.states["/root"]])
+        _root_0.setAction(self._root_0_exec)
+        _root_0.setTrigger(Event("button_pressed", None))
+        _root_0.setGuard(self._root_0_guard)
+        self.states["/root"].addTransition(_root_0)
+        _root_1 = Transition(self, self.states["/root"], [self.states["/root"]])
+        _root_1.setAction(self._root_1_exec)
+        _root_1.setTrigger(Event("stdin_input", "stdin_port"))
+        self.states["/root"].addTransition(_root_1)
+        _root_2 = Transition(self, self.states["/root"], [self.states["/root"]])
+        _root_2.setAction(self._root_2_exec)
+        _root_2.setTrigger(Event("changed_entry", None))
+        _root_2.setGuard(self._root_2_guard)
+        self.states["/root"].addTransition(_root_2)
+        _root_3 = Transition(self, self.states["/root"], [self.states["/closing"]])
+        _root_3.setTrigger(Event("close_window", None))
+        self.states["/root"].addTransition(_root_3)
+        
+        # transition /closing
+        _closing_0 = Transition(self, self.states["/closing"], [self.states["/close"]])
+        _closing_0.setTrigger(Event("instance_deleted", None))
+        self.states["/closing"].addTransition(_closing_0)
+    
+    def _init_init_entry_log_create_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'entries', 'Text', {'parent': self, 'name': 'history'}]))
+    
+    def _init_init_entry_input_create_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'entries', 'Entry', {'parent': self, 'value': self.input_value, 'name': 'input_value'}]))
+    
+    def _init_init_button_send_create_enter(self):
+        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'}]))
+    
+    def _closing_enter(self):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'buttons']))
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'entries']))
+    
+    def _init_init_entry_log_create_0_exec(self, parameters):
+        association_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
+        self.entry_log = association_name
+    
+    def _init_init_entry_log_wait_for_packing_0_exec(self, parameters):
+        tk_elem = parameters[0]
+        tk_elem.pack()
+    
+    def _init_init_entry_input_create_0_exec(self, parameters):
+        association_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
+        self.entry_input = association_name
+    
+    def _init_init_entry_input_wait_for_packing_0_exec(self, parameters):
+        tk_elem = parameters[0]
+        tk_elem.pack()
+    
+    def _init_init_button_send_create_0_exec(self, parameters):
+        association_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
+        self.button = association_name
+    
+    def _init_init_button_send_wait_for_packing_0_exec(self, parameters):
+        tk_elem = parameters[0]
+        tk_elem.pack()
+    
+    def _root_0_exec(self, parameters):
+        event_name = parameters[0]
+        self.big_step.outputEvent(Event("stdout_output", "stdout_port", [self.input_value]))
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.entry_input, Event("change_value", None, [''])]))
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.entry_log, Event("append_value", None, ['< ' + self.input_value + '\n'])]))
+    
+    def _root_0_guard(self, parameters):
+        event_name = parameters[0]
+        return event_name == 'send'
+    
+    def _root_1_exec(self, parameters):
+        value = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.entry_log, Event("append_value", None, ['> ' + value + '\n'])]))
+    
+    def _root_2_exec(self, parameters):
+        name = parameters[0]
+        value = parameters[1]
+        self.input_value = value
+    
+    def _root_2_guard(self, parameters):
+        name = parameters[0]
+        value = parameters[1]
+        return name == 'input_value'
+    
+    def initializeStatechart(self):
+        # enter default state
+        self.default_targets = self.states["/init"].getEffectiveTargetStates()
+        RuntimeClassBase.initializeStatechart(self)
+
+class Text(RuntimeClassBase):
+    def __init__(self, controller, constructor_parameters = None):
+        if constructor_parameters == None: constructor_parameters = {}
+        RuntimeClassBase.__init__(self, controller)
+        
+        self.semantics.big_step_maximality = StatechartSemantics.TakeMany
+        self.semantics.internal_event_lifeline = StatechartSemantics.Queue
+        self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
+        self.semantics.priority = StatechartSemantics.SourceParent
+        self.semantics.concurrency = StatechartSemantics.Single
+        
+        # build Statechart structure
+        self.build_statechart_structure()
+        
+        # call user defined constructor
+        Text.user_defined_constructor(self, constructor_parameters)
+    
+    def user_defined_constructor(self, constructor_parameters = None):
+        if constructor_parameters == None: constructor_parameters = {}
+        self.name = constructor_parameters['name']
+        self.entry = tk.Text(constructor_parameters['parent'])
+        self.entry.config(state=tk.DISABLED)
+    
+    def user_defined_destructor(self):
+        self.entry.destroy()
+    
+    
+    # builds Statechart structure
+    def build_statechart_structure(self):
+        
+        # state <root>
+        self.states[""] = State(0, "", self)
+        
+        # state /main
+        self.states["/main"] = State(1, "/main", self)
+        
+        # state /main/initializing
+        self.states["/main/initializing"] = State(2, "/main/initializing", self)
+        
+        # state /main/ready
+        self.states["/main/ready"] = State(3, "/main/ready", self)
+        
+        # add children
+        self.states[""].addChild(self.states["/main"])
+        self.states["/main"].addChild(self.states["/main/initializing"])
+        self.states["/main"].addChild(self.states["/main/ready"])
+        self.states[""].fixTree()
+        self.states[""].default_state = self.states["/main"]
+        self.states["/main"].default_state = self.states["/main/initializing"]
+        
+        # transition /main/initializing
+        _main_initializing_0 = Transition(self, self.states["/main/initializing"], [self.states["/main/ready"]])
+        _main_initializing_0.setAction(self._main_initializing_0_exec)
+        _main_initializing_0.setTrigger(None)
+        self.states["/main/initializing"].addTransition(_main_initializing_0)
+        
+        # transition /main/ready
+        _main_ready_0 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
+        _main_ready_0.setAction(self._main_ready_0_exec)
+        _main_ready_0.setTrigger(Event("append_value", None))
+        self.states["/main/ready"].addTransition(_main_ready_0)
+    
+    def _main_initializing_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("tk_widget", None, [self.entry])]))
+    
+    def _main_ready_0_exec(self, parameters):
+        new_value = parameters[0]
+        self.entry.config(state=tk.NORMAL)
+        self.entry.insert(tk.END, new_value)
+        self.entry.config(state=tk.DISABLED)
+        self.entry.see(tk.END)
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("changed_value", None, [self.name, self.entry.get(1.0, tk.END)])]))
+    
+    def initializeStatechart(self):
+        # enter default state
+        self.default_targets = self.states["/main"].getEffectiveTargetStates()
+        RuntimeClassBase.initializeStatechart(self)
+
+class Entry(RuntimeClassBase):
+    def __init__(self, controller, constructor_parameters = None):
+        if constructor_parameters == None: constructor_parameters = {}
+        RuntimeClassBase.__init__(self, controller)
+        
+        self.semantics.big_step_maximality = StatechartSemantics.TakeMany
+        self.semantics.internal_event_lifeline = StatechartSemantics.Queue
+        self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
+        self.semantics.priority = StatechartSemantics.SourceParent
+        self.semantics.concurrency = StatechartSemantics.Single
+        
+        # build Statechart structure
+        self.build_statechart_structure()
+        
+        # call user defined constructor
+        Entry.user_defined_constructor(self, constructor_parameters)
+    
+    def user_defined_constructor(self, constructor_parameters = None):
+        if constructor_parameters == None: constructor_parameters = {}
+        self.name = constructor_parameters['name']
+        self.entry = tk.Entry(constructor_parameters['parent'], textvariable=self.construct_strvar(constructor_parameters['parent'], constructor_parameters['value']))
+        
+        if constructor_parameters.get('readonly', False):
+            self.entry.config(state=tk.DISABLED)
+    
+    def user_defined_destructor(self):
+        self.entry.destroy()
+    
+    
+    # user defined method
+    def construct_strvar(self, parent, value):
+        self.strvar = tk.StringVar(parent)
+        self.strvar.set(value)
+        self.strvar.trace('w', lambda a, b, c: self.controller.addInput(Event("change_entry", "input", [id(self), self.strvar.get()])))
+        return self.strvar
+    
+    
+    # builds Statechart structure
+    def build_statechart_structure(self):
+        
+        # state <root>
+        self.states[""] = State(0, "", self)
+        
+        # state /main
+        self.states["/main"] = State(1, "/main", self)
+        
+        # state /main/initializing
+        self.states["/main/initializing"] = State(2, "/main/initializing", self)
+        
+        # state /main/ready
+        self.states["/main/ready"] = State(3, "/main/ready", self)
+        
+        # add children
+        self.states[""].addChild(self.states["/main"])
+        self.states["/main"].addChild(self.states["/main/initializing"])
+        self.states["/main"].addChild(self.states["/main/ready"])
+        self.states[""].fixTree()
+        self.states[""].default_state = self.states["/main"]
+        self.states["/main"].default_state = self.states["/main/initializing"]
+        
+        # transition /main/initializing
+        _main_initializing_0 = Transition(self, self.states["/main/initializing"], [self.states["/main/ready"]])
+        _main_initializing_0.setAction(self._main_initializing_0_exec)
+        _main_initializing_0.setTrigger(None)
+        self.states["/main/initializing"].addTransition(_main_initializing_0)
+        
+        # transition /main/ready
+        _main_ready_0 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
+        _main_ready_0.setAction(self._main_ready_0_exec)
+        _main_ready_0.setTrigger(Event("change_entry", "input"))
+        _main_ready_0.setGuard(self._main_ready_0_guard)
+        self.states["/main/ready"].addTransition(_main_ready_0)
+        _main_ready_1 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
+        _main_ready_1.setAction(self._main_ready_1_exec)
+        _main_ready_1.setTrigger(Event("change_bg", None))
+        self.states["/main/ready"].addTransition(_main_ready_1)
+        _main_ready_2 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
+        _main_ready_2.setAction(self._main_ready_2_exec)
+        _main_ready_2.setTrigger(Event("change_event_name", None))
+        self.states["/main/ready"].addTransition(_main_ready_2)
+        _main_ready_3 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
+        _main_ready_3.setAction(self._main_ready_3_exec)
+        _main_ready_3.setTrigger(Event("change_value", None))
+        self.states["/main/ready"].addTransition(_main_ready_3)
+        _main_ready_4 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
+        _main_ready_4.setAction(self._main_ready_4_exec)
+        _main_ready_4.setTrigger(Event("disable", None))
+        self.states["/main/ready"].addTransition(_main_ready_4)
+    
+    def _main_initializing_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("tk_widget", None, [self.entry])]))
+    
+    def _main_ready_0_exec(self, parameters):
+        tagorid = parameters[0]
+        new_value = parameters[1]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("changed_entry", None, [self.name, new_value])]))
+    
+    def _main_ready_0_guard(self, parameters):
+        tagorid = parameters[0]
+        new_value = parameters[1]
+        return tagorid == id(self)
+    
+    def _main_ready_1_exec(self, parameters):
+        colour = parameters[0]
+        self.entry.configure(bg=colour, disabledbackground=colour)
+    
+    def _main_ready_2_exec(self, parameters):
+        new_name = parameters[0]
+        self.name = new_name
+    
+    def _main_ready_3_exec(self, parameters):
+        new_value = parameters[0]
+        self.strvar.set(new_value)
+    
+    def _main_ready_4_exec(self, parameters):
+        self.entry.config(state=tk.DISABLED)
+    
+    def initializeStatechart(self):
+        # enter default state
+        self.default_targets = self.states["/main"].getEffectiveTargetStates()
+        RuntimeClassBase.initializeStatechart(self)
+
+class Button(RuntimeClassBase, tk.Button, SCCDWidget):
+    def __init__(self, controller, constructor_parameters = None):
+        if constructor_parameters == None: constructor_parameters = {}
+        RuntimeClassBase.__init__(self, controller)
+        
+        self.semantics.big_step_maximality = StatechartSemantics.TakeMany
+        self.semantics.internal_event_lifeline = StatechartSemantics.Queue
+        self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
+        self.semantics.priority = StatechartSemantics.SourceParent
+        self.semantics.concurrency = StatechartSemantics.Single
+        
+        # build Statechart structure
+        self.build_statechart_structure()
+        
+        # call user defined constructor
+        Button.user_defined_constructor(self, constructor_parameters)
+    
+    def user_defined_constructor(self, constructor_parameters = None):
+        if constructor_parameters == None: constructor_parameters = {}
+        tk.Button.__init__(self, constructor_parameters['parent'], **(constructor_parameters['visual'].get_params()))
+        SCCDWidget.__init__(self)
+        self.event_parameters = constructor_parameters["event_parameters"]
+        if "tooltip_text" in constructor_parameters:
+            self.tooltip = ToolTip(self, constructor_parameters["tooltip_text"])
+        else:
+            self.tooltip = None
+        self.visual = constructor_parameters["visual"]
+    
+    def user_defined_destructor(self):
+        self.destroy()
+        # call super class destructors
+        if hasattr(tk.Button, "__del__"):
+            tk.Button.__del__(self)
+        if hasattr(SCCDWidget, "__del__"):
+            SCCDWidget.__del__(self)
+    
+    
+    # builds Statechart structure
+    def build_statechart_structure(self):
+        
+        # state <root>
+        self.states[""] = State(0, "", self)
+        
+        # state /main
+        self.states["/main"] = State(1, "/main", self)
+        
+        # state /main/initializing
+        self.states["/main/initializing"] = State(2, "/main/initializing", self)
+        
+        # state /main/ready
+        self.states["/main/ready"] = State(3, "/main/ready", self)
+        
+        # add children
+        self.states[""].addChild(self.states["/main"])
+        self.states["/main"].addChild(self.states["/main/initializing"])
+        self.states["/main"].addChild(self.states["/main/ready"])
+        self.states[""].fixTree()
+        self.states[""].default_state = self.states["/main"]
+        self.states["/main"].default_state = self.states["/main/initializing"]
+        
+        # transition /main/initializing
+        _main_initializing_0 = Transition(self, self.states["/main/initializing"], [self.states["/main/ready"]])
+        _main_initializing_0.setAction(self._main_initializing_0_exec)
+        _main_initializing_0.setTrigger(None)
+        self.states["/main/initializing"].addTransition(_main_initializing_0)
+        
+        # transition /main/ready
+        _main_ready_0 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
+        _main_ready_0.setAction(self._main_ready_0_exec)
+        _main_ready_0.setTrigger(Event("left-click", "input"))
+        _main_ready_0.setGuard(self._main_ready_0_guard)
+        self.states["/main/ready"].addTransition(_main_ready_0)
+        _main_ready_1 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
+        _main_ready_1.setAction(self._main_ready_1_exec)
+        _main_ready_1.setTrigger(Event("enter", "input"))
+        _main_ready_1.setGuard(self._main_ready_1_guard)
+        self.states["/main/ready"].addTransition(_main_ready_1)
+        _main_ready_2 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
+        _main_ready_2.setAction(self._main_ready_2_exec)
+        _main_ready_2.setTrigger(Event("leave", "input"))
+        _main_ready_2.setGuard(self._main_ready_2_guard)
+        self.states["/main/ready"].addTransition(_main_ready_2)
+        _main_ready_3 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
+        _main_ready_3.setAction(self._main_ready_3_exec)
+        _main_ready_3.setTrigger(Event("activate", None))
+        self.states["/main/ready"].addTransition(_main_ready_3)
+        _main_ready_4 = Transition(self, self.states["/main/ready"], [self.states["/main/ready"]])
+        _main_ready_4.setAction(self._main_ready_4_exec)
+        _main_ready_4.setTrigger(Event("deactivate", None))
+        self.states["/main/ready"].addTransition(_main_ready_4)
+    
+    def _main_initializing_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("tk_widget", None, [self])]))
+    
+    def _main_ready_0_exec(self, parameters):
+        tagorid = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("button_pressed", None, [self.event_parameters])]))
+    
+    def _main_ready_0_guard(self, parameters):
+        tagorid = parameters[0]
+        return tagorid == id(self)
+    
+    def _main_ready_1_exec(self, parameters):
+        tagorid = parameters[0]
+        self.tooltip.showtip()
+    
+    def _main_ready_1_guard(self, parameters):
+        tagorid = parameters[0]
+        return tagorid == id(self) and self.tooltip is not None
+    
+    def _main_ready_2_exec(self, parameters):
+        tagorid = parameters[0]
+        self.tooltip.hidetip()
+    
+    def _main_ready_2_guard(self, parameters):
+        tagorid = parameters[0]
+        return tagorid == id(self) and self.tooltip is not None
+    
+    def _main_ready_3_exec(self, parameters):
+        self.configure(state=tk.ACTIVE, relief=tk.SUNKEN)
+        print("Activate " + str(self.event_parameters))
+    
+    def _main_ready_4_exec(self, parameters):
+        self.configure(state=tk.NORMAL, relief=tk.RAISED)
+        print("Deactivate " + str(self.event_parameters))
+    
+    def initializeStatechart(self):
+        # enter default state
+        self.default_targets = self.states["/main"].getEffectiveTargetStates()
+        RuntimeClassBase.initializeStatechart(self)
+
+class Label(RuntimeClassBase, tk.Label, SCCDWidget):
+    def __init__(self, controller, constructor_parameters = None):
+        if constructor_parameters == None: constructor_parameters = {}
+        RuntimeClassBase.__init__(self, controller)
+        
+        self.semantics.big_step_maximality = StatechartSemantics.TakeMany
+        self.semantics.internal_event_lifeline = StatechartSemantics.Queue
+        self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
+        self.semantics.priority = StatechartSemantics.SourceParent
+        self.semantics.concurrency = StatechartSemantics.Single
+        
+        # build Statechart structure
+        self.build_statechart_structure()
+        
+        # call user defined constructor
+        Label.user_defined_constructor(self, constructor_parameters)
+    
+    def user_defined_constructor(self, constructor_parameters = None):
+        if constructor_parameters == None: constructor_parameters = {}
+        tk.Label.__init__(self, constructor_parameters['parent'], **({'text': constructor_parameters['text'], 'bg': 'white'}))
+        SCCDWidget.__init__(self)
+    
+    def user_defined_destructor(self):
+        self.destroy()
+        # call super class destructors
+        if hasattr(tk.Label, "__del__"):
+            tk.Label.__del__(self)
+        if hasattr(SCCDWidget, "__del__"):
+            SCCDWidget.__del__(self)
+    
+    
+    # user defined method
+    def set_text(self, text):
+        self.config(text=text)
+    
+    
+    # builds Statechart structure
+    def build_statechart_structure(self):
+        
+        # state <root>
+        self.states[""] = State(0, "", self)
+        
+        # state /root
+        self.states["/root"] = State(1, "/root", self)
+        
+        # state /root/initializing
+        self.states["/root/initializing"] = State(2, "/root/initializing", self)
+        
+        # state /root/ready
+        self.states["/root/ready"] = State(3, "/root/ready", self)
+        
+        # add children
+        self.states[""].addChild(self.states["/root"])
+        self.states["/root"].addChild(self.states["/root/initializing"])
+        self.states["/root"].addChild(self.states["/root/ready"])
+        self.states[""].fixTree()
+        self.states[""].default_state = self.states["/root"]
+        self.states["/root"].default_state = self.states["/root/initializing"]
+        
+        # transition /root/initializing
+        _root_initializing_0 = Transition(self, self.states["/root/initializing"], [self.states["/root/ready"]])
+        _root_initializing_0.setAction(self._root_initializing_0_exec)
+        _root_initializing_0.setTrigger(None)
+        self.states["/root/initializing"].addTransition(_root_initializing_0)
+        
+        # transition /root/ready
+        _root_ready_0 = Transition(self, self.states["/root/ready"], [self.states["/root/ready"]])
+        _root_ready_0.setAction(self._root_ready_0_exec)
+        _root_ready_0.setTrigger(Event("left-click", "input"))
+        _root_ready_0.setGuard(self._root_ready_0_guard)
+        self.states["/root/ready"].addTransition(_root_ready_0)
+        _root_ready_1 = Transition(self, self.states["/root/ready"], [self.states["/root/ready"]])
+        _root_ready_1.setAction(self._root_ready_1_exec)
+        _root_ready_1.setTrigger(Event("highlight", None))
+        self.states["/root/ready"].addTransition(_root_ready_1)
+        _root_ready_2 = Transition(self, self.states["/root/ready"], [self.states["/root/ready"]])
+        _root_ready_2.setAction(self._root_ready_2_exec)
+        _root_ready_2.setTrigger(Event("unhighlight", None))
+        self.states["/root/ready"].addTransition(_root_ready_2)
+    
+    def _root_initializing_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("tk_widget", None, [self])]))
+    
+    def _root_ready_0_exec(self, parameters):
+        tagorid = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("label_pressed", None, [self.cget('text')])]))
+    
+    def _root_ready_0_guard(self, parameters):
+        tagorid = parameters[0]
+        return tagorid == id(self)
+    
+    def _root_ready_1_exec(self, parameters):
+        self.config(bg="yellow")
+    
+    def _root_ready_2_exec(self, parameters):
+        self.config(bg="white")
+    
+    def initializeStatechart(self):
+        # enter default state
+        self.default_targets = self.states["/root"].getEffectiveTargetStates()
+        RuntimeClassBase.initializeStatechart(self)
+
+class ObjectManager(ObjectManagerBase):
+    def __init__(self, controller):
+        ObjectManagerBase.__init__(self, controller)
+    
+    def instantiate(self, class_name, construct_params):
+        if class_name == "ChatWindow":
+            instance = ChatWindow(self.controller)
+            instance.associations = {}
+            instance.associations["buttons"] = Association("Button", 0, -1)
+            instance.associations["entries"] = Association("Entry", 0, -1)
+            instance.associations["parent"] = Association("A", 0, -1)
+        elif class_name == "Text":
+            instance = Text(self.controller, construct_params[0])
+            instance.associations = {}
+            instance.associations["parent"] = Association("A", 0, -1)
+        elif class_name == "Entry":
+            instance = Entry(self.controller, construct_params[0])
+            instance.associations = {}
+            instance.associations["parent"] = Association("A", 0, -1)
+        elif class_name == "Button":
+            instance = Button(self.controller, construct_params[0])
+            instance.associations = {}
+            instance.associations["parent"] = Association("A", 0, -1)
+        elif class_name == "Label":
+            instance = Label(self.controller, construct_params[0])
+            instance.associations = {}
+            instance.associations["parent"] = Association("A", 1, 1)
+        else:
+            raise Exception("Cannot instantiate class " + class_name)
+        return instance
+
+class Controller(EventLoopControllerBase):
+    def __init__(self, event_loop_callbacks, finished_callback = None, behind_schedule_callback = None):
+        if finished_callback == None: finished_callback = None
+        if behind_schedule_callback == None: behind_schedule_callback = None
+        EventLoopControllerBase.__init__(self, ObjectManager(self), event_loop_callbacks, finished_callback, behind_schedule_callback)
+        self.addInputPort("input")
+        self.addInputPort("stdin_port")
+        self.addOutputPort("stdout_port")
+        self.object_manager.createInstance("ChatWindow", [])

+ 26 - 0
chatwindow.xml

@@ -0,0 +1,26 @@
+<?xml version="1.0" ?>
+<diagram author="Yentl Van Tendeloo" name="ChatWindow- Tkinter Version ">
+    <description>
+        TkInter chatwindow over STDIN and STDOUT
+    </description>
+    <top>
+        import Tkinter as tk
+        import ttk
+        from sccd_widget import SCCDWidget, ImageVisual, TextVisual, ToolTip
+        import uuid
+        import json
+        import urllib
+        import subprocess
+        import sys
+    </top>
+
+    <inport name="input"/>
+    <inport name="stdin_port"/>
+    <outport name="stdout_port"/>
+
+    <class src="classes/window/chatwindow.xml" default="true"/>
+    <class src="classes/widgets/text.xml"/>
+    <class src="classes/widgets/entry.xml"/>
+    <class src="classes/widgets/button.xml"/>
+    <class src="classes/widgets/label.xml"/>
+</diagram>

+ 0 - 4
classes/widgets/entry.xml

@@ -49,9 +49,6 @@
                         <parameter expr="self.name"/>
                         <parameter expr="new_value"/>
                     </raise>
-                    <script>
-                        print("Got entry change Tk event!")
-                    </script>
                 </transition>
 
                 <transition event="change_bg" target=".">
@@ -71,7 +68,6 @@
                 <transition event="change_value" target=".">
                     <parameter name="new_value"/>
                     <script>
-                        print("CHANGE VALUE IN ENTRY")
                         self.strvar.set(new_value)
                     </script>
                 </transition>

+ 0 - 1
classes/widgets/text.xml

@@ -32,7 +32,6 @@
                 <transition event="append_value" target=".">
                     <parameter name="new_value"/>
                     <script>
-                        print("Appending value")
                         self.entry.config(state=tk.NORMAL)
                         self.entry.insert(tk.END, new_value)
                         self.entry.config(state=tk.DISABLED)

+ 4 - 24
classes/window/chatwindow.xml

@@ -12,7 +12,6 @@
         <super class="SCCDWidget"/>
         <body>
             self.input_value = ""
-            print("Start up chatwindow!")
         </body>
     </constructor>
 
@@ -22,16 +21,7 @@
         </body>
     </destructor>
 
-    <scxml initial="get_assoc_name">
-        <state id="get_assoc_name">
-            <transition event="assoc_name" target="../init">
-                <parameter name="assoc_name"/>
-                <script>
-                    self.assoc_name = assoc_name
-                </script>
-            </transition>
-        </state>
-
+    <scxml initial="init">
         <state id="init" initial="init_entry_log">
             <state id="init_entry_log" initial="create">
                 <state id="create">
@@ -133,13 +123,9 @@
         <state id="root">
             <transition event="button_pressed" cond="event_name == 'send'" target=".">
                 <parameter name="event_name"/>
-                <raise event="mv_data_input" scope="broad">
+                <raise event="stdout_output" scope="output" port="stdout_port">
                     <parameter expr="self.input_value"/>
-                    <parameter expr="None"/>
                 </raise>
-                <script>
-                    print("Sent data")
-                </script>
                 <raise event="change_value" scope="narrow" target="self.entry_input">
                     <parameter expr="''"/>
                 </raise>
@@ -148,7 +134,7 @@
                 </raise>
             </transition>
 
-            <transition event="mv_data_output" target=".">
+            <transition event="stdin_input" port="stdin_port" target=".">
                 <parameter name="value"/>
                 <raise event="append_value" scope="narrow" target="self.entry_log">
                     <parameter expr="'> ' + value + '\n'"/>
@@ -163,8 +149,6 @@
                 </script>
             </transition>
 
-            <transition event="mv_response" target="../closing"/>
-
             <transition event="close_window" target="../closing"/>
         </state>
 
@@ -178,11 +162,7 @@
                 </raise>
             </onentry>
 
-            <transition event="instance_deleted" target="../close">
-                <raise event="delete_me" scope="narrow" target="'parent'">
-                    <parameter expr="self.assoc_name"/>
-                </raise>
-            </transition>
+            <transition event="instance_deleted" target="../close"/>
         </state>
             
         <state id="close"/>

+ 39 - 0
run_chatwindow.py

@@ -0,0 +1,39 @@
+import Tkinter as tk
+import chatwindow
+from sccd.runtime.statecharts_core import Event
+from sccd.runtime.tkinter_eventloop import *
+import threading
+
+from sccd_widget import SCCDWidget
+
+class Root(tk.Tk, SCCDWidget):
+    def __init__(self):
+        tk.Tk.__init__(self)
+        SCCDWidget.__init__(self)
+
+root = Root()
+root.withdraw()
+controller = chatwindow.Controller(TkEventLoop(root))
+
+SCCDWidget.controller = controller
+
+def stdin_poller(controller):
+    while 1:
+        controller.addInput(Event("stdin_input", "stdin_port", [raw_input()]))
+
+def stdout_printer(controller):
+    port = controller.addOutputListener("stdout_port")
+    while 1:
+        print(port.fetch(-1).parameters[0])
+
+input_thread = threading.Thread(target=stdin_poller, args=[controller])
+input_thread.daemon = True
+input_thread.start()
+
+output_thread = threading.Thread(target=stdout_printer, args=[controller])
+output_thread.daemon = True
+output_thread.start()
+
+controller.start()
+
+root.mainloop()

+ 2 - 0
run_chatwindow.sh

@@ -0,0 +1,2 @@
+#!/bin/bash
+python -m sccd.compiler.sccdc -p eventloop chatwindow.xml && python run_chatwindow.py