Browse Source

Fix file browsing and various smaller bugs

Yentl Van Tendeloo 7 years ago
parent
commit
ac3b2b975a
7 changed files with 919 additions and 108 deletions
  1. 1 1
      add_render_OD.py
  2. 34 7
      classes/window/create_activity.xml
  3. 268 0
      classes/window/file_browser.xml
  4. 32 4
      classes/window/main_window.xml
  5. 580 94
      frontend.py
  6. 2 0
      frontend.xml
  7. 2 2
      upload_models.py

+ 1 - 1
add_render_OD.py

@@ -5,6 +5,6 @@ from modelverse import *
 try:
     init()
     login("admin", "admin")
-    transformation_add_AL({"rendered": "formalisms/MM_render", "abstract": sys.argv[1]}, {"rendered": "formalisms/MM_render"}, "models/render_OD/" + sys.argv[1], open("models/render_OD.alc", 'r').read())
+    transformation_add_AL({"rendered": "formalisms/MM_render/graphical", "abstract": sys.argv[1]}, {"rendered": "formalisms/MM_render/graphical"}, "models/render_OD/" + sys.argv[1], open("models/render_OD.alc", 'r').read())
 except:
     pass

+ 34 - 7
classes/window/create_activity.xml

@@ -683,17 +683,44 @@
                 </script>
             </transition>
 
-            <transition event="button_pressed" cond="evt == 'confirm' and self.activity_type == 'ActionLanguage'" target="../creating">
+            <transition event="button_pressed" cond="evt == 'confirm' and self.activity_type == 'ActionLanguage'" target="../browse_file">
                 <parameter name="evt"/>
+            </transition>
+        </state>
+
+        <state id="browse_file">
+            <onentry>
+                <raise event="create_instance" scope="cd">
+                    <parameter expr="'browser'"/>
+                    <parameter expr="'FileBrowser'"/>
+                    <parameter expr="'Select model code.'"/>
+                </raise>
+                <script>
+                    self.upload_code = ""
+                </script>
+            </onentry>
+            
+            <transition event="instance_created" target="../waiting">
+                <parameter name="result"/>
+                <raise event="start_instance" scope="cd">
+                    <parameter expr="result"/>
+                </raise>
+            </transition>
+        </state>
+
+        <state id="waiting">
+            <transition event="browse_result" target=".">
+                <parameter name="result"/>
                 <script>
-                    from tkFileDialog import askopenfilename
-                    self.upload_code = askopenfilename()
-                    if self.upload_code is None:
-                        self.upload_code = ""
-                    else:
-                        self.upload_code = open(self.upload_code, 'r').read()
+                    self.upload_code = open(result, 'r').read()
                 </script>
             </transition>
+
+            <transition event="close_window" target="../creating">
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="'browser'"/>
+                </raise>
+            </transition>
         </state>
 
         <state id="creating">

+ 268 - 0
classes/window/file_browser.xml

@@ -0,0 +1,268 @@
+<class name="FileBrowser">
+    <relationships>
+        <inheritance class="tk.Toplevel" priority="1"/>
+        <inheritance class="SCCDWidget" priority="0"/>
+        <association name="buttons" class="Button"/>
+        <association name="labels" class="Label"/>
+        <association name="parent" class="A"/>
+    </relationships>
+
+    <constructor>
+        <parameter name="prompt"/>
+        <super class="tk.TopLevel"/>
+        <super class="SCCDWidget"/>
+        <body>
+            tk.Label(self, text=prompt).pack()
+
+            self.button_frame = tk.Frame(self)
+            self.button_frame.pack(fill=tk.X)
+
+            self.browser_frame = tk.Frame(self)
+            self.browser_frame.pack(fill=tk.BOTH)
+
+            self.current_location = "."
+            self.selected_label = None
+            self.labels = {}
+        </body>
+    </constructor>
+
+    <destructor>
+        <body>
+            self.destroy()
+        </body>
+    </destructor>
+
+    <scxml initial="init">
+        <state id="init" initial="button_OK">
+            <state id="button_OK">
+                <onentry>
+                    <raise event="create_instance" scope="cd">
+                        <parameter expr="'buttons'"/>
+                        <parameter expr="'Button'"/>
+                        <parameter expr="{'parent': self.button_frame, 'visual': TextVisual('OK'), 'tooltip_text': 'Open model', 'event_parameters': 'OK'}"/>
+                    </raise>
+                </onentry>
+
+                <transition event="instance_created" target="../wait_for_packing_OK">
+                    <parameter name="association_name"/>
+                    <raise event="start_instance" scope="cd">
+                        <parameter expr="association_name"/>
+                    </raise>
+
+                    <script>
+                        self.button_ok = association_name
+                    </script>
+                </transition>
+            </state>
+
+            <state id="wait_for_packing_OK">
+                <transition event="tk_widget" target="../button_back">
+                    <parameter name="tk_elem"/>
+                    <script>
+                        tk_elem.pack(anchor=tk.W, fill=tk.BOTH, expand=tk.TRUE)
+                    </script>
+                </transition>
+            </state>
+
+            <state id="button_back">
+                <onentry>
+                    <raise event="create_instance" scope="cd">
+                        <parameter expr="'buttons'"/>
+                        <parameter expr="'Button'"/>
+                        <parameter expr="{'parent': self.button_frame, 'visual': TextVisual('back'), 'tooltip_text': 'Up in hierarchy', 'event_parameters': 'UP'}"/>
+                    </raise>
+                </onentry>
+
+                <transition event="instance_created" target="../wait_for_packing_up">
+                    <parameter name="association_name"/>
+                    <raise event="start_instance" scope="cd">
+                        <parameter expr="association_name"/>
+                    </raise>
+
+                    <script>
+                        self.button_back = association_name
+                    </script>
+                </transition>
+            </state>
+
+            <state id="wait_for_packing_up">
+                <transition event="tk_widget" target="../../root">
+                    <parameter name="tk_elem"/>
+                    <script>
+                        tk_elem.pack(anchor=tk.E, fill=tk.BOTH, expand=tk.TRUE)
+                    </script>
+                </transition>
+            </state>
+        </state>
+
+        <parallel id="root">
+            <state id="label_clicked">
+                <state id="selecting_label">
+                    <transition event="label_pressed" cond="self.selected_label is None" target=".">
+                        <parameter name="text"/>
+                        <raise event="highlight" target="self.labels[text]" scope="narrow"/>
+                        <script>
+                            self.selected_label = text
+                        </script>
+                    </transition>
+
+                    <transition event="label_pressed" cond="self.selected_label is not None and self.selected_label != text" target=".">
+                        <parameter name="text"/>
+                        <raise event="unhighlight" target="self.labels[self.selected_label]" scope="narrow"/>
+                        <raise event="highlight" target="self.labels[text]" scope="narrow"/>
+                        <script>
+                            self.selected_label = text
+                        </script>
+                    </transition>
+
+                    <transition event="label_pressed" cond="self.selected_label is not None and self.selected_label == text" target=".">
+                        <parameter name="text"/>
+                        <script>
+                            self.current_location += ("/" + self.selected_label)
+                            self.selected_label = None
+                        </script>
+                        <raise event="redraw_labels"/>
+                    </transition>
+                </state>
+            </state>
+
+            <state id="state" initial="root">
+                <state id="root">
+                    <transition event="button_pressed" cond="event_name == 'OK' and self.selected_label is not None" target=".">
+                        <parameter name="event_name"/>
+                        <script>
+                            self.current_location += ("/" + self.selected_label)
+                            self.selected_label = None
+                        </script>
+
+                        <raise event="redraw_labels"/>
+                    </transition>
+
+                    <transition event="button_pressed" cond="event_name == 'UP' and self.current_location != ''" target=".">
+                        <parameter name="event_name"/>
+                        <script>
+                            self.current_location += "/.."
+                            self.selected_label = None
+                        </script>
+
+                        <raise event="redraw_labels"/>
+                    </transition>
+                </state>
+
+                <state id="finished"/>
+            </state>
+
+            <state id="draw_labels" initial="create_labels">
+                <state id="create_labels" initial="query">
+                    <state id="query">
+                        <transition target="../add_labels">
+                            <parameter name="result"/>
+                            <script>
+                                result = os.listdir(self.current_location)
+                                self.labels_to_add = sorted(result)
+                                self.all_results = sorted(result)
+                            </script>
+                        </transition>
+                    </state>
+
+                    <state id="add_labels" initial="check_list">
+                        <state id="check_list">
+                            <transition cond="not self.labels_to_add" target="../../../waiting"/>
+                            <transition cond="self.labels_to_add" target="../add_label"/>
+                        </state>
+
+                        <state id="add_label">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'labels'"/>
+                                    <parameter expr="'Label'"/>
+                                    <parameter expr="{'parent': self.browser_frame, 'text': self.labels_to_add[0]}"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="instance_created" target="../pack_label">
+                                <parameter name="association_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="association_name"/>
+                                </raise>
+                                <script>
+                                    self.labels[self.labels_to_add.pop(0)] = association_name
+                                </script>
+                            </transition>
+                        </state>
+                        <state id="pack_label">
+                            <transition event="tk_widget" target="../check_list">
+                                <parameter name="tk_elem"/>
+                                <script>
+                                    tk_elem.pack()
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+                </state>
+
+                <state id="waiting"/>
+
+                <state id="delete_labels">
+                    <transition cond="len(self.labels) > 0" target=".">
+                        <raise event="delete_instance" scope="cd">
+                            <parameter expr="self.labels.popitem()[1]"/>
+                        </raise>
+                    </transition>
+
+                    <transition cond="len(self.labels) == 0" target="../create_labels"/>
+                </state>
+
+                <transition event="redraw_labels" target="delete_labels"/>
+            </state>
+
+            <transition cond="os.path.isfile(self.current_location)" target="../closing">
+                <raise event="browse_result" target="'parent'" scope="narrow">
+                    <parameter expr="self.current_location"/>
+                    <script>
+                        print("RAISE RESULT: " + self.current_location)
+                    </script>
+                </raise>
+
+                <raise event="close_self"/>
+
+                <script>
+                    self.to_close = self.labels.values() + [self.button_ok, self.button_back]
+                </script>
+            </transition>
+
+            <transition event="window-close" cond="ID == id(self)" target="../closing">
+                <parameter name="ID"/>
+                <script>
+                    self.to_close = self.labels.values() + [self.button_ok, self.button_back]
+                </script>
+            </transition>
+
+            <transition event="close_self" target="../closing">
+                <script>
+                    self.to_close = self.labels.values() + [self.button_ok, self.button_back]
+                </script>
+            </transition>
+        </parallel>
+
+        <state id="closing">
+            <onentry>
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="self.to_close.pop(0)"/>
+                </raise>
+            </onentry>
+
+            <transition event="instance_deleted" cond="len(self.to_close) > 0" target="."/>
+            <transition event="instance_deleted" cond="len(self.to_close) == 0" target="../close"/>
+        </state>
+            
+        <state id="close">
+            <onentry>
+                <raise event="close_window" scope="narrow" target="'parent'"/>
+                <script>
+                    print("CLOSE BROWSER")
+                </script>
+            </onentry>
+        </state>
+    </scxml>
+</class>

+ 32 - 4
classes/window/main_window.xml

@@ -326,12 +326,40 @@
                     <state id="upload_MVC" initial="load_code">
                         <state id="load_code">
                             <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'subwindow'"/>
+                                    <parameter expr="'FileBrowser'"/>
+                                    <parameter expr="'Select model code.'"/>
+                                </raise>
                                 <script>
-                                    from tkFileDialog import askopenfilename
-                                    self.filename = askopenfilename()
+                                    self.filename = None
                                 </script>
                             </onentry>
+                            
+                            <transition event="instance_created" target="../waiting">
+                                <parameter name="result"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="result"/>
+                                </raise>
+                            </transition>
+                        </state>
+
+                        <state id="waiting">
+                            <transition event="browse_result" target=".">
+                                <parameter name="result"/>
+                                <script>
+                                    self.filename = result
+                                </script>
+                            </transition>
+
+                            <transition event="close_window" target="../got_filename">
+                                <raise event="delete_instance" scope="cd">
+                                    <parameter expr="'subwindow'"/>
+                                </raise>
+                            </transition>
+                        </state>
 
+                        <state id="got_filename">
                             <transition cond="self.filename is not None" target="../overwriting_model">
                                 <raise event="mv_request" scope="broad">
                                     <parameter expr="'model_overwrite'"/>
@@ -627,7 +655,7 @@
                             <onentry>
                                 <raise event="mv_request" scope="broad">
                                     <parameter expr="'transformation_between'"/>
-                                    <parameter expr="[{'abstract': current_metamodel, 'rendered': 'formalisms/MM_render'}, {'rendered': 'formalisms/MM_render'}]"/>
+                                    <parameter expr="[{'abstract': current_metamodel, 'rendered': 'formalisms/MM_render/graphical'}, {'rendered': 'formalisms/MM_render/graphical'}]"/>
                                 </raise>
                                 <script>
                                     print("Finding transformation with current MM: " + current_metamodel)
@@ -1045,7 +1073,7 @@
                                 </script>
                                 <raise event="mv_request" scope="broad">
                                     <parameter expr="'alter_context'"/>
-                                    <parameter expr="[current_rendered_model, 'formalisms/MM_render']"/>
+                                    <parameter expr="[current_rendered_model, 'formalisms/MM_render/graphical']"/>
                                 </raise>
                             </onentry>
 

+ 580 - 94
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:   Fri Nov 17 11:37:21 2017
+Date:   Fri Nov 17 15:20:54 2017
 
 Model author: Yentl Van Tendeloo
 Model name:   Modelverse Visual Editor - Tkinter Version 
@@ -18,6 +18,7 @@ import json
 import urllib
 import subprocess
 import sys
+import os
 
 global current_model
 global current_metamodel
@@ -5151,202 +5152,208 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/init/init/running/upload_MVC/load_code"] = State(27, "/init/init/running/upload_MVC/load_code", self)
         self.states["/init/init/running/upload_MVC/load_code"].setEnter(self._init_init_running_upload_MVC_load_code_enter)
         
+        # state /init/init/running/upload_MVC/waiting
+        self.states["/init/init/running/upload_MVC/waiting"] = State(28, "/init/init/running/upload_MVC/waiting", self)
+        
+        # state /init/init/running/upload_MVC/got_filename
+        self.states["/init/init/running/upload_MVC/got_filename"] = State(29, "/init/init/running/upload_MVC/got_filename", self)
+        
         # state /init/init/running/upload_MVC/overwriting_model
-        self.states["/init/init/running/upload_MVC/overwriting_model"] = State(28, "/init/init/running/upload_MVC/overwriting_model", self)
+        self.states["/init/init/running/upload_MVC/overwriting_model"] = State(30, "/init/init/running/upload_MVC/overwriting_model", self)
         
         # state /init/init/running/change_metamodel
-        self.states["/init/init/running/change_metamodel"] = State(29, "/init/init/running/change_metamodel", self)
+        self.states["/init/init/running/change_metamodel"] = State(31, "/init/init/running/change_metamodel", self)
         self.states["/init/init/running/change_metamodel"].setEnter(self._init_init_running_change_metamodel_enter)
         
         # state /init/init/running/conf_bottom
-        self.states["/init/init/running/conf_bottom"] = State(30, "/init/init/running/conf_bottom", self)
+        self.states["/init/init/running/conf_bottom"] = State(32, "/init/init/running/conf_bottom", self)
         
         # state /init/init/running/conf_bottom/check_if_exists
-        self.states["/init/init/running/conf_bottom/check_if_exists"] = State(31, "/init/init/running/conf_bottom/check_if_exists", self)
+        self.states["/init/init/running/conf_bottom/check_if_exists"] = State(33, "/init/init/running/conf_bottom/check_if_exists", self)
         
         # state /init/init/running/conf_bottom/add_bottom
-        self.states["/init/init/running/conf_bottom/add_bottom"] = State(32, "/init/init/running/conf_bottom/add_bottom", self)
+        self.states["/init/init/running/conf_bottom/add_bottom"] = State(34, "/init/init/running/conf_bottom/add_bottom", self)
         self.states["/init/init/running/conf_bottom/add_bottom"].setEnter(self._init_init_running_conf_bottom_add_bottom_enter)
         
         # state /init/init/running/custom_MM
-        self.states["/init/init/running/custom_MM"] = State(33, "/init/init/running/custom_MM", self)
+        self.states["/init/init/running/custom_MM"] = State(35, "/init/init/running/custom_MM", self)
         
         # state /init/init/running/custom_MM/query
-        self.states["/init/init/running/custom_MM/query"] = State(34, "/init/init/running/custom_MM/query", self)
+        self.states["/init/init/running/custom_MM/query"] = State(36, "/init/init/running/custom_MM/query", self)
         self.states["/init/init/running/custom_MM/query"].setEnter(self._init_init_running_custom_MM_query_enter)
         
         # state /init/init/running/custom_MM/wait_for_metamodel
-        self.states["/init/init/running/custom_MM/wait_for_metamodel"] = State(35, "/init/init/running/custom_MM/wait_for_metamodel", self)
+        self.states["/init/init/running/custom_MM/wait_for_metamodel"] = State(37, "/init/init/running/custom_MM/wait_for_metamodel", self)
         self.states["/init/init/running/custom_MM/wait_for_metamodel"].setEnter(self._init_init_running_custom_MM_wait_for_metamodel_enter)
         
         # state /init/init/running/custom_MM/wait_for_metamodel/wait_for_result
-        self.states["/init/init/running/custom_MM/wait_for_metamodel/wait_for_result"] = State(36, "/init/init/running/custom_MM/wait_for_metamodel/wait_for_result", self)
+        self.states["/init/init/running/custom_MM/wait_for_metamodel/wait_for_result"] = State(38, "/init/init/running/custom_MM/wait_for_metamodel/wait_for_result", self)
         
         # state /init/init/running/custom_MM/wait_for_metamodel/got_result
-        self.states["/init/init/running/custom_MM/wait_for_metamodel/got_result"] = State(37, "/init/init/running/custom_MM/wait_for_metamodel/got_result", self)
+        self.states["/init/init/running/custom_MM/wait_for_metamodel/got_result"] = State(39, "/init/init/running/custom_MM/wait_for_metamodel/got_result", self)
         
         # state /init/init/running/custom_MM/wait_for_metamodel/mv_processing
-        self.states["/init/init/running/custom_MM/wait_for_metamodel/mv_processing"] = State(38, "/init/init/running/custom_MM/wait_for_metamodel/mv_processing", self)
+        self.states["/init/init/running/custom_MM/wait_for_metamodel/mv_processing"] = State(40, "/init/init/running/custom_MM/wait_for_metamodel/mv_processing", self)
         
         # state /init/init/running/change_mapper
-        self.states["/init/init/running/change_mapper"] = State(39, "/init/init/running/change_mapper", self)
+        self.states["/init/init/running/change_mapper"] = State(41, "/init/init/running/change_mapper", self)
         
         # state /init/init/running/change_rendered
-        self.states["/init/init/running/change_rendered"] = State(40, "/init/init/running/change_rendered", self)
+        self.states["/init/init/running/change_rendered"] = State(42, "/init/init/running/change_rendered", self)
         
         # state /init/init/running/verify_model
-        self.states["/init/init/running/verify_model"] = State(41, "/init/init/running/verify_model", self)
+        self.states["/init/init/running/verify_model"] = State(43, "/init/init/running/verify_model", self)
         
         # state /init/init/running/verify_model/request
-        self.states["/init/init/running/verify_model/request"] = State(42, "/init/init/running/verify_model/request", self)
+        self.states["/init/init/running/verify_model/request"] = State(44, "/init/init/running/verify_model/request", self)
         self.states["/init/init/running/verify_model/request"].setEnter(self._init_init_running_verify_model_request_enter)
         
         # state /init/init/running/verify_model/show_result
-        self.states["/init/init/running/verify_model/show_result"] = State(43, "/init/init/running/verify_model/show_result", self)
+        self.states["/init/init/running/verify_model/show_result"] = State(45, "/init/init/running/verify_model/show_result", self)
         
         # state /init/init/running/verify_model/wait_for_close
-        self.states["/init/init/running/verify_model/wait_for_close"] = State(44, "/init/init/running/verify_model/wait_for_close", self)
+        self.states["/init/init/running/verify_model/wait_for_close"] = State(46, "/init/init/running/verify_model/wait_for_close", self)
         
         # state /init/init/running/open_model
-        self.states["/init/init/running/open_model"] = State(45, "/init/init/running/open_model", self)
+        self.states["/init/init/running/open_model"] = State(47, "/init/init/running/open_model", self)
         
         # state /init/init/running/open_model/query_model
-        self.states["/init/init/running/open_model/query_model"] = State(46, "/init/init/running/open_model/query_model", self)
+        self.states["/init/init/running/open_model/query_model"] = State(48, "/init/init/running/open_model/query_model", self)
         self.states["/init/init/running/open_model/query_model"].setEnter(self._init_init_running_open_model_query_model_enter)
         
         # state /init/init/running/open_model/wait_for_model
-        self.states["/init/init/running/open_model/wait_for_model"] = State(47, "/init/init/running/open_model/wait_for_model", self)
+        self.states["/init/init/running/open_model/wait_for_model"] = State(49, "/init/init/running/open_model/wait_for_model", self)
         
         # state /init/init/running/open_model/got_model
-        self.states["/init/init/running/open_model/got_model"] = State(48, "/init/init/running/open_model/got_model", self)
+        self.states["/init/init/running/open_model/got_model"] = State(50, "/init/init/running/open_model/got_model", self)
         
         # state /init/init/running/open_model/search_metamodels
-        self.states["/init/init/running/open_model/search_metamodels"] = State(49, "/init/init/running/open_model/search_metamodels", self)
+        self.states["/init/init/running/open_model/search_metamodels"] = State(51, "/init/init/running/open_model/search_metamodels", self)
         self.states["/init/init/running/open_model/search_metamodels"].setEnter(self._init_init_running_open_model_search_metamodels_enter)
         
         # state /init/init/running/open_model/search_CS_mappers
-        self.states["/init/init/running/open_model/search_CS_mappers"] = State(50, "/init/init/running/open_model/search_CS_mappers", self)
+        self.states["/init/init/running/open_model/search_CS_mappers"] = State(52, "/init/init/running/open_model/search_CS_mappers", self)
         self.states["/init/init/running/open_model/search_CS_mappers"].setEnter(self._init_init_running_open_model_search_CS_mappers_enter)
         
         # state /init/init/running/open_model/check_CS_mapper
-        self.states["/init/init/running/open_model/check_CS_mapper"] = State(51, "/init/init/running/open_model/check_CS_mapper", self)
+        self.states["/init/init/running/open_model/check_CS_mapper"] = State(53, "/init/init/running/open_model/check_CS_mapper", self)
         
         # state /init/init/running/open_model/search_CS_rendered
-        self.states["/init/init/running/open_model/search_CS_rendered"] = State(52, "/init/init/running/open_model/search_CS_rendered", self)
+        self.states["/init/init/running/open_model/search_CS_rendered"] = State(54, "/init/init/running/open_model/search_CS_rendered", self)
         self.states["/init/init/running/open_model/search_CS_rendered"].setEnter(self._init_init_running_open_model_search_CS_rendered_enter)
         
         # state /init/init/running/open_model/store_metamodel
-        self.states["/init/init/running/open_model/store_metamodel"] = State(53, "/init/init/running/open_model/store_metamodel", self)
+        self.states["/init/init/running/open_model/store_metamodel"] = State(55, "/init/init/running/open_model/store_metamodel", self)
         self.states["/init/init/running/open_model/store_metamodel"].setEnter(self._init_init_running_open_model_store_metamodel_enter)
         
         # state /init/init/running/new_rendered
-        self.states["/init/init/running/new_rendered"] = State(54, "/init/init/running/new_rendered", self)
+        self.states["/init/init/running/new_rendered"] = State(56, "/init/init/running/new_rendered", self)
         self.states["/init/init/running/new_rendered"].setEnter(self._init_init_running_new_rendered_enter)
         
         # state /init/init/running/create_new_model
-        self.states["/init/init/running/create_new_model"] = State(55, "/init/init/running/create_new_model", self)
+        self.states["/init/init/running/create_new_model"] = State(57, "/init/init/running/create_new_model", self)
         
         # state /init/init/running/create_new_model/query_metamodel
-        self.states["/init/init/running/create_new_model/query_metamodel"] = State(56, "/init/init/running/create_new_model/query_metamodel", self)
+        self.states["/init/init/running/create_new_model/query_metamodel"] = State(58, "/init/init/running/create_new_model/query_metamodel", self)
         self.states["/init/init/running/create_new_model/query_metamodel"].setEnter(self._init_init_running_create_new_model_query_metamodel_enter)
         
         # state /init/init/running/create_new_model/wait_for_metamodel
-        self.states["/init/init/running/create_new_model/wait_for_metamodel"] = State(57, "/init/init/running/create_new_model/wait_for_metamodel", self)
+        self.states["/init/init/running/create_new_model/wait_for_metamodel"] = State(59, "/init/init/running/create_new_model/wait_for_metamodel", self)
         
         # state /init/init/running/create_new_model/got_mm
-        self.states["/init/init/running/create_new_model/got_mm"] = State(58, "/init/init/running/create_new_model/got_mm", self)
+        self.states["/init/init/running/create_new_model/got_mm"] = State(60, "/init/init/running/create_new_model/got_mm", self)
         
         # state /init/init/running/create_new_model/prompt_model_name
-        self.states["/init/init/running/create_new_model/prompt_model_name"] = State(59, "/init/init/running/create_new_model/prompt_model_name", self)
+        self.states["/init/init/running/create_new_model/prompt_model_name"] = State(61, "/init/init/running/create_new_model/prompt_model_name", self)
         self.states["/init/init/running/create_new_model/prompt_model_name"].setEnter(self._init_init_running_create_new_model_prompt_model_name_enter)
         
         # state /init/init/running/create_new_model/waiting_for_model_name
-        self.states["/init/init/running/create_new_model/waiting_for_model_name"] = State(60, "/init/init/running/create_new_model/waiting_for_model_name", self)
+        self.states["/init/init/running/create_new_model/waiting_for_model_name"] = State(62, "/init/init/running/create_new_model/waiting_for_model_name", self)
         
         # state /init/init/running/create_new_model/creating_model
-        self.states["/init/init/running/create_new_model/creating_model"] = State(61, "/init/init/running/create_new_model/creating_model", self)
+        self.states["/init/init/running/create_new_model/creating_model"] = State(63, "/init/init/running/create_new_model/creating_model", self)
         self.states["/init/init/running/create_new_model/creating_model"].setEnter(self._init_init_running_create_new_model_creating_model_enter)
         
         # state /init/init/running/rerender_model
-        self.states["/init/init/running/rerender_model"] = State(62, "/init/init/running/rerender_model", self)
+        self.states["/init/init/running/rerender_model"] = State(64, "/init/init/running/rerender_model", self)
         
         # state /init/init/running/rerender_model/initial_render
-        self.states["/init/init/running/rerender_model/initial_render"] = State(63, "/init/init/running/rerender_model/initial_render", self)
+        self.states["/init/init/running/rerender_model/initial_render"] = State(65, "/init/init/running/rerender_model/initial_render", self)
         
         # state /init/init/running/rerender_model/recreate_toolbars
-        self.states["/init/init/running/rerender_model/recreate_toolbars"] = State(64, "/init/init/running/rerender_model/recreate_toolbars", self)
+        self.states["/init/init/running/rerender_model/recreate_toolbars"] = State(66, "/init/init/running/rerender_model/recreate_toolbars", self)
         self.states["/init/init/running/rerender_model/recreate_toolbars"].setEnter(self._init_init_running_rerender_model_recreate_toolbars_enter)
         
         # state /init/init/running/rerender_model/recreate_toolbars/waiting
-        self.states["/init/init/running/rerender_model/recreate_toolbars/waiting"] = State(65, "/init/init/running/rerender_model/recreate_toolbars/waiting", self)
+        self.states["/init/init/running/rerender_model/recreate_toolbars/waiting"] = State(67, "/init/init/running/rerender_model/recreate_toolbars/waiting", self)
         
         # state /init/init/running/rerender_model/recreate_toolbars/close_all
-        self.states["/init/init/running/rerender_model/recreate_toolbars/close_all"] = State(66, "/init/init/running/rerender_model/recreate_toolbars/close_all", self)
+        self.states["/init/init/running/rerender_model/recreate_toolbars/close_all"] = State(68, "/init/init/running/rerender_model/recreate_toolbars/close_all", self)
         
         # state /init/init/running/rerender_model/canvas
-        self.states["/init/init/running/rerender_model/canvas"] = State(67, "/init/init/running/rerender_model/canvas", self)
+        self.states["/init/init/running/rerender_model/canvas"] = State(69, "/init/init/running/rerender_model/canvas", self)
         self.states["/init/init/running/rerender_model/canvas"].setEnter(self._init_init_running_rerender_model_canvas_enter)
         
         # state /init/init/running/rerender_model/pack_canvas
-        self.states["/init/init/running/rerender_model/pack_canvas"] = State(68, "/init/init/running/rerender_model/pack_canvas", self)
+        self.states["/init/init/running/rerender_model/pack_canvas"] = State(70, "/init/init/running/rerender_model/pack_canvas", self)
         
         # state /init/init/running/rerender_model/model_toolbars
-        self.states["/init/init/running/rerender_model/model_toolbars"] = State(69, "/init/init/running/rerender_model/model_toolbars", self)
+        self.states["/init/init/running/rerender_model/model_toolbars"] = State(71, "/init/init/running/rerender_model/model_toolbars", self)
         
         # state /init/init/running/rerender_model/model_toolbars/mm_toolbar
-        self.states["/init/init/running/rerender_model/model_toolbars/mm_toolbar"] = State(70, "/init/init/running/rerender_model/model_toolbars/mm_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/mm_toolbar"] = State(72, "/init/init/running/rerender_model/model_toolbars/mm_toolbar", self)
         self.states["/init/init/running/rerender_model/model_toolbars/mm_toolbar"].setEnter(self._init_init_running_rerender_model_model_toolbars_mm_toolbar_enter)
         
         # state /init/init/running/rerender_model/model_toolbars/pack_mm_toolbar
-        self.states["/init/init/running/rerender_model/model_toolbars/pack_mm_toolbar"] = State(71, "/init/init/running/rerender_model/model_toolbars/pack_mm_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/pack_mm_toolbar"] = State(73, "/init/init/running/rerender_model/model_toolbars/pack_mm_toolbar", self)
         
         # state /init/init/running/rerender_model/model_toolbars/cs_toolbar
-        self.states["/init/init/running/rerender_model/model_toolbars/cs_toolbar"] = State(72, "/init/init/running/rerender_model/model_toolbars/cs_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/cs_toolbar"] = State(74, "/init/init/running/rerender_model/model_toolbars/cs_toolbar", self)
         self.states["/init/init/running/rerender_model/model_toolbars/cs_toolbar"].setEnter(self._init_init_running_rerender_model_model_toolbars_cs_toolbar_enter)
         
         # state /init/init/running/rerender_model/model_toolbars/pack_cs_toolbar
-        self.states["/init/init/running/rerender_model/model_toolbars/pack_cs_toolbar"] = State(73, "/init/init/running/rerender_model/model_toolbars/pack_cs_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/pack_cs_toolbar"] = State(75, "/init/init/running/rerender_model/model_toolbars/pack_cs_toolbar", self)
         
         # state /init/init/running/rerender_model/model_toolbars/fetch_types
-        self.states["/init/init/running/rerender_model/model_toolbars/fetch_types"] = State(74, "/init/init/running/rerender_model/model_toolbars/fetch_types", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/fetch_types"] = State(76, "/init/init/running/rerender_model/model_toolbars/fetch_types", self)
         self.states["/init/init/running/rerender_model/model_toolbars/fetch_types"].setEnter(self._init_init_running_rerender_model_model_toolbars_fetch_types_enter)
         
         # state /init/init/running/rerender_model/model_toolbars/dsl_toolbar
-        self.states["/init/init/running/rerender_model/model_toolbars/dsl_toolbar"] = State(75, "/init/init/running/rerender_model/model_toolbars/dsl_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/dsl_toolbar"] = State(77, "/init/init/running/rerender_model/model_toolbars/dsl_toolbar", self)
         
         # state /init/init/running/rerender_model/model_toolbars/pack_dsl_toolbar
-        self.states["/init/init/running/rerender_model/model_toolbars/pack_dsl_toolbar"] = State(76, "/init/init/running/rerender_model/model_toolbars/pack_dsl_toolbar", self)
+        self.states["/init/init/running/rerender_model/model_toolbars/pack_dsl_toolbar"] = State(78, "/init/init/running/rerender_model/model_toolbars/pack_dsl_toolbar", self)
         
         # state /init/init/running/rerender_model/request_render
-        self.states["/init/init/running/rerender_model/request_render"] = State(77, "/init/init/running/rerender_model/request_render", self)
+        self.states["/init/init/running/rerender_model/request_render"] = State(79, "/init/init/running/rerender_model/request_render", self)
         self.states["/init/init/running/rerender_model/request_render"].setEnter(self._init_init_running_rerender_model_request_render_enter)
         
         # state /init/init/running/rerender_model/render_model
-        self.states["/init/init/running/rerender_model/render_model"] = State(78, "/init/init/running/rerender_model/render_model", self)
+        self.states["/init/init/running/rerender_model/render_model"] = State(80, "/init/init/running/rerender_model/render_model", self)
         self.states["/init/init/running/rerender_model/render_model"].setEnter(self._init_init_running_rerender_model_render_model_enter)
         
         # state /init/init/running/rerender_model/render_model/allocate_groups
-        self.states["/init/init/running/rerender_model/render_model/allocate_groups"] = State(79, "/init/init/running/rerender_model/render_model/allocate_groups", self)
+        self.states["/init/init/running/rerender_model/render_model/allocate_groups"] = State(81, "/init/init/running/rerender_model/render_model/allocate_groups", self)
         
         # state /init/init/running/rerender_model/render_model/allocating_group
-        self.states["/init/init/running/rerender_model/render_model/allocating_group"] = State(80, "/init/init/running/rerender_model/render_model/allocating_group", self)
+        self.states["/init/init/running/rerender_model/render_model/allocating_group"] = State(82, "/init/init/running/rerender_model/render_model/allocating_group", self)
         
         # state /init/init/running/rerender_model/render_model/allocate_contains
-        self.states["/init/init/running/rerender_model/render_model/allocate_contains"] = State(81, "/init/init/running/rerender_model/render_model/allocate_contains", self)
+        self.states["/init/init/running/rerender_model/render_model/allocate_contains"] = State(83, "/init/init/running/rerender_model/render_model/allocate_contains", self)
         
         # state /init/init/running/rerender_model/render_model/render_elements
-        self.states["/init/init/running/rerender_model/render_model/render_elements"] = State(82, "/init/init/running/rerender_model/render_model/render_elements", self)
+        self.states["/init/init/running/rerender_model/render_model/render_elements"] = State(84, "/init/init/running/rerender_model/render_model/render_elements", self)
         
         # state /init/init/close
-        self.states["/init/init/close"] = State(83, "/init/init/close", self)
+        self.states["/init/init/close"] = State(85, "/init/init/close", self)
         self.states["/init/init/close"].setEnter(self._init_init_close_enter)
         
         # state /init/key_status
-        self.states["/init/key_status"] = State(84, "/init/key_status", self)
+        self.states["/init/key_status"] = State(86, "/init/key_status", self)
         self.states["/init/key_status"].setEnter(self._init_key_status_enter)
         
         # state /init/key_status/listening
-        self.states["/init/key_status/listening"] = State(85, "/init/key_status/listening", self)
+        self.states["/init/key_status/listening"] = State(87, "/init/key_status/listening", self)
         
         # add children
         self.states[""].addChild(self.states["/init"])
@@ -5388,6 +5395,8 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/init/init/running/enact_process"].addChild(self.states["/init/init/running/enact_process/waiting"])
         self.states["/init/init/running/add_object_diagrams"].addChild(self.states["/init/init/running/add_object_diagrams/init"])
         self.states["/init/init/running/upload_MVC"].addChild(self.states["/init/init/running/upload_MVC/load_code"])
+        self.states["/init/init/running/upload_MVC"].addChild(self.states["/init/init/running/upload_MVC/waiting"])
+        self.states["/init/init/running/upload_MVC"].addChild(self.states["/init/init/running/upload_MVC/got_filename"])
         self.states["/init/init/running/upload_MVC"].addChild(self.states["/init/init/running/upload_MVC/overwriting_model"])
         self.states["/init/init/running/conf_bottom"].addChild(self.states["/init/init/running/conf_bottom/check_if_exists"])
         self.states["/init/init/running/conf_bottom"].addChild(self.states["/init/init/running/conf_bottom/add_bottom"])
@@ -5616,15 +5625,31 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/init/init/running/add_object_diagrams/init"].addTransition(_init_init_running_add_object_diagrams_init_0)
         
         # transition /init/init/running/upload_MVC/load_code
-        _init_init_running_upload_MVC_load_code_0 = Transition(self, self.states["/init/init/running/upload_MVC/load_code"], [self.states["/init/init/running/upload_MVC/overwriting_model"]])
+        _init_init_running_upload_MVC_load_code_0 = Transition(self, self.states["/init/init/running/upload_MVC/load_code"], [self.states["/init/init/running/upload_MVC/waiting"]])
         _init_init_running_upload_MVC_load_code_0.setAction(self._init_init_running_upload_MVC_load_code_0_exec)
-        _init_init_running_upload_MVC_load_code_0.setTrigger(None)
-        _init_init_running_upload_MVC_load_code_0.setGuard(self._init_init_running_upload_MVC_load_code_0_guard)
+        _init_init_running_upload_MVC_load_code_0.setTrigger(Event("instance_created", None))
         self.states["/init/init/running/upload_MVC/load_code"].addTransition(_init_init_running_upload_MVC_load_code_0)
-        _init_init_running_upload_MVC_load_code_1 = Transition(self, self.states["/init/init/running/upload_MVC/load_code"], [self.states["/init/init/running/idle"]])
-        _init_init_running_upload_MVC_load_code_1.setTrigger(None)
-        _init_init_running_upload_MVC_load_code_1.setGuard(self._init_init_running_upload_MVC_load_code_1_guard)
-        self.states["/init/init/running/upload_MVC/load_code"].addTransition(_init_init_running_upload_MVC_load_code_1)
+        
+        # transition /init/init/running/upload_MVC/waiting
+        _init_init_running_upload_MVC_waiting_0 = Transition(self, self.states["/init/init/running/upload_MVC/waiting"], [self.states["/init/init/running/upload_MVC/waiting"]])
+        _init_init_running_upload_MVC_waiting_0.setAction(self._init_init_running_upload_MVC_waiting_0_exec)
+        _init_init_running_upload_MVC_waiting_0.setTrigger(Event("browse_result", None))
+        self.states["/init/init/running/upload_MVC/waiting"].addTransition(_init_init_running_upload_MVC_waiting_0)
+        _init_init_running_upload_MVC_waiting_1 = Transition(self, self.states["/init/init/running/upload_MVC/waiting"], [self.states["/init/init/running/upload_MVC/got_filename"]])
+        _init_init_running_upload_MVC_waiting_1.setAction(self._init_init_running_upload_MVC_waiting_1_exec)
+        _init_init_running_upload_MVC_waiting_1.setTrigger(Event("close_window", None))
+        self.states["/init/init/running/upload_MVC/waiting"].addTransition(_init_init_running_upload_MVC_waiting_1)
+        
+        # transition /init/init/running/upload_MVC/got_filename
+        _init_init_running_upload_MVC_got_filename_0 = Transition(self, self.states["/init/init/running/upload_MVC/got_filename"], [self.states["/init/init/running/upload_MVC/overwriting_model"]])
+        _init_init_running_upload_MVC_got_filename_0.setAction(self._init_init_running_upload_MVC_got_filename_0_exec)
+        _init_init_running_upload_MVC_got_filename_0.setTrigger(None)
+        _init_init_running_upload_MVC_got_filename_0.setGuard(self._init_init_running_upload_MVC_got_filename_0_guard)
+        self.states["/init/init/running/upload_MVC/got_filename"].addTransition(_init_init_running_upload_MVC_got_filename_0)
+        _init_init_running_upload_MVC_got_filename_1 = Transition(self, self.states["/init/init/running/upload_MVC/got_filename"], [self.states["/init/init/running/idle"]])
+        _init_init_running_upload_MVC_got_filename_1.setTrigger(None)
+        _init_init_running_upload_MVC_got_filename_1.setGuard(self._init_init_running_upload_MVC_got_filename_1_guard)
+        self.states["/init/init/running/upload_MVC/got_filename"].addTransition(_init_init_running_upload_MVC_got_filename_1)
         
         # transition /init/init/running/upload_MVC/overwriting_model
         _init_init_running_upload_MVC_overwriting_model_0 = Transition(self, self.states["/init/init/running/upload_MVC/overwriting_model"], [self.states["/init/init/running/rerender_model"]])
@@ -5987,7 +6012,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.contains = [i for i in self.rendered if i["type"] == "contains"]
         self.rendered = [i for i in self.rendered if i["type"] not in ["Group", "contains"]]
         self.rendered.reverse()
-        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['alter_context', [current_rendered_model, 'formalisms/MM_render']])]))
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['alter_context', [current_rendered_model, 'formalisms/MM_render/graphical']])]))
     
     def _init_key_status_enter(self):
         global control_pressed
@@ -6022,8 +6047,8 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [10, 'Adding transformation...'])]))
     
     def _init_init_running_upload_MVC_load_code_enter(self):
-        from tkFileDialog import askopenfilename
-        self.filename = askopenfilename()
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'subwindow', 'FileBrowser', 'Select model code.']))
+        self.filename = None
     
     def _init_init_running_change_metamodel_enter(self):
         print("MM -> " + current_metamodel)
@@ -6052,7 +6077,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [10, 'Querying existing metamodels...'])]))
     
     def _init_init_running_open_model_search_CS_mappers_enter(self):
-        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['transformation_between', [{'abstract': current_metamodel, 'rendered': 'formalisms/MM_render'}, {'rendered': 'formalisms/MM_render'}]])]))
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['transformation_between', [{'abstract': current_metamodel, 'rendered': 'formalisms/MM_render/graphical'}, {'rendered': 'formalisms/MM_render/graphical'}]])]))
         print("Finding transformation with current MM: " + current_metamodel)
     
     def _init_init_running_open_model_search_CS_rendered_enter(self):
@@ -6201,13 +6226,24 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         return self.subprocess.poll() is not None
     
     def _init_init_running_upload_MVC_load_code_0_exec(self, parameters):
+        result = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, result]))
+    
+    def _init_init_running_upload_MVC_waiting_0_exec(self, parameters):
+        result = parameters[0]
+        self.filename = result
+    
+    def _init_init_running_upload_MVC_waiting_1_exec(self, parameters):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'subwindow']))
+    
+    def _init_init_running_upload_MVC_got_filename_0_exec(self, parameters):
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['model_overwrite', [current_model, open(self.filename, 'r').read()]])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [10, 'Uploading model...'])]))
     
-    def _init_init_running_upload_MVC_load_code_0_guard(self, parameters):
+    def _init_init_running_upload_MVC_got_filename_0_guard(self, parameters):
         return self.filename is not None
     
-    def _init_init_running_upload_MVC_load_code_1_guard(self, parameters):
+    def _init_init_running_upload_MVC_got_filename_1_guard(self, parameters):
         return self.filename is None
     
     def _init_init_running_upload_MVC_overwriting_model_0_exec(self, parameters):
@@ -6993,6 +7029,420 @@ class Browser(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.default_targets = self.states["/init"].getEffectiveTargetStates()
         RuntimeClassBase.initializeStatechart(self)
 
+class FileBrowser(RuntimeClassBase, tk.Toplevel, SCCDWidget):
+    def __init__(self, controller, prompt):
+        RuntimeClassBase.__init__(self, controller)
+        
+        self.semantics.big_step_maximality = StatechartSemantics.TakeMany
+        self.semantics.internal_event_lifeline = StatechartSemantics.Queue
+        self.semantics.input_event_lifeline = StatechartSemantics.FirstComboStep
+        self.semantics.priority = StatechartSemantics.SourceParent
+        self.semantics.concurrency = StatechartSemantics.Single
+        
+        # build Statechart structure
+        self.build_statechart_structure()
+        
+        # call user defined constructor
+        FileBrowser.user_defined_constructor(self, prompt)
+    
+    def user_defined_constructor(self, prompt):
+        tk.Toplevel.__init__(self)
+        SCCDWidget.__init__(self)
+        tk.Label(self, text=prompt).pack()
+        
+        self.button_frame = tk.Frame(self)
+        self.button_frame.pack(fill=tk.X)
+        
+        self.browser_frame = tk.Frame(self)
+        self.browser_frame.pack(fill=tk.BOTH)
+        
+        self.current_location = "."
+        self.selected_label = None
+        self.labels = {}
+    
+    def user_defined_destructor(self):
+        self.destroy()
+        # call super class destructors
+        if hasattr(tk.Toplevel, "__del__"):
+            tk.Toplevel.__del__(self)
+        if hasattr(SCCDWidget, "__del__"):
+            SCCDWidget.__del__(self)
+    
+    
+    # builds Statechart structure
+    def build_statechart_structure(self):
+        
+        # state <root>
+        self.states[""] = State(0, "", self)
+        
+        # state /init
+        self.states["/init"] = State(1, "/init", self)
+        
+        # state /init/button_OK
+        self.states["/init/button_OK"] = State(2, "/init/button_OK", self)
+        self.states["/init/button_OK"].setEnter(self._init_button_OK_enter)
+        
+        # state /init/wait_for_packing_OK
+        self.states["/init/wait_for_packing_OK"] = State(3, "/init/wait_for_packing_OK", self)
+        
+        # state /init/button_back
+        self.states["/init/button_back"] = State(4, "/init/button_back", self)
+        self.states["/init/button_back"].setEnter(self._init_button_back_enter)
+        
+        # state /init/wait_for_packing_up
+        self.states["/init/wait_for_packing_up"] = State(5, "/init/wait_for_packing_up", self)
+        
+        # state /root
+        self.states["/root"] = ParallelState(6, "/root", self)
+        
+        # state /root/label_clicked
+        self.states["/root/label_clicked"] = State(7, "/root/label_clicked", self)
+        
+        # state /root/label_clicked/selecting_label
+        self.states["/root/label_clicked/selecting_label"] = State(8, "/root/label_clicked/selecting_label", self)
+        
+        # state /root/state
+        self.states["/root/state"] = State(9, "/root/state", self)
+        
+        # state /root/state/root
+        self.states["/root/state/root"] = State(10, "/root/state/root", self)
+        
+        # state /root/state/finished
+        self.states["/root/state/finished"] = State(11, "/root/state/finished", self)
+        
+        # state /root/draw_labels
+        self.states["/root/draw_labels"] = State(12, "/root/draw_labels", self)
+        
+        # state /root/draw_labels/create_labels
+        self.states["/root/draw_labels/create_labels"] = State(13, "/root/draw_labels/create_labels", self)
+        
+        # state /root/draw_labels/create_labels/query
+        self.states["/root/draw_labels/create_labels/query"] = State(14, "/root/draw_labels/create_labels/query", self)
+        
+        # state /root/draw_labels/create_labels/add_labels
+        self.states["/root/draw_labels/create_labels/add_labels"] = State(15, "/root/draw_labels/create_labels/add_labels", self)
+        
+        # state /root/draw_labels/create_labels/add_labels/check_list
+        self.states["/root/draw_labels/create_labels/add_labels/check_list"] = State(16, "/root/draw_labels/create_labels/add_labels/check_list", self)
+        
+        # state /root/draw_labels/create_labels/add_labels/add_label
+        self.states["/root/draw_labels/create_labels/add_labels/add_label"] = State(17, "/root/draw_labels/create_labels/add_labels/add_label", self)
+        self.states["/root/draw_labels/create_labels/add_labels/add_label"].setEnter(self._root_draw_labels_create_labels_add_labels_add_label_enter)
+        
+        # state /root/draw_labels/create_labels/add_labels/pack_label
+        self.states["/root/draw_labels/create_labels/add_labels/pack_label"] = State(18, "/root/draw_labels/create_labels/add_labels/pack_label", self)
+        
+        # state /root/draw_labels/waiting
+        self.states["/root/draw_labels/waiting"] = State(19, "/root/draw_labels/waiting", self)
+        
+        # state /root/draw_labels/delete_labels
+        self.states["/root/draw_labels/delete_labels"] = State(20, "/root/draw_labels/delete_labels", self)
+        
+        # state /closing
+        self.states["/closing"] = State(21, "/closing", self)
+        self.states["/closing"].setEnter(self._closing_enter)
+        
+        # state /close
+        self.states["/close"] = State(22, "/close", self)
+        self.states["/close"].setEnter(self._close_enter)
+        
+        # add children
+        self.states[""].addChild(self.states["/init"])
+        self.states[""].addChild(self.states["/root"])
+        self.states[""].addChild(self.states["/closing"])
+        self.states[""].addChild(self.states["/close"])
+        self.states["/init"].addChild(self.states["/init/button_OK"])
+        self.states["/init"].addChild(self.states["/init/wait_for_packing_OK"])
+        self.states["/init"].addChild(self.states["/init/button_back"])
+        self.states["/init"].addChild(self.states["/init/wait_for_packing_up"])
+        self.states["/root"].addChild(self.states["/root/label_clicked"])
+        self.states["/root"].addChild(self.states["/root/state"])
+        self.states["/root"].addChild(self.states["/root/draw_labels"])
+        self.states["/root/label_clicked"].addChild(self.states["/root/label_clicked/selecting_label"])
+        self.states["/root/state"].addChild(self.states["/root/state/root"])
+        self.states["/root/state"].addChild(self.states["/root/state/finished"])
+        self.states["/root/draw_labels"].addChild(self.states["/root/draw_labels/create_labels"])
+        self.states["/root/draw_labels"].addChild(self.states["/root/draw_labels/waiting"])
+        self.states["/root/draw_labels"].addChild(self.states["/root/draw_labels/delete_labels"])
+        self.states["/root/draw_labels/create_labels"].addChild(self.states["/root/draw_labels/create_labels/query"])
+        self.states["/root/draw_labels/create_labels"].addChild(self.states["/root/draw_labels/create_labels/add_labels"])
+        self.states["/root/draw_labels/create_labels/add_labels"].addChild(self.states["/root/draw_labels/create_labels/add_labels/check_list"])
+        self.states["/root/draw_labels/create_labels/add_labels"].addChild(self.states["/root/draw_labels/create_labels/add_labels/add_label"])
+        self.states["/root/draw_labels/create_labels/add_labels"].addChild(self.states["/root/draw_labels/create_labels/add_labels/pack_label"])
+        self.states[""].fixTree()
+        self.states[""].default_state = self.states["/init"]
+        self.states["/init"].default_state = self.states["/init/button_OK"]
+        self.states["/root/label_clicked"].default_state = self.states["/root/label_clicked/selecting_label"]
+        self.states["/root/state"].default_state = self.states["/root/state/root"]
+        self.states["/root/draw_labels"].default_state = self.states["/root/draw_labels/create_labels"]
+        self.states["/root/draw_labels/create_labels"].default_state = self.states["/root/draw_labels/create_labels/query"]
+        self.states["/root/draw_labels/create_labels/add_labels"].default_state = self.states["/root/draw_labels/create_labels/add_labels/check_list"]
+        
+        # transition /init/button_OK
+        _init_button_OK_0 = Transition(self, self.states["/init/button_OK"], [self.states["/init/wait_for_packing_OK"]])
+        _init_button_OK_0.setAction(self._init_button_OK_0_exec)
+        _init_button_OK_0.setTrigger(Event("instance_created", None))
+        self.states["/init/button_OK"].addTransition(_init_button_OK_0)
+        
+        # transition /init/wait_for_packing_OK
+        _init_wait_for_packing_OK_0 = Transition(self, self.states["/init/wait_for_packing_OK"], [self.states["/init/button_back"]])
+        _init_wait_for_packing_OK_0.setAction(self._init_wait_for_packing_OK_0_exec)
+        _init_wait_for_packing_OK_0.setTrigger(Event("tk_widget", None))
+        self.states["/init/wait_for_packing_OK"].addTransition(_init_wait_for_packing_OK_0)
+        
+        # transition /init/button_back
+        _init_button_back_0 = Transition(self, self.states["/init/button_back"], [self.states["/init/wait_for_packing_up"]])
+        _init_button_back_0.setAction(self._init_button_back_0_exec)
+        _init_button_back_0.setTrigger(Event("instance_created", None))
+        self.states["/init/button_back"].addTransition(_init_button_back_0)
+        
+        # transition /init/wait_for_packing_up
+        _init_wait_for_packing_up_0 = Transition(self, self.states["/init/wait_for_packing_up"], [self.states["/root"]])
+        _init_wait_for_packing_up_0.setAction(self._init_wait_for_packing_up_0_exec)
+        _init_wait_for_packing_up_0.setTrigger(Event("tk_widget", None))
+        self.states["/init/wait_for_packing_up"].addTransition(_init_wait_for_packing_up_0)
+        
+        # transition /root/label_clicked/selecting_label
+        _root_label_clicked_selecting_label_0 = Transition(self, self.states["/root/label_clicked/selecting_label"], [self.states["/root/label_clicked/selecting_label"]])
+        _root_label_clicked_selecting_label_0.setAction(self._root_label_clicked_selecting_label_0_exec)
+        _root_label_clicked_selecting_label_0.setTrigger(Event("label_pressed", None))
+        _root_label_clicked_selecting_label_0.setGuard(self._root_label_clicked_selecting_label_0_guard)
+        self.states["/root/label_clicked/selecting_label"].addTransition(_root_label_clicked_selecting_label_0)
+        _root_label_clicked_selecting_label_1 = Transition(self, self.states["/root/label_clicked/selecting_label"], [self.states["/root/label_clicked/selecting_label"]])
+        _root_label_clicked_selecting_label_1.setAction(self._root_label_clicked_selecting_label_1_exec)
+        _root_label_clicked_selecting_label_1.setTrigger(Event("label_pressed", None))
+        _root_label_clicked_selecting_label_1.setGuard(self._root_label_clicked_selecting_label_1_guard)
+        self.states["/root/label_clicked/selecting_label"].addTransition(_root_label_clicked_selecting_label_1)
+        _root_label_clicked_selecting_label_2 = Transition(self, self.states["/root/label_clicked/selecting_label"], [self.states["/root/label_clicked/selecting_label"]])
+        _root_label_clicked_selecting_label_2.setAction(self._root_label_clicked_selecting_label_2_exec)
+        _root_label_clicked_selecting_label_2.setTrigger(Event("label_pressed", None))
+        _root_label_clicked_selecting_label_2.setGuard(self._root_label_clicked_selecting_label_2_guard)
+        self.states["/root/label_clicked/selecting_label"].addTransition(_root_label_clicked_selecting_label_2)
+        
+        # transition /root/state/root
+        _root_state_root_0 = Transition(self, self.states["/root/state/root"], [self.states["/root/state/root"]])
+        _root_state_root_0.setAction(self._root_state_root_0_exec)
+        _root_state_root_0.setTrigger(Event("button_pressed", None))
+        _root_state_root_0.setGuard(self._root_state_root_0_guard)
+        self.states["/root/state/root"].addTransition(_root_state_root_0)
+        _root_state_root_1 = Transition(self, self.states["/root/state/root"], [self.states["/root/state/root"]])
+        _root_state_root_1.setAction(self._root_state_root_1_exec)
+        _root_state_root_1.setTrigger(Event("button_pressed", None))
+        _root_state_root_1.setGuard(self._root_state_root_1_guard)
+        self.states["/root/state/root"].addTransition(_root_state_root_1)
+        
+        # transition /root/draw_labels/create_labels/query
+        _root_draw_labels_create_labels_query_0 = Transition(self, self.states["/root/draw_labels/create_labels/query"], [self.states["/root/draw_labels/create_labels/add_labels"]])
+        _root_draw_labels_create_labels_query_0.setAction(self._root_draw_labels_create_labels_query_0_exec)
+        _root_draw_labels_create_labels_query_0.setTrigger(None)
+        self.states["/root/draw_labels/create_labels/query"].addTransition(_root_draw_labels_create_labels_query_0)
+        
+        # transition /root/draw_labels/create_labels/add_labels/check_list
+        _root_draw_labels_create_labels_add_labels_check_list_0 = Transition(self, self.states["/root/draw_labels/create_labels/add_labels/check_list"], [self.states["/root/draw_labels/waiting"]])
+        _root_draw_labels_create_labels_add_labels_check_list_0.setTrigger(None)
+        _root_draw_labels_create_labels_add_labels_check_list_0.setGuard(self._root_draw_labels_create_labels_add_labels_check_list_0_guard)
+        self.states["/root/draw_labels/create_labels/add_labels/check_list"].addTransition(_root_draw_labels_create_labels_add_labels_check_list_0)
+        _root_draw_labels_create_labels_add_labels_check_list_1 = Transition(self, self.states["/root/draw_labels/create_labels/add_labels/check_list"], [self.states["/root/draw_labels/create_labels/add_labels/add_label"]])
+        _root_draw_labels_create_labels_add_labels_check_list_1.setTrigger(None)
+        _root_draw_labels_create_labels_add_labels_check_list_1.setGuard(self._root_draw_labels_create_labels_add_labels_check_list_1_guard)
+        self.states["/root/draw_labels/create_labels/add_labels/check_list"].addTransition(_root_draw_labels_create_labels_add_labels_check_list_1)
+        
+        # transition /root/draw_labels/create_labels/add_labels/add_label
+        _root_draw_labels_create_labels_add_labels_add_label_0 = Transition(self, self.states["/root/draw_labels/create_labels/add_labels/add_label"], [self.states["/root/draw_labels/create_labels/add_labels/pack_label"]])
+        _root_draw_labels_create_labels_add_labels_add_label_0.setAction(self._root_draw_labels_create_labels_add_labels_add_label_0_exec)
+        _root_draw_labels_create_labels_add_labels_add_label_0.setTrigger(Event("instance_created", None))
+        self.states["/root/draw_labels/create_labels/add_labels/add_label"].addTransition(_root_draw_labels_create_labels_add_labels_add_label_0)
+        
+        # transition /root/draw_labels/create_labels/add_labels/pack_label
+        _root_draw_labels_create_labels_add_labels_pack_label_0 = Transition(self, self.states["/root/draw_labels/create_labels/add_labels/pack_label"], [self.states["/root/draw_labels/create_labels/add_labels/check_list"]])
+        _root_draw_labels_create_labels_add_labels_pack_label_0.setAction(self._root_draw_labels_create_labels_add_labels_pack_label_0_exec)
+        _root_draw_labels_create_labels_add_labels_pack_label_0.setTrigger(Event("tk_widget", None))
+        self.states["/root/draw_labels/create_labels/add_labels/pack_label"].addTransition(_root_draw_labels_create_labels_add_labels_pack_label_0)
+        
+        # transition /root/draw_labels/delete_labels
+        _root_draw_labels_delete_labels_0 = Transition(self, self.states["/root/draw_labels/delete_labels"], [self.states["/root/draw_labels/delete_labels"]])
+        _root_draw_labels_delete_labels_0.setAction(self._root_draw_labels_delete_labels_0_exec)
+        _root_draw_labels_delete_labels_0.setTrigger(None)
+        _root_draw_labels_delete_labels_0.setGuard(self._root_draw_labels_delete_labels_0_guard)
+        self.states["/root/draw_labels/delete_labels"].addTransition(_root_draw_labels_delete_labels_0)
+        _root_draw_labels_delete_labels_1 = Transition(self, self.states["/root/draw_labels/delete_labels"], [self.states["/root/draw_labels/create_labels"]])
+        _root_draw_labels_delete_labels_1.setTrigger(None)
+        _root_draw_labels_delete_labels_1.setGuard(self._root_draw_labels_delete_labels_1_guard)
+        self.states["/root/draw_labels/delete_labels"].addTransition(_root_draw_labels_delete_labels_1)
+        
+        # transition /closing
+        _closing_0 = Transition(self, self.states["/closing"], [self.states["/closing"]])
+        _closing_0.setTrigger(Event("instance_deleted", None))
+        _closing_0.setGuard(self._closing_0_guard)
+        self.states["/closing"].addTransition(_closing_0)
+        _closing_1 = Transition(self, self.states["/closing"], [self.states["/close"]])
+        _closing_1.setTrigger(Event("instance_deleted", None))
+        _closing_1.setGuard(self._closing_1_guard)
+        self.states["/closing"].addTransition(_closing_1)
+        
+        # transition /root
+        _root_0 = Transition(self, self.states["/root"], [self.states["/closing"]])
+        _root_0.setAction(self._root_0_exec)
+        _root_0.setTrigger(None)
+        _root_0.setGuard(self._root_0_guard)
+        self.states["/root"].addTransition(_root_0)
+        _root_1 = Transition(self, self.states["/root"], [self.states["/closing"]])
+        _root_1.setAction(self._root_1_exec)
+        _root_1.setTrigger(Event("window-close", None))
+        _root_1.setGuard(self._root_1_guard)
+        self.states["/root"].addTransition(_root_1)
+        _root_2 = Transition(self, self.states["/root"], [self.states["/closing"]])
+        _root_2.setAction(self._root_2_exec)
+        _root_2.setTrigger(Event("close_self", None))
+        self.states["/root"].addTransition(_root_2)
+        
+        # transition /root/draw_labels
+        _root_draw_labels_0 = Transition(self, self.states["/root/draw_labels"], [self.states["/root/draw_labels/delete_labels"]])
+        _root_draw_labels_0.setTrigger(Event("redraw_labels", None))
+        self.states["/root/draw_labels"].addTransition(_root_draw_labels_0)
+    
+    def _init_button_OK_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'buttons', 'Button', {'parent': self.button_frame, 'visual': TextVisual('OK'), 'tooltip_text': 'Open model', 'event_parameters': 'OK'}]))
+    
+    def _init_button_back_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'buttons', 'Button', {'parent': self.button_frame, 'visual': TextVisual('back'), 'tooltip_text': 'Up in hierarchy', 'event_parameters': 'UP'}]))
+    
+    def _root_draw_labels_create_labels_add_labels_add_label_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'labels', 'Label', {'parent': self.browser_frame, 'text': self.labels_to_add[0]}]))
+    
+    def _closing_enter(self):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, self.to_close.pop(0)]))
+    
+    def _close_enter(self):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("close_window", None, [])]))
+        print("CLOSE BROWSER")
+    
+    def _root_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("browse_result", None, [self.current_location])]))
+        self.raiseInternalEvent(Event("close_self", None, []))
+        self.to_close = self.labels.values() + [self.button_ok, self.button_back]
+    
+    def _root_0_guard(self, parameters):
+        return os.path.isfile(self.current_location)
+    
+    def _root_1_exec(self, parameters):
+        ID = parameters[0]
+        self.to_close = self.labels.values() + [self.button_ok, self.button_back]
+    
+    def _root_1_guard(self, parameters):
+        ID = parameters[0]
+        return ID == id(self)
+    
+    def _root_2_exec(self, parameters):
+        self.to_close = self.labels.values() + [self.button_ok, self.button_back]
+    
+    def _init_button_OK_0_exec(self, parameters):
+        association_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
+        self.button_ok = association_name
+    
+    def _init_wait_for_packing_OK_0_exec(self, parameters):
+        tk_elem = parameters[0]
+        tk_elem.pack(anchor=tk.W, fill=tk.BOTH, expand=tk.TRUE)
+    
+    def _init_button_back_0_exec(self, parameters):
+        association_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
+        self.button_back = association_name
+    
+    def _init_wait_for_packing_up_0_exec(self, parameters):
+        tk_elem = parameters[0]
+        tk_elem.pack(anchor=tk.E, fill=tk.BOTH, expand=tk.TRUE)
+    
+    def _root_label_clicked_selecting_label_0_exec(self, parameters):
+        text = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.labels[text], Event("highlight", None, [])]))
+        self.selected_label = text
+    
+    def _root_label_clicked_selecting_label_0_guard(self, parameters):
+        text = parameters[0]
+        return self.selected_label is None
+    
+    def _root_label_clicked_selecting_label_1_exec(self, parameters):
+        text = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.labels[self.selected_label], Event("unhighlight", None, [])]))
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, self.labels[text], Event("highlight", None, [])]))
+        self.selected_label = text
+    
+    def _root_label_clicked_selecting_label_1_guard(self, parameters):
+        text = parameters[0]
+        return self.selected_label is not None and self.selected_label != text
+    
+    def _root_label_clicked_selecting_label_2_exec(self, parameters):
+        text = parameters[0]
+        self.current_location += ("/" + self.selected_label)
+        self.selected_label = None
+        self.raiseInternalEvent(Event("redraw_labels", None, []))
+    
+    def _root_label_clicked_selecting_label_2_guard(self, parameters):
+        text = parameters[0]
+        return self.selected_label is not None and self.selected_label == text
+    
+    def _root_state_root_0_exec(self, parameters):
+        event_name = parameters[0]
+        self.current_location += ("/" + self.selected_label)
+        self.selected_label = None
+        self.raiseInternalEvent(Event("redraw_labels", None, []))
+    
+    def _root_state_root_0_guard(self, parameters):
+        event_name = parameters[0]
+        return event_name == 'OK' and self.selected_label is not None
+    
+    def _root_state_root_1_exec(self, parameters):
+        event_name = parameters[0]
+        self.current_location += "/.."
+        self.selected_label = None
+        self.raiseInternalEvent(Event("redraw_labels", None, []))
+    
+    def _root_state_root_1_guard(self, parameters):
+        event_name = parameters[0]
+        return event_name == 'UP' and self.current_location != ''
+    
+    def _root_draw_labels_create_labels_query_0_exec(self, parameters):
+        result = os.listdir(self.current_location)
+        self.labels_to_add = sorted(result)
+        self.all_results = sorted(result)
+    
+    def _root_draw_labels_create_labels_add_labels_check_list_0_guard(self, parameters):
+        return not self.labels_to_add
+    
+    def _root_draw_labels_create_labels_add_labels_check_list_1_guard(self, parameters):
+        return self.labels_to_add
+    
+    def _root_draw_labels_create_labels_add_labels_add_label_0_exec(self, parameters):
+        association_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
+        self.labels[self.labels_to_add.pop(0)] = association_name
+    
+    def _root_draw_labels_create_labels_add_labels_pack_label_0_exec(self, parameters):
+        tk_elem = parameters[0]
+        tk_elem.pack()
+    
+    def _root_draw_labels_delete_labels_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, self.labels.popitem()[1]]))
+    
+    def _root_draw_labels_delete_labels_0_guard(self, parameters):
+        return len(self.labels) > 0
+    
+    def _root_draw_labels_delete_labels_1_guard(self, parameters):
+        return len(self.labels) == 0
+    
+    def _closing_0_guard(self, parameters):
+        return len(self.to_close) > 0
+    
+    def _closing_1_guard(self, parameters):
+        return len(self.to_close) == 0
+    
+    def initializeStatechart(self):
+        # enter default state
+        self.default_targets = self.states["/init"].getEffectiveTargetStates()
+        RuntimeClassBase.initializeStatechart(self)
+
 class SplashWindow(RuntimeClassBase, tk.Toplevel):
     def __init__(self, controller):
         RuntimeClassBase.__init__(self, controller)
@@ -9538,50 +9988,59 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         # state /ready
         self.states["/ready"] = State(61, "/ready", self)
         
+        # state /browse_file
+        self.states["/browse_file"] = State(62, "/browse_file", self)
+        self.states["/browse_file"].setEnter(self._browse_file_enter)
+        
+        # state /waiting
+        self.states["/waiting"] = State(63, "/waiting", self)
+        
         # state /creating
-        self.states["/creating"] = State(62, "/creating", self)
+        self.states["/creating"] = State(64, "/creating", self)
         self.states["/creating"].setEnter(self._creating_enter)
         
         # state /modifying_mm
-        self.states["/modifying_mm"] = State(63, "/modifying_mm", self)
+        self.states["/modifying_mm"] = State(65, "/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(64, "/finish_transformation_add", self)
+        self.states["/finish_transformation_add"] = State(66, "/finish_transformation_add", self)
         self.states["/finish_transformation_add"].setEnter(self._finish_transformation_add_enter)
         
         # state /closing
-        self.states["/closing"] = State(65, "/closing", self)
+        self.states["/closing"] = State(67, "/closing", self)
         self.states["/closing"].setEnter(self._closing_enter)
         
         # state /closed
-        self.states["/closed"] = State(66, "/closed", self)
+        self.states["/closed"] = State(68, "/closed", self)
         
         # state /browsing_input
-        self.states["/browsing_input"] = State(67, "/browsing_input", self)
+        self.states["/browsing_input"] = State(69, "/browsing_input", self)
         
         # state /browsing_input/creating
-        self.states["/browsing_input/creating"] = State(68, "/browsing_input/creating", self)
+        self.states["/browsing_input/creating"] = State(70, "/browsing_input/creating", self)
         self.states["/browsing_input/creating"].setEnter(self._browsing_input_creating_enter)
         
         # state /browsing_input/waiting
-        self.states["/browsing_input/waiting"] = State(69, "/browsing_input/waiting", self)
+        self.states["/browsing_input/waiting"] = State(71, "/browsing_input/waiting", self)
         
         # state /browsing_output
-        self.states["/browsing_output"] = State(70, "/browsing_output", self)
+        self.states["/browsing_output"] = State(72, "/browsing_output", self)
         
         # state /browsing_output/creating
-        self.states["/browsing_output/creating"] = State(71, "/browsing_output/creating", self)
+        self.states["/browsing_output/creating"] = State(73, "/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)
+        self.states["/browsing_output/waiting"] = State(74, "/browsing_output/waiting", self)
         
         # add children
         self.states[""].addChild(self.states["/init"])
         self.states[""].addChild(self.states["/draw_signature"])
         self.states[""].addChild(self.states["/ready"])
+        self.states[""].addChild(self.states["/browse_file"])
+        self.states[""].addChild(self.states["/waiting"])
         self.states[""].addChild(self.states["/creating"])
         self.states[""].addChild(self.states["/modifying_mm"])
         self.states[""].addChild(self.states["/finish_transformation_add"])
@@ -9940,12 +10399,27 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         _ready_10.setTrigger(Event("button_pressed", None))
         _ready_10.setGuard(self._ready_10_guard)
         self.states["/ready"].addTransition(_ready_10)
-        _ready_11 = Transition(self, self.states["/ready"], [self.states["/creating"]])
-        _ready_11.setAction(self._ready_11_exec)
+        _ready_11 = Transition(self, self.states["/ready"], [self.states["/browse_file"]])
         _ready_11.setTrigger(Event("button_pressed", None))
         _ready_11.setGuard(self._ready_11_guard)
         self.states["/ready"].addTransition(_ready_11)
         
+        # transition /browse_file
+        _browse_file_0 = Transition(self, self.states["/browse_file"], [self.states["/waiting"]])
+        _browse_file_0.setAction(self._browse_file_0_exec)
+        _browse_file_0.setTrigger(Event("instance_created", None))
+        self.states["/browse_file"].addTransition(_browse_file_0)
+        
+        # transition /waiting
+        _waiting_0 = Transition(self, self.states["/waiting"], [self.states["/waiting"]])
+        _waiting_0.setAction(self._waiting_0_exec)
+        _waiting_0.setTrigger(Event("browse_result", None))
+        self.states["/waiting"].addTransition(_waiting_0)
+        _waiting_1 = Transition(self, self.states["/waiting"], [self.states["/creating"]])
+        _waiting_1.setAction(self._waiting_1_exec)
+        _waiting_1.setTrigger(Event("close_window", None))
+        self.states["/waiting"].addTransition(_waiting_1)
+        
         # transition /creating
         _creating_0 = Transition(self, self.states["/creating"], [self.states["/modifying_mm"]])
         _creating_0.setAction(self._creating_0_exec)
@@ -10084,6 +10558,10 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     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 _browse_file_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'browser', 'FileBrowser', 'Select model code.']))
+        self.upload_code = ""
+    
     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.create_input_signature, self.create_output_signature, self.activity_name, self.upload_code]])]))
     
@@ -10369,19 +10847,21 @@ class ActivityCreator(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         evt = parameters[0]
         return evt == 'confirm' and self.activity_type != 'ActionLanguage'
     
-    def _ready_11_exec(self, parameters):
-        evt = parameters[0]
-        from tkFileDialog import askopenfilename
-        self.upload_code = askopenfilename()
-        if self.upload_code is None:
-            self.upload_code = ""
-        else:
-            self.upload_code = open(self.upload_code, 'r').read()
-    
     def _ready_11_guard(self, parameters):
         evt = parameters[0]
         return evt == 'confirm' and self.activity_type == 'ActionLanguage'
     
+    def _browse_file_0_exec(self, parameters):
+        result = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, result]))
+    
+    def _waiting_0_exec(self, parameters):
+        result = parameters[0]
+        self.upload_code = open(result, 'r').read()
+    
+    def _waiting_1_exec(self, parameters):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, 'browser']))
+    
     def _creating_0_exec(self, parameters):
         model = parameters[0]
         self.subprocess = subprocess.Popen([sys.executable, sys.argv[0], "--address", data['mv_address'], "--username", data['username'], "--password", data['password'], "--model", model, "--limited"])
@@ -13821,6 +14301,12 @@ class ObjectManager(ObjectManagerBase):
             instance.associations["labels"] = Association("Label", 0, -1)
             instance.associations["parent"] = Association("A", 0, -1)
             instance.associations["progressbar"] = Association("ProgressBar", 0, -1)
+        elif class_name == "FileBrowser":
+            instance = FileBrowser(self.controller, construct_params[0])
+            instance.associations = {}
+            instance.associations["buttons"] = Association("Button", 0, -1)
+            instance.associations["labels"] = Association("Label", 0, -1)
+            instance.associations["parent"] = Association("A", 0, -1)
         elif class_name == "SplashWindow":
             instance = SplashWindow(self.controller)
             instance.associations = {}

+ 2 - 0
frontend.xml

@@ -12,6 +12,7 @@
         import urllib
         import subprocess
         import sys
+        import os
         
         global current_model
         global current_metamodel
@@ -29,6 +30,7 @@
     <class src="classes/window/prompt_window.xml"/>
     <class src="classes/window/main_window.xml"/>
     <class src="classes/window/browser.xml"/>
+    <class src="classes/window/file_browser.xml"/>
     <class src="classes/window/splash_window.xml"/>
     <class src="classes/window/popup.xml"/>
     <class src="classes/window/choice_prompt_window.xml"/>

+ 2 - 2
upload_models.py

@@ -10,7 +10,7 @@ def scd_tracability(model):
 try:
     init()
     login("admin", "admin")
-    model_add("formalisms/MM_render", "formalisms/SimpleClassDiagrams", open("models/MM_render.mvc", 'r').read())
-    transformation_add_AL({"rendered": "formalisms/MM_render", "abstract": "formalisms/SimpleClassDiagrams"}, {"rendered": "formalisms/MM_render"}, "models/render_SCD", open("models/render_SCD.alc", 'r').read(), callback=scd_tracability)
+    model_add("formalisms/MM_render/graphical", "formalisms/SimpleClassDiagrams", open("models/MM_render.mvc", 'r').read())
+    transformation_add_AL({"rendered": "formalisms/MM_render/graphical", "abstract": "formalisms/SimpleClassDiagrams"}, {"rendered": "formalisms/MM_render/graphical"}, "models/render_SCD", open("models/render_SCD.alc", 'r').read(), callback=scd_tracability)
 except:
     pass