Forráskód Böngészése

Fixes to create activity

Yentl Van Tendeloo 7 éve
szülő
commit
7f29e5b373

+ 25 - 11
classes/main_app.xml

@@ -16,12 +16,15 @@
 
             self.splash_window = None
 
-            self.address = location
-            self.timeout = 20.0
-            self.username = username
-            self.password = password
             self.open_model = model
             self.limited_mode = limited_mode
+
+            global data
+            data = {}
+            data['username'] = username
+            data['password'] = password
+            data['mv_address'] = location
+            data['timeout'] = 20.0
         </body>
     </constructor>
     <scxml initial="parallel">
@@ -95,7 +98,7 @@
                         <onentry>
                             <raise event="mv_request">
                                 <parameter expr="'init'"/>
-                                <parameter expr="[self.address, self.timeout]"/>
+                                <parameter expr="[data['mv_address'], data['timeout']]"/>
                             </raise>
 
                             <raise event="update_status" scope="narrow" target="self.splash_window">
@@ -118,7 +121,7 @@
                                 <raise event="create_instance" scope="cd">
                                     <parameter expr="'windows'"/>
                                     <parameter expr="'PromptWindow'"/>
-                                    <parameter expr="{'username': self.username, 'password': self.password}"/>
+                                    <parameter expr="{'username': data['username'], 'password': data['password']}"/>
                                     <parameter expr="{'password': {'show': '*'}}"/>
                                 </raise>
                             </onentry>
@@ -141,13 +144,13 @@
                                 <transition event="prompt_results" target=".">
                                     <parameter name="results"/>
                                     <script>
-                                        self.username = results["username"]
-                                        self.password = results["password"]
+                                        data['username'] = results["username"]
+                                        data['password'] = results["password"]
                                     </script>
                                 </transition>
 
-                                <transition event="close_window" cond="self.username == ''" target="../../prompt_username"/>
-                                <transition event="close_window" cond="self.username != ''" target="../../login"/>
+                                <transition event="close_window" cond="data['username'] == ''" target="../../prompt_username"/>
+                                <transition event="close_window" cond="data['username'] != ''" target="../../login"/>
                             </state>
 
                             <onexit>
@@ -161,7 +164,7 @@
                             <onentry>
                                 <raise event="mv_request">
                                     <parameter expr="'login'"/>
-                                    <parameter expr="[self.username, self.password]"/>
+                                    <parameter expr="[data['username'], data['password']]"/>
                                 </raise>
 
                                 <raise event="update_status" scope="narrow" target="self.splash_window">
@@ -193,6 +196,17 @@
                                 </raise>
                             </onentry>
 
+                            <transition event="mv_response" target="../register_conf_bottom"/>
+                        </state>
+
+                        <state id="register_conf_bottom">
+                            <onentry>
+                                <raise event="mv_request">
+                                    <parameter expr="'alter_context'"/>
+                                    <parameter expr="['formalisms/Bottom', 'formalisms/SimpleClassDiagrams']"/>
+                                </raise>
+                            </onentry>
+
                             <transition event="mv_response" target="../upload_models"/>
                         </state>
 

+ 15 - 14
classes/modelverse/modelverse.xml

@@ -557,9 +557,6 @@
                                         self.code = self.parameters[3]
                                     </script>
 
-                                    <raise event="result">
-                                        <parameter expr="self.context"/>
-                                    </raise>
                                 </onentry>
 
                                 <transition target="../edit_metamodel"/>
@@ -567,7 +564,11 @@
                             </state>
 
                             <state id="edit_metamodel">
-                                <transition cond="self.expect_response('Model loaded, ready for commands!')" target="../../../../going_scripted"/>
+                                <transition cond="self.expect_response('Model loaded, ready for commands!')" target="../../../../going_scripted">
+                                    <raise event="result">
+                                        <parameter expr="self.context"/>
+                                    </raise>
+                                </transition>
                                 <transition cond="self.expect_response('Waiting for model constructors...')" target="../send_model"/>
                             </state>
 
@@ -604,10 +605,6 @@
                                         self.actions[self.context] = []
                                         self.code = self.parameters[3]
                                     </script>
-
-                                    <raise event="result">
-                                        <parameter expr="self.context"/>
-                                    </raise>
                                 </onentry>
 
                                 <transition target="../edit_metamodel"/>
@@ -615,7 +612,11 @@
                             </state>
 
                             <state id="edit_metamodel">
-                                <transition cond="self.expect_response('Model loaded, ready for commands!')" target="../../../../going_scripted"/>
+                                <transition cond="self.expect_response('Model loaded, ready for commands!')" target="../../../../going_scripted">
+                                    <raise event="result">
+                                        <parameter expr="self.context"/>
+                                    </raise>
+                                </transition>
                                 <transition cond="self.expect_response('Waiting for code constructors...')" target="../send_model"/>
                             </state>
 
@@ -645,10 +646,6 @@
                                         self.context = str(uuid.uuid4())
                                         self.actions[self.context] = []
                                     </script>
-
-                                    <raise event="result">
-                                        <parameter expr="self.context"/>
-                                    </raise>
                                 </onentry>
 
                                 <transition target="../edit_metamodel"/>
@@ -656,7 +653,11 @@
                             </state>
 
                             <state id="edit_metamodel">
-                                <transition cond="self.expect_response('Model loaded, ready for commands!')" target="../../../../going_scripted"/>
+                                <transition cond="self.expect_response('Model loaded, ready for commands!')" target="../../../../going_scripted">
+                                    <raise event="result">
+                                        <parameter expr="self.context"/>
+                                    </raise>
+                                </transition>
                                 <transition cond="self.expect_response('Success')" target="../../../../wait_for_action/megamodelling">
                                     <raise event="result">
                                         <parameter expr="None"/>

+ 284 - 9
classes/window/create_activity.xml

@@ -381,6 +381,189 @@
                             </transition>
                         </state>
 
+                        <state id="pack_button">
+                            <transition event="tk_widget" target="../../../../create_outputs">
+                                <parameter name="tk_widget"/>
+                                <script>
+                                    tk_widget.grid(row=self.counter, column=3)
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+                </state>
+            </state>
+
+            <state id="create_outputs" initial="check_values">
+                <onentry>
+                    <script>
+                        self.tmp_output_signature = dict(self.create_output_signature)
+                        self.counter = -1
+                        self.output_map = []
+                    </script>
+                </onentry>
+
+                <state id="check_values">
+                    <onentry>
+                        <script>
+                            self.counter += 1
+                        </script>
+                    </onentry>
+                    <transition cond="self.tmp_output_signature" target="../create_entry"/>
+                    <transition cond="not self.tmp_output_signature" target="../create_add_entry"/>
+                </state>
+
+                <state id="create_entry" initial="create_tag">
+                    <onentry>
+                        <script>
+                            self.current = self.tmp_output_signature.popitem()
+                            self.output_map.append([self.current[0], self.current[1]])
+                        </script>
+                    </onentry>
+
+                    <state id="create_tag" initial="create">
+                        <state id="create">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'input_tag'"/>
+                                    <parameter expr="'Entry'"/>
+                                    <parameter expr="{'parent': self.output_frame, 'name': 'output_tag_%s' % self.counter, 'value': self.current[0]}"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="instance_created" target="../pack">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                                <script>
+                                    self.output_map[-1].append(assoc_name)
+                                </script>
+                            </transition>
+                        </state>
+
+                        <state id="pack">
+                            <transition event="tk_widget" target="../../create_MM">
+                                <parameter name="tk_widget"/>
+                                <script>
+                                    tk_widget.grid(row=self.counter,column=0)
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+
+                    <state id="create_MM" initial="create">
+                        <state id="create">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'input_MM_entry'"/>
+                                    <parameter expr="'Entry'"/>
+                                    <parameter expr="{'parent': self.output_frame, 'name': 'output_MM_%s' % self.counter, 'value': self.current[1], 'readonly': True}"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="instance_created" target="../pack">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                                <script>
+                                    self.output_map[-1].append(assoc_name)
+                                </script>
+                            </transition>
+                        </state>
+
+                        <state id="pack">
+                            <transition event="tk_widget" target="../../create_browse">
+                                <parameter name="tk_widget"/>
+                                <script>
+                                    tk_widget.grid(row=self.counter,column=1)
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+
+                    <state id="create_browse" initial="create">
+                        <state id="create">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'input_MM_browse'"/>
+                                    <parameter expr="'Button'"/>
+                                    <parameter expr="{'parent': self.output_frame, 'visual': TextVisual('...'), 'tooltip_text': 'Browse for output metamodel.', 'event_parameters': 'output_browse_%s' % self.counter}"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="instance_created" target="../pack_button">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                                <script>
+                                    self.output_map[-1].append(assoc_name)
+                                </script>
+                            </transition>
+                        </state>
+
+                        <state id="pack_button">
+                            <transition event="tk_widget" target="../../create_delete">
+                                <parameter name="tk_widget"/>
+                                <script>
+                                    tk_widget.grid(row=self.counter, column=2)
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+
+                    <state id="create_delete" initial="create">
+                        <state id="create">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'input_delete'"/>
+                                    <parameter expr="'Button'"/>
+                                    <parameter expr="{'parent': self.output_frame, 'visual': TextVisual('X'), 'tooltip_text': 'Delete tag in signature.', 'event_parameters': 'output_delete_%s' % self.counter}"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="instance_created" target="../pack_button">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                                <script>
+                                    self.output_map[-1].append(assoc_name)
+                                </script>
+                            </transition>
+                        </state>
+
+                        <state id="pack_button">
+                            <transition event="tk_widget" target="../../../check_values">
+                                <parameter name="tk_widget"/>
+                                <script>
+                                    tk_widget.grid(row=self.counter, column=3)
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+                </state>
+
+                <state id="create_add_entry">
+                    <state id="create_button" initial="create">
+                        <state id="create">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'input_MM_browse'"/>
+                                    <parameter expr="'Button'"/>
+                                    <parameter expr="{'parent': self.output_frame, 'visual': TextVisual('+'), 'tooltip_text': 'Create new element in signature.', 'event_parameters': 'add_output'}"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="instance_created" target="../pack_button">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                            </transition>
+                        </state>
+
                         <state id="pack_button">
                             <transition event="tk_widget" target="../../../../../ready">
                                 <parameter name="tk_widget"/>
@@ -409,6 +592,20 @@
                 </script>
             </transition>
 
+            <transition event="button_pressed" cond="evt == 'add_output'" target="../draw_signature">
+                <parameter name="evt"/>
+                <script>
+                    ctr = 0
+                    while 1:
+                        free_id = 'tag_%i' % ctr
+                        if free_id not in self.create_output_signature:
+                            break
+                        else:
+                            ctr += 1
+                    self.create_output_signature[free_id] = ""
+                </script>
+            </transition>
+
             <transition event="button_pressed" cond="evt.startswith('input_delete_')" target="../draw_signature">
                 <parameter name="evt"/>
                 <script>
@@ -417,6 +614,14 @@
                 </script>
             </transition>
 
+            <transition event="button_pressed" cond="evt.startswith('output_delete_')" target="../draw_signature">
+                <parameter name="evt"/>
+                <script>
+                    index = int(evt.split("output_delete_", 1)[1])
+                    del self.create_output_signature[self.output_map[index][0]]
+                </script>
+            </transition>
+
             <transition event="changed_entry" cond="evt == 'name'" target=".">
                 <parameter name="evt"/>
                 <parameter name="new_value"/>
@@ -445,14 +650,35 @@
                 </script>
             </transition>
 
-            <transition event="button_pressed" cond="evt.startswith('input_MM_browse_')" target="../browsing">
+            <transition event="changed_entry" cond="evt.startswith('output_tag_')" target=".">
+                <parameter name="evt"/>
+                <parameter name="new_value"/>
+                <script>
+                    index = int(evt.split("output_tag_", 1)[1])
+                    information = self.output_map[index]
+                    old_tag = information[0]
+                    self.create_output_signature[new_value] = self.create_output_signature.pop(old_tag)
+                    information[0] = new_value
+                </script>
+            </transition>
+
+            <transition event="button_pressed" cond="evt.startswith('input_browse_')" target="../browsing_input">
+                <parameter name="evt"/>
+                <script>
+                    self.current = int(evt.split("input_browse_", 1)[1])
+                    print("Browse button pressed for " + str(self.input_map[self.current]))
+                </script>
+            </transition>
+
+            <transition event="button_pressed" cond="evt.startswith('output_browse_')" target="../browsing_output">
                 <parameter name="evt"/>
                 <script>
-                    self.current = int(evt.split("input_MM_browse_", 1)[1])
+                    self.current = int(evt.split("output_browse_", 1)[1])
+                    print("Browse button pressed for " + str(self.output_map[self.current]))
                 </script>
             </transition>
 
-            <transition event="button_pressed" cond="evt == 'create'" target="../creating">
+            <transition event="button_pressed" cond="evt == 'confirm'" target="../creating">
                 <parameter name="evt"/>
             </transition>
         </state>
@@ -461,24 +687,27 @@
             <onentry>
                 <raise event="mv_request" scope="broad">
                     <parameter expr="'transformation_add_%s' % ({'ManualOperation': 'MANUAL', 'ModelTransformation': 'MT', 'ActionLanguage': 'AL'}[self.activity_type])"/>
-                    <parameter expr="[self.activity_name, self.input_signature, self.output_signature]"/>
+                    <parameter expr="[self.create_input_signature, self.create_output_signature, self.activity_name, '']"/>
                 </raise>
             </onentry>
 
             <transition event="mv_response" target="../modifying_mm">
                 <parameter name="context"/>
                 <script>
-                    print("Starting subprocess")
+                    print("Got context: " + str(context))
                     self.context = context
-                    from runner import run_GUI
                     model_to_modify = "merged/%s" % self.activity_name
-                    self.subprocess = multiprocessing.Proces(target=run_GUI, args=(self.address, self.username, self.password, model_to_modify, True))
+                    self.subprocess = subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--model", model_to_modify, "--limited"])
                 </script>
             </transition>
         </state>
 
         <state id="modifying_mm">
-            <transition cond="not self.subprocess.is_alive()" target="../finish_transformation_add"/>
+            <transition cond="self.subprocess.poll() is not None" target="../finish_transformation_add">
+                <script>
+                    print("Not alive anymore...")
+                </script>
+            </transition>
             <transition after="0.5" target=".">
                 <script>
                     print("Checking whether or not subprocess is still alive...")
@@ -496,6 +725,9 @@
             </onentry>
 
             <transition event="mv_response" target="../closing">
+                <script>
+                    print("FINISHED")
+                </script>
             </transition>
         </state>
 
@@ -513,6 +745,9 @@
                 <raise event="delete_instance" scope="cd">
                     <parameter expr="'input_delete'"/>
                 </raise>
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="'static'"/>
+                </raise>
             </onentry>
             
             <transition target="../closed">
@@ -522,12 +757,13 @@
 
         <state id="closed"/>
 
-        <state id="browsing" initial="creating">
+        <state id="browsing_input" initial="creating">
             <state id="creating">
                 <onentry>
                     <raise event="create_instance" scope="cd">
                         <parameter expr="'browser'"/>
                         <parameter expr="'Browser'"/>
+                        <parameter expr="'Select metamodel for signature of activity.'"/>
                         <parameter expr="None"/>
                     </raise>
                 </onentry>
@@ -559,5 +795,44 @@
                 </transition>
             </state>
         </state>
+
+        <state id="browsing_output" initial="creating">
+            <state id="creating">
+                <onentry>
+                    <raise event="create_instance" scope="cd">
+                        <parameter expr="'browser'"/>
+                        <parameter expr="'Browser'"/>
+                        <parameter expr="'Select metamodel for signature of activity.'"/>
+                        <parameter expr="None"/>
+                    </raise>
+                </onentry>
+
+                <transition event="instance_created" target="../waiting">
+                    <parameter name="assoc_name"/>
+                    <raise event="start_instance" scope="cd">
+                        <parameter expr="assoc_name"/>
+                    </raise>
+                </transition>
+            </state>
+
+            <state id="waiting">
+                <transition event="browse_result" target=".">
+                    <parameter name="result"/>
+                    <raise event="change_value" scope="narrow" target="self.output_map[self.current][3]">
+                        <parameter expr="result"/>
+                    </raise>
+                    <script>
+                        self.create_output_signature[self.output_map[self.current][0]] = result
+                        self.output_map[self.current][1] = result
+                    </script>
+                </transition>
+
+                <transition event="close_window" target="../../ready">
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="'browser'"/>
+                    </raise>
+                </transition>
+            </state>
+        </state>
     </scxml>
 </class>

+ 1 - 1
classes/window/main_window.xml

@@ -263,7 +263,7 @@
                         </state>
 
                         <state id="waiting">
-                            <transition event="window_close" target="../../idle">
+                            <transition event="close_window" target="../../idle">
                                 <raise event="delete_instance" scope="cd">
                                     <parameter expr="self.activity_creator"/>
                                 </raise>

+ 483 - 95
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)
 
-Date:   Thu Oct 19 13:14:27 2017
+Date:   Mon Oct 30 10:35:31 2017
 
 Model author: Yentl Van Tendeloo
 Model name:   Modelverse Visual Editor - Tkinter Version 
@@ -16,6 +16,8 @@ from sccd_widget import SCCDWidget, ImageVisual, TextVisual, ToolTip
 import uuid
 import json
 import urllib
+import subprocess
+import sys
 
 global current_model
 global current_metamodel
@@ -44,12 +46,15 @@ class MainApp(RuntimeClassBase):
         
         self.splash_window = None
         
-        self.address = location
-        self.timeout = 20.0
-        self.username = username
-        self.password = password
         self.open_model = model
         self.limited_mode = limited_mode
+        
+        global data
+        data = {}
+        data['username'] = username
+        data['password'] = password
+        data['mv_address'] = location
+        data['timeout'] = 20.0
     
     def user_defined_destructor(self):
         pass
@@ -108,58 +113,62 @@ class MainApp(RuntimeClassBase):
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD"] = State(13, "/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_register_SCD_enter)
         
+        # state /parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom"] = State(14, "/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_register_conf_bottom_enter)
+        
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models"] = State(14, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models"] = State(15, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models", self)
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_MM_render
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_MM_render"] = State(15, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_MM_render", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_MM_render"] = State(16, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_MM_render", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_MM_render"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_upload_MM_render_enter)
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_render_SCD
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_render_SCD"] = State(16, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_render_SCD", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_render_SCD"] = State(17, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_render_SCD", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_render_SCD"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_upload_render_SCD_enter)
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"] = State(17, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"] = State(18, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD"].setExit(self._parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_exit)
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_class
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_class"] = State(18, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_class", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_class"] = State(19, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_class", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_class"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_trace_class_enter)
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_association
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_association"] = State(19, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_association", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_association"] = State(20, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_association", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/trace_association"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_trace_association_enter)
         
         # state /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/exit
-        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/exit"] = State(20, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/exit", self)
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/exit"] = State(21, "/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/exit", self)
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/modify_render_SCD/exit"].setEnter(self._parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_modify_render_SCD_exit_enter)
         
         # state /parallel/behaviour/init_modelverse/wait_close_splash
-        self.states["/parallel/behaviour/init_modelverse/wait_close_splash"] = State(21, "/parallel/behaviour/init_modelverse/wait_close_splash", self)
+        self.states["/parallel/behaviour/init_modelverse/wait_close_splash"] = State(22, "/parallel/behaviour/init_modelverse/wait_close_splash", self)
         self.states["/parallel/behaviour/init_modelverse/wait_close_splash"].setEnter(self._parallel_behaviour_init_modelverse_wait_close_splash_enter)
         self.states["/parallel/behaviour/init_modelverse/wait_close_splash"].setExit(self._parallel_behaviour_init_modelverse_wait_close_splash_exit)
         
         # state /parallel/behaviour/init_modelverse/closing_splash
-        self.states["/parallel/behaviour/init_modelverse/closing_splash"] = State(22, "/parallel/behaviour/init_modelverse/closing_splash", self)
+        self.states["/parallel/behaviour/init_modelverse/closing_splash"] = State(23, "/parallel/behaviour/init_modelverse/closing_splash", self)
         self.states["/parallel/behaviour/init_modelverse/closing_splash"].setEnter(self._parallel_behaviour_init_modelverse_closing_splash_enter)
         
         # state /parallel/behaviour/init_main_window
-        self.states["/parallel/behaviour/init_main_window"] = State(23, "/parallel/behaviour/init_main_window", self)
+        self.states["/parallel/behaviour/init_main_window"] = State(24, "/parallel/behaviour/init_main_window", self)
         self.states["/parallel/behaviour/init_main_window"].setEnter(self._parallel_behaviour_init_main_window_enter)
         
         # state /parallel/behaviour/main_behaviour
-        self.states["/parallel/behaviour/main_behaviour"] = State(24, "/parallel/behaviour/main_behaviour", self)
+        self.states["/parallel/behaviour/main_behaviour"] = State(25, "/parallel/behaviour/main_behaviour", self)
         
         # state /parallel/behaviour/stopped
-        self.states["/parallel/behaviour/stopped"] = State(25, "/parallel/behaviour/stopped", self)
+        self.states["/parallel/behaviour/stopped"] = State(26, "/parallel/behaviour/stopped", self)
         self.states["/parallel/behaviour/stopped"].setEnter(self._parallel_behaviour_stopped_enter)
         
         # state /parallel/forward_requests
-        self.states["/parallel/forward_requests"] = State(26, "/parallel/forward_requests", self)
+        self.states["/parallel/forward_requests"] = State(27, "/parallel/forward_requests", self)
         
         # state /parallel/forward_requests/forward
-        self.states["/parallel/forward_requests/forward"] = State(27, "/parallel/forward_requests/forward", self)
+        self.states["/parallel/forward_requests/forward"] = State(28, "/parallel/forward_requests/forward", self)
         
         # add children
         self.states[""].addChild(self.states["/parallel"])
@@ -180,6 +189,7 @@ class MainApp(RuntimeClassBase):
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/login"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD"])
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/wait_for_credentials/responsive"])
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models"].addChild(self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_MM_render"])
@@ -254,10 +264,15 @@ class MainApp(RuntimeClassBase):
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/login"].addTransition(_parallel_behaviour_init_modelverse_logging_in_modelverse_login_1)
         
         # transition /parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD
-        _parallel_behaviour_init_modelverse_logging_in_modelverse_register_SCD_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD"], [self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models"]])
+        _parallel_behaviour_init_modelverse_logging_in_modelverse_register_SCD_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD"], [self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom"]])
         _parallel_behaviour_init_modelverse_logging_in_modelverse_register_SCD_0.setTrigger(Event("mv_response", None))
         self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_SCD"].addTransition(_parallel_behaviour_init_modelverse_logging_in_modelverse_register_SCD_0)
         
+        # transition /parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom
+        _parallel_behaviour_init_modelverse_logging_in_modelverse_register_conf_bottom_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom"], [self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models"]])
+        _parallel_behaviour_init_modelverse_logging_in_modelverse_register_conf_bottom_0.setTrigger(Event("mv_response", None))
+        self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/register_conf_bottom"].addTransition(_parallel_behaviour_init_modelverse_logging_in_modelverse_register_conf_bottom_0)
+        
         # transition /parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_MM_render
         _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_upload_MM_render_0 = Transition(self, self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_MM_render"], [self.states["/parallel/behaviour/init_modelverse/logging_in_modelverse/upload_models/upload_render_SCD"]])
         _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_upload_MM_render_0.setTrigger(Event("mv_exception", None))
@@ -352,19 +367,22 @@ class MainApp(RuntimeClassBase):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.splash_window, Event("update_status", None, [10, 'Waiting for HTTP connection to Modelverse...'])]))
     
     def _parallel_behaviour_init_modelverse_initializing_modelverse_enter(self):
-        self.raiseInternalEvent(Event("mv_request", None, ['init', [self.address, self.timeout]]))
+        self.raiseInternalEvent(Event("mv_request", None, ['init', [data['mv_address'], data['timeout']]]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.splash_window, Event("update_status", None, [30, 'Waiting for Modelverse initialization...'])]))
     
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_prompt_username_enter(self):
-        self.big_step.outputEventOM(Event("create_instance", None, [self, 'windows', 'PromptWindow', {'username': self.username, 'password': self.password}, {'password': {'show': '*'}}]))
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'windows', 'PromptWindow', {'username': data['username'], 'password': data['password']}, {'password': {'show': '*'}}]))
     
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_login_enter(self):
-        self.raiseInternalEvent(Event("mv_request", None, ['login', [self.username, self.password]]))
+        self.raiseInternalEvent(Event("mv_request", None, ['login', [data['username'], data['password']]]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.splash_window, Event("update_status", None, [50, 'Logging in...'])]))
     
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_register_SCD_enter(self):
         self.raiseInternalEvent(Event("mv_request", None, ['alter_context', ['formalisms/SimpleClassDiagrams', 'formalisms/SimpleClassDiagrams']]))
     
+    def _parallel_behaviour_init_modelverse_logging_in_modelverse_register_conf_bottom_enter(self):
+        self.raiseInternalEvent(Event("mv_request", None, ['alter_context', ['formalisms/Bottom', 'formalisms/SimpleClassDiagrams']]))
+    
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_upload_models_upload_MM_render_enter(self):
         self.raiseInternalEvent(Event("mv_request", None, ['model_add', ['formalisms/MM_render', 'formalisms/SimpleClassDiagrams', open('models/MM_render.mvc', 'r').read()]]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.splash_window, Event("update_status", None, [75, 'Uploading MM render...'])]))
@@ -420,14 +438,14 @@ class MainApp(RuntimeClassBase):
     
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_wait_for_credentials_responsive_0_exec(self, parameters):
         results = parameters[0]
-        self.username = results["username"]
-        self.password = results["password"]
+        data['username'] = results["username"]
+        data['password'] = results["password"]
     
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_wait_for_credentials_responsive_1_guard(self, parameters):
-        return self.username == ''
+        return data['username'] == ''
     
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_wait_for_credentials_responsive_2_guard(self, parameters):
-        return self.username != ''
+        return data['username'] != ''
     
     def _parallel_behaviour_init_modelverse_logging_in_modelverse_login_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.splash_window, Event("update_status", None, [70, 'Logging in... OK'])]))
@@ -1390,6 +1408,7 @@ class Modelverse(RuntimeClassBase):
         
         # transition /initialized/behaviour/operations/store_on_scripted/transformation_add_MT/edit_metamodel
         _initialized_behaviour_operations_store_on_scripted_transformation_add_MT_edit_metamodel_0 = Transition(self, self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add_MT/edit_metamodel"], [self.states["/initialized/behaviour/going_scripted"]])
+        _initialized_behaviour_operations_store_on_scripted_transformation_add_MT_edit_metamodel_0.setAction(self._initialized_behaviour_operations_store_on_scripted_transformation_add_MT_edit_metamodel_0_exec)
         _initialized_behaviour_operations_store_on_scripted_transformation_add_MT_edit_metamodel_0.setTrigger(None)
         _initialized_behaviour_operations_store_on_scripted_transformation_add_MT_edit_metamodel_0.setGuard(self._initialized_behaviour_operations_store_on_scripted_transformation_add_MT_edit_metamodel_0_guard)
         self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add_MT/edit_metamodel"].addTransition(_initialized_behaviour_operations_store_on_scripted_transformation_add_MT_edit_metamodel_0)
@@ -1412,6 +1431,7 @@ class Modelverse(RuntimeClassBase):
         
         # transition /initialized/behaviour/operations/store_on_scripted/transformation_add_AL/edit_metamodel
         _initialized_behaviour_operations_store_on_scripted_transformation_add_AL_edit_metamodel_0 = Transition(self, self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add_AL/edit_metamodel"], [self.states["/initialized/behaviour/going_scripted"]])
+        _initialized_behaviour_operations_store_on_scripted_transformation_add_AL_edit_metamodel_0.setAction(self._initialized_behaviour_operations_store_on_scripted_transformation_add_AL_edit_metamodel_0_exec)
         _initialized_behaviour_operations_store_on_scripted_transformation_add_AL_edit_metamodel_0.setTrigger(None)
         _initialized_behaviour_operations_store_on_scripted_transformation_add_AL_edit_metamodel_0.setGuard(self._initialized_behaviour_operations_store_on_scripted_transformation_add_AL_edit_metamodel_0_guard)
         self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add_AL/edit_metamodel"].addTransition(_initialized_behaviour_operations_store_on_scripted_transformation_add_AL_edit_metamodel_0)
@@ -1434,6 +1454,7 @@ class Modelverse(RuntimeClassBase):
         
         # transition /initialized/behaviour/operations/store_on_scripted/transformation_add_MANUAL/edit_metamodel
         _initialized_behaviour_operations_store_on_scripted_transformation_add_MANUAL_edit_metamodel_0 = Transition(self, self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add_MANUAL/edit_metamodel"], [self.states["/initialized/behaviour/going_scripted"]])
+        _initialized_behaviour_operations_store_on_scripted_transformation_add_MANUAL_edit_metamodel_0.setAction(self._initialized_behaviour_operations_store_on_scripted_transformation_add_MANUAL_edit_metamodel_0_exec)
         _initialized_behaviour_operations_store_on_scripted_transformation_add_MANUAL_edit_metamodel_0.setTrigger(None)
         _initialized_behaviour_operations_store_on_scripted_transformation_add_MANUAL_edit_metamodel_0.setGuard(self._initialized_behaviour_operations_store_on_scripted_transformation_add_MANUAL_edit_metamodel_0_guard)
         self.states["/initialized/behaviour/operations/store_on_scripted/transformation_add_MANUAL/edit_metamodel"].addTransition(_initialized_behaviour_operations_store_on_scripted_transformation_add_MANUAL_edit_metamodel_0)
@@ -2355,7 +2376,6 @@ class Modelverse(RuntimeClassBase):
         self.context = str(uuid.uuid4())
         self.actions[self.context] = []
         self.code = self.parameters[3]
-        self.raiseInternalEvent(Event("result", None, [self.context]))
     
     def _initialized_behaviour_operations_store_on_scripted_transformation_add_MT_send_model_enter(self):
         self.raiseInternalEvent(Event("request", None, [self.code]))
@@ -2365,7 +2385,6 @@ class Modelverse(RuntimeClassBase):
         self.context = str(uuid.uuid4())
         self.actions[self.context] = []
         self.code = self.parameters[3]
-        self.raiseInternalEvent(Event("result", None, [self.context]))
     
     def _initialized_behaviour_operations_store_on_scripted_transformation_add_AL_send_model_enter(self):
         self.raiseInternalEvent(Event("request", None, [self.code]))
@@ -2374,7 +2393,6 @@ class Modelverse(RuntimeClassBase):
         self.raiseInternalEvent(Event("request", None, [['transformation_add_MANUAL'] + self.dict_to_list(self.parameters[0]) + self.dict_to_list(self.parameters[1]) + [self.parameters[2]]]))
         self.context = str(uuid.uuid4())
         self.actions[self.context] = []
-        self.raiseInternalEvent(Event("result", None, [self.context]))
     
     def _initialized_behaviour_operations_store_on_scripted_transformation_execute_send_operation_enter(self):
         self.raiseInternalEvent(Event("request", None, [['transformation_execute', self.parameters[0]] + self.dict_to_list(self.parameters[1]) + self.dict_to_list(self.parameters[2])]))
@@ -2918,6 +2936,9 @@ class Modelverse(RuntimeClassBase):
     def _initialized_behaviour_operations_transformation_signature_0_guard(self, parameters):
         return self.expect_response_partial('Success: ', pop=False)
     
+    def _initialized_behaviour_operations_store_on_scripted_transformation_add_MT_edit_metamodel_0_exec(self, parameters):
+        self.raiseInternalEvent(Event("result", None, [self.context]))
+    
     def _initialized_behaviour_operations_store_on_scripted_transformation_add_MT_edit_metamodel_0_guard(self, parameters):
         return self.expect_response('Model loaded, ready for commands!')
     
@@ -2930,6 +2951,9 @@ class Modelverse(RuntimeClassBase):
     def _initialized_behaviour_operations_store_on_scripted_transformation_add_MT_send_model_0_guard(self, parameters):
         return self.expect_response('Success')
     
+    def _initialized_behaviour_operations_store_on_scripted_transformation_add_AL_edit_metamodel_0_exec(self, parameters):
+        self.raiseInternalEvent(Event("result", None, [self.context]))
+    
     def _initialized_behaviour_operations_store_on_scripted_transformation_add_AL_edit_metamodel_0_guard(self, parameters):
         return self.expect_response('Model loaded, ready for commands!')
     
@@ -2942,6 +2966,9 @@ class Modelverse(RuntimeClassBase):
     def _initialized_behaviour_operations_store_on_scripted_transformation_add_AL_send_model_0_guard(self, parameters):
         return self.expect_response('Success')
     
+    def _initialized_behaviour_operations_store_on_scripted_transformation_add_MANUAL_edit_metamodel_0_exec(self, parameters):
+        self.raiseInternalEvent(Event("result", None, [self.context]))
+    
     def _initialized_behaviour_operations_store_on_scripted_transformation_add_MANUAL_edit_metamodel_0_guard(self, parameters):
         return self.expect_response('Model loaded, ready for commands!')
     
@@ -5309,7 +5336,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         # transition /init/init/running/create_activity/waiting
         _init_init_running_create_activity_waiting_0 = Transition(self, self.states["/init/init/running/create_activity/waiting"], [self.states["/init/init/running/idle"]])
         _init_init_running_create_activity_waiting_0.setAction(self._init_init_running_create_activity_waiting_0_exec)
-        _init_init_running_create_activity_waiting_0.setTrigger(Event("window_close", None))
+        _init_init_running_create_activity_waiting_0.setTrigger(Event("close_window", None))
         self.states["/init/init/running/create_activity/waiting"].addTransition(_init_init_running_create_activity_waiting_0)
         
         # transition /init/init/running/add_object_diagrams/init
@@ -8272,38 +8299,113 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         # state /draw_signature/create_inputs/create_add_entry/create_button/pack_button
         self.states["/draw_signature/create_inputs/create_add_entry/create_button/pack_button"] = State(41, "/draw_signature/create_inputs/create_add_entry/create_button/pack_button", self)
         
+        # state /draw_signature/create_outputs
+        self.states["/draw_signature/create_outputs"] = State(42, "/draw_signature/create_outputs", self)
+        self.states["/draw_signature/create_outputs"].setEnter(self._draw_signature_create_outputs_enter)
+        
+        # state /draw_signature/create_outputs/check_values
+        self.states["/draw_signature/create_outputs/check_values"] = State(43, "/draw_signature/create_outputs/check_values", self)
+        self.states["/draw_signature/create_outputs/check_values"].setEnter(self._draw_signature_create_outputs_check_values_enter)
+        
+        # state /draw_signature/create_outputs/create_entry
+        self.states["/draw_signature/create_outputs/create_entry"] = State(44, "/draw_signature/create_outputs/create_entry", self)
+        self.states["/draw_signature/create_outputs/create_entry"].setEnter(self._draw_signature_create_outputs_create_entry_enter)
+        
+        # state /draw_signature/create_outputs/create_entry/create_tag
+        self.states["/draw_signature/create_outputs/create_entry/create_tag"] = State(45, "/draw_signature/create_outputs/create_entry/create_tag", self)
+        
+        # state /draw_signature/create_outputs/create_entry/create_tag/create
+        self.states["/draw_signature/create_outputs/create_entry/create_tag/create"] = State(46, "/draw_signature/create_outputs/create_entry/create_tag/create", self)
+        self.states["/draw_signature/create_outputs/create_entry/create_tag/create"].setEnter(self._draw_signature_create_outputs_create_entry_create_tag_create_enter)
+        
+        # state /draw_signature/create_outputs/create_entry/create_tag/pack
+        self.states["/draw_signature/create_outputs/create_entry/create_tag/pack"] = State(47, "/draw_signature/create_outputs/create_entry/create_tag/pack", self)
+        
+        # state /draw_signature/create_outputs/create_entry/create_MM
+        self.states["/draw_signature/create_outputs/create_entry/create_MM"] = State(48, "/draw_signature/create_outputs/create_entry/create_MM", self)
+        
+        # state /draw_signature/create_outputs/create_entry/create_MM/create
+        self.states["/draw_signature/create_outputs/create_entry/create_MM/create"] = State(49, "/draw_signature/create_outputs/create_entry/create_MM/create", self)
+        self.states["/draw_signature/create_outputs/create_entry/create_MM/create"].setEnter(self._draw_signature_create_outputs_create_entry_create_MM_create_enter)
+        
+        # state /draw_signature/create_outputs/create_entry/create_MM/pack
+        self.states["/draw_signature/create_outputs/create_entry/create_MM/pack"] = State(50, "/draw_signature/create_outputs/create_entry/create_MM/pack", self)
+        
+        # state /draw_signature/create_outputs/create_entry/create_browse
+        self.states["/draw_signature/create_outputs/create_entry/create_browse"] = State(51, "/draw_signature/create_outputs/create_entry/create_browse", self)
+        
+        # state /draw_signature/create_outputs/create_entry/create_browse/create
+        self.states["/draw_signature/create_outputs/create_entry/create_browse/create"] = State(52, "/draw_signature/create_outputs/create_entry/create_browse/create", self)
+        self.states["/draw_signature/create_outputs/create_entry/create_browse/create"].setEnter(self._draw_signature_create_outputs_create_entry_create_browse_create_enter)
+        
+        # state /draw_signature/create_outputs/create_entry/create_browse/pack_button
+        self.states["/draw_signature/create_outputs/create_entry/create_browse/pack_button"] = State(53, "/draw_signature/create_outputs/create_entry/create_browse/pack_button", self)
+        
+        # state /draw_signature/create_outputs/create_entry/create_delete
+        self.states["/draw_signature/create_outputs/create_entry/create_delete"] = State(54, "/draw_signature/create_outputs/create_entry/create_delete", self)
+        
+        # state /draw_signature/create_outputs/create_entry/create_delete/create
+        self.states["/draw_signature/create_outputs/create_entry/create_delete/create"] = State(55, "/draw_signature/create_outputs/create_entry/create_delete/create", self)
+        self.states["/draw_signature/create_outputs/create_entry/create_delete/create"].setEnter(self._draw_signature_create_outputs_create_entry_create_delete_create_enter)
+        
+        # state /draw_signature/create_outputs/create_entry/create_delete/pack_button
+        self.states["/draw_signature/create_outputs/create_entry/create_delete/pack_button"] = State(56, "/draw_signature/create_outputs/create_entry/create_delete/pack_button", self)
+        
+        # state /draw_signature/create_outputs/create_add_entry
+        self.states["/draw_signature/create_outputs/create_add_entry"] = State(57, "/draw_signature/create_outputs/create_add_entry", self)
+        
+        # state /draw_signature/create_outputs/create_add_entry/create_button
+        self.states["/draw_signature/create_outputs/create_add_entry/create_button"] = State(58, "/draw_signature/create_outputs/create_add_entry/create_button", self)
+        
+        # state /draw_signature/create_outputs/create_add_entry/create_button/create
+        self.states["/draw_signature/create_outputs/create_add_entry/create_button/create"] = State(59, "/draw_signature/create_outputs/create_add_entry/create_button/create", self)
+        self.states["/draw_signature/create_outputs/create_add_entry/create_button/create"].setEnter(self._draw_signature_create_outputs_create_add_entry_create_button_create_enter)
+        
+        # state /draw_signature/create_outputs/create_add_entry/create_button/pack_button
+        self.states["/draw_signature/create_outputs/create_add_entry/create_button/pack_button"] = State(60, "/draw_signature/create_outputs/create_add_entry/create_button/pack_button", self)
+        
         # state /ready
-        self.states["/ready"] = State(42, "/ready", self)
+        self.states["/ready"] = State(61, "/ready", self)
         
         # state /creating
-        self.states["/creating"] = State(43, "/creating", self)
+        self.states["/creating"] = State(62, "/creating", self)
         self.states["/creating"].setEnter(self._creating_enter)
         
         # state /modifying_mm
-        self.states["/modifying_mm"] = State(44, "/modifying_mm", self)
+        self.states["/modifying_mm"] = State(63, "/modifying_mm", self)
         self.states["/modifying_mm"].setEnter(self._modifying_mm_enter)
         self.states["/modifying_mm"].setExit(self._modifying_mm_exit)
         
         # state /finish_transformation_add
-        self.states["/finish_transformation_add"] = State(45, "/finish_transformation_add", self)
+        self.states["/finish_transformation_add"] = State(64, "/finish_transformation_add", self)
         self.states["/finish_transformation_add"].setEnter(self._finish_transformation_add_enter)
         
         # state /closing
-        self.states["/closing"] = State(46, "/closing", self)
+        self.states["/closing"] = State(65, "/closing", self)
         self.states["/closing"].setEnter(self._closing_enter)
         
         # state /closed
-        self.states["/closed"] = State(47, "/closed", self)
+        self.states["/closed"] = State(66, "/closed", self)
+        
+        # state /browsing_input
+        self.states["/browsing_input"] = State(67, "/browsing_input", self)
+        
+        # state /browsing_input/creating
+        self.states["/browsing_input/creating"] = State(68, "/browsing_input/creating", self)
+        self.states["/browsing_input/creating"].setEnter(self._browsing_input_creating_enter)
         
-        # state /browsing
-        self.states["/browsing"] = State(48, "/browsing", self)
+        # state /browsing_input/waiting
+        self.states["/browsing_input/waiting"] = State(69, "/browsing_input/waiting", self)
         
-        # state /browsing/creating
-        self.states["/browsing/creating"] = State(49, "/browsing/creating", self)
-        self.states["/browsing/creating"].setEnter(self._browsing_creating_enter)
+        # state /browsing_output
+        self.states["/browsing_output"] = State(70, "/browsing_output", self)
         
-        # state /browsing/waiting
-        self.states["/browsing/waiting"] = State(50, "/browsing/waiting", self)
+        # state /browsing_output/creating
+        self.states["/browsing_output/creating"] = State(71, "/browsing_output/creating", self)
+        self.states["/browsing_output/creating"].setEnter(self._browsing_output_creating_enter)
+        
+        # state /browsing_output/waiting
+        self.states["/browsing_output/waiting"] = State(72, "/browsing_output/waiting", self)
         
         # add children
         self.states[""].addChild(self.states["/init"])
@@ -8314,7 +8416,8 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states[""].addChild(self.states["/finish_transformation_add"])
         self.states[""].addChild(self.states["/closing"])
         self.states[""].addChild(self.states["/closed"])
-        self.states[""].addChild(self.states["/browsing"])
+        self.states[""].addChild(self.states["/browsing_input"])
+        self.states[""].addChild(self.states["/browsing_output"])
         self.states["/init"].addChild(self.states["/init/create_activity_info"])
         self.states["/init"].addChild(self.states["/init/create_confirm"])
         self.states["/init/create_activity_info"].addChild(self.states["/init/create_activity_info/create_name"])
@@ -8336,6 +8439,7 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/init/create_confirm/create_create/button"].addChild(self.states["/init/create_confirm/create_create/button/create"])
         self.states["/init/create_confirm/create_create/button"].addChild(self.states["/init/create_confirm/create_create/button/pack"])
         self.states["/draw_signature"].addChild(self.states["/draw_signature/create_inputs"])
+        self.states["/draw_signature"].addChild(self.states["/draw_signature/create_outputs"])
         self.states["/draw_signature/create_inputs"].addChild(self.states["/draw_signature/create_inputs/check_values"])
         self.states["/draw_signature/create_inputs"].addChild(self.states["/draw_signature/create_inputs/create_entry"])
         self.states["/draw_signature/create_inputs"].addChild(self.states["/draw_signature/create_inputs/create_add_entry"])
@@ -8354,8 +8458,28 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/draw_signature/create_inputs/create_add_entry"].addChild(self.states["/draw_signature/create_inputs/create_add_entry/create_button"])
         self.states["/draw_signature/create_inputs/create_add_entry/create_button"].addChild(self.states["/draw_signature/create_inputs/create_add_entry/create_button/create"])
         self.states["/draw_signature/create_inputs/create_add_entry/create_button"].addChild(self.states["/draw_signature/create_inputs/create_add_entry/create_button/pack_button"])
-        self.states["/browsing"].addChild(self.states["/browsing/creating"])
-        self.states["/browsing"].addChild(self.states["/browsing/waiting"])
+        self.states["/draw_signature/create_outputs"].addChild(self.states["/draw_signature/create_outputs/check_values"])
+        self.states["/draw_signature/create_outputs"].addChild(self.states["/draw_signature/create_outputs/create_entry"])
+        self.states["/draw_signature/create_outputs"].addChild(self.states["/draw_signature/create_outputs/create_add_entry"])
+        self.states["/draw_signature/create_outputs/create_entry"].addChild(self.states["/draw_signature/create_outputs/create_entry/create_tag"])
+        self.states["/draw_signature/create_outputs/create_entry"].addChild(self.states["/draw_signature/create_outputs/create_entry/create_MM"])
+        self.states["/draw_signature/create_outputs/create_entry"].addChild(self.states["/draw_signature/create_outputs/create_entry/create_browse"])
+        self.states["/draw_signature/create_outputs/create_entry"].addChild(self.states["/draw_signature/create_outputs/create_entry/create_delete"])
+        self.states["/draw_signature/create_outputs/create_entry/create_tag"].addChild(self.states["/draw_signature/create_outputs/create_entry/create_tag/create"])
+        self.states["/draw_signature/create_outputs/create_entry/create_tag"].addChild(self.states["/draw_signature/create_outputs/create_entry/create_tag/pack"])
+        self.states["/draw_signature/create_outputs/create_entry/create_MM"].addChild(self.states["/draw_signature/create_outputs/create_entry/create_MM/create"])
+        self.states["/draw_signature/create_outputs/create_entry/create_MM"].addChild(self.states["/draw_signature/create_outputs/create_entry/create_MM/pack"])
+        self.states["/draw_signature/create_outputs/create_entry/create_browse"].addChild(self.states["/draw_signature/create_outputs/create_entry/create_browse/create"])
+        self.states["/draw_signature/create_outputs/create_entry/create_browse"].addChild(self.states["/draw_signature/create_outputs/create_entry/create_browse/pack_button"])
+        self.states["/draw_signature/create_outputs/create_entry/create_delete"].addChild(self.states["/draw_signature/create_outputs/create_entry/create_delete/create"])
+        self.states["/draw_signature/create_outputs/create_entry/create_delete"].addChild(self.states["/draw_signature/create_outputs/create_entry/create_delete/pack_button"])
+        self.states["/draw_signature/create_outputs/create_add_entry"].addChild(self.states["/draw_signature/create_outputs/create_add_entry/create_button"])
+        self.states["/draw_signature/create_outputs/create_add_entry/create_button"].addChild(self.states["/draw_signature/create_outputs/create_add_entry/create_button/create"])
+        self.states["/draw_signature/create_outputs/create_add_entry/create_button"].addChild(self.states["/draw_signature/create_outputs/create_add_entry/create_button/pack_button"])
+        self.states["/browsing_input"].addChild(self.states["/browsing_input/creating"])
+        self.states["/browsing_input"].addChild(self.states["/browsing_input/waiting"])
+        self.states["/browsing_output"].addChild(self.states["/browsing_output/creating"])
+        self.states["/browsing_output"].addChild(self.states["/browsing_output/waiting"])
         self.states[""].fixTree()
         self.states[""].default_state = self.states["/init"]
         self.states["/init"].default_state = self.states["/init/create_activity_info"]
@@ -8378,7 +8502,16 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/draw_signature/create_inputs/create_entry/create_delete"].default_state = self.states["/draw_signature/create_inputs/create_entry/create_delete/create"]
         self.states["/draw_signature/create_inputs/create_add_entry"].default_state = self.states["/draw_signature/create_inputs/create_add_entry/create_button"]
         self.states["/draw_signature/create_inputs/create_add_entry/create_button"].default_state = self.states["/draw_signature/create_inputs/create_add_entry/create_button/create"]
-        self.states["/browsing"].default_state = self.states["/browsing/creating"]
+        self.states["/draw_signature/create_outputs"].default_state = self.states["/draw_signature/create_outputs/check_values"]
+        self.states["/draw_signature/create_outputs/create_entry"].default_state = self.states["/draw_signature/create_outputs/create_entry/create_tag"]
+        self.states["/draw_signature/create_outputs/create_entry/create_tag"].default_state = self.states["/draw_signature/create_outputs/create_entry/create_tag/create"]
+        self.states["/draw_signature/create_outputs/create_entry/create_MM"].default_state = self.states["/draw_signature/create_outputs/create_entry/create_MM/create"]
+        self.states["/draw_signature/create_outputs/create_entry/create_browse"].default_state = self.states["/draw_signature/create_outputs/create_entry/create_browse/create"]
+        self.states["/draw_signature/create_outputs/create_entry/create_delete"].default_state = self.states["/draw_signature/create_outputs/create_entry/create_delete/create"]
+        self.states["/draw_signature/create_outputs/create_add_entry"].default_state = self.states["/draw_signature/create_outputs/create_add_entry/create_button"]
+        self.states["/draw_signature/create_outputs/create_add_entry/create_button"].default_state = self.states["/draw_signature/create_outputs/create_add_entry/create_button/create"]
+        self.states["/browsing_input"].default_state = self.states["/browsing_input/creating"]
+        self.states["/browsing_output"].default_state = self.states["/browsing_output/creating"]
         
         # transition /init/create_activity_info/create_name/label/create
         _init_create_activity_info_create_name_label_create_0 = Transition(self, self.states["/init/create_activity_info/create_name/label/create"], [self.states["/init/create_activity_info/create_name/label/pack"]])
@@ -8505,11 +8638,81 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/draw_signature/create_inputs/create_add_entry/create_button/create"].addTransition(_draw_signature_create_inputs_create_add_entry_create_button_create_0)
         
         # transition /draw_signature/create_inputs/create_add_entry/create_button/pack_button
-        _draw_signature_create_inputs_create_add_entry_create_button_pack_button_0 = Transition(self, self.states["/draw_signature/create_inputs/create_add_entry/create_button/pack_button"], [self.states["/ready"]])
+        _draw_signature_create_inputs_create_add_entry_create_button_pack_button_0 = Transition(self, self.states["/draw_signature/create_inputs/create_add_entry/create_button/pack_button"], [self.states["/draw_signature/create_outputs"]])
         _draw_signature_create_inputs_create_add_entry_create_button_pack_button_0.setAction(self._draw_signature_create_inputs_create_add_entry_create_button_pack_button_0_exec)
         _draw_signature_create_inputs_create_add_entry_create_button_pack_button_0.setTrigger(Event("tk_widget", None))
         self.states["/draw_signature/create_inputs/create_add_entry/create_button/pack_button"].addTransition(_draw_signature_create_inputs_create_add_entry_create_button_pack_button_0)
         
+        # transition /draw_signature/create_outputs/check_values
+        _draw_signature_create_outputs_check_values_0 = Transition(self, self.states["/draw_signature/create_outputs/check_values"], [self.states["/draw_signature/create_outputs/create_entry"]])
+        _draw_signature_create_outputs_check_values_0.setTrigger(None)
+        _draw_signature_create_outputs_check_values_0.setGuard(self._draw_signature_create_outputs_check_values_0_guard)
+        self.states["/draw_signature/create_outputs/check_values"].addTransition(_draw_signature_create_outputs_check_values_0)
+        _draw_signature_create_outputs_check_values_1 = Transition(self, self.states["/draw_signature/create_outputs/check_values"], [self.states["/draw_signature/create_outputs/create_add_entry"]])
+        _draw_signature_create_outputs_check_values_1.setTrigger(None)
+        _draw_signature_create_outputs_check_values_1.setGuard(self._draw_signature_create_outputs_check_values_1_guard)
+        self.states["/draw_signature/create_outputs/check_values"].addTransition(_draw_signature_create_outputs_check_values_1)
+        
+        # transition /draw_signature/create_outputs/create_entry/create_tag/create
+        _draw_signature_create_outputs_create_entry_create_tag_create_0 = Transition(self, self.states["/draw_signature/create_outputs/create_entry/create_tag/create"], [self.states["/draw_signature/create_outputs/create_entry/create_tag/pack"]])
+        _draw_signature_create_outputs_create_entry_create_tag_create_0.setAction(self._draw_signature_create_outputs_create_entry_create_tag_create_0_exec)
+        _draw_signature_create_outputs_create_entry_create_tag_create_0.setTrigger(Event("instance_created", None))
+        self.states["/draw_signature/create_outputs/create_entry/create_tag/create"].addTransition(_draw_signature_create_outputs_create_entry_create_tag_create_0)
+        
+        # transition /draw_signature/create_outputs/create_entry/create_tag/pack
+        _draw_signature_create_outputs_create_entry_create_tag_pack_0 = Transition(self, self.states["/draw_signature/create_outputs/create_entry/create_tag/pack"], [self.states["/draw_signature/create_outputs/create_entry/create_MM"]])
+        _draw_signature_create_outputs_create_entry_create_tag_pack_0.setAction(self._draw_signature_create_outputs_create_entry_create_tag_pack_0_exec)
+        _draw_signature_create_outputs_create_entry_create_tag_pack_0.setTrigger(Event("tk_widget", None))
+        self.states["/draw_signature/create_outputs/create_entry/create_tag/pack"].addTransition(_draw_signature_create_outputs_create_entry_create_tag_pack_0)
+        
+        # transition /draw_signature/create_outputs/create_entry/create_MM/create
+        _draw_signature_create_outputs_create_entry_create_MM_create_0 = Transition(self, self.states["/draw_signature/create_outputs/create_entry/create_MM/create"], [self.states["/draw_signature/create_outputs/create_entry/create_MM/pack"]])
+        _draw_signature_create_outputs_create_entry_create_MM_create_0.setAction(self._draw_signature_create_outputs_create_entry_create_MM_create_0_exec)
+        _draw_signature_create_outputs_create_entry_create_MM_create_0.setTrigger(Event("instance_created", None))
+        self.states["/draw_signature/create_outputs/create_entry/create_MM/create"].addTransition(_draw_signature_create_outputs_create_entry_create_MM_create_0)
+        
+        # transition /draw_signature/create_outputs/create_entry/create_MM/pack
+        _draw_signature_create_outputs_create_entry_create_MM_pack_0 = Transition(self, self.states["/draw_signature/create_outputs/create_entry/create_MM/pack"], [self.states["/draw_signature/create_outputs/create_entry/create_browse"]])
+        _draw_signature_create_outputs_create_entry_create_MM_pack_0.setAction(self._draw_signature_create_outputs_create_entry_create_MM_pack_0_exec)
+        _draw_signature_create_outputs_create_entry_create_MM_pack_0.setTrigger(Event("tk_widget", None))
+        self.states["/draw_signature/create_outputs/create_entry/create_MM/pack"].addTransition(_draw_signature_create_outputs_create_entry_create_MM_pack_0)
+        
+        # transition /draw_signature/create_outputs/create_entry/create_browse/create
+        _draw_signature_create_outputs_create_entry_create_browse_create_0 = Transition(self, self.states["/draw_signature/create_outputs/create_entry/create_browse/create"], [self.states["/draw_signature/create_outputs/create_entry/create_browse/pack_button"]])
+        _draw_signature_create_outputs_create_entry_create_browse_create_0.setAction(self._draw_signature_create_outputs_create_entry_create_browse_create_0_exec)
+        _draw_signature_create_outputs_create_entry_create_browse_create_0.setTrigger(Event("instance_created", None))
+        self.states["/draw_signature/create_outputs/create_entry/create_browse/create"].addTransition(_draw_signature_create_outputs_create_entry_create_browse_create_0)
+        
+        # transition /draw_signature/create_outputs/create_entry/create_browse/pack_button
+        _draw_signature_create_outputs_create_entry_create_browse_pack_button_0 = Transition(self, self.states["/draw_signature/create_outputs/create_entry/create_browse/pack_button"], [self.states["/draw_signature/create_outputs/create_entry/create_delete"]])
+        _draw_signature_create_outputs_create_entry_create_browse_pack_button_0.setAction(self._draw_signature_create_outputs_create_entry_create_browse_pack_button_0_exec)
+        _draw_signature_create_outputs_create_entry_create_browse_pack_button_0.setTrigger(Event("tk_widget", None))
+        self.states["/draw_signature/create_outputs/create_entry/create_browse/pack_button"].addTransition(_draw_signature_create_outputs_create_entry_create_browse_pack_button_0)
+        
+        # transition /draw_signature/create_outputs/create_entry/create_delete/create
+        _draw_signature_create_outputs_create_entry_create_delete_create_0 = Transition(self, self.states["/draw_signature/create_outputs/create_entry/create_delete/create"], [self.states["/draw_signature/create_outputs/create_entry/create_delete/pack_button"]])
+        _draw_signature_create_outputs_create_entry_create_delete_create_0.setAction(self._draw_signature_create_outputs_create_entry_create_delete_create_0_exec)
+        _draw_signature_create_outputs_create_entry_create_delete_create_0.setTrigger(Event("instance_created", None))
+        self.states["/draw_signature/create_outputs/create_entry/create_delete/create"].addTransition(_draw_signature_create_outputs_create_entry_create_delete_create_0)
+        
+        # transition /draw_signature/create_outputs/create_entry/create_delete/pack_button
+        _draw_signature_create_outputs_create_entry_create_delete_pack_button_0 = Transition(self, self.states["/draw_signature/create_outputs/create_entry/create_delete/pack_button"], [self.states["/draw_signature/create_outputs/check_values"]])
+        _draw_signature_create_outputs_create_entry_create_delete_pack_button_0.setAction(self._draw_signature_create_outputs_create_entry_create_delete_pack_button_0_exec)
+        _draw_signature_create_outputs_create_entry_create_delete_pack_button_0.setTrigger(Event("tk_widget", None))
+        self.states["/draw_signature/create_outputs/create_entry/create_delete/pack_button"].addTransition(_draw_signature_create_outputs_create_entry_create_delete_pack_button_0)
+        
+        # transition /draw_signature/create_outputs/create_add_entry/create_button/create
+        _draw_signature_create_outputs_create_add_entry_create_button_create_0 = Transition(self, self.states["/draw_signature/create_outputs/create_add_entry/create_button/create"], [self.states["/draw_signature/create_outputs/create_add_entry/create_button/pack_button"]])
+        _draw_signature_create_outputs_create_add_entry_create_button_create_0.setAction(self._draw_signature_create_outputs_create_add_entry_create_button_create_0_exec)
+        _draw_signature_create_outputs_create_add_entry_create_button_create_0.setTrigger(Event("instance_created", None))
+        self.states["/draw_signature/create_outputs/create_add_entry/create_button/create"].addTransition(_draw_signature_create_outputs_create_add_entry_create_button_create_0)
+        
+        # transition /draw_signature/create_outputs/create_add_entry/create_button/pack_button
+        _draw_signature_create_outputs_create_add_entry_create_button_pack_button_0 = Transition(self, self.states["/draw_signature/create_outputs/create_add_entry/create_button/pack_button"], [self.states["/ready"]])
+        _draw_signature_create_outputs_create_add_entry_create_button_pack_button_0.setAction(self._draw_signature_create_outputs_create_add_entry_create_button_pack_button_0_exec)
+        _draw_signature_create_outputs_create_add_entry_create_button_pack_button_0.setTrigger(Event("tk_widget", None))
+        self.states["/draw_signature/create_outputs/create_add_entry/create_button/pack_button"].addTransition(_draw_signature_create_outputs_create_add_entry_create_button_pack_button_0)
+        
         # transition /ready
         _ready_0 = Transition(self, self.states["/ready"], [self.states["/draw_signature"]])
         _ready_0.setAction(self._ready_0_exec)
@@ -8521,14 +8724,14 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         _ready_1.setTrigger(Event("button_pressed", None))
         _ready_1.setGuard(self._ready_1_guard)
         self.states["/ready"].addTransition(_ready_1)
-        _ready_2 = Transition(self, self.states["/ready"], [self.states["/ready"]])
+        _ready_2 = Transition(self, self.states["/ready"], [self.states["/draw_signature"]])
         _ready_2.setAction(self._ready_2_exec)
-        _ready_2.setTrigger(Event("changed_entry", None))
+        _ready_2.setTrigger(Event("button_pressed", None))
         _ready_2.setGuard(self._ready_2_guard)
         self.states["/ready"].addTransition(_ready_2)
-        _ready_3 = Transition(self, self.states["/ready"], [self.states["/ready"]])
+        _ready_3 = Transition(self, self.states["/ready"], [self.states["/draw_signature"]])
         _ready_3.setAction(self._ready_3_exec)
-        _ready_3.setTrigger(Event("changed_dropdown", None))
+        _ready_3.setTrigger(Event("button_pressed", None))
         _ready_3.setGuard(self._ready_3_guard)
         self.states["/ready"].addTransition(_ready_3)
         _ready_4 = Transition(self, self.states["/ready"], [self.states["/ready"]])
@@ -8536,15 +8739,35 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         _ready_4.setTrigger(Event("changed_entry", None))
         _ready_4.setGuard(self._ready_4_guard)
         self.states["/ready"].addTransition(_ready_4)
-        _ready_5 = Transition(self, self.states["/ready"], [self.states["/browsing"]])
+        _ready_5 = Transition(self, self.states["/ready"], [self.states["/ready"]])
         _ready_5.setAction(self._ready_5_exec)
-        _ready_5.setTrigger(Event("button_pressed", None))
+        _ready_5.setTrigger(Event("changed_dropdown", None))
         _ready_5.setGuard(self._ready_5_guard)
         self.states["/ready"].addTransition(_ready_5)
-        _ready_6 = Transition(self, self.states["/ready"], [self.states["/creating"]])
-        _ready_6.setTrigger(Event("button_pressed", None))
+        _ready_6 = Transition(self, self.states["/ready"], [self.states["/ready"]])
+        _ready_6.setAction(self._ready_6_exec)
+        _ready_6.setTrigger(Event("changed_entry", None))
         _ready_6.setGuard(self._ready_6_guard)
         self.states["/ready"].addTransition(_ready_6)
+        _ready_7 = Transition(self, self.states["/ready"], [self.states["/ready"]])
+        _ready_7.setAction(self._ready_7_exec)
+        _ready_7.setTrigger(Event("changed_entry", None))
+        _ready_7.setGuard(self._ready_7_guard)
+        self.states["/ready"].addTransition(_ready_7)
+        _ready_8 = Transition(self, self.states["/ready"], [self.states["/browsing_input"]])
+        _ready_8.setAction(self._ready_8_exec)
+        _ready_8.setTrigger(Event("button_pressed", None))
+        _ready_8.setGuard(self._ready_8_guard)
+        self.states["/ready"].addTransition(_ready_8)
+        _ready_9 = Transition(self, self.states["/ready"], [self.states["/browsing_output"]])
+        _ready_9.setAction(self._ready_9_exec)
+        _ready_9.setTrigger(Event("button_pressed", None))
+        _ready_9.setGuard(self._ready_9_guard)
+        self.states["/ready"].addTransition(_ready_9)
+        _ready_10 = Transition(self, self.states["/ready"], [self.states["/creating"]])
+        _ready_10.setTrigger(Event("button_pressed", None))
+        _ready_10.setGuard(self._ready_10_guard)
+        self.states["/ready"].addTransition(_ready_10)
         
         # transition /creating
         _creating_0 = Transition(self, self.states["/creating"], [self.states["/modifying_mm"]])
@@ -8554,6 +8777,7 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         
         # transition /modifying_mm
         _modifying_mm_0 = Transition(self, self.states["/modifying_mm"], [self.states["/finish_transformation_add"]])
+        _modifying_mm_0.setAction(self._modifying_mm_0_exec)
         _modifying_mm_0.setTrigger(None)
         _modifying_mm_0.setGuard(self._modifying_mm_0_guard)
         self.states["/modifying_mm"].addTransition(_modifying_mm_0)
@@ -8564,6 +8788,7 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         
         # transition /finish_transformation_add
         _finish_transformation_add_0 = Transition(self, self.states["/finish_transformation_add"], [self.states["/closing"]])
+        _finish_transformation_add_0.setAction(self._finish_transformation_add_0_exec)
         _finish_transformation_add_0.setTrigger(Event("mv_response", None))
         self.states["/finish_transformation_add"].addTransition(_finish_transformation_add_0)
         
@@ -8573,21 +8798,37 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         _closing_0.setTrigger(None)
         self.states["/closing"].addTransition(_closing_0)
         
-        # transition /browsing/creating
-        _browsing_creating_0 = Transition(self, self.states["/browsing/creating"], [self.states["/browsing/waiting"]])
-        _browsing_creating_0.setAction(self._browsing_creating_0_exec)
-        _browsing_creating_0.setTrigger(Event("instance_created", None))
-        self.states["/browsing/creating"].addTransition(_browsing_creating_0)
-        
-        # transition /browsing/waiting
-        _browsing_waiting_0 = Transition(self, self.states["/browsing/waiting"], [self.states["/browsing/waiting"]])
-        _browsing_waiting_0.setAction(self._browsing_waiting_0_exec)
-        _browsing_waiting_0.setTrigger(Event("browse_result", None))
-        self.states["/browsing/waiting"].addTransition(_browsing_waiting_0)
-        _browsing_waiting_1 = Transition(self, self.states["/browsing/waiting"], [self.states["/ready"]])
-        _browsing_waiting_1.setAction(self._browsing_waiting_1_exec)
-        _browsing_waiting_1.setTrigger(Event("close_window", None))
-        self.states["/browsing/waiting"].addTransition(_browsing_waiting_1)
+        # transition /browsing_input/creating
+        _browsing_input_creating_0 = Transition(self, self.states["/browsing_input/creating"], [self.states["/browsing_input/waiting"]])
+        _browsing_input_creating_0.setAction(self._browsing_input_creating_0_exec)
+        _browsing_input_creating_0.setTrigger(Event("instance_created", None))
+        self.states["/browsing_input/creating"].addTransition(_browsing_input_creating_0)
+        
+        # transition /browsing_input/waiting
+        _browsing_input_waiting_0 = Transition(self, self.states["/browsing_input/waiting"], [self.states["/browsing_input/waiting"]])
+        _browsing_input_waiting_0.setAction(self._browsing_input_waiting_0_exec)
+        _browsing_input_waiting_0.setTrigger(Event("browse_result", None))
+        self.states["/browsing_input/waiting"].addTransition(_browsing_input_waiting_0)
+        _browsing_input_waiting_1 = Transition(self, self.states["/browsing_input/waiting"], [self.states["/ready"]])
+        _browsing_input_waiting_1.setAction(self._browsing_input_waiting_1_exec)
+        _browsing_input_waiting_1.setTrigger(Event("close_window", None))
+        self.states["/browsing_input/waiting"].addTransition(_browsing_input_waiting_1)
+        
+        # transition /browsing_output/creating
+        _browsing_output_creating_0 = Transition(self, self.states["/browsing_output/creating"], [self.states["/browsing_output/waiting"]])
+        _browsing_output_creating_0.setAction(self._browsing_output_creating_0_exec)
+        _browsing_output_creating_0.setTrigger(Event("instance_created", None))
+        self.states["/browsing_output/creating"].addTransition(_browsing_output_creating_0)
+        
+        # transition /browsing_output/waiting
+        _browsing_output_waiting_0 = Transition(self, self.states["/browsing_output/waiting"], [self.states["/browsing_output/waiting"]])
+        _browsing_output_waiting_0.setAction(self._browsing_output_waiting_0_exec)
+        _browsing_output_waiting_0.setTrigger(Event("browse_result", None))
+        self.states["/browsing_output/waiting"].addTransition(_browsing_output_waiting_0)
+        _browsing_output_waiting_1 = Transition(self, self.states["/browsing_output/waiting"], [self.states["/ready"]])
+        _browsing_output_waiting_1.setAction(self._browsing_output_waiting_1_exec)
+        _browsing_output_waiting_1.setTrigger(Event("close_window", None))
+        self.states["/browsing_output/waiting"].addTransition(_browsing_output_waiting_1)
     
     def _draw_signature_enter(self):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'input_tag']))
@@ -8604,6 +8845,15 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.current = self.tmp_input_signature.popitem()
         self.input_map.append([self.current[0], self.current[1]])
     
+    def _draw_signature_create_outputs_enter(self):
+        self.tmp_output_signature = dict(self.create_output_signature)
+        self.counter = -1
+        self.output_map = []
+    
+    def _draw_signature_create_outputs_create_entry_enter(self):
+        self.current = self.tmp_output_signature.popitem()
+        self.output_map.append([self.current[0], self.current[1]])
+    
     def _init_create_activity_info_create_name_label_create_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'static', 'Label', {'parent': self.activity_frame, 'text': 'Name'}]))
     
@@ -8637,8 +8887,26 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     def _draw_signature_create_inputs_create_add_entry_create_button_create_enter(self):
         self.big_step.outputEventOM(Event("create_instance", None, [self, 'input_MM_browse', 'Button', {'parent': self.input_frame, 'visual': TextVisual('+'), 'tooltip_text': 'Create new element in signature.', 'event_parameters': 'add_input'}]))
     
+    def _draw_signature_create_outputs_check_values_enter(self):
+        self.counter += 1
+    
+    def _draw_signature_create_outputs_create_entry_create_tag_create_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'input_tag', 'Entry', {'parent': self.output_frame, 'name': 'output_tag_%s' % self.counter, 'value': self.current[0]}]))
+    
+    def _draw_signature_create_outputs_create_entry_create_MM_create_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'input_MM_entry', 'Entry', {'parent': self.output_frame, 'name': 'output_MM_%s' % self.counter, 'value': self.current[1], 'readonly': True}]))
+    
+    def _draw_signature_create_outputs_create_entry_create_browse_create_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'input_MM_browse', 'Button', {'parent': self.output_frame, 'visual': TextVisual('...'), 'tooltip_text': 'Browse for output metamodel.', 'event_parameters': 'output_browse_%s' % self.counter}]))
+    
+    def _draw_signature_create_outputs_create_entry_create_delete_create_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'input_delete', 'Button', {'parent': self.output_frame, 'visual': TextVisual('X'), 'tooltip_text': 'Delete tag in signature.', 'event_parameters': 'output_delete_%s' % self.counter}]))
+    
+    def _draw_signature_create_outputs_create_add_entry_create_button_create_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'input_MM_browse', 'Button', {'parent': self.output_frame, 'visual': TextVisual('+'), 'tooltip_text': 'Create new element in signature.', 'event_parameters': 'add_output'}]))
+    
     def _creating_enter(self):
-        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['transformation_add_%s' % ({'ManualOperation': 'MANUAL', 'ModelTransformation': 'MT', 'ActionLanguage': 'AL'}[self.activity_type]), [self.activity_name, self.input_signature, self.output_signature]])]))
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['transformation_add_%s' % ({'ManualOperation': 'MANUAL', 'ModelTransformation': 'MT', 'ActionLanguage': 'AL'}[self.activity_type]), [self.create_input_signature, self.create_output_signature, self.activity_name, '']])]))
     
     def _modifying_mm_enter(self):
         self.addTimer(0, 0.5)
@@ -8654,9 +8922,13 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'input_MM_entry']))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'input_MM_browse']))
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'input_delete']))
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'static']))
+    
+    def _browsing_input_creating_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'browser', 'Browser', 'Select metamodel for signature of activity.', None]))
     
-    def _browsing_creating_enter(self):
-        self.big_step.outputEventOM(Event("create_instance", None, [self, 'browser', 'Browser', None]))
+    def _browsing_output_creating_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'browser', 'Browser', 'Select metamodel for signature of activity.', None]))
     
     def _init_create_activity_info_create_name_label_create_0_exec(self, parameters):
         assoc_name = parameters[0]
@@ -8748,6 +9020,56 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         tk_widget = parameters[0]
         tk_widget.grid(row=self.counter, column=3)
     
+    def _draw_signature_create_outputs_check_values_0_guard(self, parameters):
+        return self.tmp_output_signature
+    
+    def _draw_signature_create_outputs_check_values_1_guard(self, parameters):
+        return not self.tmp_output_signature
+    
+    def _draw_signature_create_outputs_create_entry_create_tag_create_0_exec(self, parameters):
+        assoc_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, assoc_name]))
+        self.output_map[-1].append(assoc_name)
+    
+    def _draw_signature_create_outputs_create_entry_create_tag_pack_0_exec(self, parameters):
+        tk_widget = parameters[0]
+        tk_widget.grid(row=self.counter,column=0)
+    
+    def _draw_signature_create_outputs_create_entry_create_MM_create_0_exec(self, parameters):
+        assoc_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, assoc_name]))
+        self.output_map[-1].append(assoc_name)
+    
+    def _draw_signature_create_outputs_create_entry_create_MM_pack_0_exec(self, parameters):
+        tk_widget = parameters[0]
+        tk_widget.grid(row=self.counter,column=1)
+    
+    def _draw_signature_create_outputs_create_entry_create_browse_create_0_exec(self, parameters):
+        assoc_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, assoc_name]))
+        self.output_map[-1].append(assoc_name)
+    
+    def _draw_signature_create_outputs_create_entry_create_browse_pack_button_0_exec(self, parameters):
+        tk_widget = parameters[0]
+        tk_widget.grid(row=self.counter, column=2)
+    
+    def _draw_signature_create_outputs_create_entry_create_delete_create_0_exec(self, parameters):
+        assoc_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, assoc_name]))
+        self.output_map[-1].append(assoc_name)
+    
+    def _draw_signature_create_outputs_create_entry_create_delete_pack_button_0_exec(self, parameters):
+        tk_widget = parameters[0]
+        tk_widget.grid(row=self.counter, column=3)
+    
+    def _draw_signature_create_outputs_create_add_entry_create_button_create_0_exec(self, parameters):
+        assoc_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, assoc_name]))
+    
+    def _draw_signature_create_outputs_create_add_entry_create_button_pack_button_0_exec(self, parameters):
+        tk_widget = parameters[0]
+        tk_widget.grid(row=self.counter, column=3)
+    
     def _ready_0_exec(self, parameters):
         evt = parameters[0]
         ctr = 0
@@ -8764,35 +9086,59 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         return evt == 'add_input'
     
     def _ready_1_exec(self, parameters):
+        evt = parameters[0]
+        ctr = 0
+        while 1:
+            free_id = 'tag_%i' % ctr
+            if free_id not in self.create_output_signature:
+                break
+            else:
+                ctr += 1
+        self.create_output_signature[free_id] = ""
+    
+    def _ready_1_guard(self, parameters):
+        evt = parameters[0]
+        return evt == 'add_output'
+    
+    def _ready_2_exec(self, parameters):
         evt = parameters[0]
         index = int(evt.split("input_delete_", 1)[1])
         del self.create_input_signature[self.input_map[index][0]]
     
-    def _ready_1_guard(self, parameters):
+    def _ready_2_guard(self, parameters):
         evt = parameters[0]
         return evt.startswith('input_delete_')
     
-    def _ready_2_exec(self, parameters):
+    def _ready_3_exec(self, parameters):
+        evt = parameters[0]
+        index = int(evt.split("output_delete_", 1)[1])
+        del self.create_output_signature[self.output_map[index][0]]
+    
+    def _ready_3_guard(self, parameters):
+        evt = parameters[0]
+        return evt.startswith('output_delete_')
+    
+    def _ready_4_exec(self, parameters):
         evt = parameters[0]
         new_value = parameters[1]
         self.activity_name = new_value
     
-    def _ready_2_guard(self, parameters):
+    def _ready_4_guard(self, parameters):
         evt = parameters[0]
         new_value = parameters[1]
         return evt == 'name'
     
-    def _ready_3_exec(self, parameters):
+    def _ready_5_exec(self, parameters):
         evt = parameters[0]
         new_value = parameters[1]
         self.activity_type = new_value
     
-    def _ready_3_guard(self, parameters):
+    def _ready_5_guard(self, parameters):
         evt = parameters[0]
         new_value = parameters[1]
         return evt == 'type'
     
-    def _ready_4_exec(self, parameters):
+    def _ready_6_exec(self, parameters):
         evt = parameters[0]
         new_value = parameters[1]
         index = int(evt.split("input_tag_", 1)[1])
@@ -8801,51 +9147,93 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.create_input_signature[new_value] = self.create_input_signature.pop(old_tag)
         information[0] = new_value
     
-    def _ready_4_guard(self, parameters):
+    def _ready_6_guard(self, parameters):
         evt = parameters[0]
         new_value = parameters[1]
         return evt.startswith('input_tag_')
     
-    def _ready_5_exec(self, parameters):
+    def _ready_7_exec(self, parameters):
         evt = parameters[0]
-        self.current = int(evt.split("input_MM_browse_", 1)[1])
+        new_value = parameters[1]
+        index = int(evt.split("output_tag_", 1)[1])
+        information = self.output_map[index]
+        old_tag = information[0]
+        self.create_output_signature[new_value] = self.create_output_signature.pop(old_tag)
+        information[0] = new_value
     
-    def _ready_5_guard(self, parameters):
+    def _ready_7_guard(self, parameters):
         evt = parameters[0]
-        return evt.startswith('input_MM_browse_')
+        new_value = parameters[1]
+        return evt.startswith('output_tag_')
     
-    def _ready_6_guard(self, parameters):
+    def _ready_8_exec(self, parameters):
         evt = parameters[0]
-        return evt == 'create'
+        self.current = int(evt.split("input_browse_", 1)[1])
+        print("Browse button pressed for " + str(self.input_map[self.current]))
+    
+    def _ready_8_guard(self, parameters):
+        evt = parameters[0]
+        return evt.startswith('input_browse_')
+    
+    def _ready_9_exec(self, parameters):
+        evt = parameters[0]
+        self.current = int(evt.split("output_browse_", 1)[1])
+        print("Browse button pressed for " + str(self.output_map[self.current]))
+    
+    def _ready_9_guard(self, parameters):
+        evt = parameters[0]
+        return evt.startswith('output_browse_')
+    
+    def _ready_10_guard(self, parameters):
+        evt = parameters[0]
+        return evt == 'confirm'
     
     def _creating_0_exec(self, parameters):
         context = parameters[0]
-        print("Starting subprocess")
+        print("Got context: " + str(context))
         self.context = context
-        from runner import run_GUI
         model_to_modify = "merged/%s" % self.activity_name
-        self.subprocess = multiprocessing.Proces(target=run_GUI, args=(self.address, self.username, self.password, model_to_modify, True))
+        self.subprocess = subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--model", model_to_modify, "--limited"])
+    
+    def _modifying_mm_0_exec(self, parameters):
+        print("Not alive anymore...")
     
     def _modifying_mm_0_guard(self, parameters):
-        return not self.subprocess.is_alive()
+        return self.subprocess.poll() is not None
     
     def _modifying_mm_1_exec(self, parameters):
         print("Checking whether or not subprocess is still alive...")
     
+    def _finish_transformation_add_0_exec(self, parameters):
+        print("FINISHED")
+    
     def _closing_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("close_window", None, [])]))
     
-    def _browsing_creating_0_exec(self, parameters):
+    def _browsing_input_creating_0_exec(self, parameters):
         assoc_name = parameters[0]
         self.big_step.outputEventOM(Event("start_instance", None, [self, assoc_name]))
     
-    def _browsing_waiting_0_exec(self, parameters):
+    def _browsing_input_waiting_0_exec(self, parameters):
         result = parameters[0]
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.input_map[self.current][3], Event("change_value", None, [result])]))
         self.create_input_signature[self.input_map[self.current][0]] = result
         self.input_map[self.current][1] = result
     
-    def _browsing_waiting_1_exec(self, parameters):
+    def _browsing_input_waiting_1_exec(self, parameters):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'browser']))
+    
+    def _browsing_output_creating_0_exec(self, parameters):
+        assoc_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, assoc_name]))
+    
+    def _browsing_output_waiting_0_exec(self, parameters):
+        result = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.output_map[self.current][3], Event("change_value", None, [result])]))
+        self.create_output_signature[self.output_map[self.current][0]] = result
+        self.output_map[self.current][1] = result
+    
+    def _browsing_output_waiting_1_exec(self, parameters):
         self.big_step.outputEventOM(Event("delete_instance", None, [self, 'browser']))
     
     def initializeStatechart(self):

+ 2 - 0
frontend.xml

@@ -10,6 +10,8 @@
         import uuid
         import json
         import urllib
+        import subprocess
+        import sys
         
         global current_model
         global current_metamodel

+ 11 - 3
runner.py

@@ -2,9 +2,9 @@ import Tkinter as tk
 import frontend
 from sccd.runtime.tkinter_eventloop import *
 import sccd.runtime.socket2event as socket2event
-import multiprocessing
 
 from sccd_widget import SCCDWidget
+import argparse
 
 class Root(tk.Tk, SCCDWidget):
     def __init__(self):
@@ -22,5 +22,13 @@ def run_GUI(location, username, password, model, limited_mode):
     root.mainloop()
 
 if __name__ == '__main__':
-    multiprocessing.freeze_support()
-    run_GUI("127.0.0.1:8001", "admin", "admin", None, False)
+    parser = argparse.ArgumentParser(description="Run the Modelverse GUI.")
+    parser.add_argument("--address", default="127.0.0.1:8001", type=str)
+    parser.add_argument("--username", default="admin", type=str)
+    parser.add_argument("--password", default="admin", type=str)
+    parser.add_argument("--model", default=None, type=str)
+    parser.add_argument("--limited", action="store_true")
+
+    args = parser.parse_args()
+
+    run_GUI(args.address, args.username, args.password, args.model, args.limited)