Viewer.py
changeset 118 0c53d6a36013
parent 114 06454545e5d0
child 121 40b91ba978db
--- a/Viewer.py	Fri Oct 26 17:04:18 2007 +0200
+++ b/Viewer.py	Tue Oct 30 16:53:08 2007 +0100
@@ -49,7 +49,8 @@
  ID_FBDVIEWERCONTEXTUALMENUITEMS5, ID_FBDVIEWERCONTEXTUALMENUITEMS6,
  ID_FBDVIEWERCONTEXTUALMENUITEMS8, ID_FBDVIEWERCONTEXTUALMENUITEMS9,
  ID_FBDVIEWERCONTEXTUALMENUITEMS11, ID_FBDVIEWERCONTEXTUALMENUITEMS12,
-] = [wx.NewId() for _init_coll_ContextualMenu_Items in range(10)]
+ ID_FBDVIEWERCONTEXTUALMENUITEMS14, ID_FBDVIEWERCONTEXTUALMENUITEMS15,
+] = [wx.NewId() for _init_coll_ContextualMenu_Items in range(12)]
 
 
 class ViewerDropTarget(wx.TextDropTarget):
@@ -155,8 +156,13 @@
               kind=wx.ITEM_NORMAL, text=u'Delete Divergence Branch')
         parent.AppendSeparator()
         AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS11,
+              kind=wx.ITEM_NORMAL, text=u'Clear Execution Order')
+        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS12,
+              kind=wx.ITEM_NORMAL, text=u'Reset Execution Order')
+        parent.AppendSeparator()
+        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS14,
               kind=wx.ITEM_NORMAL, text=u'Edit Block')
-        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS12,
+        AppendMenu(parent, help='', id=ID_FBDVIEWERCONTEXTUALMENUITEMS15,
               kind=wx.ITEM_NORMAL, text=u'Delete')
         # Link menu event to corresponding called functions
         self.Bind(wx.EVT_MENU, self.OnNoModifierMenu,
@@ -175,10 +181,14 @@
               id=ID_FBDVIEWERCONTEXTUALMENUITEMS8)
         self.Bind(wx.EVT_MENU, self.OnDeleteBranchMenu,
               id=ID_FBDVIEWERCONTEXTUALMENUITEMS9)
+        self.Bind(wx.EVT_MENU, self.OnClearExecutionOrderMenu,
+              id=ID_FBDVIEWERCONTEXTUALMENUITEMS11)
+        self.Bind(wx.EVT_MENU, self.OnResetExecutionOrderMenu,
+              id=ID_FBDVIEWERCONTEXTUALMENUITEMS12)
         self.Bind(wx.EVT_MENU, self.OnEditBlockMenu,
-              id=ID_FBDVIEWERCONTEXTUALMENUITEMS11)
+              id=ID_FBDVIEWERCONTEXTUALMENUITEMS14)
         self.Bind(wx.EVT_MENU, self.OnDeleteMenu,
-              id=ID_FBDVIEWERCONTEXTUALMENUITEMS12)
+              id=ID_FBDVIEWERCONTEXTUALMENUITEMS15)
     
     # Create and initialize Contextual Menu
     def _init_menus(self):
@@ -388,7 +398,7 @@
         ids.append(instance["id"])
         self.current_id = max(self.current_id, instance["id"]) 
         if instance["type"] == "input":
-            variable = FBD_Variable(self, INPUT, instance["name"], instance["value_type"], instance["id"])
+            variable = FBD_Variable(self, INPUT, instance["name"], instance["value_type"], instance["id"], instance["executionOrder"])
             variable.SetPosition(instance["x"], instance["y"])
             variable.SetSize(instance["width"], instance["height"])
             self.AddBlock(variable)
@@ -399,7 +409,7 @@
             if instance["connector"]["edge"]:
                 connectors["output"].SetEdge(instance["connector"]["edge"])
         elif instance["type"] == "output":
-            variable = FBD_Variable(self, OUTPUT, instance["name"], instance["value_type"], instance["id"])
+            variable = FBD_Variable(self, OUTPUT, instance["name"], instance["value_type"], instance["id"], instance["executionOrder"])
             variable.SetPosition(instance["x"], instance["y"])
             variable.SetSize(instance["width"], instance["height"])
             self.AddBlock(variable)
@@ -411,7 +421,7 @@
                 connectors["input"].SetEdge(instance["connector"]["edge"])
             self.CreateWires(connectors["input"], instance["connector"]["links"], ids)
         elif instance["type"] == "inout":
-            variable = FBD_Variable(self, INOUT, instance["name"], instance["value_type"], instance["id"])
+            variable = FBD_Variable(self, INOUT, instance["name"], instance["value_type"], instance["id"], instance["executionOrder"])
             variable.SetPosition(instance["x"], instance["y"])
             variable.SetSize(instance["width"], instance["height"])
             self.AddBlock(variable)
@@ -599,9 +609,9 @@
                 else:
                     connectors["outputs"].append((output["name"], None, "none"))
             if instance["name"] != None:
-                block = FBD_Block(self, instance["type"], instance["name"], instance["id"], len(instance["connectors"]["inputs"]), connectors=connectors)
-            else:
-                block = FBD_Block(self, instance["type"], "", instance["id"], len(instance["connectors"]["inputs"]), connectors=connectors)
+                block = FBD_Block(self, instance["type"], instance["name"], instance["id"], len(instance["connectors"]["inputs"]), connectors=connectors, executionOrder=instance["executionOrder"])
+            else:
+                block = FBD_Block(self, instance["type"], "", instance["id"], len(instance["connectors"]["inputs"]), connectors=connectors, executionOrder=instance["executionOrder"])
             block.SetPosition(instance["x"], instance["y"])
             block.SetSize(instance["width"], instance["height"])
             self.AddBlock(block)
@@ -698,65 +708,69 @@
     def PopupBlockMenu(self, connector = None):
         if connector is not None and connector.IsCompatible("BOOL"):
             type = self.Controler.GetCurrentElementEditingType()
-            self.ContextualMenu.FindItemByPosition(0).Enable(True)
-            self.ContextualMenu.FindItemByPosition(1).Enable(True)
-            self.ContextualMenu.FindItemByPosition(2).Enable(type != "function")
-            self.ContextualMenu.FindItemByPosition(3).Enable(type != "function")
+            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, True)
+            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, True)
+            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, type != "function")
+            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, type != "function")
         else:
-            self.ContextualMenu.FindItemByPosition(0).Enable(False)
-            self.ContextualMenu.FindItemByPosition(1).Enable(False)
-            self.ContextualMenu.FindItemByPosition(2).Enable(False)
-            self.ContextualMenu.FindItemByPosition(3).Enable(False)
-        self.ContextualMenu.FindItemByPosition(5).Enable(False)
-        self.ContextualMenu.FindItemByPosition(6).Enable(False)
-        self.ContextualMenu.FindItemByPosition(8).Enable(False)
-        self.ContextualMenu.FindItemByPosition(9).Enable(False)
-        self.ContextualMenu.FindItemByPosition(11).Enable(self.SelectedElement.GetType() in self.Controler.GetProjectPouNames())
+            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False)
+            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False)
+            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False)
+            self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, self.SelectedElement.GetType() in self.Controler.GetProjectPouNames())
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, True)
         if connector:
             if connector.IsNegated():
-                self.ContextualMenu.FindItemByPosition(1).Check(True)
+                self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS1, True)
             elif connector.GetEdge() == "rising":
-                self.ContextualMenu.FindItemByPosition(2).Check(True)
+                self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS2, True)
             elif connector.GetEdge() == "falling":
-                self.ContextualMenu.FindItemByPosition(3).Check(True)
-            else:
-                self.ContextualMenu.FindItemByPosition(0).Check(True)
+                self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS3, True)
+            else:
+                self.ContextualMenu.Check(ID_FBDVIEWERCONTEXTUALMENUITEMS0, True)
         self.PopupMenu(self.ContextualMenu)
     
     def PopupWireMenu(self):
-        self.ContextualMenu.FindItemByPosition(0).Enable(False)
-        self.ContextualMenu.FindItemByPosition(1).Enable(False)
-        self.ContextualMenu.FindItemByPosition(2).Enable(False)
-        self.ContextualMenu.FindItemByPosition(3).Enable(False)
-        self.ContextualMenu.FindItemByPosition(5).Enable(True)
-        self.ContextualMenu.FindItemByPosition(6).Enable(True)
-        self.ContextualMenu.FindItemByPosition(8).Enable(False)
-        self.ContextualMenu.FindItemByPosition(9).Enable(False)
-        self.ContextualMenu.FindItemByPosition(11).Enable(False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, True)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, True)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, True)
         self.PopupMenu(self.ContextualMenu)
     
     def PopupDivergenceMenu(self, connector):
-        self.ContextualMenu.FindItemByPosition(0).Enable(False)
-        self.ContextualMenu.FindItemByPosition(1).Enable(False)
-        self.ContextualMenu.FindItemByPosition(2).Enable(False)
-        self.ContextualMenu.FindItemByPosition(3).Enable(False)
-        self.ContextualMenu.FindItemByPosition(5).Enable(False)
-        self.ContextualMenu.FindItemByPosition(6).Enable(False)
-        self.ContextualMenu.FindItemByPosition(8).Enable(True)
-        self.ContextualMenu.FindItemByPosition(9).Enable(connector)
-        self.ContextualMenu.FindItemByPosition(11).Enable(False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, True)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, connector)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, True)
         self.PopupMenu(self.ContextualMenu)
     
-    def PopupDefaultMenu(self):
-        self.ContextualMenu.FindItemByPosition(0).Enable(False)
-        self.ContextualMenu.FindItemByPosition(1).Enable(False)
-        self.ContextualMenu.FindItemByPosition(2).Enable(False)
-        self.ContextualMenu.FindItemByPosition(3).Enable(False)
-        self.ContextualMenu.FindItemByPosition(5).Enable(False)
-        self.ContextualMenu.FindItemByPosition(6).Enable(False)
-        self.ContextualMenu.FindItemByPosition(8).Enable(False)
-        self.ContextualMenu.FindItemByPosition(9).Enable(False)
-        self.ContextualMenu.FindItemByPosition(11).Enable(False)
+    def PopupDefaultMenu(self, block = True):
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS0, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS1, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS2, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS3, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS5, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS6, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS8, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS9, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS14, False)
+        self.ContextualMenu.Enable(ID_FBDVIEWERCONTEXTUALMENUITEMS15, block)
         self.PopupMenu(self.ContextualMenu)
 
 #-------------------------------------------------------------------------------
@@ -821,6 +835,16 @@
             self.RefreshBuffer()
         event.Skip()
 
+    def OnClearExecutionOrderMenu(self, event):
+        self.Controler.ClearCurrentExecutionOrder()
+        self.RefreshBuffer()
+        self.RefreshView()
+        
+    def OnResetExecutionOrderMenu(self, event):
+        self.Controler.ResetCurrentExecutionOrder()
+        self.RefreshBuffer()
+        self.RefreshView()
+
 #-------------------------------------------------------------------------------
 #                          Mouse event functions
 #-------------------------------------------------------------------------------
@@ -962,6 +986,8 @@
             wx.CallAfter(self.SetCursor, wx.NullCursor)
             self.ReleaseMouse()
             self.Refresh(False)
+        else:
+            self.PopupDefaultMenu(False)
         event.Skip()
     
     def OnViewerLeftDClick(self, event):
@@ -1361,18 +1387,24 @@
         dialog = BlockPropertiesDialog(self.ParentWindow)
         dialog.SetBlockList(self.Controler.GetBlockTypes())
         dialog.SetPouNames(self.Controler.GetProjectPouNames())
-        dialog.SetPouElementNames(self.Controler.GetCurrentElementEditingVariables())
+        variable_names = self.Controler.GetCurrentElementEditingVariables()
+        if block.GetName() != "":
+            variable_names.remove(block.GetName())
+        dialog.SetPouElementNames(variable_names)
         dialog.SetMinBlockSize(block.GetSize())
-        values = {"name" : block.GetName(), "type" : block.GetType(), "inputs" : block.GetInputTypes()}
-        values["extension"] = block.GetExtension()
-        dialog.SetValues(values)
-        if dialog.ShowModal() == wx.ID_OK:
-            values = dialog.GetValues()
-            if "name" in values:
-                block.SetName(values["name"])
-            block.SetSize(values["width"], values["height"])
-            block.SetType(values["type"], values["extension"])
+        old_values = {"name" : block.GetName(), "type" : block.GetType(), "inputs" : block.GetInputTypes(), 
+            "executionOrder" : block.GetExecutionOrder(), "extension" : block.GetExtension()}
+        dialog.SetValues(old_values)
+        if dialog.ShowModal() == wx.ID_OK:
+            new_values = dialog.GetValues()
+            if "name" in new_values:
+                block.SetName(new_values["name"])
+            block.SetSize(new_values["width"], new_values["height"])
+            block.SetType(new_values["type"], new_values["extension"])
+            block.SetExecutionOrder(new_values["executionOrder"])
             self.RefreshBlockModel(block)
+            if old_values["executionOrder"] != new_values["executionOrder"]:
+                self.RefreshView()
             self.RefreshBuffer()
             self.RefreshScrollBars()
             self.ParentWindow.RefreshEditor()
@@ -1392,19 +1424,22 @@
         if returntype:
             varlist.append((self.Controler.GetCurrentElementEditingName(), "Output", returntype))
         dialog.SetVariables(varlist)
-        values = {"name" : variable.GetName(), "type" : variable.GetType()}
-        dialog.SetValues(values)
-        if dialog.ShowModal() == wx.ID_OK:
-            old_type = variable.GetType()
-            values = dialog.GetValues()
-            variable.SetName(values["name"])
-            variable.SetType(values["type"], values["value_type"])
-            variable.SetSize(values["width"], values["height"])
-            if old_type != values["type"]:
+        old_values = {"name" : variable.GetName(), "type" : variable.GetType(), 
+            "executionOrder" : variable.GetExecutionOrder()}
+        dialog.SetValues(old_values)
+        if dialog.ShowModal() == wx.ID_OK:
+            new_values = dialog.GetValues()
+            variable.SetName(new_values["name"])
+            variable.SetType(new_values["type"], new_values["value_type"])
+            variable.SetSize(new_values["width"], new_values["height"])
+            variable.SetExecutionOrder(new_values["executionOrder"])
+            if old_values["type"] != new_values["type"]:
                 id = variable.GetId()
                 self.Controler.RemoveCurrentElementEditingInstance(id)
-                self.Controler.AddCurrentElementEditingVariable(id, values["type"])
+                self.Controler.AddCurrentElementEditingVariable(id, new_values["type"])
             self.RefreshVariableModel(variable)
+            if old_values["executionOrder"] != new_values["executionOrder"]:
+                self.RefreshView()
             self.RefreshBuffer()
             self.RefreshScrollBars()
             self.Refresh(False)
@@ -1600,6 +1635,7 @@
         infos = {}
         infos["type"] = block.GetType()
         infos["name"] = block.GetName()
+        infos["executionOrder"] = block.GetExecutionOrder()
         infos["x"], infos["y"] = block.GetPosition()
         infos["width"], infos["height"] = block.GetSize()
         infos["connectors"] = block.GetConnectors()
@@ -1609,6 +1645,7 @@
         variableid = variable.GetId()
         infos = {}
         infos["name"] = variable.GetName()
+        infos["executionOrder"] = variable.GetExecutionOrder()
         infos["x"], infos["y"] = variable.GetPosition()
         infos["width"], infos["height"] = variable.GetSize()
         infos["connectors"] = variable.GetConnectors()
@@ -1618,6 +1655,7 @@
         connectionid = connection.GetId()
         infos = {}
         infos["name"] = connection.GetName()
+        infos["executionOrder"] = connection.GetExecutionOrder()
         infos["x"], infos["y"] = connection.GetPosition()
         infos["width"], infos["height"] = connection.GetSize()
         infos["connector"] = connection.GetConnector()