Bläddra i källkod

Added pypdevs examples, need to fix ValueError: cannot convert float NaN to integer

sampieters 1 år sedan
förälder
incheckning
9d7d02a12f

+ 1 - 1
.gitignore

@@ -1,4 +1,4 @@
-pypdevs/
+pypdevs
 
 # Byte-compiled / optimized Python files
 __pycache__/

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1158 - 0
examples/BouncingBalls/PyDEVS/new_tester.py


+ 55 - 0
examples/BouncingBalls/PyDEVS/runner.py

@@ -0,0 +1,55 @@
+from pypdevs.simulator import Simulator
+import target as target
+
+from tkinter import *
+from sccd.runtime.libs.ui_v2 import UI
+
+class OutputListener:
+	def __init__(self, ui):
+		self.ui = ui
+
+	def add(self, event):
+		if event.port == "ui":
+			method = getattr(self.ui, event.name)
+			method(*event.parameters)
+
+if __name__ == '__main__':
+	model = target.Controller(name="controller")
+	refs = {"ui": model.ui, "field_ui": model.atomic1.field_ui}
+
+	tkroot = Tk()
+	tkroot.withdraw()
+	sim = Simulator(model)
+	sim.setRealTime(True)
+	sim.setRealTimeInputFile(None)
+	sim.setRealTimePorts(refs)
+	sim.setVerbose(None)
+	sim.setRealTimePlatformTk(tkroot)
+
+
+	#controller = target.Controller(TkEventLoop(tkroot))
+	ui = UI(tkroot, "controller")
+	#controller.addMyOwnOutputListener(OutputListener(ui))
+	#controller.start()
+	sim.simulate()
+	tkroot.mainloop()
+
+
+"""
+model = target.Controller(name="controller")
+refs = {"ui": model.ui, "field_ui": model.atomic1.field_ui}
+ui.window = Tk()
+ui.window.withdraw()
+
+sim = Simulator(model)
+sim.setRealTime(True)
+sim.setRealTimeInputFile(None)
+sim.setRealTimePorts(refs)
+sim.setVerbose(None)
+sim.setRealTimePlatformTk(ui.window)
+
+ui.simulator = sim
+
+sim.simulate()
+ui.window.mainloop()
+"""

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1156 - 0
examples/BouncingBalls/PyDEVS/target.py


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 546 - 218
examples/bouncingballs_fixtk/bouncingballs.py


+ 24 - 0
examples/Timer/PyDEVS/runner.py

@@ -0,0 +1,24 @@
+from pypdevs.simulator import Simulator
+import target as target
+
+from tkinter import *
+from sccd.runtime.libs.DEVui import ui
+
+
+
+model = target.Controller(name="controller")
+#refs = {"ui": model.ui, "field_ui": model.atomic1.field_ui}
+ui.window = Tk()
+ui.window.withdraw()
+
+sim = Simulator(model)
+sim.setRealTime(True)
+sim.setRealTimeInputFile(None)
+#sim.setRealTimePorts(refs)
+sim.setVerbose(None)
+sim.setRealTimePlatformTk(ui.window)
+
+ui.simulator = sim
+
+sim.simulate()
+ui.window.mainloop()

+ 252 - 0
examples/Timer/PyDEVS/target.py

@@ -0,0 +1,252 @@
+"""
+Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration) and Sam Pieters (DEVS)
+
+Model author: Simon Van Mierlo
+Model name:   Timer (Eventloop Version)
+
+"""
+
+from sccd.runtime.DEVS_statecharts_core import *
+from pypdevs.DEVS import *
+from pypdevs.infinity import *
+from pypdevs.simulator import *
+from sccd.runtime.libs.ui import ui
+from sccd.runtime.accurate_time import AccurateTime
+
+# package "Timer (Eventloop Version)"
+
+class MainAppInstance(RuntimeClassBase):
+    def __init__(self, atomdevs):
+        RuntimeClassBase.__init__(self, atomdevs)
+        self.associations = {}
+        
+        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
+        MainAppInstance.user_defined_constructor(self)
+    
+    def user_defined_constructor(self):
+        self.canvas = ui.append_canvas(ui.window,100,100,{'background':'#eee'})
+        self.clock_text = self.canvas.element.create_text(25,25,{'text':'0.0'})
+        self.actual_clock_text = self.canvas.element.create_text(25,50,{'text':'0.0'})
+        interrupt_button = ui.append_button(ui.window, 'INTERRUPT');
+        continue_button = ui.append_button(ui.window, 'CONTINUE');
+        ui.bind_event(interrupt_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'interrupt_clicked');
+        ui.bind_event(continue_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'continue_clicked');
+    
+    def user_defined_destructor(self):
+        pass
+    
+    
+    # user defined method
+    def update_timers(self):
+        self.canvas.element.itemconfigure(self.clock_text, text=str('%.2f' % (self.getSimulatedTime() / 1000.0)))
+        #self.canvas.element.itemconfigure(self.actual_clock_text, text='%.2f' % (time() / 1000.0))
+    
+    
+    # builds Statechart structure
+    def build_statechart_structure(self):
+        
+        # state <root>
+        self.states[""] = State(0, "", self)
+        
+        # state /running
+        self.states["/running"] = State(1, "/running", self)
+        self.states["/running"].setEnter(self._running_enter)
+        self.states["/running"].setExit(self._running_exit)
+        
+        # state /interrupted
+        self.states["/interrupted"] = State(2, "/interrupted", self)
+        
+        # add children
+        self.states[""].addChild(self.states["/running"])
+        self.states[""].addChild(self.states["/interrupted"])
+        self.states[""].fixTree()
+        self.states[""].default_state = self.states["/running"]
+        
+        # transition /running
+        _running_0 = Transition(self, self.states["/running"], [self.states["/running"]])
+        _running_0.setAction(self._running_0_exec)
+        _running_0.setTrigger(Event("_0after"))
+        self.states["/running"].addTransition(_running_0)
+        _running_1 = Transition(self, self.states["/running"], [self.states["/interrupted"]])
+        _running_1.setAction(self._running_1_exec)
+        _running_1.setTrigger(Event("interrupt_clicked", self.getInPortName("ui")))
+        self.states["/running"].addTransition(_running_1)
+        
+        # transition /interrupted
+        _interrupted_0 = Transition(self, self.states["/interrupted"], [self.states["/interrupted"]])
+        _interrupted_0.setAction(self._interrupted_0_exec)
+        _interrupted_0.setTrigger(Event("interrupt_clicked", self.getInPortName("ui")))
+        self.states["/interrupted"].addTransition(_interrupted_0)
+        _interrupted_1 = Transition(self, self.states["/interrupted"], [self.states["/running"]])
+        _interrupted_1.setAction(self._interrupted_1_exec)
+        _interrupted_1.setTrigger(Event("continue_clicked", self.getInPortName("ui")))
+        self.states["/interrupted"].addTransition(_interrupted_1)
+    
+    def _running_enter(self):
+        self.addTimer(0, 0.05)
+    
+    def _running_exit(self):
+        self.removeTimer(0)
+    
+    def _running_0_exec(self, parameters):
+        self.update_timers()
+    
+    def _running_1_exec(self, parameters):
+        self.update_timers()
+    
+    def _interrupted_0_exec(self, parameters):
+        self.update_timers()
+    
+    def _interrupted_1_exec(self, parameters):
+        self.update_timers()
+    
+    def initializeStatechart(self):
+        # enter default state
+        self.default_targets = self.states["/running"].getEffectiveTargetStates()
+        RuntimeClassBase.initializeStatechart(self)
+
+class MainApp(AtomicDEVS, ObjectManagerBase):
+    def __init__(self, name):
+        AtomicDEVS.__init__(self, name)
+        ObjectManagerBase.__init__(self)
+        self.elapsed = 0
+        self.obj_manager_out = self.addOutPort("obj_manager_out")
+        self.outputs = {}
+        self.obj_manager_in = self.addInPort("obj_manager_in")
+        self.input = self.addInPort("input")
+        self.instances.add(MainAppInstance(self))
+        self.next_time = 0
+    
+    def extTransition(self, inputs):
+        self.next_time = 0
+        all_inputs = []
+        if self.obj_manager_in in inputs:
+            all_inputs.extend(inputs[self.obj_manager_in])
+        if self.input in inputs:
+            all_inputs.extend(inputs[self.input])
+        for input in all_inputs:
+            if isinstance(input, str):
+                tem = eval(input)
+                self.addInput(tem)
+            if input[3].name == "create_instance":
+                self.instances.add(MainAppInstance(self))
+                ev = Event("instance_created", None, parameters=[f"{input[0]}[{len(self.instances)-1}]"])
+                self.to_send.append(("MainApp", TODO, input[2], ev))
+            elif input[3].name == "start_instance":
+                instance = list(self.instances)[input[2]]
+                instance.start()
+                ev = Event("instance_started", None, parameters=[])
+                self.to_send.append((input[0], input[1], input[2], ev))
+            elif input[3].name == "delete_instance":
+                ev = Event("instance_deleted", None, parameters=[TODO])
+                self.to_send.append((TODO, TODO, TODO, ev))
+            elif input[3].name == "associate_instance":
+                ev = Event("instance_associated", None, parameters=[TODO])
+                self.to_send.append((TODO, TODO, TODO, ev))
+            elif input[3].name == "disassociate_instance":
+                ev = Event("instance_disassociated", None, parameters=[TODO])
+                self.to_send.append((TODO, TODO, TODO, ev))
+            elif input[3].name == "instance_created":
+                instance = list(self.instances)[input[2]]
+                instance.addEvent(input[3])
+                instance.associations['fields'].instances[0] = input[3].parameters[0]
+            elif input[3].name == "instance_started":
+                instance = list(self.instances)[input[2]]
+                instance.addEvent(input[3])
+            elif input[3].name == "instance_deleted":
+                instance = list(self.instances)[input[2]]
+                instance.addEvent(input[3])
+            elif input[3].name == "instance_associated":
+                instance = list(self.instances)[input[2]]
+                instance.addEvent(input[3])
+            elif input[3].name == "instance_disassociated":
+                instance = list(self.instances)[input[2]]
+                instance.addEvent(input[3])
+            elif input[3].name == "set_association_name":
+                ev = input[3]
+                self.addInput(ev, force_internal=True)
+        return self.instances
+    
+    def intTransition(self):
+        earliest = min(self.getEarliestEventTime(), self.input_queue.getEarliestTime())
+        if not (earliest == INFINITY):
+            self.simulated_time = earliest
+        self.to_send = []
+        self.handleInput()
+        self.stepAll()
+        next_earliest = min(self.getEarliestEventTime(), self.input_queue.getEarliestTime())
+        self.next_time = next_earliest - earliest
+        return self.instances
+    
+    def outputFnc(self):
+        to_dict = {}
+        for sending in self.to_send:
+            if sending[0] == None:
+                if self.obj_manager_out in to_dict:
+                    to_dict[self.obj_manager_out].append(sending)
+                else:
+                    to_dict[self.obj_manager_out] = [sending]
+            else:
+                the_port = None
+                for port in self.OPorts:
+                    if port.name == sending[0]:
+                        the_port = port
+                if the_port in to_dict:
+                    to_dict[the_port].append(sending)
+                else:
+                    to_dict[the_port] = [sending]
+        return to_dict
+    
+    def timeAdvance(self):
+        return self.next_time
+
+class ObjectManagerState:
+    def __init__(self):
+        self.to_send = [(None, "MainApp", 0, Event("start_instance", None, None))]
+
+class ObjectManager(AtomicDEVS):
+    def __init__(self, name):
+        AtomicDEVS.__init__(self, name)
+        self.State = ObjectManagerState()
+        self.input = self.addInPort("input")
+        self.output = {}
+        self.output["MainApp"] = self.addOutPort()
+    
+    def extTransition(self, inputs):
+        all_inputs = inputs[self.input]
+        for input in all_inputs:
+            self.State.to_send.append(input)
+        return self.State
+    
+    def intTransition(self):
+        self.State.to_send = []
+        return self.State
+    
+    def outputFnc(self):
+        out_dict = {}
+        for (source, target, id, message) in self.State.to_send:
+            out_dict[self.output[target]] = [(source, target, id, message)]
+        return out_dict
+    
+    def timeAdvance(self):
+        if self.State.to_send:
+            return 0
+        return INFINITY
+
+class Controller(CoupledDEVS):
+    def __init__(self, name):
+        CoupledDEVS.__init__(self, name)
+        self.ui = self.addInPort("ui")
+        self.objectmanager = self.addSubModel(ObjectManager("ObjectManager"))
+        self.atomic0 = self.addSubModel(MainApp("MainApp"))
+        self.connectPorts(self.atomic0.obj_manager_out, self.objectmanager.input)
+        self.connectPorts(self.objectmanager.output["MainApp"], self.atomic0.obj_manager_in)

+ 24 - 0
examples/TrafficLight/PyDEVS/runner.py

@@ -0,0 +1,24 @@
+from pypdevs.simulator import Simulator
+import target as target
+
+from tkinter import *
+from sccd.runtime.libs.DEVui import ui
+
+
+
+model = target.Controller(name="controller")
+refs = {"ui": model.ui}
+ui.window = Tk()
+ui.window.withdraw()
+
+sim = Simulator(model)
+sim.setRealTime(True)
+sim.setRealTimeInputFile(None)
+sim.setRealTimePorts(refs)
+sim.setVerbose(None)
+sim.setRealTimePlatformTk(ui.window)
+
+ui.simulator = sim
+
+sim.simulate()
+ui.window.mainloop()

+ 531 - 0
examples/TrafficLight/PyDEVS/target.py

@@ -0,0 +1,531 @@
+"""
+Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration) and Sam Pieters (DEVS)
+
+Model author: Raphael Mannadiar
+Model name:   Traffic_Light_Python_Version
+
+"""
+
+from sccd.runtime.DEVS_statecharts_core import *
+from pypdevs.DEVS import *
+from pypdevs.infinity import *
+from pypdevs.simulator import *
+from sccd.runtime.libs.ui import ui
+
+# package "Traffic_Light_Python_Version"
+
+class MainAppInstance(RuntimeClassBase):
+    def __init__(self, atomdevs):
+        RuntimeClassBase.__init__(self, atomdevs)
+        self.associations = {}
+        self.associations["trafficlight"] = Association("TrafficLight", 0, -1)
+        
+        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
+        MainAppInstance.user_defined_constructor(self)
+    
+    def user_defined_constructor(self):
+        self.canvas   = ui.append_canvas(ui.window,100,310,{'background':'#eee'});
+        police_button = ui.append_button(ui.window, 'Police interrupt');
+        quit_button   = ui.append_button(ui.window, 'Quit');
+        ui.bind_event(police_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'police_interrupt_clicked');
+        ui.bind_event(quit_button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'quit_clicked');
+    
+    def user_defined_destructor(self):
+        pass
+    
+    
+    # builds Statechart structure
+    def build_statechart_structure(self):
+        
+        # state <root>
+        self.states[""] = State(0, "", self)
+        
+        # state /initializing
+        self.states["/initializing"] = State(1, "/initializing", self)
+        
+        # state /creating
+        self.states["/creating"] = State(2, "/creating", self)
+        
+        # state /initialized
+        self.states["/initialized"] = State(3, "/initialized", self)
+        
+        # add children
+        self.states[""].addChild(self.states["/initializing"])
+        self.states[""].addChild(self.states["/creating"])
+        self.states[""].addChild(self.states["/initialized"])
+        self.states[""].fixTree()
+        self.states[""].default_state = self.states["/initializing"]
+        
+        # transition /initializing
+        _initializing_0 = Transition(self, self.states["/initializing"], [self.states["/creating"]])
+        _initializing_0.setAction(self._initializing_0_exec)
+        _initializing_0.setTrigger(None)
+        self.states["/initializing"].addTransition(_initializing_0)
+        
+        # transition /creating
+        _creating_0 = Transition(self, self.states["/creating"], [self.states["/initialized"]])
+        _creating_0.setAction(self._creating_0_exec)
+        _creating_0.setTrigger(Event("instance_created", None))
+        self.states["/creating"].addTransition(_creating_0)
+    
+    def _initializing_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, "trafficlight", "TrafficLight", self.canvas]))
+    
+    def _creating_0_exec(self, parameters):
+        association_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
+    
+    def initializeStatechart(self):
+        # enter default state
+        self.default_targets = self.states["/initializing"].getEffectiveTargetStates()
+        RuntimeClassBase.initializeStatechart(self)
+
+class MainApp(AtomicDEVS, ObjectManagerBase):
+    def __init__(self, name):
+        AtomicDEVS.__init__(self, name)
+        ObjectManagerBase.__init__(self)
+        self.elapsed = 0
+        self.obj_manager_in = self.addInPort("obj_manager_in")
+        self.obj_manager_out = self.addOutPort("obj_manager_out")
+        self.input = self.addInPort("input")
+        self.outputs = {}
+        self.outputs["trafficlight"] = self.addOutPort("trafficlight")
+        self.obj_manager_in = self.addInPort("obj_manager_in")
+        self.input = self.addInPort("input")
+        self.instances.add(MainAppInstance(self))
+
+        self.name = "MainApp"
+    
+    def extTransition(self, inputs):
+        self.simulated_time = (self.simulated_time + self.elapsed)
+        all_inputs = []
+        if self.obj_manager_in in inputs:
+            all_inputs.extend(inputs[self.obj_manager_in])
+        if self.input in inputs:
+            all_inputs.extend(inputs[self.input])
+        for input in all_inputs:
+            if isinstance(input, str):
+                tem = eval(input)
+                self.addInput(tem)
+            if input[3].name == "create_instance":
+                self.instances.add(MainAppInstance(self))
+                ev = Event("instance_created", None, parameters=[f"{input[0]}[{len(self.instances)-1}]"])
+                self.to_send.append(("MainApp", TODO, input[2], ev))
+            elif input[3].name == "start_instance":
+                instance = list(self.instances)[input[2]]
+                instance.start()
+                ev = Event("instance_started", None, parameters=[])
+                self.to_send.append((input[0], input[1], input[2], ev))
+            elif input[3].name == "delete_instance":
+                ev = Event("instance_deleted", None, parameters=[TODO])
+                self.to_send.append((TODO, TODO, TODO, ev))
+            elif input[3].name == "associate_instance":
+                ev = Event("instance_associated", None, parameters=[TODO])
+                self.to_send.append((TODO, TODO, TODO, ev))
+            elif input[3].name == "disassociate_instance":
+                ev = Event("instance_disassociated", None, parameters=[TODO])
+                self.to_send.append((TODO, TODO, TODO, ev))
+            elif input[3].name == "instance_created":
+                instance = list(self.instances)[input[2]]
+                instance.addEvent(input[3])
+                instance.associations['fields'].instances[0] = input[3].parameters[0]
+            elif input[3].name == "instance_started":
+                instance = list(self.instances)[input[2]]
+                instance.addEvent(input[3])
+            elif input[3].name == "instance_deleted":
+                instance = list(self.instances)[input[2]]
+                instance.addEvent(input[3])
+            elif input[3].name == "instance_associated":
+                instance = list(self.instances)[input[2]]
+                instance.addEvent(input[3])
+            elif input[3].name == "instance_disassociated":
+                instance = list(self.instances)[input[2]]
+                instance.addEvent(input[3])
+            elif input[3].name == "set_association_name":
+                ev = input[3]
+                self.addInput(ev, force_internal=True)
+        return self.instances
+    
+    def intTransition(self):
+        self.to_send = []
+        self.handleInput()
+        self.stepAll()
+        return self.instances
+    
+    def outputFnc(self):
+        to_dict = {}
+        for sending in self.to_send:
+            if sending[0] == None:
+                if self.obj_manager_out in to_dict:
+                    to_dict[self.obj_manager_out].append(sending)
+                else:
+                    to_dict[self.obj_manager_out] = [sending]
+            else:
+                the_port = None
+                for port in self.OPorts:
+                    if port.name == sending[0]:
+                        the_port = port
+                if the_port in to_dict:
+                    to_dict[the_port].append(sending)
+                else:
+                    to_dict[the_port] = [sending]
+        return to_dict
+    
+    def timeAdvance(self):
+        if not (len(self.to_send) == 0):
+            return 0
+        return self.getEarliestEventTime()
+
+class TrafficLightInstance(RuntimeClassBase):
+    def __init__(self, atomdevs, canvas):
+        RuntimeClassBase.__init__(self, atomdevs)
+        self.associations = {}
+        
+        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
+        TrafficLightInstance.user_defined_constructor(self, canvas)
+    
+    def user_defined_constructor(self, canvas):
+        size        = 100;
+        offset      = size+5;
+        self.RED    = 0;
+        self.YELLOW = 1;
+        self.GREEN  = 2;
+        self.colors = ['#f00','#ff0','#0f0']
+        self.lights = [
+            canvas.add_rectangle(size/2, size/2, size, size, {'fill':'#000'}),
+            canvas.add_rectangle(size/2, size/2+offset,     size, size, {'fill':'#000'}),
+            canvas.add_rectangle(size/2, size/2+2*offset, size, size, {'fill':'#000'})];
+    
+    def user_defined_destructor(self):
+        pass
+    
+    
+    # user defined method
+    def clear(self):
+        self.lights[self.RED].set_color('#000');
+        self.lights[self.YELLOW].set_color('#000');
+        self.lights[self.GREEN].set_color('#000');
+    
+    
+    # user defined method
+    def setGreen(self):
+        self.clear();
+        self.lights[self.GREEN].set_color(self.colors[self.GREEN]);
+    
+    
+    # user defined method
+    def setYellow(self):
+        self.clear();
+        self.lights[self.YELLOW].set_color(self.colors[self.YELLOW]);
+    
+    
+    # user defined method
+    def setRed(self):
+        self.clear();
+        self.lights[self.RED].set_color(self.colors[self.RED]);
+    
+    
+    # builds Statechart structure
+    def build_statechart_structure(self):
+        
+        # state <root>
+        self.states[""] = State(0, "", self)
+        
+        # state /on
+        self.states["/on"] = State(1, "/on", self)
+        
+        # state /on/normal
+        self.states["/on/normal"] = State(2, "/on/normal", self)
+        
+        # state /on/normal/red
+        self.states["/on/normal/red"] = State(3, "/on/normal/red", self)
+        self.states["/on/normal/red"].setEnter(self._on_normal_red_enter)
+        self.states["/on/normal/red"].setExit(self._on_normal_red_exit)
+        
+        # state /on/normal/green
+        self.states["/on/normal/green"] = State(4, "/on/normal/green", self)
+        self.states["/on/normal/green"].setEnter(self._on_normal_green_enter)
+        self.states["/on/normal/green"].setExit(self._on_normal_green_exit)
+        
+        # state /on/normal/yellow
+        self.states["/on/normal/yellow"] = State(5, "/on/normal/yellow", self)
+        self.states["/on/normal/yellow"].setEnter(self._on_normal_yellow_enter)
+        self.states["/on/normal/yellow"].setExit(self._on_normal_yellow_exit)
+        
+        # state /on/normal/history
+        self.states["/on/normal/history"] = ShallowHistoryState(6, "/on/normal/history", self)
+        
+        # state /on/interrupted
+        self.states["/on/interrupted"] = State(7, "/on/interrupted", self)
+        
+        # state /on/interrupted/yellow
+        self.states["/on/interrupted/yellow"] = State(8, "/on/interrupted/yellow", self)
+        self.states["/on/interrupted/yellow"].setEnter(self._on_interrupted_yellow_enter)
+        self.states["/on/interrupted/yellow"].setExit(self._on_interrupted_yellow_exit)
+        
+        # state /on/interrupted/black
+        self.states["/on/interrupted/black"] = State(9, "/on/interrupted/black", self)
+        self.states["/on/interrupted/black"].setEnter(self._on_interrupted_black_enter)
+        self.states["/on/interrupted/black"].setExit(self._on_interrupted_black_exit)
+        
+        # state /off
+        self.states["/off"] = State(10, "/off", self)
+        self.states["/off"].setEnter(self._off_enter)
+        
+        # add children
+        self.states[""].addChild(self.states["/on"])
+        self.states[""].addChild(self.states["/off"])
+        self.states["/on"].addChild(self.states["/on/normal"])
+        self.states["/on"].addChild(self.states["/on/interrupted"])
+        self.states["/on/normal"].addChild(self.states["/on/normal/red"])
+        self.states["/on/normal"].addChild(self.states["/on/normal/green"])
+        self.states["/on/normal"].addChild(self.states["/on/normal/yellow"])
+        self.states["/on/normal"].addChild(self.states["/on/normal/history"])
+        self.states["/on/interrupted"].addChild(self.states["/on/interrupted/yellow"])
+        self.states["/on/interrupted"].addChild(self.states["/on/interrupted/black"])
+        self.states[""].fixTree()
+        self.states[""].default_state = self.states["/on"]
+        self.states["/on"].default_state = self.states["/on/normal"]
+        self.states["/on/normal"].default_state = self.states["/on/normal/red"]
+        self.states["/on/interrupted"].default_state = self.states["/on/interrupted/yellow"]
+        
+        # transition /on/normal/red
+        _on_normal_red_0 = Transition(self, self.states["/on/normal/red"], [self.states["/on/normal/green"]])
+        _on_normal_red_0.setTrigger(Event("_0after"))
+        self.states["/on/normal/red"].addTransition(_on_normal_red_0)
+        
+        # transition /on/normal/green
+        _on_normal_green_0 = Transition(self, self.states["/on/normal/green"], [self.states["/on/normal/yellow"]])
+        _on_normal_green_0.setTrigger(Event("_1after"))
+        self.states["/on/normal/green"].addTransition(_on_normal_green_0)
+        
+        # transition /on/normal/yellow
+        _on_normal_yellow_0 = Transition(self, self.states["/on/normal/yellow"], [self.states["/on/normal/red"]])
+        _on_normal_yellow_0.setTrigger(Event("_2after"))
+        self.states["/on/normal/yellow"].addTransition(_on_normal_yellow_0)
+        
+        # transition /on/interrupted/yellow
+        _on_interrupted_yellow_0 = Transition(self, self.states["/on/interrupted/yellow"], [self.states["/on/interrupted/black"]])
+        _on_interrupted_yellow_0.setTrigger(Event("_3after"))
+        self.states["/on/interrupted/yellow"].addTransition(_on_interrupted_yellow_0)
+        
+        # transition /on/interrupted/black
+        _on_interrupted_black_0 = Transition(self, self.states["/on/interrupted/black"], [self.states["/on/interrupted/yellow"]])
+        _on_interrupted_black_0.setTrigger(Event("_4after"))
+        self.states["/on/interrupted/black"].addTransition(_on_interrupted_black_0)
+        
+        # transition /on
+        _on_0 = Transition(self, self.states["/on"], [self.states["/off"]])
+        _on_0.setTrigger(Event("quit_clicked", self.getInPortName("ui")))
+        self.states["/on"].addTransition(_on_0)
+        
+        # transition /on/normal
+        _on_normal_0 = Transition(self, self.states["/on/normal"], [self.states["/on/interrupted"]])
+        _on_normal_0.setTrigger(Event("police_interrupt_clicked", self.getInPortName("ui")))
+        self.states["/on/normal"].addTransition(_on_normal_0)
+        
+        # transition /on/interrupted
+        _on_interrupted_0 = Transition(self, self.states["/on/interrupted"], [self.states["/on/normal/history"]])
+        _on_interrupted_0.setTrigger(Event("police_interrupt_clicked", self.getInPortName("ui")))
+        self.states["/on/interrupted"].addTransition(_on_interrupted_0)
+    
+    def _on_normal_red_enter(self):
+        self.setRed();
+        self.addTimer(0, 3)
+    
+    def _on_normal_red_exit(self):
+        self.removeTimer(0)
+    
+    def _on_normal_green_enter(self):
+        self.setGreen();
+        self.addTimer(1, 2)
+    
+    def _on_normal_green_exit(self):
+        self.removeTimer(1)
+    
+    def _on_normal_yellow_enter(self):
+        self.setYellow();
+        self.addTimer(2, 1)
+    
+    def _on_normal_yellow_exit(self):
+        self.removeTimer(2)
+    
+    def _on_interrupted_yellow_enter(self):
+        self.setYellow();
+        self.addTimer(3, .5)
+    
+    def _on_interrupted_yellow_exit(self):
+        self.removeTimer(3)
+    
+    def _on_interrupted_black_enter(self):
+        self.clear();
+        self.addTimer(4, .5)
+    
+    def _on_interrupted_black_exit(self):
+        self.removeTimer(4)
+    
+    def _off_enter(self):
+        self.clear();
+    
+    def initializeStatechart(self):
+        # enter default state
+        self.default_targets = self.states["/on"].getEffectiveTargetStates()
+        RuntimeClassBase.initializeStatechart(self)
+
+class TrafficLight(AtomicDEVS, ObjectManagerBase):
+    def __init__(self, name):
+        AtomicDEVS.__init__(self, name)
+        ObjectManagerBase.__init__(self)
+        self.elapsed = 0
+        self.obj_manager_in = self.addInPort("obj_manager_in")
+        self.obj_manager_out = self.addOutPort("obj_manager_out")
+        self.input = self.addInPort("input")
+        self.outputs = {}
+        self.obj_manager_in = self.addInPort("obj_manager_in")
+        self.input = self.addInPort("input")
+    
+    def extTransition(self, inputs):
+        self.simulated_time = (self.simulated_time + self.elapsed)
+        all_inputs = []
+        if self.obj_manager_in in inputs:
+            all_inputs.extend(inputs[self.obj_manager_in])
+        if self.input in inputs:
+            all_inputs.extend(inputs[self.input])
+        for input in all_inputs:
+            if isinstance(input, str):
+                tem = eval(input)
+                self.addInput(tem)
+            if input[3].name == "create_instance":
+                self.instances.add(TrafficLightInstance(self))
+                ev = Event("instance_created", None, parameters=[f"{input[0]}[{len(self.instances)-1}]"])
+                self.to_send.append(("TrafficLight", TODO, input[2], ev))
+            elif input[3].name == "start_instance":
+                instance = list(self.instances)[input[2]]
+                instance.start()
+                ev = Event("instance_started", None, parameters=[TODO])
+                self.to_send.append((input[0], input[1], input[2], ev))
+            elif input[3].name == "delete_instance":
+                ev = Event("instance_deleted", None, parameters=[TODO])
+                self.to_send.append((TODO, TODO, TODO, ev))
+            elif input[3].name == "associate_instance":
+                ev = Event("instance_associated", None, parameters=[TODO])
+                self.to_send.append((TODO, TODO, TODO, ev))
+            elif input[3].name == "disassociate_instance":
+                ev = Event("instance_disassociated", None, parameters=[TODO])
+                self.to_send.append((TODO, TODO, TODO, ev))
+            elif input[3].name == "instance_created":
+                instance = list(self.instances)[input[2]]
+                instance.addEvent(input[3])
+                instance.associations['fields'].instances[0] = input[3].parameters[0]
+            elif input[3].name == "instance_started":
+                instance = list(self.instances)[input[2]]
+                instance.addEvent(input[3])
+            elif input[3].name == "instance_deleted":
+                instance = list(self.instances)[input[2]]
+                instance.addEvent(input[3])
+            elif input[3].name == "instance_associated":
+                instance = list(self.instances)[input[2]]
+                instance.addEvent(input[3])
+            elif input[3].name == "instance_disassociated":
+                instance = list(self.instances)[input[2]]
+                instance.addEvent(input[3])
+            elif input[3].name == "set_association_name":
+                ev = input[3]
+                self.addInput(ev, force_internal=True)
+        return self.instances
+    
+    def intTransition(self):
+        self.to_send = []
+        self.handleInput()
+        self.stepAll()
+        return self.instances
+    
+    def outputFnc(self):
+        to_dict = {}
+        for sending in self.to_send:
+            if sending[0] == None:
+                if self.obj_manager_out in to_dict:
+                    to_dict[self.obj_manager_out].append(sending)
+                else:
+                    to_dict[self.obj_manager_out] = [sending]
+            else:
+                the_port = None
+                for port in self.OPorts:
+                    if port.name == sending[0]:
+                        the_port = port
+                if the_port in to_dict:
+                    to_dict[the_port].append(sending)
+                else:
+                    to_dict[the_port] = [sending]
+        return to_dict
+    
+    def timeAdvance(self):
+        if not (len(self.to_send) == 0):
+            return 0
+        return self.getEarliestEventTime()
+
+class ObjectManagerState:
+    def __init__(self):
+        self.to_send = [(None, "MainApp", 0, Event("start_instance", None, None))]
+
+class ObjectManager(AtomicDEVS):
+    def __init__(self, name):
+        AtomicDEVS.__init__(self, name)
+        self.State = ObjectManagerState()
+        self.input = self.addInPort("input")
+        self.output = {}
+        self.output["MainApp"] = self.addOutPort()
+        self.output["TrafficLight"] = self.addOutPort()
+    
+    def extTransition(self, inputs):
+        all_inputs = inputs[self.input]
+        for input in all_inputs:
+            self.State.to_send.append(input)
+        return self.State
+    
+    def intTransition(self):
+        self.State.to_send = []
+        return self.State
+    
+    def outputFnc(self):
+        out_dict = {}
+        for (source, target, id, message) in self.State.to_send:
+            out_dict[self.output[target]] = [(source, target, id, message)]
+        return out_dict
+    
+    def timeAdvance(self):
+        if self.State.to_send:
+            return 0
+        return INFINITY
+
+class Controller(CoupledDEVS):
+    def __init__(self, name):
+        CoupledDEVS.__init__(self, name)
+        self.ui = self.addInPort("ui")
+        self.objectmanager = self.addSubModel(ObjectManager("ObjectManager"))
+        self.atomic0 = self.addSubModel(MainApp("MainApp"))
+        self.atomic1 = self.addSubModel(TrafficLight("TrafficLight"))
+        self.connectPorts(self.atomic0.obj_manager_out, self.objectmanager.input)
+        self.connectPorts(self.objectmanager.output["MainApp"], self.atomic0.obj_manager_in)
+        self.connectPorts(self.atomic0.outputs["trafficlight"], self.atomic1.input)
+        self.connectPorts(self.atomic1.obj_manager_out, self.objectmanager.input)
+        self.connectPorts(self.objectmanager.output["TrafficLight"], self.atomic1.obj_manager_in)

+ 0 - 17
examples/bouncingballs/README.txt

@@ -1,17 +0,0 @@
-Bouncing balls example.
-
-Adopted from:
-  https://msdl.uantwerpen.be/git/simon/SCCD/src/master/examples/bouncingballs/python/sccd.xml
-
-To (re-)compile:
-  Dependencies:
-    Python 3
-    SCCD2DEVS must be in your PYTHONPATH environment variable.
-  Run:
-    python3 -m sccd.compiler.sccdc bouncingballs.xml -p eventloop
-
-To run the example:
-  Dependencies:
-    Python 3 and TkInter
-  Run:
-    python3 runner.py

+ 0 - 405
examples/bouncingballs/bouncingballs.xml

@@ -1,405 +0,0 @@
-<?xml version="1.1" ?>
-<diagram author="Simon Van Mierlo+Raphael Mannadiar" name="Bouncing_Balls_Python_Version">
-    <description>
-        Tkinter frame with bouncing balls in it.
-    </description>
-    <top>
-        from sccd.runtime.libs.ui import ui
-        from sccd.runtime.libs.utils import utils
-        import random
-    </top>
-    <inport name="ui"/>
-    <class name="MainApp" default="true">
-        <relationships>
-            <association name="fields" class="Field" />
-        </relationships>
-        <constructor>
-            <body>
-                <![CDATA[
-                self.nr_of_fields = 0
-                ]]>
-            </body>
-        </constructor>
-        <scxml initial="running">
-            <state id="running" initial="root">
-                <parallel id="root">
-                    <state id="main_behaviour" initial="initializing">
-                        <state id="initializing">
-                            <transition target="../running">
-                                <raise event="create_field" />        
-                            </transition>
-                        </state>
-                        <state id="running">
-                            <transition target='.' event='button_pressed' cond='event_name == "create_new_field"'>
-                                <parameter name="event_name" type="str" />
-                                <raise event="create_field" />
-                            </transition>
-                        </state>
-                    </state>
-                    <state id="cd_behaviour" initial="waiting">
-                        <state id="waiting">
-                            <transition event="create_field" target="../creating">
-                                <raise scope="cd" event="create_instance">
-                                    <parameter expr='"fields"' />
-                                </raise>
-                            </transition>
-                            <transition event="delete_field" target='../check_nr_of_fields'>
-                                <parameter name="association_name" type="str"/>
-                                <raise scope="cd" event="delete_instance">
-                                    <parameter expr='association_name' />
-                                </raise>
-                                <script>
-                                    <![CDATA[
-                                    self.nr_of_fields -= 1
-                                    ]]>
-                                </script>
-                            </transition>
-                        </state>
-                        <state id="creating">
-                            <transition event="instance_created" target="../waiting">
-                                <parameter name="association_name" type="string"/>
-                                <raise scope="cd" event="start_instance">
-                                    <parameter expr="association_name" />
-                                </raise>
-                                <raise scope="narrow" event="set_association_name" target="association_name">
-                                    <parameter expr="association_name" />
-                                </raise>
-                                <script>
-                                    <![CDATA[
-                                    self.nr_of_fields += 1
-                                    ]]>
-                                </script>
-                            </transition>
-                        </state>
-                        <state id="check_nr_of_fields">
-                            <transition target="../stopped" cond="self.nr_of_fields == 0" after="0.05">
-                                <raise event="stop" />
-                            </transition>
-                            <transition target="../waiting" cond="self.nr_of_fields != 0"/>
-                        </state>
-                        <state id="stopped" />
-                    </state>
-                    <transition target="../stopped" event="stop">
-                        <script>
-                            <![CDATA[
-                            ui.close_window(ui.window)
-                            ]]>
-                        </script>
-                    </transition>
-                </parallel>
-                <state id="stopped" />
-            </state>
-        </scxml>
-    </class>
-
-    <class name="Field">
-        <attribute name="canvas" />
-        <attribute name="field_window" />
-        <inport name="field_ui"/>
-        <relationships>
-            <association name="balls" class="Ball" />
-            <association name="buttons" class="Button" />
-            <association name="parent" class="MainApp" min="1" max="1" />
-        </relationships>
-        <constructor>
-            <body>
-                <![CDATA[
-                self.field_window = ui.new_window(800,600,"BouncingBalls");
-                self.canvas = ui.append_canvas(self.field_window,800,550,{'background':'#eee'});
-                ui.bind_event(self.field_window, ui.EVENTS.WINDOW_CLOSE, self.controller, 'window_close', self.inports['field_ui']);
-                ui.bind_event(self.field_window, ui.EVENTS.KEY_PRESS, self.controller, 'key_press', self.inports['field_ui']);
-                ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_RIGHT_CLICK,    self.controller, 'right_click', self.inports['field_ui']);
-                ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_MOVE, self.controller, 'mouse_move', self.inports['field_ui']);
-                ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_RELEASE, self.controller, 'mouse_release', self.inports['field_ui']);
-                ]]>
-            </body>
-        </constructor>
-        <destructor>
-            <body>
-                <![CDATA[
-                ui.close_window(self.field_window);
-                ]]>
-            </body>
-        </destructor>
-        <scxml initial="root">
-            <state id="root" initial="waiting">
-                <state id="waiting">
-                    <transition event="set_association_name" target="../initializing">
-                        <parameter name="association_name" type="str" />
-                        <script>
-                            <![CDATA[
-                            self.association_name = association_name
-                            ]]>
-                        </script>
-                    </transition>
-                </state>
-                <state id="initializing">
-                    <transition target="../creating">
-                        <raise scope="cd" event="create_instance">
-                            <parameter expr='"buttons"' />
-                            <parameter expr='"Button"' />
-                            <parameter expr="self.field_window" />
-                            <parameter expr="'create_new_field'" />
-                            <parameter expr="'Spawn New Window'" />
-                        </raise>
-                    </transition>
-                </state>
-                <state id="creating">
-                    <transition event='instance_created' target='../packing'>
-                        <parameter name="association_name" type="string"/>
-                        <raise scope="cd" event="start_instance">
-                            <parameter expr="association_name" />
-                        </raise>
-                    </transition>
-                </state>
-                <state id="packing">
-                    <transition event="button_created" target='../running'>
-                    </transition>
-                </state>
-                <parallel id="running">
-                    <transition port="field_ui" event="window_close" target="../deleting">
-                        <raise event="delete_instance" scope="cd">
-                            <parameter expr='"buttons"' />
-                        </raise>
-                        <raise event="delete_instance" scope="cd">
-                            <parameter expr='"balls"' />
-                        </raise>
-                    </transition>
-                    <state id="main_behaviour" initial="running">
-                        <state id="running">
-                            <transition port="field_ui" event="right_click" target="../creating">
-                                <parameter name="x" />
-                                <parameter name="y" />
-                                <parameter name="button" />
-                                <raise scope="cd" event="create_instance">
-                                    <parameter expr='"balls"' />
-                                    <parameter expr='"Ball"' />
-                                    <parameter expr="self.canvas" />
-                                    <parameter expr="x" />
-                                    <parameter expr="y" />
-                                </raise>
-                            </transition>
-                        </state>
-                        <state id="creating">
-                            <transition event="instance_created" target="../running">
-                                <parameter name="association_name" type="string"/>
-                                <raise scope="cd" event="start_instance">
-                                    <parameter expr="association_name" />
-                                </raise>
-                                <raise scope="narrow" event="set_association_name" target="association_name">
-                                    <parameter expr="association_name" />
-                                </raise>
-                            </transition>
-                        </state>
-                    </state>
-                    <state id="deleting_behaviour" initial="running">
-                        <state id="running">
-                            <transition event="delete_ball" target='.'>
-                                <parameter name="association_name" type="str"/>
-                                <raise scope="cd" event="delete_instance">
-                                    <parameter expr='association_name' />
-                                </raise>
-                            </transition>
-                        </state>
-                    </state>
-                    <state id="child_behaviour" initial="listening">
-                        <state id="listening">
-                            <transition event="button_pressed" target='.'>
-                                <parameter name="event_name" type="str" />
-                                <raise event="button_pressed" scope="narrow" target="'parent'">
-                                    <parameter expr='event_name' />
-                                </raise>
-                            </transition>
-                        </state>
-                    </state>
-                    <state id="deleting_balls_behaviour" initial="listening">
-                        <state id="listening">
-                            <transition port="field_ui" event="key_press" target="." cond="key == ui.KEYCODES.DELETE">
-                                <parameter name="key" />
-                                <raise event="delete_self" scope="narrow" target="'balls'" />
-                            </transition>
-                        </state>
-                    </state>
-                </parallel>
-                <state id="deleting">
-                    <transition target="../deleted">
-                        <raise event="delete_field" scope="narrow" target="'parent'">
-                            <parameter expr='self.association_name' />
-                        </raise>
-                    </transition>
-                </state>
-                <state id="deleted" />
-            </state>
-        </scxml>
-    </class>
-    
-    <class name="Button">
-        <relationships>
-            <association name="parent" class="Field" min="1" max="1" />
-        </relationships>
-        <inport name="button_ui"/>
-        <constructor>
-            <parameter name="tkparent" type="object" />
-            <parameter name="event_name" type="str" />
-            <parameter name="button_text" type="str" />
-            <body>
-                <![CDATA[
-                self.event_name = event_name;
-                button = ui.append_button(tkparent, event_name);
-                ui.bind_event(button.element, ui.EVENTS.MOUSE_CLICK, self.controller, 'mouse_click', self.inports['button_ui']);
-                ]]>
-            </body>
-        </constructor>
-        <scxml initial="initializing">
-            <state id="initializing">
-                <transition target="../running">
-                    <raise event="button_created" scope="narrow" target="'parent'">
-                    </raise>
-                </transition>
-            </state>
-            <state id="running">
-                <transition port='button_ui' event="mouse_click" target='.' cond="button == ui.MOUSE_BUTTONS.LEFT">
-                    <parameter name="x" />
-                    <parameter name="y" />
-                    <parameter name="button" />
-                    <raise event="button_pressed" scope="narrow" target="'parent'">
-                        <parameter expr="self.event_name" />
-                    </raise>
-                </transition>
-            </state>
-        </scxml>
-    </class>
-    
-    <class name="Ball">
-        <atrribute name="element" />
-        <attribute name="canvas" />
-        <inport name="ball_ui" />
-        <relationships>
-            <association name="parent" class="Field" min="1" max="1" />
-        </relationships>
-        <constructor>
-            <parameter name="canvas" />
-            <parameter name="x" />
-            <parameter name="y" />
-            <body>
-                <![CDATA[
-                self.canvas = canvas;
-                self.r = 20.0;
-                self.vel = {'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)};
-                self.mouse_pos = {};
-                self.smooth = 0.4; # value between 0 and 1
-
-                circle = self.canvas.add_circle(x, y, self.r, {'fill':'#000'});
-                ui.bind_event(circle, ui.EVENTS.MOUSE_PRESS, self.controller, 'mouse_press', self.inports["ball_ui"]);
-                ui.bind_event(circle, ui.EVENTS.MOUSE_MOVE, self.controller, 'mouse_move', self.inports['ball_ui']);
-                ui.bind_event(circle, ui.EVENTS.MOUSE_RELEASE, self.controller, 'mouse_release', self.inports['ball_ui']);
-                self.element = circle;
-                ]]>
-            </body>
-        </constructor>
-        <destructor>
-            <body>
-                <![CDATA[
-                self.canvas.remove_element(self.element);
-                ]]>
-            </body>
-        </destructor>
-        <scxml initial="main_behaviour">
-            <state id="main_behaviour" initial="initializing">
-                <state id="initializing">
-                    <transition event="set_association_name" target="../bouncing">
-                        <parameter name="association_name" type="str" />
-                        <script>
-                            <![CDATA[
-                            self.association_name = association_name
-                            ]]>                            
-                        </script>
-                    </transition>
-                </state>
-                <state id="bouncing">
-                    <transition after="(20 - self.getSimulatedTime() % 20) / 1000.0" target=".">
-                        <script>
-                            <![CDATA[
-                            pos = self.element.get_position();    
-                            if pos.x-self.r <= 0 or pos.x+self.r >= self.canvas.get_width():
-                                self.vel['x'] = -self.vel['x'];
-                            if pos.y-self.r <= 0 or pos.y+self.r >= self.canvas.get_height():
-                                self.vel['y'] = -self.vel['y'];
-                            self.element.move(self.vel['x'], self.vel['y']);
-                            ]]>                            
-                        </script>
-                    </transition>
-                    <transition port="ball_ui" event="mouse_press" target="../selected" cond="button == ui.MOUSE_BUTTONS.LEFT">
-                        <parameter name="x" />
-                        <parameter name="y" />
-                        <parameter name="button" />
-                        <script>
-                            <![CDATA[
-                            self.element.set_color("#ff0");
-                            ]]>                            
-                        </script>
-                    </transition>
-                </state>
-                <state id="dragging">
-                    <transition port="ball_ui" event="mouse_move" target=".">
-                        <parameter name="x" />
-                        <parameter name="y" />
-                        <parameter name="button" />
-                        <script>
-                            <![CDATA[
-                            dx = x - self.mouse_pos['x'];
-                            dy = y - self.mouse_pos['y'];
-
-                            self.element.move(dx, dy);
-
-                            # keep ball within boundaries
-                            pos = self.element.get_position();
-                            if pos.x-self.r <= 0 :
-                                pos.x = self.r + 1;
-                            elif pos.x+self.r >= self.canvas.width :
-                                pos.x = self.canvas.width-self.r-1;
-                            if pos.y-self.r <= 0 :
-                                pos.y = self.r + 1;
-                            elif pos.y+self.r >= self.canvas.height :
-                                pos.y = self.canvas.height-self.r-1;
-                            self.element.set_position(pos.x, pos.y);
-                            self.mouse_pos = {'x':x, 'y':y};
-                            self.vel = {
-                                'x': (1-self.smooth)*dx + self.smooth*self.vel['x'],
-                                'y': (1-self.smooth)*dy + self.smooth*self.vel['y']
-                            };
-                            ]]>
-                        </script>
-                    </transition>
-                    <transition port="ball_ui" event="mouse_release" target="../bouncing">
-                        <parameter name="x" />
-                        <parameter name="y" />
-                        <script>
-                            <![CDATA[
-                            self.element.set_color("#f00");
-                            ]]>                            
-                        </script>
-                    </transition>
-                </state>
-                <state id='selected'>
-                    <transition port="ball_ui" event="mouse_press" target="../dragging" cond="button == ui.MOUSE_BUTTONS.LEFT">
-                        <parameter name="x" />
-                        <parameter name="y" />
-                        <parameter name="button" />
-                        <script>
-                            <![CDATA[
-                            self.mouse_pos = {'x':x, 'y':y};
-                            ]]>
-                        </script>
-                    </transition>
-                    <transition event="delete_self" target='../../deleted'>                    
-                        <raise event="delete_ball" scope="narrow" target="'parent'">
-                            <parameter expr='self.association_name' />
-                        </raise>
-                    </transition>
-                </state>
-            </state>
-            <state id='deleted' />
-        </scxml>
-    </class>
-</diagram>

+ 0 - 18
examples/bouncingballs/runner.py

@@ -1,18 +0,0 @@
-'''
-Created on 27-jul.-2014
-
-@author: Simon
-'''
-
-import tkinter as tk
-import bouncingballs as target
-from sccd.runtime.libs.ui import ui
-from sccd.runtime.statecharts_core import Event
-from sccd.runtime.tkinter_eventloop import *
-
-if __name__ == '__main__':
-	ui.window = tk.Tk()
-	ui.window.withdraw()
-	controller = target.Controller(TkEventLoop(ui.window))
-	controller.start()
-	ui.window.mainloop()

+ 0 - 17
examples/bouncingballs_fixtk/README.txt

@@ -1,17 +0,0 @@
-Bouncing balls example.
-
-Adopted from:
-  https://msdl.uantwerpen.be/git/simon/SCCD/src/master/examples/bouncingballs/python/sccd.xml
-
-To (re-)compile:
-  Dependencies:
-    Python 3
-    SCCD2DEVS must be in your PYTHONPATH environment variable.
-  Run:
-    python3 -m sccd.compiler.sccdc bouncingballs.xml -p eventloop
-
-To run the example:
-  Dependencies:
-    Python 3 and TkInter
-  Run:
-    python3 runner.py

+ 0 - 512
examples/bouncingballs_fixtk/bouncingballs.xml

@@ -1,512 +0,0 @@
-<?xml version="1.1" ?>
-<diagram author="Simon Van Mierlo+Raphael Mannadiar" name="Bouncing_Balls_Python_Version">
-    <description>
-        Tkinter frame with bouncing balls in it.
-    </description>
-    <top>
-        from sccd.runtime.libs import ui_v2 as ui
-        from sccd.runtime.libs.utils import utils
-        import random
-
-        CANVAS_WIDTH = 800
-        CANVAS_HEIGHT = 550
-    </top>
-    <inport name="ui"/>
-    <outport name="ui"/>
-    <class name="MainApp" default="true">
-        <relationships>
-            <association name="fields" class="Field" />
-        </relationships>
-        <constructor>
-            <body>
-                self.nr_of_fields = 0
-            </body>
-        </constructor>
-        <scxml initial="running">
-            <state id="running" initial="root">
-                <parallel id="root">
-                    <state id="main_behaviour" initial="initializing">
-                        <state id="initializing">
-                            <transition target="../running">
-                                <raise event="create_field" />        
-                            </transition>
-                        </state>
-                        <state id="running">
-                            <transition target='.' event='button_pressed' cond='event_name == "create_new_field"'>
-                                <parameter name="event_name" type="str" />
-                                <raise event="create_field" />
-                            </transition>
-                        </state>
-                    </state>
-                    <state id="cd_behaviour" initial="waiting">
-                        <state id="waiting">
-                            <transition event="create_field" target="../creating">
-                                <raise scope="cd" event="create_instance">
-                                    <parameter expr='"fields"' />
-                                </raise>
-                            </transition>
-                            <transition event="delete_field" target='../check_nr_of_fields'>
-                                <parameter name="association_name" type="str"/>
-                                <raise scope="cd" event="delete_instance">
-                                    <parameter expr='association_name' />
-                                </raise>
-                                <script>
-                                    self.nr_of_fields -= 1
-                                </script>
-                            </transition>
-                        </state>
-                        <state id="creating">
-                            <transition event="instance_created" target="../waiting">
-                                <parameter name="association_name" type="string"/>
-                                <raise scope="cd" event="start_instance">
-                                    <parameter expr="association_name" />
-                                </raise>
-                                <raise scope="narrow" event="set_association_name" target="association_name">
-                                    <parameter expr="association_name" />
-                                </raise>
-                                <script>
-                                    self.nr_of_fields += 1
-                                </script>
-                            </transition>
-                        </state>
-                        <state id="check_nr_of_fields">
-                            <transition target="../stopped" cond="self.nr_of_fields == 0" after="0.05">
-                                <raise event="stop" />
-                            </transition>
-                            <transition target="../waiting" cond="self.nr_of_fields != 0"/>
-                        </state>
-                        <state id="stopped" />
-                    </state>
-                    <transition target="../stopped" event="stop">
-                        <raise port="ui" event="destroy_all"/>
-                    </transition>
-                </parallel>
-                <state id="stopped" />
-            </state>
-        </scxml>
-    </class>
-
-    <class name="Field">
-        <attribute name="window_id" />
-        <attribute name="canvas_id" />
-        <inport name="field_ui"/>
-        <relationships>
-            <association name="balls" class="Ball" />
-            <association name="buttons" class="Button" />
-            <association name="parent" class="MainApp" min="1" max="1" />
-        </relationships>
-        <scxml initial="root">
-            <state id="root" initial="waiting">
-                <state id="waiting">
-                    <transition event="set_association_name" target="../creating_window">
-                        <parameter name="association_name" type="str" />
-                        <script>
-                            <![CDATA[
-                            self.association_name = association_name
-                            ]]>
-                        </script>
-                    </transition>
-                </state>
-                <state id="creating_window">
-                    <onentry>
-                        <raise port="ui" event="create_window">
-                            <parameter expr="800"/><!-- width -->
-                            <parameter expr="600"/><!-- height -->
-                            <parameter expr='"BouncingBalls"'/><!-- title -->
-                            <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
-                        </raise>
-                    </onentry>
-                    <transition event="window_created" target="../creating_canvas">
-                        <parameter name="window_id" type="int" />
-                        <script>
-                            <![CDATA[
-                            self.window_id = window_id
-                            ]]>
-                        </script>
-                        <raise port="ui" event="bind_event">
-                            <parameter expr="window_id"/><!-- widget_id -->
-                            <parameter expr="ui.EVENTS.WINDOW_CLOSE"/><!-- tk_event -->
-                            <parameter expr="'window_close'"/><!-- sccd_event_name -->
-                            <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
-                        </raise>
-                        <raise port="ui" event="bind_event">
-                            <parameter expr="window_id"/><!-- widget_id -->
-                            <parameter expr="ui.EVENTS.KEY_PRESS"/><!-- tk_event -->
-                            <parameter expr="'key_press'"/><!-- sccd_event_name -->
-                            <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
-                        </raise>
-                    </transition>
-                </state>
-                <state id="creating_canvas">
-                    <onentry>
-                        <raise port="ui" event="create_canvas">
-                            <parameter expr="self.window_id"/><!-- window_id -->
-                            <parameter expr="CANVAS_WIDTH"/><!-- width -->
-                            <parameter expr="CANVAS_HEIGHT"/><!-- height -->
-                            <parameter expr="{'background':'#eee'}"/><!-- style -->
-                            <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
-                        </raise>
-                    </onentry>
-                    <transition event="canvas_created" target="../creating_button">
-                        <parameter name="canvas_id" type="int"/>
-                        <script>
-                            <![CDATA[
-                            self.canvas_id = canvas_id
-                            ]]>
-                        </script>
-                        <raise port="ui" event="bind_event">
-                            <parameter expr="canvas_id"/><!-- widget_id -->
-                            <parameter expr="ui.EVENTS.MOUSE_RIGHT_CLICK"/><!-- tk_event -->
-                            <parameter expr="'right_click'"/><!-- sccd_event_name -->
-                            <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
-                        </raise>
-                        <raise port="ui" event="bind_event">
-                            <parameter expr="canvas_id"/><!-- widget_id -->
-                            <parameter expr="ui.EVENTS.MOUSE_MOVE"/><!-- tk_event -->
-                            <parameter expr="'mouse_move'"/><!-- sccd_event_name -->
-                            <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
-                        </raise>
-                        <raise port="ui" event="bind_event">
-                            <parameter expr="canvas_id"/><!-- widget_id -->
-                            <parameter expr="ui.EVENTS.MOUSE_RELEASE"/><!-- tk_event -->
-                            <parameter expr="'mouse_release'"/><!-- sccd_event_name -->
-                            <parameter expr="self.inports['field_ui']"/><!-- inport for response -->
-                        </raise>
-                    </transition>
-                </state>
-                <state id="creating_button">
-                    <onentry>
-                        <raise scope="cd" event="create_instance">
-                            <parameter expr='"buttons"' />
-                            <parameter expr='"Button"' />
-                            <parameter expr="self.window_id" />
-                            <parameter expr="'create_new_field'" />
-                            <parameter expr="'Spawn New Window'" />
-                        </raise>
-                    </onentry>
-                    <transition event='instance_created' target='../running'>
-                        <parameter name="association_name" type="string"/>
-                        <raise scope="cd" event="start_instance">
-                            <parameter expr="association_name" />
-                        </raise>
-                    </transition>
-                </state>
-                 <parallel id="running">
-                    <transition port="field_ui" event="window_close" target="../deleting">
-                        <raise event="delete_instance" scope="cd">
-                            <parameter expr='"buttons"' />
-                        </raise>
-                        <raise event="delete_instance" scope="cd">
-                            <parameter expr='"balls"' />
-                        </raise>
-                    </transition>
-                    <state id="main_behaviour" initial="running">
-                        <state id="running">
-                            <transition port="field_ui" event="right_click" target="../creating_ball">
-                                <parameter name="x" />
-                                <parameter name="y" />
-                                <parameter name="button" />
-                                <raise scope="cd" event="create_instance">
-                                    <parameter expr='"balls"' />
-                                    <parameter expr='"Ball"' />
-                                    <parameter expr="self.canvas_id" />
-                                    <parameter expr="x" />
-                                    <parameter expr="y" />
-                                </raise>
-                            </transition>
-                        </state>
-                        <state id="creating_ball">
-                            <transition event="instance_created" target="../running">
-                                <parameter name="association_name" type="string"/>
-                                <raise scope="cd" event="start_instance">
-                                    <parameter expr="association_name" />
-                                </raise>
-                                <raise scope="narrow" event="set_association_name" target="association_name">
-                                    <parameter expr="association_name" />
-                                </raise>
-                            </transition>
-                        </state>
-                    </state>
-                    <state id="deleting_behaviour" initial="running">
-                        <state id="running">
-                            <transition event="delete_ball" target='.'>
-                                <parameter name="association_name" type="str"/>
-                                <raise scope="cd" event="delete_instance">
-                                    <parameter expr='association_name' />
-                                </raise>
-                            </transition>
-                        </state>
-                    </state>
-                    <state id="child_behaviour" initial="listening">
-                        <state id="listening">
-                            <transition event="button_pressed" target='.'>
-                                <parameter name="event_name" type="str" />
-                                <raise event="button_pressed" scope="narrow" target="'parent'">
-                                    <parameter expr='event_name' />
-                                </raise>
-                            </transition>
-                        </state>
-                    </state>
-                    <state id="deleting_balls_behaviour" initial="listening">
-                        <state id="listening">
-                            <transition port="field_ui" event="key_press" target="." cond="key == ui.KEYCODES.DELETE">
-                                <parameter name="key" />
-                                <raise event="delete_self" scope="narrow" target="'balls'" />
-                            </transition>
-                        </state>
-                    </state>
-                </parallel>
-                <state id="deleting">
-                    <transition target="../deleted">
-                        <raise event="delete_field" scope="narrow" target="'parent'">
-                            <parameter expr='self.association_name' />
-                        </raise>
-                        <raise port="ui" event="destroy_window">
-                            <parameter expr="self.window_id"/><!-- window to destroy -->
-                        </raise>
-                    </transition>
-                </state>
-                <state id="deleted" />
-            </state>
-        </scxml>
-    </class>
-    
-    <class name="Button">
-        <attribute name="window_id" />
-        <attribute name="event_name" />
-        <attribute name="button_id" />
-        <relationships>
-            <association name="parent" class="Field" min="1" max="1" />
-        </relationships>
-        <inport name="button_ui"/>
-        <constructor>
-            <parameter name="window_id" type="int" />
-            <parameter name="event_name" type="str" />
-            <parameter name="button_text" type="str" />
-            <body>
-                self.window_id = window_id;
-                self.event_name = event_name;
-            </body>
-        </constructor>
-        <scxml initial="creating_button">
-            <state id="creating_button">
-                <onentry>
-                    <raise port="ui" event="create_button">
-                        <parameter expr="self.window_id"/><!-- window_id -->
-                        <parameter expr="self.event_name"/><!-- text -->
-                        <parameter expr="self.inports['button_ui']"/><!-- inport for response -->
-                    </raise>
-                </onentry>
-                <transition event="button_created" target="../running">
-                    <parameter name="button_id" type="int"/>
-                    <script>
-                        self.button_id = button_id
-                    </script>
-                    <raise port="ui" event="bind_event">
-                        <parameter expr="button_id"/><!-- widget_id -->
-                        <parameter expr="ui.EVENTS.MOUSE_CLICK"/><!-- tk_event -->
-                        <parameter expr='"mouse_click"'/><!-- sccd_event_name -->
-                        <parameter expr="self.inports['button_ui']"/><!-- inport for response -->
-                    </raise>
-                </transition>
-            </state>
-             <state id="running">
-                <transition port='button_ui' event="mouse_click" target='.' cond="button == ui.MOUSE_BUTTONS.LEFT">
-                    <parameter name="x" />
-                    <parameter name="y" />
-                    <parameter name="button" />
-                    <raise event="button_pressed" scope="narrow" target="'parent'">
-                        <parameter expr="self.event_name" />
-                    </raise>
-                </transition>
-            </state>
-        </scxml>
-    </class>
-    
-    <class name="Ball">
-        <attribute name="canvas_id" />
-        <atrribute name="circle_id" />
-        <attribute name="pos" />
-        <inport name="ball_ui" />
-        <relationships>
-            <association name="parent" class="Field" min="1" max="1" />
-        </relationships>
-        <constructor>
-            <parameter name="canvas_id" />
-            <parameter name="x" />
-            <parameter name="y" />
-            <body>
-                <![CDATA[
-                self.canvas_id = canvas_id;
-                self.r = 20.0;
-                self.vel = {'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)};
-                self.pos = {'x': x, 'y': y};
-                self.smooth = 0.6; # value between 0 and 1
-
-                # TODO:
-                #circle = self.canvas.add_circle(x, y, self.r, {'fill':'#000'});
-                #ui.bind_event(circle, ui.EVENTS.MOUSE_PRESS, self.controller, 'mouse_press', self.inports["ball_ui"]);
-                #ui.bind_event(circle, ui.EVENTS.MOUSE_MOVE, self.controller, 'mouse_move', self.inports['ball_ui']);
-                #ui.bind_event(circle, ui.EVENTS.MOUSE_RELEASE, self.controller, 'mouse_release', self.inports['ball_ui']);
-                #self.element = circle;
-                ]]>
-            </body>
-        </constructor>
-        <destructor>
-            <body>
-                <![CDATA[
-                #self.canvas.remove_element(self.element);
-                pass
-                ]]>
-            </body>
-        </destructor>
-        <scxml initial="main_behaviour">
-            <state id="main_behaviour" initial="initializing">
-                <state id="initializing">
-                    <transition event="set_association_name" target="../creating_circle">
-                        <parameter name="association_name" type="str" />
-                        <script>
-                            self.association_name = association_name
-                        </script>
-                    </transition>
-                </state>
-                <state id="creating_circle">
-                    <onentry>
-                        <raise port="ui" event="create_circle">
-                            canvas_id, x, y, r, style, res_port
-                            <parameter expr="self.canvas_id"/><!-- canvas_id -->
-                            <parameter expr="self.pos['x']"/><!-- x -->
-                            <parameter expr="self.pos['y']"/><!-- y -->
-                            <parameter expr="self.r"/><!-- r -->
-                            <parameter expr="{'fill':'#000'}"/><!-- style -->
-                            <parameter expr="self.inports['ball_ui']"/><!-- inport for response -->
-                        </raise>
-                    </onentry>
-                    <transition event="circle_created" target="../bouncing">
-                        <parameter name="canvas_id"/>
-                        <parameter name="circle_id"/>
-                        <script>
-                            self.circle_id = circle_id
-                        </script>
-                        <raise port="ui" event="bind_canvas_event">
-                            <parameter expr="self.canvas_id"/>
-                            <parameter expr="circle_id"/>
-                            <parameter expr="ui.EVENTS.MOUSE_PRESS"/>
-                            <parameter expr="'mouse_press'"/>
-                            <parameter expr="self.inports['ball_ui']"/>
-                        </raise>
-                        <raise port="ui" event="bind_canvas_event">
-                            <parameter expr="self.canvas_id"/>
-                            <parameter expr="circle_id"/>
-                            <parameter expr="ui.EVENTS.MOUSE_MOVE"/>
-                            <parameter expr="'mouse_move'"/>
-                            <parameter expr="self.inports['ball_ui']"/>
-                        </raise>
-                        <raise port="ui" event="bind_canvas_event">
-                            <parameter expr="self.canvas_id"/>
-                            <parameter expr="circle_id"/>
-                            <parameter expr="ui.EVENTS.MOUSE_RELEASE"/>
-                            <parameter expr="'mouse_release'"/>
-                            <parameter expr="self.inports['ball_ui']"/>
-                        </raise>
-                    </transition>
-                </state>
-                <state id="bouncing">
-                    <!-- <transition after="(20 - self.getSimulatedTime() % 20) / 1000.0" target="."> -->
-                    <transition after="0.02" target=".">
-                        <script>
-                            <![CDATA[
-                            # Invert velocity when colliding with canvas border:
-                            if self.pos['x']-self.r <= 0 or self.pos['x']+self.r >= CANVAS_WIDTH:
-                                self.vel['x'] = -self.vel['x'];
-                            if self.pos['y']-self.r <= 0 or self.pos['y']+self.r >= CANVAS_HEIGHT:
-                                self.vel['y'] = -self.vel['y'];
-                            ]]>
-                        </script>
-                        <raise port="ui" event="move_element">
-                            <parameter expr="self.canvas_id"/>
-                            <parameter expr="self.circle_id"/>
-                            <parameter expr="self.vel['x']"/>
-                            <parameter expr="self.vel['y']"/>
-                        </raise>
-                        <script>
-                            self.pos['x'] += self.vel['x']
-                            self.pos['y'] += self.vel['y']
-                        </script>
-                    </transition>
-                    <transition port="ball_ui" event="mouse_press" target="../selected" cond="button == ui.MOUSE_BUTTONS.LEFT">
-                        <parameter name="x" />
-                        <parameter name="y" />
-                        <parameter name="button" />
-                        <raise port="ui" event="set_element_color">
-                            <parameter expr="self.canvas_id"/>
-                            <parameter expr="self.circle_id"/>
-                            <parameter expr="'#ff0'"/>
-                        </raise>
-                    </transition>
-                </state>
-                <state id="dragging">
-                    <transition port="ball_ui" event="mouse_move" target=".">
-                        <parameter name="x" />
-                        <parameter name="y" />
-                        <parameter name="button" />
-                        <script>
-                            <![CDATA[
-                            # Always keep ball within canvas:
-                            x = min(max(0+self.r, x), CANVAS_WIDTH-self.r)
-                            y = min(max(0+self.r, y), CANVAS_HEIGHT-self.r)
-
-                            dx = x - self.pos['x']
-                            dy = y - self.pos['y']
-
-                            self.vel = {
-                                'x': (1-self.smooth)*dx + self.smooth*self.vel['x'],
-                                'y': (1-self.smooth)*dy + self.smooth*self.vel['y']
-                            }
-
-                            self.pos = {'x': x, 'y': y}
-                            ]]>
-                        </script>
-                        <raise port="ui" event="set_element_pos">
-                            <parameter expr="self.canvas_id"/>
-                            <parameter expr="self.circle_id"/>
-                            <parameter expr="x-self.r"/>
-                            <parameter expr="y-self.r"/>
-                        </raise>
-                    </transition>
-                    <transition port="ball_ui" event="mouse_release" target="../bouncing">
-                        <parameter name="x" />
-                        <parameter name="y" />
-                        <raise port="ui" event="set_element_color">
-                            <parameter expr="self.canvas_id"/>
-                            <parameter expr="self.circle_id"/>
-                            <parameter expr="'#f00'"/>
-                        </raise>
-                    </transition>
-                </state>
-                <state id='selected'>
-                    <transition port="ball_ui" event="mouse_press" target="../dragging" cond="button == ui.MOUSE_BUTTONS.LEFT">
-                        <parameter name="x" />
-                        <parameter name="y" />
-                        <parameter name="button" />
-                        <script>
-                            <![CDATA[
-                            self.mouse_pos = {'x':x, 'y':y};
-                            ]]>
-                        </script>
-                    </transition>
-                    <transition event="delete_self" target='../../deleted'>                    
-                        <raise event="delete_ball" scope="narrow" target="'parent'">
-                            <parameter expr='self.association_name' />
-                        </raise>
-                        <raise port="ui" event="destroy_element">
-                            <parameter expr="self.canvas_id" />
-                            <parameter expr="self.element_id" />
-                        </raise>
-                    </transition>
-                </state>
-            </state>
-            <state id='deleted' />
-        </scxml>
-    </class>
-</diagram>

+ 0 - 28
examples/bouncingballs_fixtk/runner.py

@@ -1,28 +0,0 @@
-'''
-Created on 27-jul.-2014
-
-@author: Simon
-'''
-
-import tkinter as tk
-import bouncingballs
-from sccd.runtime.libs.ui_v2 import UI
-from sccd.runtime.tkinter_eventloop import TkEventLoop
-
-class OutputListener:
-	def __init__(self, ui):
-		self.ui = ui
-
-	def add(self, event):
-		if event.port == "ui":
-			method = getattr(self.ui, event.name)
-			method(*event.parameters)
-
-if __name__ == '__main__':
-	tkroot = tk.Tk()
-	tkroot.withdraw()
-	controller = bouncingballs.Controller(TkEventLoop(tkroot))
-	ui = UI(tkroot, controller)
-	controller.addMyOwnOutputListener(OutputListener(ui))
-	controller.start()
-	tkroot.mainloop()

+ 0 - 17
examples/bouncingballs_multiwindow/README.txt

@@ -1,17 +0,0 @@
-Bouncing balls example.
-
-Adopted from:
-  https://msdl.uantwerpen.be/git/simon/SCCD/src/master/examples/bouncingballs/python/sccd_multiwindow.xml
-
-To (re-)compile:
-  Dependencies:
-    Python 3
-    SCCD2DEVS must be in your PYTHONPATH environment variable.
-  Run:
-    python3 -m sccd.compiler.sccdc sccd_multiwindow.xml -p eventloop
-
-To run the example:
-  Dependencies:
-    Python 3 and TkInter
-  Run:
-    python3 runner_multiwindow.py

+ 0 - 19
examples/bouncingballs_multiwindow/runner_multiwindow.py

@@ -1,19 +0,0 @@
-'''
-Created on 27-jul.-2014
-
-@author: Simon
-'''
-
-import tkinter as tk
-import sccd_multiwindow as target
-from sccd.runtime.statecharts_core import Event
-from sccd.runtime.tkinter_eventloop import *
-from widget import Widget
-
-if __name__ == '__main__':
-    window = tk.Tk()
-    window.withdraw()
-    controller = target.Controller(window, TkEventLoop(window))
-    Widget.controller = controller
-    controller.start()
-    window.mainloop()

+ 0 - 671
examples/bouncingballs_multiwindow/sccd_multiwindow.py

@@ -1,671 +0,0 @@
-"""
-Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
-
-Model author: Simon Van Mierlo
-Model name:   Bouncing Balls - Tkinter Version 
-Model description:
-Tkinter frame with bouncing balls in it.
-"""
-
-from sccd.runtime.statecharts_core import *
-import random
-import tkinter as tk
-from widget import Widget
-
-# package "Bouncing Balls - Tkinter Version "
-
-class MainApp(RuntimeClassBase):
-    def __init__(self, controller, root):
-        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
-        MainApp.user_defined_constructor(self, root)
-    
-    def user_defined_constructor(self, root):
-        self.nr_of_windows = 0
-        self.root = root
-    
-    def user_defined_destructor(self):
-        pass
-    
-    
-    # builds Statechart structure
-    def build_statechart_structure(self):
-        
-        # state <root>
-        self.states[""] = State(0, "", self)
-        
-        # state /main
-        self.states["/main"] = ParallelState(1, "/main", self)
-        
-        # state /main/main_behaviour
-        self.states["/main/main_behaviour"] = State(2, "/main/main_behaviour", self)
-        
-        # state /main/main_behaviour/initializing
-        self.states["/main/main_behaviour/initializing"] = State(3, "/main/main_behaviour/initializing", self)
-        self.states["/main/main_behaviour/initializing"].setEnter(self._main_main_behaviour_initializing_enter)
-        
-        # state /main/main_behaviour/running
-        self.states["/main/main_behaviour/running"] = State(4, "/main/main_behaviour/running", self)
-        
-        # state /main/creating_behaviour
-        self.states["/main/creating_behaviour"] = State(5, "/main/creating_behaviour", self)
-        
-        # state /main/creating_behaviour/waiting
-        self.states["/main/creating_behaviour/waiting"] = State(6, "/main/creating_behaviour/waiting", self)
-        
-        # state /main/creating_behaviour/creating
-        self.states["/main/creating_behaviour/creating"] = State(7, "/main/creating_behaviour/creating", self)
-        
-        # state /main/deleting_behaviour
-        self.states["/main/deleting_behaviour"] = State(8, "/main/deleting_behaviour", self)
-        
-        # state /main/deleting_behaviour/waiting
-        self.states["/main/deleting_behaviour/waiting"] = State(9, "/main/deleting_behaviour/waiting", self)
-        
-        # state /main/deleting_behaviour/deleting
-        self.states["/main/deleting_behaviour/deleting"] = State(10, "/main/deleting_behaviour/deleting", self)
-        
-        # state /stopped
-        self.states["/stopped"] = State(11, "/stopped", self)
-        self.states["/stopped"].setEnter(self._stopped_enter)
-        
-        # add children
-        self.states[""].addChild(self.states["/main"])
-        self.states[""].addChild(self.states["/stopped"])
-        self.states["/main"].addChild(self.states["/main/main_behaviour"])
-        self.states["/main"].addChild(self.states["/main/creating_behaviour"])
-        self.states["/main"].addChild(self.states["/main/deleting_behaviour"])
-        self.states["/main/main_behaviour"].addChild(self.states["/main/main_behaviour/initializing"])
-        self.states["/main/main_behaviour"].addChild(self.states["/main/main_behaviour/running"])
-        self.states["/main/creating_behaviour"].addChild(self.states["/main/creating_behaviour/waiting"])
-        self.states["/main/creating_behaviour"].addChild(self.states["/main/creating_behaviour/creating"])
-        self.states["/main/deleting_behaviour"].addChild(self.states["/main/deleting_behaviour/waiting"])
-        self.states["/main/deleting_behaviour"].addChild(self.states["/main/deleting_behaviour/deleting"])
-        self.states[""].fixTree()
-        self.states[""].default_state = self.states["/main"]
-        self.states["/main/main_behaviour"].default_state = self.states["/main/main_behaviour/initializing"]
-        self.states["/main/creating_behaviour"].default_state = self.states["/main/creating_behaviour/waiting"]
-        self.states["/main/deleting_behaviour"].default_state = self.states["/main/deleting_behaviour/waiting"]
-        
-        # transition /main/main_behaviour/initializing
-        _main_main_behaviour_initializing_0 = Transition(self, self.states["/main/main_behaviour/initializing"], [self.states["/main/main_behaviour/running"]])
-        _main_main_behaviour_initializing_0.setTrigger(None)
-        self.states["/main/main_behaviour/initializing"].addTransition(_main_main_behaviour_initializing_0)
-        
-        # transition /main/main_behaviour/running
-        _main_main_behaviour_running_0 = Transition(self, self.states["/main/main_behaviour/running"], [self.states["/main/main_behaviour/running"]])
-        _main_main_behaviour_running_0.setAction(self._main_main_behaviour_running_0_exec)
-        _main_main_behaviour_running_0.setTrigger(Event("window_created", None))
-        self.states["/main/main_behaviour/running"].addTransition(_main_main_behaviour_running_0)
-        _main_main_behaviour_running_1 = Transition(self, self.states["/main/main_behaviour/running"], [self.states["/main/main_behaviour/running"]])
-        _main_main_behaviour_running_1.setAction(self._main_main_behaviour_running_1_exec)
-        _main_main_behaviour_running_1.setTrigger(Event("window_deleted", None))
-        _main_main_behaviour_running_1.setGuard(self._main_main_behaviour_running_1_guard)
-        self.states["/main/main_behaviour/running"].addTransition(_main_main_behaviour_running_1)
-        _main_main_behaviour_running_2 = Transition(self, self.states["/main/main_behaviour/running"], [self.states["/main/main_behaviour/running"]])
-        _main_main_behaviour_running_2.setAction(self._main_main_behaviour_running_2_exec)
-        _main_main_behaviour_running_2.setTrigger(Event("window_deleted", None))
-        _main_main_behaviour_running_2.setGuard(self._main_main_behaviour_running_2_guard)
-        self.states["/main/main_behaviour/running"].addTransition(_main_main_behaviour_running_2)
-        
-        # transition /main/creating_behaviour/waiting
-        _main_creating_behaviour_waiting_0 = Transition(self, self.states["/main/creating_behaviour/waiting"], [self.states["/main/creating_behaviour/creating"]])
-        _main_creating_behaviour_waiting_0.setAction(self._main_creating_behaviour_waiting_0_exec)
-        _main_creating_behaviour_waiting_0.setTrigger(Event("create_window", None))
-        self.states["/main/creating_behaviour/waiting"].addTransition(_main_creating_behaviour_waiting_0)
-        
-        # transition /main/creating_behaviour/creating
-        _main_creating_behaviour_creating_0 = Transition(self, self.states["/main/creating_behaviour/creating"], [self.states["/main/creating_behaviour/waiting"]])
-        _main_creating_behaviour_creating_0.setAction(self._main_creating_behaviour_creating_0_exec)
-        _main_creating_behaviour_creating_0.setTrigger(Event("instance_created", None))
-        self.states["/main/creating_behaviour/creating"].addTransition(_main_creating_behaviour_creating_0)
-        
-        # transition /main/deleting_behaviour/waiting
-        _main_deleting_behaviour_waiting_0 = Transition(self, self.states["/main/deleting_behaviour/waiting"], [self.states["/main/deleting_behaviour/deleting"]])
-        _main_deleting_behaviour_waiting_0.setAction(self._main_deleting_behaviour_waiting_0_exec)
-        _main_deleting_behaviour_waiting_0.setTrigger(Event("delete_window", None))
-        self.states["/main/deleting_behaviour/waiting"].addTransition(_main_deleting_behaviour_waiting_0)
-        
-        # transition /main/deleting_behaviour/deleting
-        _main_deleting_behaviour_deleting_0 = Transition(self, self.states["/main/deleting_behaviour/deleting"], [self.states["/main/deleting_behaviour/waiting"]])
-        _main_deleting_behaviour_deleting_0.setAction(self._main_deleting_behaviour_deleting_0_exec)
-        _main_deleting_behaviour_deleting_0.setTrigger(Event("instance_deleted", None))
-        self.states["/main/deleting_behaviour/deleting"].addTransition(_main_deleting_behaviour_deleting_0)
-        
-        # transition /main
-        _main_0 = Transition(self, self.states["/main"], [self.states["/stopped"]])
-        _main_0.setTrigger(Event("stop", None))
-        self.states["/main"].addTransition(_main_0)
-    
-    def _main_main_behaviour_initializing_enter(self):
-        self.raiseInternalEvent(Event("create_window", None, []))
-    
-    def _stopped_enter(self):
-        self.root.quit()
-    
-    def _main_main_behaviour_running_0_exec(self, parameters):
-        self.nr_of_windows += 1
-    
-    def _main_main_behaviour_running_1_exec(self, parameters):
-        self.nr_of_windows -= 1
-    
-    def _main_main_behaviour_running_1_guard(self, parameters):
-        return self.nr_of_windows > 1
-    
-    def _main_main_behaviour_running_2_exec(self, parameters):
-        self.raiseInternalEvent(Event("stop", None, []))
-    
-    def _main_main_behaviour_running_2_guard(self, parameters):
-        return self.nr_of_windows == 1
-    
-    def _main_creating_behaviour_waiting_0_exec(self, parameters):
-        self.big_step.outputEventOM(Event("create_instance", None, [self, 'windows']))
-    
-    def _main_creating_behaviour_creating_0_exec(self, parameters):
-        association_name = parameters[0]
-        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
-        self.raiseInternalEvent(Event("window_created", None, []))
-    
-    def _main_deleting_behaviour_waiting_0_exec(self, parameters):
-        association_name = parameters[0]
-        self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
-    
-    def _main_deleting_behaviour_deleting_0_exec(self, parameters):
-        self.raiseInternalEvent(Event("window_deleted", None, []))
-    
-    def initializeStatechart(self):
-        # enter default state
-        self.default_targets = self.states["/main"].getEffectiveTargetStates()
-        RuntimeClassBase.initializeStatechart(self)
-
-class Window(RuntimeClassBase, tk.Toplevel, Widget):
-    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
-        Window.user_defined_constructor(self)
-    
-    def user_defined_constructor(self):
-        tk.Toplevel.__init__(self)
-        Widget.__init__(self, True)
-        self.title('BouncingBalls')
-        
-        CANVAS_SIZE_TUPLE = (0, 0, self.winfo_screenwidth() * 2, self.winfo_screenheight() * 2)
-        self.c = tk.Canvas(self, relief=tk.RIDGE, scrollregion=CANVAS_SIZE_TUPLE)
-        
-        self.set_bindable_and_tagorid(self.c)
-    
-    def user_defined_destructor(self):
-        self.destroy()
-        # call super class destructors
-        if hasattr(tk.Toplevel, "__del__"):
-            tk.Toplevel.__del__(self)
-        if hasattr(Widget, "__del__"):
-            Widget.__del__(self)
-    
-    
-    # builds Statechart structure
-    def build_statechart_structure(self):
-        
-        # state <root>
-        self.states[""] = State(0, "", self)
-        
-        # state /main
-        self.states["/main"] = ParallelState(1, "/main", self)
-        
-        # state /main/main_behaviour
-        self.states["/main/main_behaviour"] = State(2, "/main/main_behaviour", self)
-        
-        # state /main/main_behaviour/initializing
-        self.states["/main/main_behaviour/initializing"] = State(3, "/main/main_behaviour/initializing", self)
-        
-        # state /main/main_behaviour/creating_button
-        self.states["/main/main_behaviour/creating_button"] = State(4, "/main/main_behaviour/creating_button", self)
-        
-        # state /main/main_behaviour/packing_button
-        self.states["/main/main_behaviour/packing_button"] = State(5, "/main/main_behaviour/packing_button", self)
-        
-        # state /main/main_behaviour/running
-        self.states["/main/main_behaviour/running"] = State(6, "/main/main_behaviour/running", self)
-        
-        # state /main/main_behaviour/creating_ball
-        self.states["/main/main_behaviour/creating_ball"] = State(7, "/main/main_behaviour/creating_ball", self)
-        
-        # state /stopped
-        self.states["/stopped"] = State(8, "/stopped", self)
-        self.states["/stopped"].setEnter(self._stopped_enter)
-        
-        # add children
-        self.states[""].addChild(self.states["/main"])
-        self.states[""].addChild(self.states["/stopped"])
-        self.states["/main"].addChild(self.states["/main/main_behaviour"])
-        self.states["/main/main_behaviour"].addChild(self.states["/main/main_behaviour/initializing"])
-        self.states["/main/main_behaviour"].addChild(self.states["/main/main_behaviour/creating_button"])
-        self.states["/main/main_behaviour"].addChild(self.states["/main/main_behaviour/packing_button"])
-        self.states["/main/main_behaviour"].addChild(self.states["/main/main_behaviour/running"])
-        self.states["/main/main_behaviour"].addChild(self.states["/main/main_behaviour/creating_ball"])
-        self.states[""].fixTree()
-        self.states[""].default_state = self.states["/main"]
-        self.states["/main/main_behaviour"].default_state = self.states["/main/main_behaviour/initializing"]
-        
-        # transition /main/main_behaviour/initializing
-        _main_main_behaviour_initializing_0 = Transition(self, self.states["/main/main_behaviour/initializing"], [self.states["/main/main_behaviour/creating_button"]])
-        _main_main_behaviour_initializing_0.setAction(self._main_main_behaviour_initializing_0_exec)
-        _main_main_behaviour_initializing_0.setTrigger(Event("set_association_name", None))
-        self.states["/main/main_behaviour/initializing"].addTransition(_main_main_behaviour_initializing_0)
-        
-        # transition /main/main_behaviour/creating_button
-        _main_main_behaviour_creating_button_0 = Transition(self, self.states["/main/main_behaviour/creating_button"], [self.states["/main/main_behaviour/packing_button"]])
-        _main_main_behaviour_creating_button_0.setAction(self._main_main_behaviour_creating_button_0_exec)
-        _main_main_behaviour_creating_button_0.setTrigger(Event("instance_created", None))
-        self.states["/main/main_behaviour/creating_button"].addTransition(_main_main_behaviour_creating_button_0)
-        
-        # transition /main/main_behaviour/packing_button
-        _main_main_behaviour_packing_button_0 = Transition(self, self.states["/main/main_behaviour/packing_button"], [self.states["/main/main_behaviour/running"]])
-        _main_main_behaviour_packing_button_0.setAction(self._main_main_behaviour_packing_button_0_exec)
-        _main_main_behaviour_packing_button_0.setTrigger(Event("button_created", None))
-        self.states["/main/main_behaviour/packing_button"].addTransition(_main_main_behaviour_packing_button_0)
-        
-        # transition /main/main_behaviour/running
-        _main_main_behaviour_running_0 = Transition(self, self.states["/main/main_behaviour/running"], [self.states["/main/main_behaviour/running"]])
-        _main_main_behaviour_running_0.setAction(self._main_main_behaviour_running_0_exec)
-        _main_main_behaviour_running_0.setTrigger(Event("window-close", self.getInPortName("input")))
-        _main_main_behaviour_running_0.setGuard(self._main_main_behaviour_running_0_guard)
-        self.states["/main/main_behaviour/running"].addTransition(_main_main_behaviour_running_0)
-        _main_main_behaviour_running_1 = Transition(self, self.states["/main/main_behaviour/running"], [self.states["/main/main_behaviour/running"]])
-        _main_main_behaviour_running_1.setAction(self._main_main_behaviour_running_1_exec)
-        _main_main_behaviour_running_1.setTrigger(Event("button_pressed", None))
-        _main_main_behaviour_running_1.setGuard(self._main_main_behaviour_running_1_guard)
-        self.states["/main/main_behaviour/running"].addTransition(_main_main_behaviour_running_1)
-        _main_main_behaviour_running_2 = Transition(self, self.states["/main/main_behaviour/running"], [self.states["/main/main_behaviour/creating_ball"]])
-        _main_main_behaviour_running_2.setAction(self._main_main_behaviour_running_2_exec)
-        _main_main_behaviour_running_2.setTrigger(Event("right-click", self.getInPortName("input")))
-        _main_main_behaviour_running_2.setGuard(self._main_main_behaviour_running_2_guard)
-        self.states["/main/main_behaviour/running"].addTransition(_main_main_behaviour_running_2)
-        _main_main_behaviour_running_3 = Transition(self, self.states["/main/main_behaviour/running"], [self.states["/main/main_behaviour/running"]])
-        _main_main_behaviour_running_3.setAction(self._main_main_behaviour_running_3_exec)
-        _main_main_behaviour_running_3.setTrigger(Event("delete_ball", None))
-        self.states["/main/main_behaviour/running"].addTransition(_main_main_behaviour_running_3)
-        
-        # transition /main/main_behaviour/creating_ball
-        _main_main_behaviour_creating_ball_0 = Transition(self, self.states["/main/main_behaviour/creating_ball"], [self.states["/main/main_behaviour/running"]])
-        _main_main_behaviour_creating_ball_0.setAction(self._main_main_behaviour_creating_ball_0_exec)
-        _main_main_behaviour_creating_ball_0.setTrigger(Event("instance_created", None))
-        self.states["/main/main_behaviour/creating_ball"].addTransition(_main_main_behaviour_creating_ball_0)
-        
-        # transition /main
-        _main_0 = Transition(self, self.states["/main"], [self.states["/stopped"]])
-        _main_0.setAction(self._main_0_exec)
-        _main_0.setTrigger(Event("stop", None))
-        self.states["/main"].addTransition(_main_0)
-    
-    def _stopped_enter(self):
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("delete_window", None, [self.association_name])]))
-    
-    def _main_0_exec(self, parameters):
-        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'buttons']))
-        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'balls']))
-    
-    def _main_main_behaviour_initializing_0_exec(self, parameters):
-        association_name = parameters[0]
-        self.association_name = association_name
-        self.big_step.outputEventOM(Event("create_instance", None, [self, 'buttons', 'Button', self, 'create_window', 'Create Window']))
-    
-    def _main_main_behaviour_creating_button_0_exec(self, parameters):
-        association_name = parameters[0]
-        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
-    
-    def _main_main_behaviour_packing_button_0_exec(self, parameters):
-        button = parameters[0]
-        button.pack(expand=False, fill=tk.X, side=tk.TOP)
-        self.c.focus_force()
-        self.c.pack(expand=True, fill=tk.BOTH)
-    
-    def _main_main_behaviour_running_0_exec(self, parameters):
-        tagorid = parameters[0]
-        self.raiseInternalEvent(Event("stop", None, []))
-    
-    def _main_main_behaviour_running_0_guard(self, parameters):
-        tagorid = parameters[0]
-        return tagorid == id(self)
-    
-    def _main_main_behaviour_running_1_exec(self, parameters):
-        event_name = parameters[0]
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("create_window", None, [])]))
-    
-    def _main_main_behaviour_running_1_guard(self, parameters):
-        event_name = parameters[0]
-        return event_name == 'create_window'
-    
-    def _main_main_behaviour_running_2_exec(self, parameters):
-        tagorid = parameters[0]
-        self.big_step.outputEventOM(Event("create_instance", None, [self, "balls", "Ball", self.c, self.last_x, self.last_y]))
-    
-    def _main_main_behaviour_running_2_guard(self, parameters):
-        tagorid = parameters[0]
-        return tagorid == id(self)
-    
-    def _main_main_behaviour_running_3_exec(self, parameters):
-        association_name = parameters[0]
-        self.big_step.outputEventOM(Event("delete_instance", None, [self, association_name]))
-    
-    def _main_main_behaviour_creating_ball_0_exec(self, parameters):
-        association_name = parameters[0]
-        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, association_name, Event("set_association_name", None, [association_name])]))
-    
-    def initializeStatechart(self):
-        # enter default state
-        self.default_targets = self.states["/main"].getEffectiveTargetStates()
-        RuntimeClassBase.initializeStatechart(self)
-
-class Button(RuntimeClassBase, tk.Button, Widget):
-    def __init__(self, controller, parent, event_name, button_text):
-        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, parent, event_name, button_text)
-    
-    def user_defined_constructor(self, parent, event_name, button_text):
-        tk.Button.__init__(self, parent, **{'text': button_text})
-        Widget.__init__(self)
-        self.event_name = event_name
-    
-    def user_defined_destructor(self):
-        self.destroy()
-        # call super class destructors
-        if hasattr(tk.Button, "__del__"):
-            tk.Button.__del__(self)
-        if hasattr(Widget, "__del__"):
-            Widget.__del__(self)
-    
-    
-    # builds Statechart structure
-    def build_statechart_structure(self):
-        
-        # state <root>
-        self.states[""] = State(0, "", self)
-        
-        # state /initializing
-        self.states["/initializing"] = State(1, "/initializing", self)
-        self.states["/initializing"].setEnter(self._initializing_enter)
-        
-        # state /running
-        self.states["/running"] = State(2, "/running", self)
-        
-        # add children
-        self.states[""].addChild(self.states["/initializing"])
-        self.states[""].addChild(self.states["/running"])
-        self.states[""].fixTree()
-        self.states[""].default_state = self.states["/initializing"]
-        
-        # transition /initializing
-        _initializing_0 = Transition(self, self.states["/initializing"], [self.states["/running"]])
-        _initializing_0.setTrigger(None)
-        self.states["/initializing"].addTransition(_initializing_0)
-        
-        # transition /running
-        _running_0 = Transition(self, self.states["/running"], [self.states["/running"]])
-        _running_0.setAction(self._running_0_exec)
-        _running_0.setTrigger(Event("left-click", self.getInPortName("input")))
-        _running_0.setGuard(self._running_0_guard)
-        self.states["/running"].addTransition(_running_0)
-    
-    def _initializing_enter(self):
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("button_created", None, [self])]))
-    
-    def _running_0_exec(self, parameters):
-        tagorid = parameters[0]
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("button_pressed", None, [self.event_name])]))
-    
-    def _running_0_guard(self, parameters):
-        tagorid = parameters[0]
-        return tagorid == id(self)
-    
-    def initializeStatechart(self):
-        # enter default state
-        self.default_targets = self.states["/initializing"].getEffectiveTargetStates()
-        RuntimeClassBase.initializeStatechart(self)
-
-class Ball(RuntimeClassBase, Widget):
-    def __init__(self, controller, canvas, x, y):
-        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()
-        
-        # user defined attributes
-        self.canvas = None
-        
-        # call user defined constructor
-        Ball.user_defined_constructor(self, canvas, x, y)
-    
-    def user_defined_constructor(self, canvas, x, y):
-        Widget.__init__(self, True)
-        self.canvas = canvas
-        self.r = 20.0;
-        self.vel = {'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)};
-        self.smooth = 0.4 # value between 0 and 1
-        self.id = self.canvas.create_oval(x, y, x + (self.r * 2), y + (self.r * 2), fill="black")
-        self.set_bindable_and_tagorid(self.canvas, self.id)
-    
-    def user_defined_destructor(self):
-        self.canvas.delete(self.id)
-        # call super class destructors
-        if hasattr(Widget, "__del__"):
-            Widget.__del__(self)
-    
-    
-    # builds Statechart structure
-    def build_statechart_structure(self):
-        
-        # state <root>
-        self.states[""] = State(0, "", self)
-        
-        # state /initializing
-        self.states["/initializing"] = State(1, "/initializing", self)
-        
-        # state /bouncing
-        self.states["/bouncing"] = State(2, "/bouncing", self)
-        self.states["/bouncing"].setEnter(self._bouncing_enter)
-        self.states["/bouncing"].setExit(self._bouncing_exit)
-        
-        # state /dragging
-        self.states["/dragging"] = State(3, "/dragging", self)
-        
-        # state /selected
-        self.states["/selected"] = State(4, "/selected", self)
-        
-        # state /deleted
-        self.states["/deleted"] = State(5, "/deleted", self)
-        
-        # add children
-        self.states[""].addChild(self.states["/initializing"])
-        self.states[""].addChild(self.states["/bouncing"])
-        self.states[""].addChild(self.states["/dragging"])
-        self.states[""].addChild(self.states["/selected"])
-        self.states[""].addChild(self.states["/deleted"])
-        self.states[""].fixTree()
-        self.states[""].default_state = self.states["/initializing"]
-        
-        # transition /initializing
-        _initializing_0 = Transition(self, self.states["/initializing"], [self.states["/bouncing"]])
-        _initializing_0.setAction(self._initializing_0_exec)
-        _initializing_0.setTrigger(Event("set_association_name", None))
-        self.states["/initializing"].addTransition(_initializing_0)
-        
-        # transition /bouncing
-        _bouncing_0 = Transition(self, self.states["/bouncing"], [self.states["/bouncing"]])
-        _bouncing_0.setAction(self._bouncing_0_exec)
-        _bouncing_0.setTrigger(Event("_0after"))
-        self.states["/bouncing"].addTransition(_bouncing_0)
-        _bouncing_1 = Transition(self, self.states["/bouncing"], [self.states["/selected"]])
-        _bouncing_1.setAction(self._bouncing_1_exec)
-        _bouncing_1.setTrigger(Event("left-click", self.getInPortName("input")))
-        _bouncing_1.setGuard(self._bouncing_1_guard)
-        self.states["/bouncing"].addTransition(_bouncing_1)
-        
-        # transition /dragging
-        _dragging_0 = Transition(self, self.states["/dragging"], [self.states["/dragging"]])
-        _dragging_0.setAction(self._dragging_0_exec)
-        _dragging_0.setTrigger(Event("motion", self.getInPortName("input")))
-        self.states["/dragging"].addTransition(_dragging_0)
-        _dragging_1 = Transition(self, self.states["/dragging"], [self.states["/bouncing"]])
-        _dragging_1.setAction(self._dragging_1_exec)
-        _dragging_1.setTrigger(Event("left-release", self.getInPortName("input")))
-        self.states["/dragging"].addTransition(_dragging_1)
-        
-        # transition /selected
-        _selected_0 = Transition(self, self.states["/selected"], [self.states["/dragging"]])
-        _selected_0.setTrigger(Event("left-click", self.getInPortName("input")))
-        _selected_0.setGuard(self._selected_0_guard)
-        self.states["/selected"].addTransition(_selected_0)
-        _selected_1 = Transition(self, self.states["/selected"], [self.states["/deleted"]])
-        _selected_1.setAction(self._selected_1_exec)
-        _selected_1.setTrigger(Event("delete", self.getInPortName("input")))
-        self.states["/selected"].addTransition(_selected_1)
-    
-    def _bouncing_enter(self):
-        self.addTimer(0, (20 - self.getSimulatedTime() % 20) / 1000.0)
-    
-    def _bouncing_exit(self):
-        self.removeTimer(0)
-    
-    def _initializing_0_exec(self, parameters):
-        association_name = parameters[0]
-        self.association_name = association_name
-    
-    def _bouncing_0_exec(self, parameters):
-        pos = self.canvas.coords(self.id)
-        x = self.canvas.canvasx(pos[0])
-        y = self.canvas.canvasy(pos[1])
-        if x <= 0 or x + (self.r * 2) >= self.canvas.canvasx(self.canvas.winfo_width()):
-            self.vel['x'] = -self.vel['x']
-        if y <= 0 or y + (self.r * 2) >= self.canvas.canvasy(self.canvas.winfo_height()):
-            self.vel['y'] = -self.vel['y']
-        self.canvas.move(self.id, self.vel['x'], self.vel['y']);
-    
-    def _bouncing_1_exec(self, parameters):
-        tagorid = parameters[0]
-        self.canvas.itemconfig(self.id, fill="yellow")
-    
-    def _bouncing_1_guard(self, parameters):
-        tagorid = parameters[0]
-        return tagorid == id(self)
-    
-    def _dragging_0_exec(self, parameters):
-        tagorid = parameters[0]
-        coords = self.canvas.coords(self.id)
-        dx = self.canvas.canvasx(self.last_x) - self.canvas.canvasx(coords[0])
-        dy = self.canvas.canvasx(self.last_y) - self.canvas.canvasy(coords[1])
-        
-        self.canvas.move(self.id, dx, dy);
-        
-        # keep ball within boundaries
-        coords = self.canvas.coords(self.id)
-        x = self.canvas.canvasx(coords[0])
-        y = self.canvas.canvasy(coords[1])
-        if x - self.r <= 0:
-            x = 1;
-        elif x + self.r >= self.canvas.winfo_width():
-            x = self.canvas.winfo_width() - (2 * self.r) - 1
-        if y - self.r <= 0:
-            y = 1
-        elif y + self.r >= self.canvas.winfo_height():
-            y = self.canvas.winfo_height() - (2 * self.r) - 1;
-        self.canvas.coords(self.id, x, y, x + (self.r * 2), y + (self.r * 2));
-        self.vel = {
-            'x': (1 - self.smooth) * dx + self.smooth * self.vel['x'],
-            'y': (1 - self.smooth) * dy + self.smooth * self.vel['y']
-        }
-    
-    def _dragging_1_exec(self, parameters):
-        tagorid = parameters[0]
-        self.canvas.itemconfig(self.id, fill="red")
-    
-    def _selected_0_guard(self, parameters):
-        tagorid = parameters[0]
-        return tagorid == id(self)
-    
-    def _selected_1_exec(self, parameters):
-        tagorid = parameters[0]
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("delete_ball", None, [self.association_name])]))
-    
-    def initializeStatechart(self):
-        # enter default state
-        self.default_targets = self.states["/initializing"].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 == "MainApp":
-            instance = MainApp(self.controller, construct_params[0])
-            instance.associations = {}
-            instance.associations["windows"] = Association("Window", 0, -1)
-        elif class_name == "Window":
-            instance = Window(self.controller)
-            instance.associations = {}
-            instance.associations["parent"] = Association("MainApp", 1, 1)
-            instance.associations["buttons"] = Association("Button", 0, -1)
-            instance.associations["balls"] = Association("Ball", 0, -1)
-        elif class_name == "Button":
-            instance = Button(self.controller, construct_params[0], construct_params[1], construct_params[2])
-            instance.associations = {}
-            instance.associations["parent"] = Association("Field", 1, 1)
-        elif class_name == "Ball":
-            instance = Ball(self.controller, construct_params[0], construct_params[1], construct_params[2])
-            instance.associations = {}
-            instance.associations["parent"] = Association("Window", 1, 1)
-        else:
-            raise Exception("Cannot instantiate class " + class_name)
-        return instance
-
-class Controller(EventLoopControllerBase):
-    def __init__(self, root, 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.object_manager.createInstance("MainApp", [root])

+ 0 - 369
examples/bouncingballs_multiwindow/sccd_multiwindow.xml

@@ -1,369 +0,0 @@
-<?xml version="1.0" ?>
-<diagram author="Simon Van Mierlo" name="Bouncing Balls - Tkinter Version ">
-    <description>
-        Tkinter frame with bouncing balls in it.
-    </description>
-    <top>
-        import random
-        import tkinter as tk
-        from widget import Widget
-    </top>
-    <inport name="input"/>
-    <class name="MainApp" default="true">
-        <relationships>
-            <association name="windows" class="Window" />
-        </relationships>
-        <constructor>
-            <parameter name="root"/>
-            <body>
-                self.nr_of_windows = 0
-                self.root = root
-            </body>
-        </constructor>
-        <scxml initial="main">
-            <parallel id="main">
-                <state id="main_behaviour" initial="initializing">
-                    <state id="initializing">
-                        <onentry>
-                            <raise event="create_window" scope="local" />
-                        </onentry>
-                        <transition target="../running" />
-                    </state>
-                    <state id="running">
-                        <transition event="window_created" target=".">
-                            <script>
-                                self.nr_of_windows += 1
-                            </script>
-                        </transition>
-                        <transition event="window_deleted" target="." cond="self.nr_of_windows > 1">
-                            <script>
-                                self.nr_of_windows -= 1
-                            </script>
-                        </transition>
-                        <transition event="window_deleted" target="." cond="self.nr_of_windows == 1">
-                            <raise event="stop" scope="local" />
-                        </transition>
-                    </state>
-                </state>
-                <state id="creating_behaviour" initial="waiting">
-                    <state id="waiting">
-                        <transition event="create_window" target="../creating">
-                            <raise event="create_instance" scope="cd">
-                                <parameter expr="'windows'" />
-                                <paremeter expr="'Window'" />
-                            </raise>
-                        </transition>
-                    </state>
-                    <state id="creating">
-                        <transition event="instance_created" target="../waiting">
-                            <parameter name="association_name" />
-                            <raise event="start_instance" scope="cd">
-                                <parameter expr="association_name" />
-                            </raise>
-                            <raise event="set_association_name" scope="narrow" target="association_name">
-                                <parameter expr="association_name" />
-                            </raise>
-                            <raise event="window_created" scope="local" />
-                        </transition>
-                    </state>
-                </state>
-                <state id="deleting_behaviour" initial="waiting">
-                    <state id="waiting">
-                        <transition event="delete_window" target="../deleting">
-                            <parameter name="association_name" />
-                            <raise event="delete_instance" scope="cd">
-                                <parameter expr="association_name" />
-                            </raise>
-                        </transition>
-                    </state>
-                    <state id="deleting">
-                        <transition event="instance_deleted" target="../waiting">
-                            <raise event="window_deleted" scope="local" />
-                        </transition>
-                    </state>
-                </state>
-                <transition event="stop" target="../stopped" />
-            </parallel>
-            <state id="stopped">
-                <onentry>
-                    <script>
-                        self.root.quit()
-                    </script>
-                </onentry>
-            </state>
-        </scxml>
-    </class>
-    <class name="Window">
-        <relationships>
-            <association name="parent" class="MainApp" min="1" max="1" />
-            <association name="buttons" class="Button" />
-            <association name="balls" class="Ball" />
-            <inheritance class="tk.Toplevel" priority="1" />
-            <inheritance class="Widget" priority="0" />
-        </relationships>
-        <constructor>
-            <super class="tk.Toplevel" />
-            <super class="Widget">
-                <parameter expr="True" />
-            </super>
-            <body>
-                <![CDATA[
-                self.title('BouncingBalls')
-                
-                CANVAS_SIZE_TUPLE = (0, 0, self.winfo_screenwidth() * 2, self.winfo_screenheight() * 2)
-                self.c = tk.Canvas(self, relief=tk.RIDGE, scrollregion=CANVAS_SIZE_TUPLE)
-                
-                self.set_bindable_and_tagorid(self.c)
-                ]]>
-            </body>
-        </constructor>
-        <destructor>
-            <body>
-                self.destroy()
-            </body>
-        </destructor>
-        <scxml initial="main">
-            <parallel id="main">
-                <state id="main_behaviour" initial="initializing">
-                    <state id="initializing">
-                        <transition event="set_association_name" target="../creating_button">
-                            <parameter name="association_name" />
-                            <script>
-                                self.association_name = association_name
-                            </script>
-                            <raise scope="cd" event="create_instance">
-                                <parameter expr="'buttons'" />
-                                <parameter expr="'Button'" />
-                                <parameter expr="self" />
-                                <parameter expr="'create_window'" />
-                                <parameter expr="'Create Window'" />
-                            </raise>
-                        </transition>
-                    </state>
-                    <state id="creating_button">
-                        <transition event="instance_created" target="../packing_button">
-                            <parameter name="association_name" type="string"/>
-                            <raise scope="cd" event="start_instance">
-                                <parameter expr="association_name" />
-                            </raise>
-                        </transition>
-                    </state>
-                    <state id="packing_button">
-                        <transition event="button_created" target="../running">
-                            <parameter name="button" type="Button"/>
-                            <script>
-                                button.pack(expand=False, fill=tk.X, side=tk.TOP)
-                                self.c.focus_force()
-                                self.c.pack(expand=True, fill=tk.BOTH)
-                            </script>
-                        </transition>
-                    </state>
-                    <state id="running">
-                        <transition event="window-close" port="input" target="." cond="tagorid == id(self)">
-                            <parameter name="tagorid" type="int" default="None" />
-                            <raise event="stop" scope="local" />
-                        </transition>
-                        <transition event="button_pressed" target="." cond="event_name == 'create_window'">
-                            <parameter name="event_name" type="string" />
-                            <raise event="create_window" scope="narrow" target="'parent'" />
-                        </transition>
-                        <transition event="right-click" port="input" target="../creating_ball" cond="tagorid == id(self)">
-                            <parameter name="tagorid" type="int" default="None" />
-                            <raise scope="cd" event="create_instance">
-                                <parameter expr='"balls"' />
-                                <parameter expr='"Ball"' />
-                                <parameter expr="self.c" />
-                                <parameter expr="self.last_x" />
-                                <parameter expr="self.last_y" />
-                            </raise>
-                        </transition>
-                        <transition event="delete_ball" target=".">
-                            <parameter name="association_name" type="string" />
-                            <raise event="delete_instance" scope="cd">
-                                <parameter expr="association_name" />
-                            </raise>
-                        </transition>
-                    </state>
-                    <state id="creating_ball">
-                        <transition event="instance_created" target="../running">
-                            <parameter name="association_name" type="string"/>
-                            <raise event="start_instance" scope="cd">
-                                <parameter expr="association_name" />
-                            </raise>
-                            <raise event="set_association_name" scope="narrow" target="association_name">
-                                <parameter expr="association_name" />
-                            </raise>
-                        </transition>
-                    </state>
-                </state>
-                <transition event="stop" target="../stopped">
-                    <raise event="delete_instance" scope="cd">
-                        <parameter expr="'buttons'" />
-                    </raise>
-                    <raise event="delete_instance" scope="cd">
-                        <parameter expr="'balls'" />
-                    </raise>
-                </transition>
-            </parallel>
-            <state id="stopped">
-                <onentry>
-                    <raise event="delete_window" scope="narrow" target="'parent'">
-                        <parameter expr="self.association_name" />
-                    </raise>
-                </onentry>
-            </state>
-        </scxml>
-    </class>
-    <class name="Button">
-        <relationships>
-            <association name="parent" class="Field" min="1" max="1" />
-            <inheritance class="tk.Button" priority="1" />
-            <inheritance class="Widget" priority="0" />
-        </relationships>
-        <constructor>
-            <parameter name="parent" type="Field" />
-            <parameter name="event_name" type="str" />
-            <parameter name="button_text" type="str" />
-            <super class="tk.Button">
-                <parameter expr="parent" />
-                <parameter expr="**{'text': button_text}" />
-            </super>
-            <body>
-                self.event_name = event_name
-            </body>
-        </constructor>
-        <destructor>
-            <body>
-                self.destroy()
-            </body>
-        </destructor>
-        <scxml initial="initializing">
-            <state id="initializing">
-                <onentry>                
-                    <raise event="button_created" scope="narrow" target="'parent'">
-                        <parameter expr="self" />
-                    </raise>
-                </onentry>
-                <transition target="../running" />
-            </state>
-            <state id="running">
-                <transition event="left-click" port="input" target="." cond="tagorid == id(self)">
-                    <parameter name="tagorid" type="int" default="None" />
-                    <raise event="button_pressed" scope="narrow" target="'parent'">
-                        <parameter expr="self.event_name" />
-                    </raise>
-                </transition>
-            </state>
-        </scxml>
-    </class>
-    <class name="Ball">
-        <relationships>
-            <association name="parent" class="Window" min="1" max="1" />
-            <inheritance class="Widget" priority="0" />
-        </relationships>
-        <attribute name="canvas" />
-        <constructor>
-            <parameter name="canvas" />
-            <parameter name="x" />
-            <parameter name="y" />
-            <super class="Widget">
-                <parameter expr="True" />
-            </super>
-            <body>
-                self.canvas = canvas
-                self.r = 20.0;
-                self.vel = {'x': random.uniform(-5.0, 5.0), 'y': random.uniform(-5.0, 5.0)};
-                self.smooth = 0.4 # value between 0 and 1
-                self.id = self.canvas.create_oval(x, y, x + (self.r * 2), y + (self.r * 2), fill="black")
-                self.set_bindable_and_tagorid(self.canvas, self.id)
-            </body>
-        </constructor>
-        <destructor>
-            <body>
-                self.canvas.delete(self.id)
-            </body>
-        </destructor>
-        <scxml initial="initializing">
-            <state id="initializing">
-                <transition event="set_association_name" target="../bouncing">
-                    <parameter name="association_name" type="str" />
-                    <script>
-                        self.association_name = association_name
-                    </script>
-                </transition>
-            </state>
-            <state id="bouncing">
-                <transition after="(20 - self.getSimulatedTime() % 20) / 1000.0" target=".">
-                    <script>
-                    <![CDATA[
-                        pos = self.canvas.coords(self.id)
-                        x = self.canvas.canvasx(pos[0])
-                        y = self.canvas.canvasy(pos[1])
-                        if x <= 0 or x + (self.r * 2) >= self.canvas.canvasx(self.canvas.winfo_width()):
-                            self.vel['x'] = -self.vel['x']
-                        if y <= 0 or y + (self.r * 2) >= self.canvas.canvasy(self.canvas.winfo_height()):
-                            self.vel['y'] = -self.vel['y']
-                        self.canvas.move(self.id, self.vel['x'], self.vel['y']);
-                    ]]>                            
-                    </script>
-                </transition>
-                <transition port="input" event="left-click" target="../selected" cond="tagorid == id(self)">
-                    <parameter name="tagorid" type="int" default="None" />
-                    <script>
-                        self.canvas.itemconfig(self.id, fill="yellow")
-                    </script>
-                </transition>
-            </state>
-            <state id="dragging">
-                <transition port="input" event="motion" target=".">
-                    <parameter name="tagorid" type="int" default="None" />
-                    <script>
-                    <![CDATA[
-                        coords = self.canvas.coords(self.id)
-                        dx = self.canvas.canvasx(self.last_x) - self.canvas.canvasx(coords[0])
-                        dy = self.canvas.canvasx(self.last_y) - self.canvas.canvasy(coords[1])
-
-                        self.canvas.move(self.id, dx, dy);
-
-                        # keep ball within boundaries
-                        coords = self.canvas.coords(self.id)
-                        x = self.canvas.canvasx(coords[0])
-                        y = self.canvas.canvasy(coords[1])
-                        if x - self.r <= 0:
-                            x = 1;
-                        elif x + self.r >= self.canvas.winfo_width():
-                            x = self.canvas.winfo_width() - (2 * self.r) - 1
-                        if y - self.r <= 0:
-                            y = 1
-                        elif y + self.r >= self.canvas.winfo_height():
-                            y = self.canvas.winfo_height() - (2 * self.r) - 1;
-                        self.canvas.coords(self.id, x, y, x + (self.r * 2), y + (self.r * 2));
-                        self.vel = {
-                            'x': (1 - self.smooth) * dx + self.smooth * self.vel['x'],
-                            'y': (1 - self.smooth) * dy + self.smooth * self.vel['y']
-                        }
-                    ]]>
-                    </script>
-                </transition>
-                <transition port="input" event="left-release" target="../bouncing">
-                    <parameter name="tagorid" type="int" default="None" />
-                    <script>
-                        self.canvas.itemconfig(self.id, fill="red")
-                    </script>
-                </transition>
-            </state>
-            <state id="selected">
-                <transition port="input" event="left-click" target="../dragging" cond="tagorid == id(self)">
-                    <parameter name="tagorid" type="int" default="None" />
-                </transition>
-                <transition port="input" event="delete" target="../deleted">
-                    <parameter name="tagorid" type="int" default="None" />
-                    <raise event="delete_ball" scope="narrow" target="'parent'">
-                        <parameter expr="self.association_name" />
-                    </raise>
-                </transition>
-            </state>
-            <state id="deleted" />
-        </scxml>
-    </class>
-</diagram>

+ 0 - 122
examples/bouncingballs_multiwindow/widget.py

@@ -1,122 +0,0 @@
-'''
-Created on 27-jul.-2014
-
-@author: Simon
-'''
-import tkinter as tk
-from sccd.runtime.statecharts_core import Event
-
-class Widget:
-	controller = None
-
-	def __init__(self, configure_later=False):
-		if not configure_later:
-			self.set_bindable_and_tagorid(None, None)
-
-	def set_bindable_and_tagorid(self, bindable=None, tagorid=None):
-		if bindable is None:
-			bindable = self
-		self.bindable = bindable
-		self.mytagorid = tagorid
-		if isinstance(self, tk.Toplevel):
-			self.protocol("WM_DELETE_WINDOW", self.window_close)
-		if tagorid is not None:
-			if not isinstance(tagorid, list):
-				tagorid = [tagorid]
-			for t in tagorid:
-				self.bindable.tag_bind(t, "<Button>", self.on_click)
-				self.bindable.tag_bind(t, "<ButtonRelease>", self.on_release)
-				self.bindable.tag_bind(t, "<Motion>", self.on_motion)
-				self.bindable.tag_bind(t, "<Enter>", self.on_enter)
-				self.bindable.tag_bind(t, "<Leave>", self.on_leave)
-				self.bindable.tag_bind(t, "<Key>", self.on_key)
-				self.bindable.tag_bind(t, "<KeyRelease>", self.on_key_release)
-		else:
-			self.bindable.bind("<Button>", self.on_click)
-			self.bindable.bind("<ButtonRelease>", self.on_release)
-			self.bindable.bind("<Motion>", self.on_motion)
-			self.bindable.bind("<Enter>", self.on_enter)
-			self.bindable.bind("<Leave>", self.on_leave)
-			self.bindable.bind("<Key>", self.on_key)
-			self.bindable.bind("<KeyRelease>", self.on_key_release)
-		self.last_x = 50
-		self.last_y = 50
-		self.selected_type = None
-
-	def on_click(self, event):
-		event_name = None
-
-		if event.num == 1:
-			event_name = "left-click"
-		elif event.num == 2:
-			event_name = "middle-click"
-		elif event.num == 3:
-			event_name = "right-click"
-
-		if event_name:
-			self.last_x = event.x
-			self.last_y = event.y
-			Widget.controller.addInput(Event(event_name, "input", [id(self)]))
-
-	def on_release(self, event):
-		event_name = None
-
-		if event.num == 1:
-			event_name = "left-release"
-		elif event.num == 2:
-			event_name = "middle-release"
-		elif event.num == 3:
-			event_name = "right-release"
-
-		if event_name:
-			self.last_x = event.x
-			self.last_y = event.y
-			Widget.controller.addInput(Event(event_name, "input", [id(self)]))
-
-	def on_motion(self, event):
-		self.last_x = event.x
-		self.last_y = event.y
-		Widget.controller.addInput(Event("motion", "input", [id(self)]))
-
-	def on_enter(self, event):
-		Widget.controller.addInput(Event("enter", "input", [id(self)]))
-
-	def on_leave(self, event):
-		Widget.controller.addInput(Event("leave", "input", [id(self)]))
-
-	def on_key(self, event):
-		event_name = None
-
-		if event.keysym == 'Escape':
-			event_name = "escape"
-		elif event.keysym == 'Return':
-			event_name = "return"
-		elif event.keysym == 'Delete':
-			event_name = "delete"
-		elif event.keysym == 'Shift_L':
-			event_name = "shift"
-		elif event.keysym == 'Control_L':
-			event_name = "control"
-
-		if event_name:
-			Widget.controller.addInput(Event(event_name, "input", [id(self)]))
-
-	def on_key_release(self, event):
-		event_name = None
-
-		if event.keysym == 'Escape':
-			event_name = "escape-release"
-		elif event.keysym == 'Return':
-			event_name = "return-release"
-		elif event.keysym == 'Delete':
-			event_name = "delete-release"
-		elif event.keysym == 'Shift_L':
-			event_name = "shift-release"
-		elif event.keysym == 'Control_L':
-			event_name = "control-release"
-
-		if event_name:
-			Widget.controller.addInput(Event(event_name, "input", [id(self)]))
-
-	def window_close(self):
-		Widget.controller.addInput(Event("window-close", "input", [id(self)]))