瀏覽代碼

Modularize the startup of the Mv, and added first code for subprocess starting

Yentl Van Tendeloo 7 年之前
父節點
當前提交
174c0be508
共有 8 個文件被更改,包括 1629 次插入125 次删除
  1. 13 4
      classes/main_app.xml
  2. 7 1
      classes/toolbar/generic_toolbar.xml
  3. 2 2
      classes/widgets/dropdown.xml
  4. 563 0
      classes/window/create_activity.xml
  5. 49 1
      classes/window/main_window.xml
  6. 987 115
      frontend.py
  7. 1 0
      frontend.xml
  8. 7 2
      runner.py

+ 13 - 4
classes/main_app.xml

@@ -5,16 +5,23 @@
     </relationships>
     <constructor>
         <parameter name="root"/>
+        <parameter name="location"/>
+        <parameter name="username"/>
+        <parameter name="password"/>
+        <parameter name="model"/>
+        <parameter name="limited_mode"/>
         <body>
             self.nr_of_windows = 0
             self.root = root
 
             self.splash_window = None
 
-            self.address = "127.0.0.1:8001"
+            self.address = location
             self.timeout = 20.0
-            self.username = "admin"
-            self.password = "admin"
+            self.username = username
+            self.password = password
+            self.open_model = model
+            self.limited_mode = limited_mode
         </body>
     </constructor>
     <scxml initial="parallel">
@@ -97,7 +104,7 @@
                             </raise>
                         </onentry>
 
-                        <transition event="mv_response" target="../logging_in_modelverse">
+                        <transition event="mv_response" target="../logging_in_modelverse/login">
                             <raise event="update_status" scope="narrow" target="self.splash_window">
                                 <parameter expr="40"/>
                                 <parameter expr="'Waiting for Modelverse initialization... OK'"/>
@@ -297,6 +304,8 @@
                         <raise event="create_instance" scope="cd">
                             <parameter expr="'windows'"/>
                             <parameter expr="'MainWindow'"/>
+                            <parameter expr="self.open_model"/>
+                            <parameter expr="self.limited_mode"/>
                         </raise>
                     </onentry>
 

+ 7 - 1
classes/toolbar/generic_toolbar.xml

@@ -11,10 +11,11 @@
             <parameter expr="parent"/>
         </super>
         <body>
-            self.to_create = ["new", "open", "activity"]
+            self.to_create = ["new", "open", "activity", "create_activity"]
             self.button_info = {"new": "Create a new model",
                                 "open": "Open an existing model",
                                 "activity": "Perform an activity",
+                                "create_activity": "Create a new activity",
                                }
             self.buttons = {}
             tk.Label(self, text="Generic").pack(side=tk.LEFT)
@@ -86,6 +87,11 @@
                 <raise event="activity" scope="narrow" target="'parent'"/>
             </transition>
 
+            <transition event="button_pressed" cond="event_name == 'create_activity'" target=".">
+                <parameter name="event_name"/>
+                <raise event="create_activity" scope="narrow" target="'parent'"/>
+            </transition>
+
             <transition event="close" target="../closing"/>
         </state>
 

+ 2 - 2
classes/widgets/dropdown.xml

@@ -10,7 +10,7 @@
         <body>
             self.strvar = tk.StringVar(parent)
             self.strvar.set(value)
-            self.strvar.trace('w', lambda a, b, c: self.controller.addInput(Event("change_value", "input", [id(self), self.strvar.get()])))
+            self.strvar.trace('w', lambda a, b, c: self.controller.addInput(Event("change_dropdown", "input", [id(self), self.strvar.get()])))
             return self.strvar
         </body>
     </method>
@@ -41,7 +41,7 @@
             </state>
 
             <state id="ready">
-                <transition port='input' event="change_value" target='.' cond='tagorid == id(self)'>
+                <transition port='input' event="change_dropdown" target='.' cond='tagorid == id(self)'>
                     <parameter name='tagorid'/>
                     <parameter name='new_value'/>
                     <raise event="changed_dropdown" scope="narrow" target="'parent'">

+ 563 - 0
classes/window/create_activity.xml

@@ -0,0 +1,563 @@
+<class name="ActivityCreator">
+    <relationships>
+        <inheritance class="tk.Toplevel" priority="1"/>
+        <inheritance class="SCCDWidget" priority="0"/>
+        <association name="static" class="A"/>
+        <association name="input_tag" class="A"/>
+        <association name="input_delete" class="A"/>
+        <association name="input_MM_browse" class="A"/>
+        <association name="input_MM_entry" class="A"/>
+        <association name="browser" class="Browser"/>
+        <association name="parent" class="A"/>
+    </relationships>
+
+    <constructor>
+        <super class="tk.TopLevel"/>
+        <super class="SCCDWidget"/>
+        <body>
+            self.activity_frame = tk.Frame(self)
+            self.input_frame = tk.Frame(self)
+            self.output_frame = tk.Frame(self)
+            self.create_frame = tk.Frame(self)
+
+            self.activity_frame.pack()
+            tk.Label(self, text="Inputs").pack()
+            self.input_frame.pack()
+            tk.Label(self, text="Outputs").pack()
+            self.output_frame.pack()
+            self.create_frame.pack()
+
+            self.create_input_signature = {}
+            self.create_output_signature = {}
+
+            self.activity_name = ""
+            self.activity_type = "ModelTransformation"
+        </body>
+    </constructor>
+
+    <destructor>
+        <body>
+            self.destroy()
+        </body>
+    </destructor>
+
+    <scxml initial="init">
+        <state id="init" initial="create_activity_info">
+            <state id="create_activity_info" initial="create_name">
+                <state id="create_name" initial="label">
+                    <state id="label" initial="create">
+                        <state id="create">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'static'"/>
+                                    <parameter expr="'Label'"/>
+                                    <parameter expr="{'parent': self.activity_frame, 'text': 'Name'}"/>
+                                </raise>
+                            </onentry>
+                        
+                            <transition event="instance_created" target="../pack">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                            </transition>
+                        </state>
+
+                        <state id="pack">
+                            <transition event="tk_widget" target="../../entry">
+                                <parameter name="tk_widget"/>
+                                <script>
+                                    tk_widget.grid(row=0,column=0)
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+
+                    <state id="entry" initial="create">
+                        <state id="create">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'static'"/>
+                                    <parameter expr="'Entry'"/>
+                                    <parameter expr="{'parent': self.activity_frame, 'name': 'name', 'value': self.activity_name, 'readonly': False}"/>
+                                </raise>
+                            </onentry>
+                        
+                            <transition event="instance_created" target="../pack">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                            </transition>
+                        </state>
+
+                        <state id="pack">
+                            <transition event="tk_widget" target="../../../create_type">
+                                <parameter name="tk_widget"/>
+                                <script>
+                                    tk_widget.grid(row=0,column=1)
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+                </state>
+
+                <state id="create_type" initial="label">
+                    <state id="label" initial="create">
+                        <state id="create">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'static'"/>
+                                    <parameter expr="'Label'"/>
+                                    <parameter expr="{'parent': self.activity_frame, 'text': 'Type'}"/>
+                                </raise>
+                            </onentry>
+                        
+                            <transition event="instance_created" target="../pack">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                            </transition>
+                        </state>
+
+                        <state id="pack">
+                            <transition event="tk_widget" target="../../dropdown">
+                                <parameter name="tk_widget"/>
+                                <script>
+                                    tk_widget.grid(row=1,column=0)
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+
+                    <state id="dropdown" initial="create">
+                        <state id="create">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'static'"/>
+                                    <parameter expr="'DropDown'"/>
+                                    <parameter expr="{'parent': self.activity_frame, 'name': 'type', 'value': self.activity_type, 'options': ['ActionLanguage', 'ModelTransformation', 'ManualOperation']}"/>
+                                </raise>
+                            </onentry>
+                        
+                            <transition event="instance_created" target="../pack">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                            </transition>
+                        </state>
+
+                        <state id="pack">
+                            <transition event="tk_widget" target="../../../../create_confirm">
+                                <parameter name="tk_widget"/>
+                                <script>
+                                    tk_widget.grid(row=1,column=1)
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+                </state>
+            </state>
+
+            <state id="create_confirm" initial="create_create">
+                <state id="create_create" initial="button">
+                    <state id="button" initial="create">
+                        <state id="create">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'static'"/>
+                                    <parameter expr="'Button'"/>
+                                    <parameter expr="{'parent': self.create_frame, 'event_parameters': 'confirm', 'visual': TextVisual('OK')}"/>
+                                </raise>
+                            </onentry>
+                        
+                            <transition event="instance_created" target="../pack">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                            </transition>
+                        </state>
+
+                        <state id="pack">
+                            <transition event="tk_widget" target="../../../../../draw_signature">
+                                <parameter name="tk_widget"/>
+                                <script>
+                                    tk_widget.grid(row=0,column=0)
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+                </state>
+            </state>
+        </state>
+
+        <state id="draw_signature" initial="create_inputs">
+            <onentry>
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="'input_tag'"/>
+                </raise>
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="'input_MM_entry'"/>
+                </raise>
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="'input_MM_browse'"/>
+                </raise>
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="'input_delete'"/>
+                </raise>
+            </onentry>
+
+            <state id="create_inputs" initial="check_values">
+                <onentry>
+                    <script>
+                        self.tmp_input_signature = dict(self.create_input_signature)
+                        self.counter = -1
+                        self.input_map = []
+                    </script>
+                </onentry>
+
+                <state id="check_values">
+                    <onentry>
+                        <script>
+                            self.counter += 1
+                        </script>
+                    </onentry>
+                    <transition cond="self.tmp_input_signature" target="../create_entry"/>
+                    <transition cond="not self.tmp_input_signature" target="../create_add_entry"/>
+                </state>
+
+                <state id="create_entry" initial="create_tag">
+                    <onentry>
+                        <script>
+                            self.current = self.tmp_input_signature.popitem()
+                            self.input_map.append([self.current[0], self.current[1]])
+                        </script>
+                    </onentry>
+
+                    <state id="create_tag" initial="create">
+                        <state id="create">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'input_tag'"/>
+                                    <parameter expr="'Entry'"/>
+                                    <parameter expr="{'parent': self.input_frame, 'name': 'input_tag_%s' % self.counter, 'value': self.current[0]}"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="instance_created" target="../pack">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                                <script>
+                                    self.input_map[-1].append(assoc_name)
+                                </script>
+                            </transition>
+                        </state>
+
+                        <state id="pack">
+                            <transition event="tk_widget" target="../../create_MM">
+                                <parameter name="tk_widget"/>
+                                <script>
+                                    tk_widget.grid(row=self.counter,column=0)
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+
+                    <state id="create_MM" initial="create">
+                        <state id="create">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'input_MM_entry'"/>
+                                    <parameter expr="'Entry'"/>
+                                    <parameter expr="{'parent': self.input_frame, 'name': 'input_MM_%s' % self.counter, 'value': self.current[1], 'readonly': True}"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="instance_created" target="../pack">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                                <script>
+                                    self.input_map[-1].append(assoc_name)
+                                </script>
+                            </transition>
+                        </state>
+
+                        <state id="pack">
+                            <transition event="tk_widget" target="../../create_browse">
+                                <parameter name="tk_widget"/>
+                                <script>
+                                    tk_widget.grid(row=self.counter,column=1)
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+
+                    <state id="create_browse" initial="create">
+                        <state id="create">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'input_MM_browse'"/>
+                                    <parameter expr="'Button'"/>
+                                    <parameter expr="{'parent': self.input_frame, 'visual': TextVisual('...'), 'tooltip_text': 'Browse for input metamodel.', 'event_parameters': 'input_browse_%s' % self.counter}"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="instance_created" target="../pack_button">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                                <script>
+                                    self.input_map[-1].append(assoc_name)
+                                </script>
+                            </transition>
+                        </state>
+
+                        <state id="pack_button">
+                            <transition event="tk_widget" target="../../create_delete">
+                                <parameter name="tk_widget"/>
+                                <script>
+                                    tk_widget.grid(row=self.counter, column=2)
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+
+                    <state id="create_delete" initial="create">
+                        <state id="create">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'input_delete'"/>
+                                    <parameter expr="'Button'"/>
+                                    <parameter expr="{'parent': self.input_frame, 'visual': TextVisual('X'), 'tooltip_text': 'Delete tag in signature.', 'event_parameters': 'input_delete_%s' % self.counter}"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="instance_created" target="../pack_button">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                                <script>
+                                    self.input_map[-1].append(assoc_name)
+                                </script>
+                            </transition>
+                        </state>
+
+                        <state id="pack_button">
+                            <transition event="tk_widget" target="../../../check_values">
+                                <parameter name="tk_widget"/>
+                                <script>
+                                    tk_widget.grid(row=self.counter, column=3)
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+                </state>
+
+                <state id="create_add_entry">
+                    <state id="create_button" initial="create">
+                        <state id="create">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'input_MM_browse'"/>
+                                    <parameter expr="'Button'"/>
+                                    <parameter expr="{'parent': self.input_frame, 'visual': TextVisual('+'), 'tooltip_text': 'Create new element in signature.', 'event_parameters': 'add_input'}"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="instance_created" target="../pack_button">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                            </transition>
+                        </state>
+
+                        <state id="pack_button">
+                            <transition event="tk_widget" target="../../../../../ready">
+                                <parameter name="tk_widget"/>
+                                <script>
+                                    tk_widget.grid(row=self.counter, column=3)
+                                </script>
+                            </transition>
+                        </state>
+                    </state>
+                </state>
+            </state>
+        </state>
+
+        <state id="ready">
+            <transition event="button_pressed" cond="evt == 'add_input'" target="../draw_signature">
+                <parameter name="evt"/>
+                <script>
+                    ctr = 0
+                    while 1:
+                        free_id = 'tag_%i' % ctr
+                        if free_id not in self.create_input_signature:
+                            break
+                        else:
+                            ctr += 1
+                    self.create_input_signature[free_id] = ""
+                </script>
+            </transition>
+
+            <transition event="button_pressed" cond="evt.startswith('input_delete_')" target="../draw_signature">
+                <parameter name="evt"/>
+                <script>
+                    index = int(evt.split("input_delete_", 1)[1])
+                    del self.create_input_signature[self.input_map[index][0]]
+                </script>
+            </transition>
+
+            <transition event="changed_entry" cond="evt == 'name'" target=".">
+                <parameter name="evt"/>
+                <parameter name="new_value"/>
+                <script>
+                    self.activity_name = new_value
+                </script>
+            </transition>
+
+            <transition event="changed_dropdown" cond="evt == 'type'" target=".">
+                <parameter name="evt"/>
+                <parameter name="new_value"/>
+                <script>
+                    self.activity_type = new_value
+                </script>
+            </transition>
+
+            <transition event="changed_entry" cond="evt.startswith('input_tag_')" target=".">
+                <parameter name="evt"/>
+                <parameter name="new_value"/>
+                <script>
+                    index = int(evt.split("input_tag_", 1)[1])
+                    information = self.input_map[index]
+                    old_tag = information[0]
+                    self.create_input_signature[new_value] = self.create_input_signature.pop(old_tag)
+                    information[0] = new_value
+                </script>
+            </transition>
+
+            <transition event="button_pressed" cond="evt.startswith('input_MM_browse_')" target="../browsing">
+                <parameter name="evt"/>
+                <script>
+                    self.current = int(evt.split("input_MM_browse_", 1)[1])
+                </script>
+            </transition>
+
+            <transition event="button_pressed" cond="evt == 'create'" target="../creating">
+                <parameter name="evt"/>
+            </transition>
+        </state>
+
+        <state id="creating">
+            <onentry>
+                <raise event="mv_request" scope="broad">
+                    <parameter expr="'transformation_add_%s' % ({'ManualOperation': 'MANUAL', 'ModelTransformation': 'MT', 'ActionLanguage': 'AL'}[self.activity_type])"/>
+                    <parameter expr="[self.activity_name, self.input_signature, self.output_signature]"/>
+                </raise>
+            </onentry>
+
+            <transition event="mv_response" target="../modifying_mm">
+                <parameter name="context"/>
+                <script>
+                    print("Starting subprocess")
+                    self.context = context
+                    from runner import run_GUI
+                    model_to_modify = "merged/%s" % self.activity_name
+                    self.subprocess = multiprocessing.Proces(target=run_GUI, args=(self.address, self.username, self.password, model_to_modify, True))
+                </script>
+            </transition>
+        </state>
+
+        <state id="modifying_mm">
+            <transition cond="not self.subprocess.is_alive()" target="../finish_transformation_add"/>
+            <transition after="0.5" target=".">
+                <script>
+                    print("Checking whether or not subprocess is still alive...")
+                </script>
+            </transition>
+        </state>
+
+        <state id="finish_transformation_add">
+            <onentry>
+                <raise event="mv_request_context" scope="broad">
+                    <parameter expr="'exit'"/>
+                    <parameter expr="[]"/>
+                    <parameter expr="self.context"/>
+                </raise>
+            </onentry>
+
+            <transition event="mv_response" target="../closing">
+            </transition>
+        </state>
+
+        <state id="closing">
+            <onentry>
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="'input_tag'"/>
+                </raise>
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="'input_MM_entry'"/>
+                </raise>
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="'input_MM_browse'"/>
+                </raise>
+                <raise event="delete_instance" scope="cd">
+                    <parameter expr="'input_delete'"/>
+                </raise>
+            </onentry>
+            
+            <transition target="../closed">
+                <raise event="close_window" scope="narrow" target="'parent'"/>
+            </transition>
+        </state>
+
+        <state id="closed"/>
+
+        <state id="browsing" initial="creating">
+            <state id="creating">
+                <onentry>
+                    <raise event="create_instance" scope="cd">
+                        <parameter expr="'browser'"/>
+                        <parameter expr="'Browser'"/>
+                        <parameter expr="None"/>
+                    </raise>
+                </onentry>
+
+                <transition event="instance_created" target="../waiting">
+                    <parameter name="assoc_name"/>
+                    <raise event="start_instance" scope="cd">
+                        <parameter expr="assoc_name"/>
+                    </raise>
+                </transition>
+            </state>
+
+            <state id="waiting">
+                <transition event="browse_result" target=".">
+                    <parameter name="result"/>
+                    <raise event="change_value" scope="narrow" target="self.input_map[self.current][3]">
+                        <parameter expr="result"/>
+                    </raise>
+                    <script>
+                        self.create_input_signature[self.input_map[self.current][0]] = result
+                        self.input_map[self.current][1] = result
+                    </script>
+                </transition>
+
+                <transition event="close_window" target="../../ready">
+                    <raise event="delete_instance" scope="cd">
+                        <parameter expr="'browser'"/>
+                    </raise>
+                </transition>
+            </state>
+        </state>
+    </scxml>
+</class>

+ 49 - 1
classes/window/main_window.xml

@@ -13,6 +13,8 @@
     <constructor>
         <super class="tk.Toplevel"/>
         <super class="SCCDWidget"/>
+        <parameter name="open_model"/>
+        <parameter name="limited_mode"/>
         <body>
             self.toolbar_frame = tk.Frame(self)
             self.canvas_frame = tk.Frame(self)
@@ -22,6 +24,9 @@
             self.progressbar_frame.pack(fill=tk.X)
             self.model_loaded = False
 
+            self.preload_model = open_model
+            self.limited_mode = limited_mode
+
             global current_mapper
             current_mapper = None
             global current_rendered_model
@@ -42,7 +47,12 @@
     <scxml initial="init">
         <parallel id="init">
             <state id="init" initial="init">
-                <state id="init" initial="generic_toolbar">
+                <state id="init" initial="determine_initial">
+                    <state id="determine_initial">
+                        <transition cond="self.limited_mode" target="../progressbar"/>
+                        <transition cond="not self.limited_mode" target="../generic_toolbar"/>
+                    </state>
+
                     <state id="generic_toolbar">
                         <onentry>
                             <raise event="create_instance" scope="cd">
@@ -114,6 +124,7 @@
                         <transition event="upload_MVC" target="../upload_MVC"/>
                         <transition event="add_object_diagrams" target="../add_object_diagrams"/>
                         <transition event="activity" target="../execute_activity"/>
+                        <transition event="create_activity" target="../create_activity"/>
                         <transition event="modify_defined_attrs" target="../modify_defined_attrs">
                             <parameter name="as_element"/>
                             <parameter name="cs_element"/>
@@ -151,6 +162,14 @@
                                 <parameter expr="element_name"/>
                             </raise>
                         </transition>
+
+                        <transition cond="self.preload_model is not None" target="../open_model/search_metamodels">
+                            <script>
+                                global current_model
+                                current_model = self.preload_model
+                                self.preload_model = None
+                            </script>
+                        </transition>
                     </state>
 
                     <state id="modify_defined_attrs" initial="create_window">
@@ -223,6 +242,35 @@
                         </state>
                     </state>
 
+                    <state id="create_activity" initial="open_window">
+                        <state id="open_window">
+                            <onentry>
+                                <raise event="create_instance" scope="cd">
+                                    <parameter expr="'subwindow'"/>
+                                    <parameter expr="'ActivityCreator'"/>
+                                </raise>
+                            </onentry>
+
+                            <transition event="instance_created" target="../waiting">
+                                <parameter name="assoc_name"/>
+                                <raise event="start_instance" scope="cd">
+                                    <parameter expr="assoc_name"/>
+                                </raise>
+                                <script>
+                                    self.activity_creator = assoc_name
+                                </script>
+                            </transition>
+                        </state>
+
+                        <state id="waiting">
+                            <transition event="window_close" target="../../idle">
+                                <raise event="delete_instance" scope="cd">
+                                    <parameter expr="self.activity_creator"/>
+                                </raise>
+                            </transition>
+                        </state>
+                    </state>
+
                     <state id="add_object_diagrams" initial="init">
                         <state id="init">
                             <onentry>

文件差異過大導致無法顯示
+ 987 - 115
frontend.py


+ 1 - 0
frontend.xml

@@ -31,6 +31,7 @@
     <class src="classes/window/popup.xml"/>
     <class src="classes/window/choice_prompt_window.xml"/>
     <class src="classes/window/activity.xml"/>
+    <class src="classes/window/create_activity.xml"/>
     <class src="classes/toolbar/toolbar.xml"/>
     <class src="classes/toolbar/generic_toolbar.xml"/>
     <class src="classes/toolbar/dsl_toolbar.xml"/>

+ 7 - 2
runner.py

@@ -2,6 +2,7 @@ import Tkinter as tk
 import frontend
 from sccd.runtime.tkinter_eventloop import *
 import sccd.runtime.socket2event as socket2event
+import multiprocessing
 
 from sccd_widget import SCCDWidget
 
@@ -10,12 +11,16 @@ class Root(tk.Tk, SCCDWidget):
         tk.Tk.__init__(self)
         SCCDWidget.__init__(self)
 
-if __name__ == '__main__':
+def run_GUI(location, username, password, model, limited_mode):
     root = Root()
     root.withdraw()
-    controller = frontend.Controller(root, TkEventLoop(root))
+    controller = frontend.Controller(root, location, username, password, model, limited_mode, TkEventLoop(root))
     socket2event.boot_translation_service(controller)
 
     SCCDWidget.controller = controller
     controller.start()
     root.mainloop()
+
+if __name__ == '__main__':
+    multiprocessing.freeze_support()
+    run_GUI("127.0.0.1:8001", "admin", "admin", None, False)