Browse Source

Selectable mapper, rendered model, and working multi-metamodel (including empty mapper/rendered)

Yentl Van Tendeloo 8 years ago
parent
commit
7692097f38

+ 10 - 4
classes/toolbar/concretesyntax_toolbar.xml

@@ -24,15 +24,21 @@
             # Mapper
             global current_mapper
             selected_mapper = tk.StringVar(self)
-            selected_mapper.set(current_mapper)
-            tk.OptionMenu(self, selected_mapper, *list(allowed_mappers)).pack(side=tk.LEFT)
+            selected_mapper.set(current_mapper if current_mapper is not None else "(none)")
+            om = tk.OptionMenu(self, selected_mapper, *list(allowed_mappers) if allowed_mappers else "(none)")
+            if not allowed_mappers:
+                om.configure(state=tk.DISABLED)
+            om.pack(side=tk.LEFT)
             selected_mapper.trace('w', lambda name, index, mode: self.controller.addInput(Event("changed_mapper", "input", [id(self), selected_mapper.get()])))
 
             # Rendered
             global current_rendered_model
             selected_rendered = tk.StringVar(self)
-            selected_rendered.set(current_rendered_model)
-            tk.OptionMenu(self, selected_rendered, *list(allowed_rendered)).pack(side=tk.LEFT)
+            selected_rendered.set(current_rendered_model if current_rendered_model is not None else "(none)")
+            om = tk.OptionMenu(self, selected_rendered, *list(allowed_rendered) if allowed_rendered else "(none)")
+            if not allowed_rendered:
+                om.configure(state=tk.DISABLED)
+            om.pack(side=tk.LEFT)
             selected_rendered.trace('w', lambda name, index, mode: self.controller.addInput(Event("changed_rendered", "input", [id(self), selected_rendered.get()])))
         </body>
     </constructor>

+ 10 - 0
classes/toolbar/metamodelling_toolbar.xml

@@ -85,6 +85,16 @@
                 <raise event="verify" scope="narrow" target="'parent'"/>
             </transition>
 
+            <transition event="button_pressed" cond="event_name == 'conf_bottom'" target=".">
+                <parameter name="event_name"/>
+                <raise event="conf_bottom" scope="narrow" target="'parent'"/>
+            </transition>
+
+            <transition event="button_pressed" cond="event_name == 'custom_MM'" target=".">
+                <parameter name="event_name"/>
+                <raise event="custom_MM" scope="narrow" target="'parent'"/>
+            </transition>
+
             <transition event="changed_metamodel" cond="ID == id(self) and new_metamodel != current_metamodel" target=".">
                 <parameter name="ID"/>
                 <parameter name="new_metamodel"/>

+ 3 - 3
classes/window/browser.xml

@@ -228,9 +228,9 @@
                             </onentry>
 
                             <transition cond="len(self.labels_to_add) == 0" target="../../../waiting"/>
-                            <transition cond="self.filter_metamodels is None" target="../add_label"/>
-                            <transition cond="self.filter_metamodels is not None and len(self.labels_to_add) > 0 and self.labels_to_add[0][-1] == '/'" target="../add_label"/>
-                            <transition cond="self.filter_metamodels is not None and len(self.labels_to_add) > 0 and self.labels_to_add[0][-1] != '/'" target="../check_types"/>
+                            <transition cond="not self.filter_metamodels" target="../add_label"/>
+                            <transition cond="self.filter_metamodels and len(self.labels_to_add) > 0 and self.labels_to_add[0][-1] == '/'" target="../add_label"/>
+                            <transition cond="self.filter_metamodels and len(self.labels_to_add) > 0 and self.labels_to_add[0][-1] != '/'" target="../check_types"/>
                         </state>
 
                         <state id="check_types">

+ 107 - 6
classes/window/main_window.xml

@@ -103,10 +103,15 @@
                     </raise>
                 </onentry>
                 <transition event="create_new_model" target="../create_new_model"/>
-                <transition event="open_model" target="../open_model"/>
+                <transition event="open_model" target="../open_model">
+                    <script>
+                        print("OPEN MODEL")
+                    </script>
+                </transition>
                 <transition event="rerender_model" target="../rerender_model"/>
-                <transition event="new_rendered" target="../new_rendered"/>
+                <transition event="new_rendered" cond="current_mapper is not None" target="../new_rendered"/>
                 <transition event="verify" target="../verify_model"/>
+                <transition event="conf_bottom" target="../conf_bottom"/>
 
                 <transition event="change_metamodel" target="../change_metamodel">
                     <parameter name="new_metamodel"/>
@@ -133,6 +138,9 @@
 
             <state id="change_metamodel">
                 <onentry>
+                    <script>
+                        print("MM -> " + current_metamodel)
+                    </script>
                     <raise event="mv_request" scope="broad">
                         <parameter expr="'alter_context'"/>
                         <parameter expr="[current_model, current_metamodel]"/>
@@ -147,6 +155,75 @@
                 <transition event="mv_response" target="../open_model/search_CS_mappers"/>
             </state>
 
+            <state id="conf_bottom">
+                <onentry>
+                    <raise event="mv_request" scope="broad">
+                        <parameter expr="'conformance_add'"/>
+                        <parameter expr="[current_model, 'formalisms/Bottom']"/>
+                    </raise>
+
+                    <raise event="update_status" scope="narrow" target="'progress_bar'">
+                        <parameter expr="10"/>
+                        <parameter expr="'Storing model context...'"/>
+                    </raise>
+
+                    <script>
+                        global current_metamodel
+                        current_metamodel = 'formalisms/Bottom'
+                    </script>
+                </onentry>
+
+                <transition event="mv_response" target="../change_metamodel"/>
+            </state>
+
+            <state id="custom_MM" initial="query">
+                <state id="query">
+                    <onentry>
+                        <raise event="create_instance" scope="cd">
+                            <parameter expr="'subwindow'"/>
+                            <parameter expr="'Browser'"/>
+                            <parameter expr="'Select metamodel to use.'"/>
+                            <parameter expr="[]"/>
+                        </raise>
+                        <raise event="update_status" scope="narrow" target="'progress_bar'">
+                            <parameter expr="0"/>
+                            <parameter expr="'Browsing for metamodel...'"/>
+                        </raise>
+                    </onentry>
+
+                    <transition event="instance_created" target="../wait_for_metamodel">
+                        <parameter name="association_name"/>
+                        <raise event="start_instance" scope="cd">
+                            <parameter expr="association_name"/>
+                        </raise>
+                        <script>
+                            self.subwindow = association_name
+                        </script>
+                    </transition>
+                </state>
+
+                <state id="wait_for_metamodel">
+                    <transition event="close_window" target="../../idle">
+                        <raise event="delete_instance" scope="cd">
+                            <parameter expr="self.subwindow"/>
+                        </raise>
+
+                        <raise event="update_status" scope="narrow" target="'progress_bar'">
+                            <parameter expr="10"/>
+                            <parameter expr="'Browsing for model... OK'"/>
+                        </raise>
+                    </transition>
+
+                    <transition event="browse_result" target="../../change_metamodel">
+                        <parameter name="result"/>
+                        <script>
+                            global current_metamodel
+                            current_metamodel = result
+                        </script>
+                    </transition>
+                </state>
+            </state>
+
             <state id="change_mapper">
                 <transition target="../rerender_model"/>
             </state>
@@ -273,6 +350,7 @@
                         <parameter name="result"/>
                         <script>
                             global current_metamodel
+                            print("Allowed metamodels: " + str(result))
                             if len(result) > 0:
                                 current_metamodel = next(iter(result))
                             else:
@@ -294,18 +372,34 @@
                         </raise>
                     </onentry>
 
-                    <transition event="mv_response" target="../search_CS_rendered">
+                    <transition event="mv_response" target="../check_CS_mapper">
                         <parameter name="result"/>
                         <script>
+                            print("MM: " + str(current_metamodel))
                             print("Allowed mappers: " + str(result))
                             self.allowed_mappers = list(result)
                             global current_mapper
-                            if current_mapper not in result:
-                                current_mapper = next(iter(result))
+                            if len(result) > 0:
+                                if current_mapper not in result:
+                                    current_mapper = next(iter(result))
+                            else:
+                                current_mapper = None
                         </script>
                     </transition>
                 </state>
 
+                <state id="check_CS_mapper">
+                    <transition cond="current_mapper is None" target="../../rerender_model">
+                        <script>
+                            global current_rendered_model
+                            current_rendered_model = None
+                            self.allowed_rendered = []
+                        </script>
+                        <raise event="clear_canvas" scope="narrow" target="'canvas'"/>
+                    </transition>
+                    <transition cond="current_mapper is not None" target="../search_CS_rendered"/>
+                </state>
+
                 <state id="search_CS_rendered">
                     <onentry>
                         <raise event="mv_request" scope="broad">
@@ -624,7 +718,14 @@
                     </state>
 
                     <state id="pack_dsl_toolbar">
-                        <transition event="tk_widget" target="../../request_render">
+                        <transition event="tk_widget" cond="current_mapper is None" target="../../../idle">
+                            <parameter name="tk_elem"/>
+                            <script>
+                                tk_elem.pack(anchor=tk.W)
+                            </script>
+                        </transition>
+
+                        <transition event="tk_widget" cond="current_mapper is not None" target="../../request_render">
                             <parameter name="tk_elem"/>
                             <script>
                                 tk_elem.pack(anchor=tk.W)

+ 233 - 75
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:   Mon Oct  2 13:04:34 2017
+Date:   Mon Oct  2 16:07:22 2017
 
 Model author: Yentl Van Tendeloo
 Model name:   Modelverse Visual Editor - Tkinter Version 
@@ -4019,151 +4019,168 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/running/change_metamodel"] = State(8, "/running/change_metamodel", self)
         self.states["/running/change_metamodel"].setEnter(self._running_change_metamodel_enter)
         
+        # state /running/conf_bottom
+        self.states["/running/conf_bottom"] = State(9, "/running/conf_bottom", self)
+        self.states["/running/conf_bottom"].setEnter(self._running_conf_bottom_enter)
+        
+        # state /running/custom_MM
+        self.states["/running/custom_MM"] = State(10, "/running/custom_MM", self)
+        
+        # state /running/custom_MM/query
+        self.states["/running/custom_MM/query"] = State(11, "/running/custom_MM/query", self)
+        self.states["/running/custom_MM/query"].setEnter(self._running_custom_MM_query_enter)
+        
+        # state /running/custom_MM/wait_for_metamodel
+        self.states["/running/custom_MM/wait_for_metamodel"] = State(12, "/running/custom_MM/wait_for_metamodel", self)
+        
         # state /running/change_mapper
-        self.states["/running/change_mapper"] = State(9, "/running/change_mapper", self)
+        self.states["/running/change_mapper"] = State(13, "/running/change_mapper", self)
         
         # state /running/change_rendered
-        self.states["/running/change_rendered"] = State(10, "/running/change_rendered", self)
+        self.states["/running/change_rendered"] = State(14, "/running/change_rendered", self)
         
         # state /running/verify_model
-        self.states["/running/verify_model"] = State(11, "/running/verify_model", self)
+        self.states["/running/verify_model"] = State(15, "/running/verify_model", self)
         
         # state /running/verify_model/request
-        self.states["/running/verify_model/request"] = State(12, "/running/verify_model/request", self)
+        self.states["/running/verify_model/request"] = State(16, "/running/verify_model/request", self)
         self.states["/running/verify_model/request"].setEnter(self._running_verify_model_request_enter)
         
         # state /running/verify_model/show_result
-        self.states["/running/verify_model/show_result"] = State(13, "/running/verify_model/show_result", self)
+        self.states["/running/verify_model/show_result"] = State(17, "/running/verify_model/show_result", self)
         
         # state /running/verify_model/wait_for_close
-        self.states["/running/verify_model/wait_for_close"] = State(14, "/running/verify_model/wait_for_close", self)
+        self.states["/running/verify_model/wait_for_close"] = State(18, "/running/verify_model/wait_for_close", self)
         
         # state /running/open_model
-        self.states["/running/open_model"] = State(15, "/running/open_model", self)
+        self.states["/running/open_model"] = State(19, "/running/open_model", self)
         
         # state /running/open_model/query_model
-        self.states["/running/open_model/query_model"] = State(16, "/running/open_model/query_model", self)
+        self.states["/running/open_model/query_model"] = State(20, "/running/open_model/query_model", self)
         self.states["/running/open_model/query_model"].setEnter(self._running_open_model_query_model_enter)
         
         # state /running/open_model/wait_for_model
-        self.states["/running/open_model/wait_for_model"] = State(17, "/running/open_model/wait_for_model", self)
+        self.states["/running/open_model/wait_for_model"] = State(21, "/running/open_model/wait_for_model", self)
         
         # state /running/open_model/got_model
-        self.states["/running/open_model/got_model"] = State(18, "/running/open_model/got_model", self)
+        self.states["/running/open_model/got_model"] = State(22, "/running/open_model/got_model", self)
         
         # state /running/open_model/search_metamodels
-        self.states["/running/open_model/search_metamodels"] = State(19, "/running/open_model/search_metamodels", self)
+        self.states["/running/open_model/search_metamodels"] = State(23, "/running/open_model/search_metamodels", self)
         self.states["/running/open_model/search_metamodels"].setEnter(self._running_open_model_search_metamodels_enter)
         
         # state /running/open_model/search_CS_mappers
-        self.states["/running/open_model/search_CS_mappers"] = State(20, "/running/open_model/search_CS_mappers", self)
+        self.states["/running/open_model/search_CS_mappers"] = State(24, "/running/open_model/search_CS_mappers", self)
         self.states["/running/open_model/search_CS_mappers"].setEnter(self._running_open_model_search_CS_mappers_enter)
         
+        # state /running/open_model/check_CS_mapper
+        self.states["/running/open_model/check_CS_mapper"] = State(25, "/running/open_model/check_CS_mapper", self)
+        
         # state /running/open_model/search_CS_rendered
-        self.states["/running/open_model/search_CS_rendered"] = State(21, "/running/open_model/search_CS_rendered", self)
+        self.states["/running/open_model/search_CS_rendered"] = State(26, "/running/open_model/search_CS_rendered", self)
         self.states["/running/open_model/search_CS_rendered"].setEnter(self._running_open_model_search_CS_rendered_enter)
         
         # state /running/open_model/store_metamodel
-        self.states["/running/open_model/store_metamodel"] = State(22, "/running/open_model/store_metamodel", self)
+        self.states["/running/open_model/store_metamodel"] = State(27, "/running/open_model/store_metamodel", self)
         self.states["/running/open_model/store_metamodel"].setEnter(self._running_open_model_store_metamodel_enter)
         
         # state /running/new_rendered
-        self.states["/running/new_rendered"] = State(23, "/running/new_rendered", self)
+        self.states["/running/new_rendered"] = State(28, "/running/new_rendered", self)
         self.states["/running/new_rendered"].setEnter(self._running_new_rendered_enter)
         
         # state /running/create_new_model
-        self.states["/running/create_new_model"] = State(24, "/running/create_new_model", self)
+        self.states["/running/create_new_model"] = State(29, "/running/create_new_model", self)
         
         # state /running/create_new_model/query_metamodel
-        self.states["/running/create_new_model/query_metamodel"] = State(25, "/running/create_new_model/query_metamodel", self)
+        self.states["/running/create_new_model/query_metamodel"] = State(30, "/running/create_new_model/query_metamodel", self)
         self.states["/running/create_new_model/query_metamodel"].setEnter(self._running_create_new_model_query_metamodel_enter)
         
         # state /running/create_new_model/wait_for_metamodel
-        self.states["/running/create_new_model/wait_for_metamodel"] = State(26, "/running/create_new_model/wait_for_metamodel", self)
+        self.states["/running/create_new_model/wait_for_metamodel"] = State(31, "/running/create_new_model/wait_for_metamodel", self)
         
         # state /running/create_new_model/got_mm
-        self.states["/running/create_new_model/got_mm"] = State(27, "/running/create_new_model/got_mm", self)
+        self.states["/running/create_new_model/got_mm"] = State(32, "/running/create_new_model/got_mm", self)
         
         # state /running/create_new_model/prompt_model_name
-        self.states["/running/create_new_model/prompt_model_name"] = State(28, "/running/create_new_model/prompt_model_name", self)
+        self.states["/running/create_new_model/prompt_model_name"] = State(33, "/running/create_new_model/prompt_model_name", self)
         self.states["/running/create_new_model/prompt_model_name"].setEnter(self._running_create_new_model_prompt_model_name_enter)
         
         # state /running/create_new_model/waiting_for_model_name
-        self.states["/running/create_new_model/waiting_for_model_name"] = State(29, "/running/create_new_model/waiting_for_model_name", self)
+        self.states["/running/create_new_model/waiting_for_model_name"] = State(34, "/running/create_new_model/waiting_for_model_name", self)
         
         # state /running/create_new_model/creating_model
-        self.states["/running/create_new_model/creating_model"] = State(30, "/running/create_new_model/creating_model", self)
+        self.states["/running/create_new_model/creating_model"] = State(35, "/running/create_new_model/creating_model", self)
         self.states["/running/create_new_model/creating_model"].setEnter(self._running_create_new_model_creating_model_enter)
         
         # state /running/rerender_model
-        self.states["/running/rerender_model"] = State(31, "/running/rerender_model", self)
+        self.states["/running/rerender_model"] = State(36, "/running/rerender_model", self)
         
         # state /running/rerender_model/initial_render
-        self.states["/running/rerender_model/initial_render"] = State(32, "/running/rerender_model/initial_render", self)
+        self.states["/running/rerender_model/initial_render"] = State(37, "/running/rerender_model/initial_render", self)
         
         # state /running/rerender_model/recreate_toolbars
-        self.states["/running/rerender_model/recreate_toolbars"] = State(33, "/running/rerender_model/recreate_toolbars", self)
+        self.states["/running/rerender_model/recreate_toolbars"] = State(38, "/running/rerender_model/recreate_toolbars", self)
         self.states["/running/rerender_model/recreate_toolbars"].setEnter(self._running_rerender_model_recreate_toolbars_enter)
         
         # state /running/rerender_model/recreate_toolbars/waiting
-        self.states["/running/rerender_model/recreate_toolbars/waiting"] = State(34, "/running/rerender_model/recreate_toolbars/waiting", self)
+        self.states["/running/rerender_model/recreate_toolbars/waiting"] = State(39, "/running/rerender_model/recreate_toolbars/waiting", self)
         
         # state /running/rerender_model/recreate_toolbars/close_all
-        self.states["/running/rerender_model/recreate_toolbars/close_all"] = State(35, "/running/rerender_model/recreate_toolbars/close_all", self)
+        self.states["/running/rerender_model/recreate_toolbars/close_all"] = State(40, "/running/rerender_model/recreate_toolbars/close_all", self)
         
         # state /running/rerender_model/canvas
-        self.states["/running/rerender_model/canvas"] = State(36, "/running/rerender_model/canvas", self)
+        self.states["/running/rerender_model/canvas"] = State(41, "/running/rerender_model/canvas", self)
         self.states["/running/rerender_model/canvas"].setEnter(self._running_rerender_model_canvas_enter)
         
         # state /running/rerender_model/pack_canvas
-        self.states["/running/rerender_model/pack_canvas"] = State(37, "/running/rerender_model/pack_canvas", self)
+        self.states["/running/rerender_model/pack_canvas"] = State(42, "/running/rerender_model/pack_canvas", self)
         
         # state /running/rerender_model/model_toolbars
-        self.states["/running/rerender_model/model_toolbars"] = State(38, "/running/rerender_model/model_toolbars", self)
+        self.states["/running/rerender_model/model_toolbars"] = State(43, "/running/rerender_model/model_toolbars", self)
         
         # state /running/rerender_model/model_toolbars/mm_toolbar
-        self.states["/running/rerender_model/model_toolbars/mm_toolbar"] = State(39, "/running/rerender_model/model_toolbars/mm_toolbar", self)
+        self.states["/running/rerender_model/model_toolbars/mm_toolbar"] = State(44, "/running/rerender_model/model_toolbars/mm_toolbar", self)
         self.states["/running/rerender_model/model_toolbars/mm_toolbar"].setEnter(self._running_rerender_model_model_toolbars_mm_toolbar_enter)
         
         # state /running/rerender_model/model_toolbars/pack_mm_toolbar
-        self.states["/running/rerender_model/model_toolbars/pack_mm_toolbar"] = State(40, "/running/rerender_model/model_toolbars/pack_mm_toolbar", self)
+        self.states["/running/rerender_model/model_toolbars/pack_mm_toolbar"] = State(45, "/running/rerender_model/model_toolbars/pack_mm_toolbar", self)
         
         # state /running/rerender_model/model_toolbars/cs_toolbar
-        self.states["/running/rerender_model/model_toolbars/cs_toolbar"] = State(41, "/running/rerender_model/model_toolbars/cs_toolbar", self)
+        self.states["/running/rerender_model/model_toolbars/cs_toolbar"] = State(46, "/running/rerender_model/model_toolbars/cs_toolbar", self)
         self.states["/running/rerender_model/model_toolbars/cs_toolbar"].setEnter(self._running_rerender_model_model_toolbars_cs_toolbar_enter)
         
         # state /running/rerender_model/model_toolbars/pack_cs_toolbar
-        self.states["/running/rerender_model/model_toolbars/pack_cs_toolbar"] = State(42, "/running/rerender_model/model_toolbars/pack_cs_toolbar", self)
+        self.states["/running/rerender_model/model_toolbars/pack_cs_toolbar"] = State(47, "/running/rerender_model/model_toolbars/pack_cs_toolbar", self)
         
         # state /running/rerender_model/model_toolbars/dsl_toolbar
-        self.states["/running/rerender_model/model_toolbars/dsl_toolbar"] = State(43, "/running/rerender_model/model_toolbars/dsl_toolbar", self)
+        self.states["/running/rerender_model/model_toolbars/dsl_toolbar"] = State(48, "/running/rerender_model/model_toolbars/dsl_toolbar", self)
         self.states["/running/rerender_model/model_toolbars/dsl_toolbar"].setEnter(self._running_rerender_model_model_toolbars_dsl_toolbar_enter)
         
         # state /running/rerender_model/model_toolbars/pack_dsl_toolbar
-        self.states["/running/rerender_model/model_toolbars/pack_dsl_toolbar"] = State(44, "/running/rerender_model/model_toolbars/pack_dsl_toolbar", self)
+        self.states["/running/rerender_model/model_toolbars/pack_dsl_toolbar"] = State(49, "/running/rerender_model/model_toolbars/pack_dsl_toolbar", self)
         
         # state /running/rerender_model/request_render
-        self.states["/running/rerender_model/request_render"] = State(45, "/running/rerender_model/request_render", self)
+        self.states["/running/rerender_model/request_render"] = State(50, "/running/rerender_model/request_render", self)
         self.states["/running/rerender_model/request_render"].setEnter(self._running_rerender_model_request_render_enter)
         
         # state /running/rerender_model/render_model
-        self.states["/running/rerender_model/render_model"] = State(46, "/running/rerender_model/render_model", self)
+        self.states["/running/rerender_model/render_model"] = State(51, "/running/rerender_model/render_model", self)
         self.states["/running/rerender_model/render_model"].setEnter(self._running_rerender_model_render_model_enter)
         
         # state /running/rerender_model/render_model/allocate_groups
-        self.states["/running/rerender_model/render_model/allocate_groups"] = State(47, "/running/rerender_model/render_model/allocate_groups", self)
+        self.states["/running/rerender_model/render_model/allocate_groups"] = State(52, "/running/rerender_model/render_model/allocate_groups", self)
         
         # state /running/rerender_model/render_model/allocating_group
-        self.states["/running/rerender_model/render_model/allocating_group"] = State(48, "/running/rerender_model/render_model/allocating_group", self)
+        self.states["/running/rerender_model/render_model/allocating_group"] = State(53, "/running/rerender_model/render_model/allocating_group", self)
         
         # state /running/rerender_model/render_model/allocate_contains
-        self.states["/running/rerender_model/render_model/allocate_contains"] = State(49, "/running/rerender_model/render_model/allocate_contains", self)
+        self.states["/running/rerender_model/render_model/allocate_contains"] = State(54, "/running/rerender_model/render_model/allocate_contains", self)
         
         # state /running/rerender_model/render_model/render_elements
-        self.states["/running/rerender_model/render_model/render_elements"] = State(50, "/running/rerender_model/render_model/render_elements", self)
+        self.states["/running/rerender_model/render_model/render_elements"] = State(55, "/running/rerender_model/render_model/render_elements", self)
         
         # state /close
-        self.states["/close"] = State(51, "/close", self)
+        self.states["/close"] = State(56, "/close", self)
         self.states["/close"].setEnter(self._close_enter)
         
         # add children
@@ -4176,6 +4193,8 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/init"].addChild(self.states["/init/pack_progressbar"])
         self.states["/running"].addChild(self.states["/running/idle"])
         self.states["/running"].addChild(self.states["/running/change_metamodel"])
+        self.states["/running"].addChild(self.states["/running/conf_bottom"])
+        self.states["/running"].addChild(self.states["/running/custom_MM"])
         self.states["/running"].addChild(self.states["/running/change_mapper"])
         self.states["/running"].addChild(self.states["/running/change_rendered"])
         self.states["/running"].addChild(self.states["/running/verify_model"])
@@ -4183,6 +4202,8 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/running"].addChild(self.states["/running/new_rendered"])
         self.states["/running"].addChild(self.states["/running/create_new_model"])
         self.states["/running"].addChild(self.states["/running/rerender_model"])
+        self.states["/running/custom_MM"].addChild(self.states["/running/custom_MM/query"])
+        self.states["/running/custom_MM"].addChild(self.states["/running/custom_MM/wait_for_metamodel"])
         self.states["/running/verify_model"].addChild(self.states["/running/verify_model/request"])
         self.states["/running/verify_model"].addChild(self.states["/running/verify_model/show_result"])
         self.states["/running/verify_model"].addChild(self.states["/running/verify_model/wait_for_close"])
@@ -4191,6 +4212,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/running/open_model"].addChild(self.states["/running/open_model/got_model"])
         self.states["/running/open_model"].addChild(self.states["/running/open_model/search_metamodels"])
         self.states["/running/open_model"].addChild(self.states["/running/open_model/search_CS_mappers"])
+        self.states["/running/open_model"].addChild(self.states["/running/open_model/check_CS_mapper"])
         self.states["/running/open_model"].addChild(self.states["/running/open_model/search_CS_rendered"])
         self.states["/running/open_model"].addChild(self.states["/running/open_model/store_metamodel"])
         self.states["/running/create_new_model"].addChild(self.states["/running/create_new_model/query_metamodel"])
@@ -4222,6 +4244,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states[""].default_state = self.states["/init"]
         self.states["/init"].default_state = self.states["/init/generic_toolbar"]
         self.states["/running"].default_state = self.states["/running/idle"]
+        self.states["/running/custom_MM"].default_state = self.states["/running/custom_MM/query"]
         self.states["/running/verify_model"].default_state = self.states["/running/verify_model/request"]
         self.states["/running/open_model"].default_state = self.states["/running/open_model/query_model"]
         self.states["/running/create_new_model"].default_state = self.states["/running/create_new_model/query_metamodel"]
@@ -4259,6 +4282,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         _running_idle_0.setTrigger(Event("create_new_model", None))
         self.states["/running/idle"].addTransition(_running_idle_0)
         _running_idle_1 = Transition(self, self.states["/running/idle"], [self.states["/running/open_model"]])
+        _running_idle_1.setAction(self._running_idle_1_exec)
         _running_idle_1.setTrigger(Event("open_model", None))
         self.states["/running/idle"].addTransition(_running_idle_1)
         _running_idle_2 = Transition(self, self.states["/running/idle"], [self.states["/running/rerender_model"]])
@@ -4266,28 +4290,53 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/running/idle"].addTransition(_running_idle_2)
         _running_idle_3 = Transition(self, self.states["/running/idle"], [self.states["/running/new_rendered"]])
         _running_idle_3.setTrigger(Event("new_rendered", None))
+        _running_idle_3.setGuard(self._running_idle_3_guard)
         self.states["/running/idle"].addTransition(_running_idle_3)
         _running_idle_4 = Transition(self, self.states["/running/idle"], [self.states["/running/verify_model"]])
         _running_idle_4.setTrigger(Event("verify", None))
         self.states["/running/idle"].addTransition(_running_idle_4)
-        _running_idle_5 = Transition(self, self.states["/running/idle"], [self.states["/running/change_metamodel"]])
-        _running_idle_5.setAction(self._running_idle_5_exec)
-        _running_idle_5.setTrigger(Event("change_metamodel", None))
+        _running_idle_5 = Transition(self, self.states["/running/idle"], [self.states["/running/conf_bottom"]])
+        _running_idle_5.setTrigger(Event("conf_bottom", None))
         self.states["/running/idle"].addTransition(_running_idle_5)
-        _running_idle_6 = Transition(self, self.states["/running/idle"], [self.states["/running/change_mapper"]])
+        _running_idle_6 = Transition(self, self.states["/running/idle"], [self.states["/running/change_metamodel"]])
         _running_idle_6.setAction(self._running_idle_6_exec)
-        _running_idle_6.setTrigger(Event("change_mapper", None))
+        _running_idle_6.setTrigger(Event("change_metamodel", None))
         self.states["/running/idle"].addTransition(_running_idle_6)
-        _running_idle_7 = Transition(self, self.states["/running/idle"], [self.states["/running/change_rendered"]])
+        _running_idle_7 = Transition(self, self.states["/running/idle"], [self.states["/running/change_mapper"]])
         _running_idle_7.setAction(self._running_idle_7_exec)
-        _running_idle_7.setTrigger(Event("change_rendered", None))
+        _running_idle_7.setTrigger(Event("change_mapper", None))
         self.states["/running/idle"].addTransition(_running_idle_7)
+        _running_idle_8 = Transition(self, self.states["/running/idle"], [self.states["/running/change_rendered"]])
+        _running_idle_8.setAction(self._running_idle_8_exec)
+        _running_idle_8.setTrigger(Event("change_rendered", None))
+        self.states["/running/idle"].addTransition(_running_idle_8)
         
         # transition /running/change_metamodel
         _running_change_metamodel_0 = Transition(self, self.states["/running/change_metamodel"], [self.states["/running/open_model/search_CS_mappers"]])
         _running_change_metamodel_0.setTrigger(Event("mv_response", None))
         self.states["/running/change_metamodel"].addTransition(_running_change_metamodel_0)
         
+        # transition /running/conf_bottom
+        _running_conf_bottom_0 = Transition(self, self.states["/running/conf_bottom"], [self.states["/running/change_metamodel"]])
+        _running_conf_bottom_0.setTrigger(Event("mv_response", None))
+        self.states["/running/conf_bottom"].addTransition(_running_conf_bottom_0)
+        
+        # transition /running/custom_MM/query
+        _running_custom_MM_query_0 = Transition(self, self.states["/running/custom_MM/query"], [self.states["/running/custom_MM/wait_for_metamodel"]])
+        _running_custom_MM_query_0.setAction(self._running_custom_MM_query_0_exec)
+        _running_custom_MM_query_0.setTrigger(Event("instance_created", None))
+        self.states["/running/custom_MM/query"].addTransition(_running_custom_MM_query_0)
+        
+        # transition /running/custom_MM/wait_for_metamodel
+        _running_custom_MM_wait_for_metamodel_0 = Transition(self, self.states["/running/custom_MM/wait_for_metamodel"], [self.states["/running/idle"]])
+        _running_custom_MM_wait_for_metamodel_0.setAction(self._running_custom_MM_wait_for_metamodel_0_exec)
+        _running_custom_MM_wait_for_metamodel_0.setTrigger(Event("close_window", None))
+        self.states["/running/custom_MM/wait_for_metamodel"].addTransition(_running_custom_MM_wait_for_metamodel_0)
+        _running_custom_MM_wait_for_metamodel_1 = Transition(self, self.states["/running/custom_MM/wait_for_metamodel"], [self.states["/running/change_metamodel"]])
+        _running_custom_MM_wait_for_metamodel_1.setAction(self._running_custom_MM_wait_for_metamodel_1_exec)
+        _running_custom_MM_wait_for_metamodel_1.setTrigger(Event("browse_result", None))
+        self.states["/running/custom_MM/wait_for_metamodel"].addTransition(_running_custom_MM_wait_for_metamodel_1)
+        
         # transition /running/change_mapper
         _running_change_mapper_0 = Transition(self, self.states["/running/change_mapper"], [self.states["/running/rerender_model"]])
         _running_change_mapper_0.setTrigger(None)
@@ -4349,11 +4398,22 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/running/open_model/search_metamodels"].addTransition(_running_open_model_search_metamodels_0)
         
         # transition /running/open_model/search_CS_mappers
-        _running_open_model_search_CS_mappers_0 = Transition(self, self.states["/running/open_model/search_CS_mappers"], [self.states["/running/open_model/search_CS_rendered"]])
+        _running_open_model_search_CS_mappers_0 = Transition(self, self.states["/running/open_model/search_CS_mappers"], [self.states["/running/open_model/check_CS_mapper"]])
         _running_open_model_search_CS_mappers_0.setAction(self._running_open_model_search_CS_mappers_0_exec)
         _running_open_model_search_CS_mappers_0.setTrigger(Event("mv_response", None))
         self.states["/running/open_model/search_CS_mappers"].addTransition(_running_open_model_search_CS_mappers_0)
         
+        # transition /running/open_model/check_CS_mapper
+        _running_open_model_check_CS_mapper_0 = Transition(self, self.states["/running/open_model/check_CS_mapper"], [self.states["/running/rerender_model"]])
+        _running_open_model_check_CS_mapper_0.setAction(self._running_open_model_check_CS_mapper_0_exec)
+        _running_open_model_check_CS_mapper_0.setTrigger(None)
+        _running_open_model_check_CS_mapper_0.setGuard(self._running_open_model_check_CS_mapper_0_guard)
+        self.states["/running/open_model/check_CS_mapper"].addTransition(_running_open_model_check_CS_mapper_0)
+        _running_open_model_check_CS_mapper_1 = Transition(self, self.states["/running/open_model/check_CS_mapper"], [self.states["/running/open_model/search_CS_rendered"]])
+        _running_open_model_check_CS_mapper_1.setTrigger(None)
+        _running_open_model_check_CS_mapper_1.setGuard(self._running_open_model_check_CS_mapper_1_guard)
+        self.states["/running/open_model/check_CS_mapper"].addTransition(_running_open_model_check_CS_mapper_1)
+        
         # transition /running/open_model/search_CS_rendered
         _running_open_model_search_CS_rendered_0 = Transition(self, self.states["/running/open_model/search_CS_rendered"], [self.states["/running/open_model/store_metamodel"]])
         _running_open_model_search_CS_rendered_0.setAction(self._running_open_model_search_CS_rendered_0_exec)
@@ -4490,10 +4550,16 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.states["/running/rerender_model/model_toolbars/dsl_toolbar"].addTransition(_running_rerender_model_model_toolbars_dsl_toolbar_0)
         
         # transition /running/rerender_model/model_toolbars/pack_dsl_toolbar
-        _running_rerender_model_model_toolbars_pack_dsl_toolbar_0 = Transition(self, self.states["/running/rerender_model/model_toolbars/pack_dsl_toolbar"], [self.states["/running/rerender_model/request_render"]])
+        _running_rerender_model_model_toolbars_pack_dsl_toolbar_0 = Transition(self, self.states["/running/rerender_model/model_toolbars/pack_dsl_toolbar"], [self.states["/running/idle"]])
         _running_rerender_model_model_toolbars_pack_dsl_toolbar_0.setAction(self._running_rerender_model_model_toolbars_pack_dsl_toolbar_0_exec)
         _running_rerender_model_model_toolbars_pack_dsl_toolbar_0.setTrigger(Event("tk_widget", None))
+        _running_rerender_model_model_toolbars_pack_dsl_toolbar_0.setGuard(self._running_rerender_model_model_toolbars_pack_dsl_toolbar_0_guard)
         self.states["/running/rerender_model/model_toolbars/pack_dsl_toolbar"].addTransition(_running_rerender_model_model_toolbars_pack_dsl_toolbar_0)
+        _running_rerender_model_model_toolbars_pack_dsl_toolbar_1 = Transition(self, self.states["/running/rerender_model/model_toolbars/pack_dsl_toolbar"], [self.states["/running/rerender_model/request_render"]])
+        _running_rerender_model_model_toolbars_pack_dsl_toolbar_1.setAction(self._running_rerender_model_model_toolbars_pack_dsl_toolbar_1_exec)
+        _running_rerender_model_model_toolbars_pack_dsl_toolbar_1.setTrigger(Event("tk_widget", None))
+        _running_rerender_model_model_toolbars_pack_dsl_toolbar_1.setGuard(self._running_rerender_model_model_toolbars_pack_dsl_toolbar_1_guard)
+        self.states["/running/rerender_model/model_toolbars/pack_dsl_toolbar"].addTransition(_running_rerender_model_model_toolbars_pack_dsl_toolbar_1)
         
         # transition /running/rerender_model/request_render
         _running_rerender_model_request_render_0 = Transition(self, self.states["/running/rerender_model/request_render"], [self.states["/running/rerender_model/render_model"]])
@@ -4571,9 +4637,20 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [0, 'Ready for action!'])]))
     
     def _running_change_metamodel_enter(self):
+        print("MM -> " + current_metamodel)
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['alter_context', [current_model, current_metamodel]])]))
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [20, 'Storing model context...'])]))
     
+    def _running_conf_bottom_enter(self):
+        self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['conformance_add', [current_model, 'formalisms/Bottom']])]))
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [10, 'Storing model context...'])]))
+        global current_metamodel
+        current_metamodel = 'formalisms/Bottom'
+    
+    def _running_custom_MM_query_enter(self):
+        self.big_step.outputEventOM(Event("create_instance", None, [self, 'subwindow', 'Browser', 'Select metamodel to use.', []]))
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [0, 'Browsing for metamodel...'])]))
+    
     def _running_verify_model_request_enter(self):
         self.big_step.outputEventOM(Event("broad_cast", None, [self, Event("mv_request", None, ['verify', [current_model, current_metamodel]])]))
     
@@ -4651,21 +4728,41 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         tk_elem = parameters[0]
         tk_elem.pack(side=tk.BOTTOM, fill=tk.X, expand=tk.TRUE)
     
-    def _running_idle_5_exec(self, parameters):
+    def _running_idle_1_exec(self, parameters):
+        print("OPEN MODEL")
+    
+    def _running_idle_3_guard(self, parameters):
+        return current_mapper is not None
+    
+    def _running_idle_6_exec(self, parameters):
         new_metamodel = parameters[0]
         global current_metamodel
         current_metamodel = new_metamodel
     
-    def _running_idle_6_exec(self, parameters):
+    def _running_idle_7_exec(self, parameters):
         new_mapper = parameters[0]
         global current_mapper
         current_mapper = new_mapper
     
-    def _running_idle_7_exec(self, parameters):
+    def _running_idle_8_exec(self, parameters):
         new_rendered = parameters[0]
         global current_rendered_model
         current_rendered_model = new_rendered
     
+    def _running_custom_MM_query_0_exec(self, parameters):
+        association_name = parameters[0]
+        self.big_step.outputEventOM(Event("start_instance", None, [self, association_name]))
+        self.subwindow = association_name
+    
+    def _running_custom_MM_wait_for_metamodel_0_exec(self, parameters):
+        self.big_step.outputEventOM(Event("delete_instance", None, [self, self.subwindow]))
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [10, 'Browsing for model... OK'])]))
+    
+    def _running_custom_MM_wait_for_metamodel_1_exec(self, parameters):
+        result = parameters[0]
+        global current_metamodel
+        current_metamodel = result
+    
     def _running_verify_model_request_0_exec(self, parameters):
         result = parameters[0]
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'progress_bar', Event("update_status", None, [result * 100, 'Verifying...'])]))
@@ -4701,6 +4798,7 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     def _running_open_model_search_metamodels_0_exec(self, parameters):
         result = parameters[0]
         global current_metamodel
+        print("Allowed metamodels: " + str(result))
         if len(result) > 0:
             current_metamodel = next(iter(result))
         else:
@@ -4710,11 +4808,27 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
     
     def _running_open_model_search_CS_mappers_0_exec(self, parameters):
         result = parameters[0]
+        print("MM: " + str(current_metamodel))
         print("Allowed mappers: " + str(result))
         self.allowed_mappers = list(result)
         global current_mapper
-        if current_mapper not in result:
-            current_mapper = next(iter(result))
+        if len(result) > 0:
+            if current_mapper not in result:
+                current_mapper = next(iter(result))
+        else:
+            current_mapper = None
+    
+    def _running_open_model_check_CS_mapper_0_exec(self, parameters):
+        global current_rendered_model
+        current_rendered_model = None
+        self.allowed_rendered = []
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'canvas', Event("clear_canvas", None, [])]))
+    
+    def _running_open_model_check_CS_mapper_0_guard(self, parameters):
+        return current_mapper is None
+    
+    def _running_open_model_check_CS_mapper_1_guard(self, parameters):
+        return current_mapper is not None
     
     def _running_open_model_search_CS_rendered_0_exec(self, parameters):
         result = parameters[0]
@@ -4824,6 +4938,18 @@ class MainWindow(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         tk_elem = parameters[0]
         tk_elem.pack(anchor=tk.W)
     
+    def _running_rerender_model_model_toolbars_pack_dsl_toolbar_0_guard(self, parameters):
+        tk_elem = parameters[0]
+        return current_mapper is None
+    
+    def _running_rerender_model_model_toolbars_pack_dsl_toolbar_1_exec(self, parameters):
+        tk_elem = parameters[0]
+        tk_elem.pack(anchor=tk.W)
+    
+    def _running_rerender_model_model_toolbars_pack_dsl_toolbar_1_guard(self, parameters):
+        tk_elem = parameters[0]
+        return current_mapper is not None
+    
     def _running_rerender_model_request_render_0_exec(self, parameters):
         result = parameters[0]
         self.rendered = result
@@ -5322,13 +5448,13 @@ class Browser(RuntimeClassBase, tk.Toplevel, SCCDWidget):
         return len(self.labels_to_add) == 0
     
     def _root_draw_labels_create_labels_add_labels_check_type_1_guard(self, parameters):
-        return self.filter_metamodels is None
+        return not self.filter_metamodels
     
     def _root_draw_labels_create_labels_add_labels_check_type_2_guard(self, parameters):
-        return self.filter_metamodels is not None and len(self.labels_to_add) > 0 and self.labels_to_add[0][-1] == '/'
+        return self.filter_metamodels and len(self.labels_to_add) > 0 and self.labels_to_add[0][-1] == '/'
     
     def _root_draw_labels_create_labels_add_labels_check_type_3_guard(self, parameters):
-        return self.filter_metamodels is not None and len(self.labels_to_add) > 0 and self.labels_to_add[0][-1] != '/'
+        return self.filter_metamodels and len(self.labels_to_add) > 0 and self.labels_to_add[0][-1] != '/'
     
     def _root_draw_labels_create_labels_add_labels_check_types_0_exec(self, parameters):
         result = parameters[0]
@@ -6036,10 +6162,10 @@ class MetamodellingToolbar(Toolbar):
         Toolbar.user_defined_constructor(self, parent)
         self.to_create = ["verify", "custom_MM", "conf_bottom", "upload_ALC", "upload_MVC"]
         self.button_info = {"verify": "Verify if the current model conforms to the current metamodel.",
-                            "custom_MM": "TODO",
-                            "conf_bottom": "TODO",
-                            "upload_ALC": "TODO",
-                            "upload_MVC": "TODO",
+                            "custom_MM": "Browse for a custom metamodel for the current model.",
+                            "conf_bottom": "Open the current model as its physical graph representation.",
+                            "upload_ALC": "Replace the current model with an Action Language fragment.",
+                            "upload_MVC": "Replace the current model with a textual representation.",
                             }
         self.buttons = {}
         tk.Label(self, text="Management").pack(side=tk.LEFT)
@@ -6127,12 +6253,22 @@ class MetamodellingToolbar(Toolbar):
         self.states["/root"].addTransition(_root_0)
         _root_1 = Transition(self, self.states["/root"], [self.states["/root"]])
         _root_1.setAction(self._root_1_exec)
-        _root_1.setTrigger(Event("changed_metamodel", None))
+        _root_1.setTrigger(Event("button_pressed", 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.setTrigger(Event("close", None))
+        _root_2 = Transition(self, self.states["/root"], [self.states["/root"]])
+        _root_2.setAction(self._root_2_exec)
+        _root_2.setTrigger(Event("button_pressed", None))
+        _root_2.setGuard(self._root_2_guard)
         self.states["/root"].addTransition(_root_2)
+        _root_3 = Transition(self, self.states["/root"], [self.states["/root"]])
+        _root_3.setAction(self._root_3_exec)
+        _root_3.setTrigger(Event("changed_metamodel", None))
+        _root_3.setGuard(self._root_3_guard)
+        self.states["/root"].addTransition(_root_3)
+        _root_4 = Transition(self, self.states["/root"], [self.states["/closing"]])
+        _root_4.setTrigger(Event("close", None))
+        self.states["/root"].addTransition(_root_4)
         
         # transition /closing
         _closing_0 = Transition(self, self.states["/closing"], [self.states["/closing"]])
@@ -6181,11 +6317,27 @@ class MetamodellingToolbar(Toolbar):
         return event_name == 'verify'
     
     def _root_1_exec(self, parameters):
+        event_name = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("conf_bottom", None, [])]))
+    
+    def _root_1_guard(self, parameters):
+        event_name = parameters[0]
+        return event_name == 'conf_bottom'
+    
+    def _root_2_exec(self, parameters):
+        event_name = parameters[0]
+        self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("custom_MM", None, [])]))
+    
+    def _root_2_guard(self, parameters):
+        event_name = parameters[0]
+        return event_name == 'custom_MM'
+    
+    def _root_3_exec(self, parameters):
         ID = parameters[0]
         new_metamodel = parameters[1]
         self.big_step.outputEventOM(Event("narrow_cast", None, [self, 'parent', Event("change_metamodel", None, [new_metamodel])]))
     
-    def _root_1_guard(self, parameters):
+    def _root_3_guard(self, parameters):
         ID = parameters[0]
         new_metamodel = parameters[1]
         return ID == id(self) and new_metamodel != current_metamodel
@@ -6221,8 +6373,8 @@ class ConcreteSyntaxToolbar(Toolbar):
         Toolbar.user_defined_constructor(self, parent)
         self.to_create = ["rerender", "new_rendered", "object_diagrams"]
         self.button_info = {"rerender": "Rerender the current model using the specified mapper and visualized model.",
-                            "new_rendered": "TODO",
-                            "object_diagrams": "TODO",
+                            "new_rendered": "Create a new 'vanilla' visualized model of the same Abstract Syntax model.",
+                            "object_diagrams": "Bind the Object Diagrams visualization to this model.",
                             }
         self.buttons = {}
         tk.Label(self, text="Visualization").pack(side=tk.LEFT)
@@ -6230,15 +6382,21 @@ class ConcreteSyntaxToolbar(Toolbar):
         # Mapper
         global current_mapper
         selected_mapper = tk.StringVar(self)
-        selected_mapper.set(current_mapper)
-        tk.OptionMenu(self, selected_mapper, *list(allowed_mappers)).pack(side=tk.LEFT)
+        selected_mapper.set(current_mapper if current_mapper is not None else "(none)")
+        om = tk.OptionMenu(self, selected_mapper, *list(allowed_mappers) if allowed_mappers else "(none)")
+        if not allowed_mappers:
+            om.configure(state=tk.DISABLED)
+        om.pack(side=tk.LEFT)
         selected_mapper.trace('w', lambda name, index, mode: self.controller.addInput(Event("changed_mapper", "input", [id(self), selected_mapper.get()])))
         
         # Rendered
         global current_rendered_model
         selected_rendered = tk.StringVar(self)
-        selected_rendered.set(current_rendered_model)
-        tk.OptionMenu(self, selected_rendered, *list(allowed_rendered)).pack(side=tk.LEFT)
+        selected_rendered.set(current_rendered_model if current_rendered_model is not None else "(none)")
+        om = tk.OptionMenu(self, selected_rendered, *list(allowed_rendered) if allowed_rendered else "(none)")
+        if not allowed_rendered:
+            om.configure(state=tk.DISABLED)
+        om.pack(side=tk.LEFT)
         selected_rendered.trace('w', lambda name, index, mode: self.controller.addInput(Event("changed_rendered", "input", [id(self), selected_rendered.get()])))
     
     def user_defined_destructor(self):