浏览代码

Working line drawing

Yentl Van Tendeloo 8 年之前
父节点
当前提交
3b727ab8ea
共有 3 个文件被更改,包括 503 次插入174 次删除
  1. 47 42
      classes/canvas/canvas.xml
  2. 80 74
      classes/window/choice_prompt_window.xml
  3. 376 58
      frontend.py

+ 47 - 42
classes/canvas/canvas.xml

@@ -35,11 +35,13 @@
             self.to_move = {}
             self.to_move = {}
 
 
             self.elems = []
             self.elems = []
+            self.tmp_line = None
 
 
             self.currently_selected = None
             self.currently_selected = None
             self.loading = [tk.PhotoImage(file="icons/loading.gif", format="gif -index %i" % i) for i in range(8)]
             self.loading = [tk.PhotoImage(file="icons/loading.gif", format="gif -index %i" % i) for i in range(8)]
         </body>
         </body>
     </constructor>
     </constructor>
+
     <destructor>
     <destructor>
         <body>
         <body>
             self.destroy()
             self.destroy()
@@ -58,22 +60,6 @@
         <parallel id="ready">
         <parallel id="ready">
             <state id="process_events" initial="ready">
             <state id="process_events" initial="ready">
                 <state id="ready">
                 <state id="ready">
-                    <transition event="clear_canvas" target=".">
-                        <raise event="delete_instance" scope="cd">
-                            <parameter expr="'elements'"/>
-                        </raise>
-                        <raise event="delete_instance" scope="cd">
-                            <parameter expr="'connecting_lines'"/>
-                        </raise>
-                        <script>
-                            for f in self.elems:
-                                self.delete(f[1])
-                            self.elems = []
-                            self.group_location = {}
-                            self.layers = []
-                        </script>
-                    </transition>
-
                     <transition event="select_for_creation" target=".">
                     <transition event="select_for_creation" target=".">
                         <parameter name="element_name"/>
                         <parameter name="element_name"/>
                         <script>
                         <script>
@@ -164,12 +150,6 @@
                         </script>
                         </script>
                     </onentry>
                     </onentry>
 
 
-                    <onexit>
-                        <script>
-                            self.delete(self.tmp_line)
-                        </script>
-                    </onexit>
-
                     <state id="drawing">
                     <state id="drawing">
                         <transition event="motion" target=".">
                         <transition event="motion" target=".">
                             <script>
                             <script>
@@ -192,6 +172,10 @@
 
 
                         <transition event="right-click" cond="ID == id(self)" target="../../ready">
                         <transition event="right-click" cond="ID == id(self)" target="../../ready">
                             <parameter name="ID"/>
                             <parameter name="ID"/>
+                            <script>
+                                self.delete(self.tmp_line)
+                                self.tmp_line = None
+                            </script>
                         </transition>
                         </transition>
 
 
                         <transition event="create_line" target="../create_in_mv">
                         <transition event="create_line" target="../create_in_mv">
@@ -241,6 +225,7 @@
                                 <raise event="create_instance" scope="cd">
                                 <raise event="create_instance" scope="cd">
                                     <parameter expr="'prompt'"/>
                                     <parameter expr="'prompt'"/>
                                     <parameter expr="'ChoicePrompt'"/>
                                     <parameter expr="'ChoicePrompt'"/>
+                                    <parameter expr="'Pick desired link type:'"/>
                                     <parameter expr="self.allowed_types"/>
                                     <parameter expr="self.allowed_types"/>
                                 </raise>
                                 </raise>
                             </onentry>
                             </onentry>
@@ -264,19 +249,35 @@
                                 </script>
                                 </script>
                             </transition>
                             </transition>
 
 
-                            <transition event="window_close" cond="self.assoc_type is not None" target="../create"/>
-                            <transition event="window_close" cond="self.assoc_type is None" target="../../../ready"/>
+                            <transition event="close_window" cond="self.assoc_type is not None" target="../create">
+                                <raise event="delete_instance" scope="cd">
+                                    <parameter expr="'prompt'"/>
+                                </raise>
+                            </transition>
+
+                            <transition event="close_window" cond="self.assoc_type is None" target="../../../ready">
+                                <raise event="delete_instance" scope="cd">
+                                    <parameter expr="'prompt'"/>
+                                </raise>
+                                <script>
+                                    self.delete(self.tmp_line)
+                                    self.tmp_line = None
+                                </script>
+                            </transition>
                         </state>
                         </state>
 
 
                         <state id="create">
                         <state id="create">
                             <onentry>
                             <onentry>
                                 <raise event="mv_request" scope="broad">
                                 <raise event="mv_request" scope="broad">
                                     <parameter expr="'instantiate'"/>
                                     <parameter expr="'instantiate'"/>
-                                    <parameter expr="[current_model, self.assoc_type, '', (self.creating_line[1], self.creating_line[3])]"/>
+                                    <parameter expr="[current_model, self.assoc_type, (self.creating_line[1], self.creating_line[3]), '']"/>
                                 </raise>
                                 </raise>
                             </onentry>
                             </onentry>
 
 
-                            <transition event="mv_response" target="../../../ready"/>
+                            <transition event="mv_response" target="../../../waiting_for_clear">
+                                <parameter name="ID"/>
+                                <raise event="rerender_model" scope="narrow" target="'parent'"/>
+                            </transition>
                         </state>
                         </state>
                     </state>
                     </state>
                 </state>
                 </state>
@@ -332,22 +333,26 @@
                     </transition>
                     </transition>
                 </state>
                 </state>
 
 
-                <state id="waiting_for_clear">
-                    <transition event="clear_canvas" target="../ready">
-                        <raise event="delete_instance" scope="cd">
-                            <parameter expr="'elements'"/>
-                        </raise>
-                        <raise event="delete_instance" scope="cd">
-                            <parameter expr="'connecting_lines'"/>
-                        </raise>
-                        <script>
-                            for f in self.elems:
-                                self.delete(f[1])
-                            self.group_location = {}
-                            self.layers = []
-                        </script>
-                    </transition>
-                </state>
+                <state id="waiting_for_clear"/>
+
+                <transition event="clear_canvas" target="ready">
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="'elements'"/>
+                    </raise>
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="'connecting_lines'"/>
+                    </raise>
+                    <script>
+                        for f in self.elems:
+                            self.delete(f[1])
+                        if self.tmp_line is not None:
+                            self.delete(self.tmp_line)
+                            self.tmp_line = None
+                        self.elems = []
+                        self.group_location = {}
+                        self.layers = []
+                    </script>
+                </transition>
             </state>
             </state>
 
 
             <state id="update_loading">
             <state id="update_loading">

+ 80 - 74
classes/window/choice_prompt_window.xml

@@ -1,4 +1,4 @@
-<class name="Browser">
+<class name="ChoicePrompt">
     <relationships>
     <relationships>
         <inheritance class="tk.Toplevel" priority="1"/>
         <inheritance class="tk.Toplevel" priority="1"/>
         <inheritance class="SCCDWidget" priority="0"/>
         <inheritance class="SCCDWidget" priority="0"/>
@@ -33,48 +33,48 @@
         </body>
         </body>
     </destructor>
     </destructor>
 
 
-    <scxml initial="init">
-        <state id="init">
-            <onentry>
-                <raise event="create_instance" scope="cd">
-                    <parameter expr="'buttons'"/>
-                    <parameter expr="'Button'"/>
-                    <parameter expr="{'parent': self.button_frame, 'visual': TextVisual('OK'), 'tooltip_text': 'Commit decision', 'event_parameters': 'OK'}"/>
-                </raise>
-            </onentry>
-
-            <transition event="instance_created" target="../wait_for_packing_OK">
-                <parameter name="association_name"/>
-                <raise event="start_instance" scope="cd">
-                    <parameter expr="association_name"/>
-                </raise>
+    <scxml initial="all">
+        <state id="all" initial="init">
+            <state id="init">
+                <onentry>
+                    <raise event="create_instance" scope="cd">
+                        <parameter expr="'buttons'"/>
+                        <parameter expr="'Button'"/>
+                        <parameter expr="{'parent': self.button_frame, 'visual': TextVisual('OK'), 'tooltip_text': 'Commit decision', 'event_parameters': 'OK'}"/>
+                    </raise>
+                </onentry>
+
+                <transition event="instance_created" target="../wait_for_packing_OK">
+                    <parameter name="association_name"/>
+                    <raise event="start_instance" scope="cd">
+                        <parameter expr="association_name"/>
+                    </raise>
 
 
-                <script>
-                    self.button_ok = association_name
-                </script>
-            </transition>
-        </state>
-
-        <state id="wait_for_packing_OK">
-            <transition event="tk_widget" target="../create_labels">
-                <parameter name="tk_elem"/>
-                <script>
-                    tk_elem.pack(anchor=tk.W, fill=tk.BOTH, expand=tk.TRUE)
-                </script>
-            </transition>
-        </state>
+                    <script>
+                        self.button_ok = association_name
+                    </script>
+                </transition>
+            </state>
 
 
-        <state id="create_labels" initial="query">
-            <state id="query">
-                <transition target="check_continue">
+            <state id="wait_for_packing_OK">
+                <transition event="tk_widget" target="../create_labels">
+                    <parameter name="tk_elem"/>
                     <script>
                     <script>
-                        self.labels_to_add = sorted(self.options)
-                        self.all_results = sorted(self.options)
+                        tk_elem.pack(anchor=tk.W, fill=tk.BOTH, expand=tk.TRUE)
                     </script>
                     </script>
                 </transition>
                 </transition>
             </state>
             </state>
 
 
-            <state id="add_labels" initial="add_label">
+            <state id="create_labels" initial="query">
+                <state id="query">
+                    <transition target="../check_continue">
+                        <script>
+                            self.labels_to_add = sorted(self.options)
+                            self.all_results = sorted(self.options)
+                        </script>
+                    </transition>
+                </state>
+
                 <state id="add_label">
                 <state id="add_label">
                     <onentry>
                     <onentry>
                         <raise event="create_instance" scope="cd">
                         <raise event="create_instance" scope="cd">
@@ -108,10 +108,8 @@
                     <transition cond="len(self.labels_to_add) > 0" target="../add_label"/>
                     <transition cond="len(self.labels_to_add) > 0" target="../add_label"/>
                 </state>
                 </state>
             </state>
             </state>
-        </state>
 
 
-        <state id="waiting">
-            <state id="selecting_label">
+            <state id="waiting">
                 <transition event="label_pressed" cond="self.selected_label is None" target=".">
                 <transition event="label_pressed" cond="self.selected_label is None" target=".">
                     <parameter name="text"/>
                     <parameter name="text"/>
                     <raise event="highlight" target="self.labels[text]" scope="narrow"/>
                     <raise event="highlight" target="self.labels[text]" scope="narrow"/>
@@ -133,47 +131,55 @@
                     <parameter name="text"/>
                     <parameter name="text"/>
                 </transition>
                 </transition>
 
 
-                <transition event="button_pressed" cond="event_name == 'OK' and self.selected_label is not None" target="../delete_labels"/>
+                <transition event="button_pressed" cond="event_name == 'OK' and self.selected_label is not None" target="../delete_labels">
+                    <parameter name="event_name"/>
+                </transition>
             </state>
             </state>
-        </state>
 
 
-        <state id="delete_labels">
-            <transition cond="len(self.labels) > 0" target=".">
-                <raise event="delete_instance" scope="cd">
-                    <parameter expr="self.labels.popitem()[1]"/>
-                </raise>
-            </transition>
+            <state id="delete_labels">
+                <transition cond="len(self.labels) > 0" target=".">
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="self.labels.popitem()[1]"/>
+                    </raise>
+                </transition>
 
 
-            <transition cond="len(self.labels) == 0" target="../send_results"/>
-        </state>
+                <transition cond="len(self.labels) == 0" target="../send_results"/>
+            </state>
 
 
-        <state id="send_results">
-            <transition target="../closing">
-                <raise event="choice_result" target="'parent'" scope="narrow">
-                    <parameter expr="self.selected_label"/>
-                </raise>
-            </transition>
-        </state>
+            <state id="send_results">
+                <transition target="../closing">
+                    <raise event="choice_result" target="'parent'" scope="narrow">
+                        <parameter expr="self.selected_label"/>
+                    </raise>
+                    <script>
+                        self.to_close = self.labels.values() + [self.button_ok]
+                    </script>
+                </transition>
+            </state>
 
 
-        <state id="closing">
-            <onentry>
-                <raise event="delete_instance" scope="cd">
-                    <parameter expr="self.to_close.pop(0)"/>
-                </raise>
-            </onentry>
+            <state id="closing">
+                <onentry>
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="self.to_close.pop(0)"/>
+                    </raise>
+                </onentry>
 
 
-            <transition event="instance_deleted" cond="len(self.to_close) > 0" target="."/>
-            <transition event="instance_deleted" cond="len(self.to_close) == 0" target="../close"/>
-        </state>
-            
-        <state id="close">
-            <onentry>
-                <raise event="close_window" scope="narrow" target="'parent'"/>
-            </onentry>
-        </state>
+                <transition event="instance_deleted" cond="len(self.to_close) > 0" target="."/>
+                <transition event="instance_deleted" cond="len(self.to_close) == 0" target="../close"/>
+            </state>
+                
+            <state id="close">
+                <onentry>
+                    <raise event="close_window" scope="narrow" target="'parent'"/>
+                </onentry>
+            </state>
 
 
-        <transition event="window-close" cond="ID == id(self)" target="../closing">
-            <parameter name="ID"/>
-        </transition>
+            <transition event="window-close" cond="ID == id(self)" target="closing">
+                <parameter name="ID"/>
+                <script>
+                    self.to_close = self.labels.values() + [self.button_ok]
+                </script>
+            </transition>
+        </state>
     </scxml>
     </scxml>
 </class>
 </class>

+ 376 - 58
frontend.py

@@ -1,7 +1,7 @@
 """
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
 
-Date:   Mon Oct  9 16:33:03 2017
+Date:   Tue Oct 10 09:18:41 2017
 
 
 Model author: Yentl Van Tendeloo
 Model author: Yentl Van Tendeloo
 Model name:   Modelverse Visual Editor - Tkinter Version 
 Model name:   Modelverse Visual Editor - Tkinter Version 
@@ -5945,6 +5945,309 @@ class Popup(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.default_targets = self.states["/init"].getEffectiveTargetStates()
         self.default_targets = self.states["/init"].getEffectiveTargetStates()
         RuntimeClassBase.initializeStatechart(self)
         RuntimeClassBase.initializeStatechart(self)
 
 
+class ChoicePrompt(RuntimeClassBase, tk.Toplevel, SCCDWidget):
+    def __init__(self, controller, prompt, options = None):
+        if options == None: options = None
+        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
+        ChoicePrompt.user_defined_constructor(self, prompt, options)
+    
+    def user_defined_constructor(self, prompt, options = None):
+        if options == None: options = None
+        tk.Toplevel.__init__(self)
+        SCCDWidget.__init__(self)
+        tk.Label(self, text=prompt).pack()
+        
+        self.button_frame = tk.Frame(self)
+        self.button_frame.pack(fill=tk.X)
+        
+        self.browser_frame = tk.Frame(self)
+        self.browser_frame.pack(fill=tk.BOTH)
+        
+        self.selected_label = None
+        self.labels = {}
+        self.options = options
+    
+    def user_defined_destructor(self):
+        self.destroy()
+        # call super class destructors
+        if hasattr(tk.Toplevel, "__del__"):
+            tk.Toplevel.__del__(self)
+        if hasattr(SCCDWidget, "__del__"):
+            SCCDWidget.__del__(self)
+    
+    
+    # builds Statechart structure
+    def build_statechart_structure(self):
+        
+        # state <root>
+        self.states[""] = State(0, "", self)
+        
+        # state /all
+        self.states["/all"] = State(1, "/all", self)
+        
+        # state /all/init
+        self.states["/all/init"] = State(2, "/all/init", self)
+        self.states["/all/init"].setEnter(self._all_init_enter)
+        
+        # state /all/wait_for_packing_OK
+        self.states["/all/wait_for_packing_OK"] = State(3, "/all/wait_for_packing_OK", self)
+        
+        # state /all/create_labels
+        self.states["/all/create_labels"] = State(4, "/all/create_labels", self)
+        
+        # state /all/create_labels/query
+        self.states["/all/create_labels/query"] = State(5, "/all/create_labels/query", self)
+        
+        # state /all/create_labels/add_label
+        self.states["/all/create_labels/add_label"] = State(6, "/all/create_labels/add_label", self)
+        self.states["/all/create_labels/add_label"].setEnter(self._all_create_labels_add_label_enter)
+        
+        # state /all/create_labels/pack_label
+        self.states["/all/create_labels/pack_label"] = State(7, "/all/create_labels/pack_label", self)
+        
+        # state /all/create_labels/check_continue
+        self.states["/all/create_labels/check_continue"] = State(8, "/all/create_labels/check_continue", self)
+        
+        # state /all/waiting
+        self.states["/all/waiting"] = State(9, "/all/waiting", self)
+        
+        # state /all/delete_labels
+        self.states["/all/delete_labels"] = State(10, "/all/delete_labels", self)
+        
+        # state /all/send_results
+        self.states["/all/send_results"] = State(11, "/all/send_results", self)
+        
+        # state /all/closing
+        self.states["/all/closing"] = State(12, "/all/closing", self)
+        self.states["/all/closing"].setEnter(self._all_closing_enter)
+        
+        # state /all/close
+        self.states["/all/close"] = State(13, "/all/close", self)
+        self.states["/all/close"].setEnter(self._all_close_enter)
+        
+        # add children
+        self.states[""].addChild(self.states["/all"])
+        self.states["/all"].addChild(self.states["/all/init"])
+        self.states["/all"].addChild(self.states["/all/wait_for_packing_OK"])
+        self.states["/all"].addChild(self.states["/all/create_labels"])
+        self.states["/all"].addChild(self.states["/all/waiting"])
+        self.states["/all"].addChild(self.states["/all/delete_labels"])
+        self.states["/all"].addChild(self.states["/all/send_results"])
+        self.states["/all"].addChild(self.states["/all/closing"])
+        self.states["/all"].addChild(self.states["/all/close"])
+        self.states["/all/create_labels"].addChild(self.states["/all/create_labels/query"])
+        self.states["/all/create_labels"].addChild(self.states["/all/create_labels/add_label"])
+        self.states["/all/create_labels"].addChild(self.states["/all/create_labels/pack_label"])
+        self.states["/all/create_labels"].addChild(self.states["/all/create_labels/check_continue"])
+        self.states[""].fixTree()
+        self.states[""].default_state = self.states["/all"]
+        self.states["/all"].default_state = self.states["/all/init"]
+        self.states["/all/create_labels"].default_state = self.states["/all/create_labels/query"]
+        
+        # transition /all/init
+        _all_init_0 = Transition(self, self.states["/all/init"], [self.states["/all/wait_for_packing_OK"]])
+        _all_init_0.setAction(self._all_init_0_exec)
+        _all_init_0.setTrigger(Event("instance_created", None))
+        self.states["/all/init"].addTransition(_all_init_0)
+        
+        # transition /all/wait_for_packing_OK
+        _all_wait_for_packing_OK_0 = Transition(self, self.states["/all/wait_for_packing_OK"], [self.states["/all/create_labels"]])
+        _all_wait_for_packing_OK_0.setAction(self._all_wait_for_packing_OK_0_exec)
+        _all_wait_for_packing_OK_0.setTrigger(Event("tk_widget", None))
+        self.states["/all/wait_for_packing_OK"].addTransition(_all_wait_for_packing_OK_0)
+        
+        # transition /all/create_labels/query
+        _all_create_labels_query_0 = Transition(self, self.states["/all/create_labels/query"], [self.states["/all/create_labels/check_continue"]])
+        _all_create_labels_query_0.setAction(self._all_create_labels_query_0_exec)
+        _all_create_labels_query_0.setTrigger(None)
+        self.states["/all/create_labels/query"].addTransition(_all_create_labels_query_0)
+        
+        # transition /all/create_labels/add_label
+        _all_create_labels_add_label_0 = Transition(self, self.states["/all/create_labels/add_label"], [self.states["/all/create_labels/pack_label"]])
+        _all_create_labels_add_label_0.setAction(self._all_create_labels_add_label_0_exec)
+        _all_create_labels_add_label_0.setTrigger(Event("instance_created", None))
+        self.states["/all/create_labels/add_label"].addTransition(_all_create_labels_add_label_0)
+        
+        # transition /all/create_labels/pack_label
+        _all_create_labels_pack_label_0 = Transition(self, self.states["/all/create_labels/pack_label"], [self.states["/all/create_labels/check_continue"]])
+        _all_create_labels_pack_label_0.setAction(self._all_create_labels_pack_label_0_exec)
+        _all_create_labels_pack_label_0.setTrigger(Event("tk_widget", None))
+        self.states["/all/create_labels/pack_label"].addTransition(_all_create_labels_pack_label_0)
+        
+        # transition /all/create_labels/check_continue
+        _all_create_labels_check_continue_0 = Transition(self, self.states["/all/create_labels/check_continue"], [self.states["/all/waiting"]])
+        _all_create_labels_check_continue_0.setTrigger(None)
+        _all_create_labels_check_continue_0.setGuard(self._all_create_labels_check_continue_0_guard)
+        self.states["/all/create_labels/check_continue"].addTransition(_all_create_labels_check_continue_0)
+        _all_create_labels_check_continue_1 = Transition(self, self.states["/all/create_labels/check_continue"], [self.states["/all/create_labels/add_label"]])
+        _all_create_labels_check_continue_1.setTrigger(None)
+        _all_create_labels_check_continue_1.setGuard(self._all_create_labels_check_continue_1_guard)
+        self.states["/all/create_labels/check_continue"].addTransition(_all_create_labels_check_continue_1)
+        
+        # transition /all/waiting
+        _all_waiting_0 = Transition(self, self.states["/all/waiting"], [self.states["/all/waiting"]])
+        _all_waiting_0.setAction(self._all_waiting_0_exec)
+        _all_waiting_0.setTrigger(Event("label_pressed", None))
+        _all_waiting_0.setGuard(self._all_waiting_0_guard)
+        self.states["/all/waiting"].addTransition(_all_waiting_0)
+        _all_waiting_1 = Transition(self, self.states["/all/waiting"], [self.states["/all/waiting"]])
+        _all_waiting_1.setAction(self._all_waiting_1_exec)
+        _all_waiting_1.setTrigger(Event("label_pressed", None))
+        _all_waiting_1.setGuard(self._all_waiting_1_guard)
+        self.states["/all/waiting"].addTransition(_all_waiting_1)
+        _all_waiting_2 = Transition(self, self.states["/all/waiting"], [self.states["/all/delete_labels"]])
+        _all_waiting_2.setTrigger(Event("label_pressed", None))
+        _all_waiting_2.setGuard(self._all_waiting_2_guard)
+        self.states["/all/waiting"].addTransition(_all_waiting_2)
+        _all_waiting_3 = Transition(self, self.states["/all/waiting"], [self.states["/all/delete_labels"]])
+        _all_waiting_3.setTrigger(Event("button_pressed", None))
+        _all_waiting_3.setGuard(self._all_waiting_3_guard)
+        self.states["/all/waiting"].addTransition(_all_waiting_3)
+        
+        # transition /all/delete_labels
+        _all_delete_labels_0 = Transition(self, self.states["/all/delete_labels"], [self.states["/all/delete_labels"]])
+        _all_delete_labels_0.setAction(self._all_delete_labels_0_exec)
+        _all_delete_labels_0.setTrigger(None)
+        _all_delete_labels_0.setGuard(self._all_delete_labels_0_guard)
+        self.states["/all/delete_labels"].addTransition(_all_delete_labels_0)
+        _all_delete_labels_1 = Transition(self, self.states["/all/delete_labels"], [self.states["/all/send_results"]])
+        _all_delete_labels_1.setTrigger(None)
+        _all_delete_labels_1.setGuard(self._all_delete_labels_1_guard)
+        self.states["/all/delete_labels"].addTransition(_all_delete_labels_1)
+        
+        # transition /all/send_results
+        _all_send_results_0 = Transition(self, self.states["/all/send_results"], [self.states["/all/closing"]])
+        _all_send_results_0.setAction(self._all_send_results_0_exec)
+        _all_send_results_0.setTrigger(None)
+        self.states["/all/send_results"].addTransition(_all_send_results_0)
+        
+        # transition /all/closing
+        _all_closing_0 = Transition(self, self.states["/all/closing"], [self.states["/all/closing"]])
+        _all_closing_0.setTrigger(Event("instance_deleted", None))
+        _all_closing_0.setGuard(self._all_closing_0_guard)
+        self.states["/all/closing"].addTransition(_all_closing_0)
+        _all_closing_1 = Transition(self, self.states["/all/closing"], [self.states["/all/close"]])
+        _all_closing_1.setTrigger(Event("instance_deleted", None))
+        _all_closing_1.setGuard(self._all_closing_1_guard)
+        self.states["/all/closing"].addTransition(_all_closing_1)
+        
+        # transition /all
+        _all_0 = Transition(self, self.states["/all"], [self.states["/all/closing"]])
+        _all_0.setAction(self._all_0_exec)
+        _all_0.setTrigger(Event("window-close", None))
+        _all_0.setGuard(self._all_0_guard)
+        self.states["/all"].addTransition(_all_0)
+    
+    def _all_init_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'buttons', 'Button', {'parent': self.button_frame, 'visual': TextVisual('OK'), 'tooltip_text': 'Commit decision', 'event_parameters': 'OK'}]))
+    
+    def _all_create_labels_add_label_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'labels', 'Label', {'parent': self.browser_frame, 'text': self.labels_to_add[0]}]))
+    
+    def _all_closing_enter(self):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, self.to_close.pop(0)]))
+    
+    def _all_close_enter(self):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("close_window", None, [])]))
+    
+    def _all_0_exec(self, parameters):
+        ID = parameters[0]
+        self.to_close = self.labels.values() + [self.button_ok]
+    
+    def _all_0_guard(self, parameters):
+        ID = parameters[0]
+        return ID == id(self)
+    
+    def _all_init_0_exec(self, parameters):
+        association_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
+        self.button_ok = association_name
+    
+    def _all_wait_for_packing_OK_0_exec(self, parameters):
+        tk_elem = parameters[0]
+        tk_elem.pack(anchor=tk.W, fill=tk.BOTH, expand=tk.TRUE)
+    
+    def _all_create_labels_query_0_exec(self, parameters):
+        self.labels_to_add = sorted(self.options)
+        self.all_results = sorted(self.options)
+    
+    def _all_create_labels_add_label_0_exec(self, parameters):
+        association_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
+        self.labels[self.labels_to_add.pop(0)] = association_name
+    
+    def _all_create_labels_pack_label_0_exec(self, parameters):
+        tk_elem = parameters[0]
+        tk_elem.pack()
+    
+    def _all_create_labels_check_continue_0_guard(self, parameters):
+        return len(self.labels_to_add) == 0
+    
+    def _all_create_labels_check_continue_1_guard(self, parameters):
+        return len(self.labels_to_add) > 0
+    
+    def _all_waiting_0_exec(self, parameters):
+        text = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.labels[text], Event("highlight", None, [])]))
+        self.selected_label = text
+    
+    def _all_waiting_0_guard(self, parameters):
+        text = parameters[0]
+        return self.selected_label is None
+    
+    def _all_waiting_1_exec(self, parameters):
+        text = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.labels[self.selected_label], Event("unhighlight", None, [])]))
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.labels[text], Event("highlight", None, [])]))
+        self.selected_label = text
+    
+    def _all_waiting_1_guard(self, parameters):
+        text = parameters[0]
+        return self.selected_label is not None and self.selected_label != text
+    
+    def _all_waiting_2_guard(self, parameters):
+        text = parameters[0]
+        return self.selected_label is not None and self.selected_label == text
+    
+    def _all_waiting_3_guard(self, parameters):
+        event_name = parameters[0]
+        return event_name == 'OK' and self.selected_label is not None
+    
+    def _all_delete_labels_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, self.labels.popitem()[1]]))
+    
+    def _all_delete_labels_0_guard(self, parameters):
+        return len(self.labels) > 0
+    
+    def _all_delete_labels_1_guard(self, parameters):
+        return len(self.labels) == 0
+    
+    def _all_send_results_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("choice_result", None, [self.selected_label])]))
+        self.to_close = self.labels.values() + [self.button_ok]
+    
+    def _all_closing_0_guard(self, parameters):
+        return len(self.to_close) > 0
+    
+    def _all_closing_1_guard(self, parameters):
+        return len(self.to_close) == 0
+    
+    def initializeStatechart(self):
+        # enter default state
+        self.default_targets = self.states["/all"].getEffectiveTargetStates()
+        RuntimeClassBase.initializeStatechart(self)
+
 class Toolbar(RuntimeClassBase, tk.Frame, SCCDWidget):
 class Toolbar(RuntimeClassBase, tk.Frame, SCCDWidget):
     def __init__(self, controller, parent):
     def __init__(self, controller, parent):
         RuntimeClassBase.__init__(self, controller)
         RuntimeClassBase.__init__(self, controller)
@@ -7147,6 +7450,7 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         self.to_move = {}
         self.to_move = {}
         
         
         self.elems = []
         self.elems = []
+        self.tmp_line = None
         
         
         self.currently_selected = None
         self.currently_selected = None
         self.loading = [tk.PhotoImage(file="icons/loading.gif", format="gif -index %i" % i) for i in range(8)]
         self.loading = [tk.PhotoImage(file="icons/loading.gif", format="gif -index %i" % i) for i in range(8)]
@@ -7181,7 +7485,6 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         # state /ready/process_events/creating_line
         # state /ready/process_events/creating_line
         self.states["/ready/process_events/creating_line"] = State(5, "/ready/process_events/creating_line", self)
         self.states["/ready/process_events/creating_line"] = State(5, "/ready/process_events/creating_line", self)
         self.states["/ready/process_events/creating_line"].setEnter(self._ready_process_events_creating_line_enter)
         self.states["/ready/process_events/creating_line"].setEnter(self._ready_process_events_creating_line_enter)
-        self.states["/ready/process_events/creating_line"].setExit(self._ready_process_events_creating_line_exit)
         
         
         # state /ready/process_events/creating_line/drawing
         # state /ready/process_events/creating_line/drawing
         self.states["/ready/process_events/creating_line/drawing"] = State(6, "/ready/process_events/creating_line/drawing", self)
         self.states["/ready/process_events/creating_line/drawing"] = State(6, "/ready/process_events/creating_line/drawing", self)
@@ -7264,28 +7567,29 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         # transition /ready/process_events/ready
         # transition /ready/process_events/ready
         _ready_process_events_ready_0 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_0 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_0.setAction(self._ready_process_events_ready_0_exec)
         _ready_process_events_ready_0.setAction(self._ready_process_events_ready_0_exec)
-        _ready_process_events_ready_0.setTrigger(Event("clear_canvas", None))
+        _ready_process_events_ready_0.setTrigger(Event("select_for_creation", None))
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_0)
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_0)
-        _ready_process_events_ready_1 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
+        _ready_process_events_ready_1 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/creating_element"]])
         _ready_process_events_ready_1.setAction(self._ready_process_events_ready_1_exec)
         _ready_process_events_ready_1.setAction(self._ready_process_events_ready_1_exec)
-        _ready_process_events_ready_1.setTrigger(Event("select_for_creation", None))
+        _ready_process_events_ready_1.setTrigger(Event("right-click", None))
+        _ready_process_events_ready_1.setGuard(self._ready_process_events_ready_1_guard)
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_1)
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_1)
-        _ready_process_events_ready_2 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/creating_element"]])
+        _ready_process_events_ready_2 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/creating_line"]])
         _ready_process_events_ready_2.setAction(self._ready_process_events_ready_2_exec)
         _ready_process_events_ready_2.setAction(self._ready_process_events_ready_2_exec)
-        _ready_process_events_ready_2.setTrigger(Event("right-click", None))
-        _ready_process_events_ready_2.setGuard(self._ready_process_events_ready_2_guard)
+        _ready_process_events_ready_2.setTrigger(Event("create_line", None))
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_2)
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_2)
-        _ready_process_events_ready_3 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/creating_line"]])
+        _ready_process_events_ready_3 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/creating_group"]])
         _ready_process_events_ready_3.setAction(self._ready_process_events_ready_3_exec)
         _ready_process_events_ready_3.setAction(self._ready_process_events_ready_3_exec)
-        _ready_process_events_ready_3.setTrigger(Event("create_line", None))
+        _ready_process_events_ready_3.setTrigger(Event("define_group", None))
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_3)
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_3)
-        _ready_process_events_ready_4 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/creating_group"]])
+        _ready_process_events_ready_4 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_4.setAction(self._ready_process_events_ready_4_exec)
         _ready_process_events_ready_4.setAction(self._ready_process_events_ready_4_exec)
-        _ready_process_events_ready_4.setTrigger(Event("define_group", None))
+        _ready_process_events_ready_4.setTrigger(Event("define_contains", None))
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_4)
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_4)
         _ready_process_events_ready_5 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_5 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_5.setAction(self._ready_process_events_ready_5_exec)
         _ready_process_events_ready_5.setAction(self._ready_process_events_ready_5_exec)
-        _ready_process_events_ready_5.setTrigger(Event("define_contains", None))
+        _ready_process_events_ready_5.setTrigger(Event("draw_canvas", None))
+        _ready_process_events_ready_5.setGuard(self._ready_process_events_ready_5_guard)
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_5)
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_5)
         _ready_process_events_ready_6 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_6 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_6.setAction(self._ready_process_events_ready_6_exec)
         _ready_process_events_ready_6.setAction(self._ready_process_events_ready_6_exec)
@@ -7294,17 +7598,12 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_6)
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_6)
         _ready_process_events_ready_7 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_7 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_7.setAction(self._ready_process_events_ready_7_exec)
         _ready_process_events_ready_7.setAction(self._ready_process_events_ready_7_exec)
-        _ready_process_events_ready_7.setTrigger(Event("draw_canvas", None))
-        _ready_process_events_ready_7.setGuard(self._ready_process_events_ready_7_guard)
+        _ready_process_events_ready_7.setTrigger(Event("instance_created", None))
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_7)
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_7)
         _ready_process_events_ready_8 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_8 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_ready_8.setAction(self._ready_process_events_ready_8_exec)
         _ready_process_events_ready_8.setAction(self._ready_process_events_ready_8_exec)
-        _ready_process_events_ready_8.setTrigger(Event("instance_created", None))
+        _ready_process_events_ready_8.setTrigger(Event("moved_group", None))
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_8)
         self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_8)
-        _ready_process_events_ready_9 = Transition(self, self.states["/ready/process_events/ready"], [self.states["/ready/process_events/ready"]])
-        _ready_process_events_ready_9.setAction(self._ready_process_events_ready_9_exec)
-        _ready_process_events_ready_9.setTrigger(Event("moved_group", None))
-        self.states["/ready/process_events/ready"].addTransition(_ready_process_events_ready_9)
         
         
         # transition /ready/process_events/creating_line/drawing
         # transition /ready/process_events/creating_line/drawing
         _ready_process_events_creating_line_drawing_0 = Transition(self, self.states["/ready/process_events/creating_line/drawing"], [self.states["/ready/process_events/creating_line/drawing"]])
         _ready_process_events_creating_line_drawing_0 = Transition(self, self.states["/ready/process_events/creating_line/drawing"], [self.states["/ready/process_events/creating_line/drawing"]])
@@ -7312,6 +7611,7 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         _ready_process_events_creating_line_drawing_0.setTrigger(Event("motion", None))
         _ready_process_events_creating_line_drawing_0.setTrigger(Event("motion", None))
         self.states["/ready/process_events/creating_line/drawing"].addTransition(_ready_process_events_creating_line_drawing_0)
         self.states["/ready/process_events/creating_line/drawing"].addTransition(_ready_process_events_creating_line_drawing_0)
         _ready_process_events_creating_line_drawing_1 = Transition(self, self.states["/ready/process_events/creating_line/drawing"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_creating_line_drawing_1 = Transition(self, self.states["/ready/process_events/creating_line/drawing"], [self.states["/ready/process_events/ready"]])
+        _ready_process_events_creating_line_drawing_1.setAction(self._ready_process_events_creating_line_drawing_1_exec)
         _ready_process_events_creating_line_drawing_1.setTrigger(Event("right-click", None))
         _ready_process_events_creating_line_drawing_1.setTrigger(Event("right-click", None))
         _ready_process_events_creating_line_drawing_1.setGuard(self._ready_process_events_creating_line_drawing_1_guard)
         _ready_process_events_creating_line_drawing_1.setGuard(self._ready_process_events_creating_line_drawing_1_guard)
         self.states["/ready/process_events/creating_line/drawing"].addTransition(_ready_process_events_creating_line_drawing_1)
         self.states["/ready/process_events/creating_line/drawing"].addTransition(_ready_process_events_creating_line_drawing_1)
@@ -7353,16 +7653,19 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         _ready_process_events_creating_line_create_in_mv_wait_for_response_0.setTrigger(Event("choice_result", None))
         _ready_process_events_creating_line_create_in_mv_wait_for_response_0.setTrigger(Event("choice_result", None))
         self.states["/ready/process_events/creating_line/create_in_mv/wait_for_response"].addTransition(_ready_process_events_creating_line_create_in_mv_wait_for_response_0)
         self.states["/ready/process_events/creating_line/create_in_mv/wait_for_response"].addTransition(_ready_process_events_creating_line_create_in_mv_wait_for_response_0)
         _ready_process_events_creating_line_create_in_mv_wait_for_response_1 = Transition(self, self.states["/ready/process_events/creating_line/create_in_mv/wait_for_response"], [self.states["/ready/process_events/creating_line/create_in_mv/create"]])
         _ready_process_events_creating_line_create_in_mv_wait_for_response_1 = Transition(self, self.states["/ready/process_events/creating_line/create_in_mv/wait_for_response"], [self.states["/ready/process_events/creating_line/create_in_mv/create"]])
-        _ready_process_events_creating_line_create_in_mv_wait_for_response_1.setTrigger(Event("window_close", None))
+        _ready_process_events_creating_line_create_in_mv_wait_for_response_1.setAction(self._ready_process_events_creating_line_create_in_mv_wait_for_response_1_exec)
+        _ready_process_events_creating_line_create_in_mv_wait_for_response_1.setTrigger(Event("close_window", None))
         _ready_process_events_creating_line_create_in_mv_wait_for_response_1.setGuard(self._ready_process_events_creating_line_create_in_mv_wait_for_response_1_guard)
         _ready_process_events_creating_line_create_in_mv_wait_for_response_1.setGuard(self._ready_process_events_creating_line_create_in_mv_wait_for_response_1_guard)
         self.states["/ready/process_events/creating_line/create_in_mv/wait_for_response"].addTransition(_ready_process_events_creating_line_create_in_mv_wait_for_response_1)
         self.states["/ready/process_events/creating_line/create_in_mv/wait_for_response"].addTransition(_ready_process_events_creating_line_create_in_mv_wait_for_response_1)
         _ready_process_events_creating_line_create_in_mv_wait_for_response_2 = Transition(self, self.states["/ready/process_events/creating_line/create_in_mv/wait_for_response"], [self.states["/ready/process_events/ready"]])
         _ready_process_events_creating_line_create_in_mv_wait_for_response_2 = Transition(self, self.states["/ready/process_events/creating_line/create_in_mv/wait_for_response"], [self.states["/ready/process_events/ready"]])
-        _ready_process_events_creating_line_create_in_mv_wait_for_response_2.setTrigger(Event("window_close", None))
+        _ready_process_events_creating_line_create_in_mv_wait_for_response_2.setAction(self._ready_process_events_creating_line_create_in_mv_wait_for_response_2_exec)
+        _ready_process_events_creating_line_create_in_mv_wait_for_response_2.setTrigger(Event("close_window", None))
         _ready_process_events_creating_line_create_in_mv_wait_for_response_2.setGuard(self._ready_process_events_creating_line_create_in_mv_wait_for_response_2_guard)
         _ready_process_events_creating_line_create_in_mv_wait_for_response_2.setGuard(self._ready_process_events_creating_line_create_in_mv_wait_for_response_2_guard)
         self.states["/ready/process_events/creating_line/create_in_mv/wait_for_response"].addTransition(_ready_process_events_creating_line_create_in_mv_wait_for_response_2)
         self.states["/ready/process_events/creating_line/create_in_mv/wait_for_response"].addTransition(_ready_process_events_creating_line_create_in_mv_wait_for_response_2)
         
         
         # transition /ready/process_events/creating_line/create_in_mv/create
         # transition /ready/process_events/creating_line/create_in_mv/create
-        _ready_process_events_creating_line_create_in_mv_create_0 = Transition(self, self.states["/ready/process_events/creating_line/create_in_mv/create"], [self.states["/ready/process_events/ready"]])
+        _ready_process_events_creating_line_create_in_mv_create_0 = Transition(self, self.states["/ready/process_events/creating_line/create_in_mv/create"], [self.states["/ready/process_events/waiting_for_clear"]])
+        _ready_process_events_creating_line_create_in_mv_create_0.setAction(self._ready_process_events_creating_line_create_in_mv_create_0_exec)
         _ready_process_events_creating_line_create_in_mv_create_0.setTrigger(Event("mv_response", None))
         _ready_process_events_creating_line_create_in_mv_create_0.setTrigger(Event("mv_response", None))
         self.states["/ready/process_events/creating_line/create_in_mv/create"].addTransition(_ready_process_events_creating_line_create_in_mv_create_0)
         self.states["/ready/process_events/creating_line/create_in_mv/create"].addTransition(_ready_process_events_creating_line_create_in_mv_create_0)
         
         
@@ -7388,24 +7691,21 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         _ready_process_events_creating_element_0.setTrigger(Event("mv_response", None))
         _ready_process_events_creating_element_0.setTrigger(Event("mv_response", None))
         self.states["/ready/process_events/creating_element"].addTransition(_ready_process_events_creating_element_0)
         self.states["/ready/process_events/creating_element"].addTransition(_ready_process_events_creating_element_0)
         
         
-        # transition /ready/process_events/waiting_for_clear
-        _ready_process_events_waiting_for_clear_0 = Transition(self, self.states["/ready/process_events/waiting_for_clear"], [self.states["/ready/process_events/ready"]])
-        _ready_process_events_waiting_for_clear_0.setAction(self._ready_process_events_waiting_for_clear_0_exec)
-        _ready_process_events_waiting_for_clear_0.setTrigger(Event("clear_canvas", None))
-        self.states["/ready/process_events/waiting_for_clear"].addTransition(_ready_process_events_waiting_for_clear_0)
-        
         # transition /ready/update_loading/updating
         # transition /ready/update_loading/updating
         _ready_update_loading_updating_0 = Transition(self, self.states["/ready/update_loading/updating"], [self.states["/ready/update_loading/updating"]])
         _ready_update_loading_updating_0 = Transition(self, self.states["/ready/update_loading/updating"], [self.states["/ready/update_loading/updating"]])
         _ready_update_loading_updating_0.setAction(self._ready_update_loading_updating_0_exec)
         _ready_update_loading_updating_0.setAction(self._ready_update_loading_updating_0_exec)
         _ready_update_loading_updating_0.setTrigger(Event("_0after"))
         _ready_update_loading_updating_0.setTrigger(Event("_0after"))
         self.states["/ready/update_loading/updating"].addTransition(_ready_update_loading_updating_0)
         self.states["/ready/update_loading/updating"].addTransition(_ready_update_loading_updating_0)
+        
+        # transition /ready/process_events
+        _ready_process_events_0 = Transition(self, self.states["/ready/process_events"], [self.states["/ready/process_events/ready"]])
+        _ready_process_events_0.setAction(self._ready_process_events_0_exec)
+        _ready_process_events_0.setTrigger(Event("clear_canvas", None))
+        self.states["/ready/process_events"].addTransition(_ready_process_events_0)
     
     
     def _ready_process_events_creating_line_enter(self):
     def _ready_process_events_creating_line_enter(self):
         self.tmp_line = self.create_line(self.creating_line[2][0], self.creating_line[2][1], self.last_x, self.last_y)
         self.tmp_line = self.create_line(self.creating_line[2][0], self.creating_line[2][1], self.last_x, self.last_y)
     
     
-    def _ready_process_events_creating_line_exit(self):
-        self.delete(self.tmp_line)
-    
     def _ready_process_events_creating_line_create_in_mv_query_type_enter(self):
     def _ready_process_events_creating_line_create_in_mv_query_type_enter(self):
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['connections_between', [current_model, self.creating_line[1], self.creating_line[3]]])]))
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['connections_between', [current_model, self.creating_line[1], self.creating_line[3]]])]))
     
     
@@ -7413,10 +7713,10 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         print("Got allowed types: " + str(self.allowed_types))
         print("Got allowed types: " + str(self.allowed_types))
     
     
     def _ready_process_events_creating_line_create_in_mv_request_user_enter(self):
     def _ready_process_events_creating_line_create_in_mv_request_user_enter(self):
-        self.big_step.outputEventOM(Event("create_instance", None, [self, 'prompt', 'ChoicePrompt', self.allowed_types]))
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'prompt', 'ChoicePrompt', 'Pick desired link type:', self.allowed_types]))
     
     
     def _ready_process_events_creating_line_create_in_mv_create_enter(self):
     def _ready_process_events_creating_line_create_in_mv_create_enter(self):
-        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['instantiate', [current_model, self.assoc_type, '', (self.creating_line[1], self.creating_line[3])]])]))
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['instantiate', [current_model, self.assoc_type, (self.creating_line[1], self.creating_line[3]), '']])]))
     
     
     def _ready_process_events_creating_element_enter(self):
     def _ready_process_events_creating_element_enter(self):
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['instantiate', [current_model, self.currently_selected, None, '']])]))
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['instantiate', [current_model, self.currently_selected, None, '']])]))
@@ -7428,67 +7728,70 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
     def _ready_update_loading_updating_exit(self):
     def _ready_update_loading_updating_exit(self):
         self.removeTimer(0)
         self.removeTimer(0)
     
     
-    def _main_0_exec(self, parameters):
-        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("tk_widget", None, [self])]))
-    
-    def _ready_process_events_ready_0_exec(self, parameters):
+    def _ready_process_events_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'elements']))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'elements']))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'connecting_lines']))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'connecting_lines']))
         for f in self.elems:
         for f in self.elems:
             self.delete(f[1])
             self.delete(f[1])
+        if self.tmp_line is not None:
+            self.delete(self.tmp_line)
+            self.tmp_line = None
         self.elems = []
         self.elems = []
         self.group_location = {}
         self.group_location = {}
         self.layers = []
         self.layers = []
     
     
-    def _ready_process_events_ready_1_exec(self, parameters):
+    def _main_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("tk_widget", None, [self])]))
+    
+    def _ready_process_events_ready_0_exec(self, parameters):
         element_name = parameters[0]
         element_name = parameters[0]
         self.currently_selected = element_name
         self.currently_selected = element_name
     
     
-    def _ready_process_events_ready_2_exec(self, parameters):
+    def _ready_process_events_ready_1_exec(self, parameters):
         ID = parameters[0]
         ID = parameters[0]
         self.create_location = (self.last_x, self.last_y)
         self.create_location = (self.last_x, self.last_y)
     
     
-    def _ready_process_events_ready_2_guard(self, parameters):
+    def _ready_process_events_ready_1_guard(self, parameters):
         ID = parameters[0]
         ID = parameters[0]
         return self.currently_selected is not None and id(self) == ID
         return self.currently_selected is not None and id(self) == ID
     
     
-    def _ready_process_events_ready_3_exec(self, parameters):
+    def _ready_process_events_ready_2_exec(self, parameters):
         cs_element = parameters[0]
         cs_element = parameters[0]
         as_element = parameters[1]
         as_element = parameters[1]
         coordinates = parameters[2]
         coordinates = parameters[2]
         self.creating_line = (cs_element, as_element, coordinates)
         self.creating_line = (cs_element, as_element, coordinates)
     
     
-    def _ready_process_events_ready_4_exec(self, parameters):
+    def _ready_process_events_ready_3_exec(self, parameters):
         element = parameters[0]
         element = parameters[0]
         self.creating_id = element["id"]
         self.creating_id = element["id"]
         self.group_location[element['id']] = (element['x'], element['y'])
         self.group_location[element['id']] = (element['x'], element['y'])
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'elements', 'CanvasElement', self, (element['x'], element['y']), element['id'], element['__asid']]))
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'elements', 'CanvasElement', self, (element['x'], element['y']), element['id'], element['__asid']]))
     
     
-    def _ready_process_events_ready_5_exec(self, parameters):
+    def _ready_process_events_ready_4_exec(self, parameters):
         element = parameters[0]
         element = parameters[0]
         self.element_group[element["__target"]] = element["__source"]
         self.element_group[element["__target"]] = element["__source"]
     
     
-    def _ready_process_events_ready_6_exec(self, parameters):
+    def _ready_process_events_ready_5_exec(self, parameters):
         element = parameters[0]
         element = parameters[0]
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.assoc_links[self.element_group[element['id']]], Event("draw_element", None, [element])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.assoc_links[self.element_group[element['id']]], Event("draw_element", None, [element])]))
     
     
-    def _ready_process_events_ready_6_guard(self, parameters):
+    def _ready_process_events_ready_5_guard(self, parameters):
         element = parameters[0]
         element = parameters[0]
         return element['type'] != 'ConnectingLine'
         return element['type'] != 'ConnectingLine'
     
     
-    def _ready_process_events_ready_7_exec(self, parameters):
+    def _ready_process_events_ready_6_exec(self, parameters):
         element = parameters[0]
         element = parameters[0]
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'connecting_lines', 'ConnectingLine', self, element]))
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'connecting_lines', 'ConnectingLine', self, element]))
     
     
-    def _ready_process_events_ready_7_guard(self, parameters):
+    def _ready_process_events_ready_6_guard(self, parameters):
         element = parameters[0]
         element = parameters[0]
         return element['type'] == 'ConnectingLine'
         return element['type'] == 'ConnectingLine'
     
     
-    def _ready_process_events_ready_8_exec(self, parameters):
+    def _ready_process_events_ready_7_exec(self, parameters):
         result = parameters[0]
         result = parameters[0]
         self.big_step.outputEventOM(Event("start_instance", None, [self, result]))
         self.big_step.outputEventOM(Event("start_instance", None, [self, result]))
     
     
-    def _ready_process_events_ready_9_exec(self, parameters):
+    def _ready_process_events_ready_8_exec(self, parameters):
         group_element = parameters[0]
         group_element = parameters[0]
         new_location = parameters[1]
         new_location = parameters[1]
         self.group_location[group_element] = new_location
         self.group_location[group_element] = new_location
@@ -7510,6 +7813,11 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         
         
         self.coords(self.tmp_line, x, y, self.last_x, self.last_y)
         self.coords(self.tmp_line, x, y, self.last_x, self.last_y)
     
     
+    def _ready_process_events_creating_line_drawing_1_exec(self, parameters):
+        ID = parameters[0]
+        self.delete(self.tmp_line)
+        self.tmp_line = None
+    
     def _ready_process_events_creating_line_drawing_1_guard(self, parameters):
     def _ready_process_events_creating_line_drawing_1_guard(self, parameters):
         ID = parameters[0]
         ID = parameters[0]
         return ID == id(self)
         return ID == id(self)
@@ -7545,12 +7853,24 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         result = parameters[0]
         result = parameters[0]
         self.assoc_type = result
         self.assoc_type = result
     
     
+    def _ready_process_events_creating_line_create_in_mv_wait_for_response_1_exec(self, parameters):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'prompt']))
+    
     def _ready_process_events_creating_line_create_in_mv_wait_for_response_1_guard(self, parameters):
     def _ready_process_events_creating_line_create_in_mv_wait_for_response_1_guard(self, parameters):
         return self.assoc_type is not None
         return self.assoc_type is not None
     
     
+    def _ready_process_events_creating_line_create_in_mv_wait_for_response_2_exec(self, parameters):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'prompt']))
+        self.delete(self.tmp_line)
+        self.tmp_line = None
+    
     def _ready_process_events_creating_line_create_in_mv_wait_for_response_2_guard(self, parameters):
     def _ready_process_events_creating_line_create_in_mv_wait_for_response_2_guard(self, parameters):
         return self.assoc_type is None
         return self.assoc_type is None
     
     
+    def _ready_process_events_creating_line_create_in_mv_create_0_exec(self, parameters):
+        ID = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("rerender_model", None, [])]))
+    
     def _ready_process_events_creating_group_0_exec(self, parameters):
     def _ready_process_events_creating_group_0_exec(self, parameters):
         assoc_name = parameters[0]
         assoc_name = parameters[0]
         self.big_step.outputEventOM(Event("start_instance", None, [self, assoc_name]))
         self.big_step.outputEventOM(Event("start_instance", None, [self, assoc_name]))
@@ -7570,14 +7890,6 @@ class Canvas(RuntimeClassBase, tk.Canvas, SCCDWidget):
         self.to_move[ID] = self.create_location
         self.to_move[ID] = self.create_location
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("rerender_model", None, [])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("rerender_model", None, [])]))
     
     
-    def _ready_process_events_waiting_for_clear_0_exec(self, parameters):
-        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'elements']))
-        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'connecting_lines']))
-        for f in self.elems:
-            self.delete(f[1])
-        self.group_location = {}
-        self.layers = []
-    
     def _ready_update_loading_updating_0_exec(self, parameters):
     def _ready_update_loading_updating_0_exec(self, parameters):
         for i in self.elems:
         for i in self.elems:
             self.itemconfigure(i[1], image=self.loading[i[0]])
             self.itemconfigure(i[1], image=self.loading[i[0]])
@@ -8318,6 +8630,12 @@ class ObjectManager(ObjectManagerBase):
             instance.associations = {}
             instance.associations = {}
             instance.associations["buttons"] = Association("Button", 0, -1)
             instance.associations["buttons"] = Association("Button", 0, -1)
             instance.associations["parent"] = Association("A", 0, -1)
             instance.associations["parent"] = Association("A", 0, -1)
+        elif class_name == "ChoicePrompt":
+            instance = ChoicePrompt(self.controller, construct_params[0], construct_params[1])
+            instance.associations = {}
+            instance.associations["buttons"] = Association("Button", 0, -1)
+            instance.associations["labels"] = Association("Label", 0, -1)
+            instance.associations["parent"] = Association("A", 0, -1)
         elif class_name == "Toolbar":
         elif class_name == "Toolbar":
             instance = Toolbar(self.controller, construct_params[0])
             instance = Toolbar(self.controller, construct_params[0])
             instance.associations = {}
             instance.associations = {}