PLCOpenEditor.py
changeset 231 fc2d6cbb8b39
parent 223 ea857c3a0427
child 235 7b58a3b5b6ec
--- a/PLCOpenEditor.py	Tue Aug 12 18:15:35 2008 +0200
+++ b/PLCOpenEditor.py	Tue Aug 12 18:16:09 2008 +0200
@@ -265,6 +265,9 @@
     def _init_coll_EditMenu_Items(self, parent):
         AppendMenu(parent, help='', id=wx.ID_REFRESH,
               kind=wx.ITEM_NORMAL, text=u'Refresh\tCTRL+R')
+        if not self.ModeSolo:
+            AppendMenu(parent, help='', id=wx.ID_CLEAR,
+                  kind=wx.ITEM_NORMAL, text=u'Clear Errors\tCTRL+K')
         AppendMenu(parent, help='', id=wx.ID_UNDO,
               kind=wx.ITEM_NORMAL, text=u'Undo\tCTRL+Z')
         AppendMenu(parent, help='', id=wx.ID_REDO,
@@ -292,6 +295,8 @@
         AppendMenu(parent, help='', id=wx.ID_DELETE,
               kind=wx.ITEM_NORMAL, text=u'Delete')
         self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
+        if not self.ModeSolo:
+            self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR)
         self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO)
         self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO)
         self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT)
@@ -489,6 +494,7 @@
         self.CurrentToolBar = []
         self.CurrentLanguage = ""
         self.SelectedItem = None
+        self.Errors = []
         self.DrawingMode = FREEDRAWING_MODE
         #self.DrawingMode = DRIVENDRAWING_MODE
         
@@ -936,6 +942,10 @@
             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
         event.Skip()
 
+    def OnClearErrorsMenu(self, event):
+        self.ClearErrors()
+        event.Skip()
+
     def OnUndoMenu(self, event):
         self.Controler.LoadPrevious()
         idxs = range(self.GetPageCount())
@@ -1085,19 +1095,7 @@
                 else:
                     window = None
             if window:
-                if self.ProjectTree:
-                    root = self.ProjectTree.GetRootItem()
-                    words = window.GetTagName().split("::")
-                    if words[0] == "P":
-                        self.SelectProjectTreeItem(root, [(words[1], ITEM_POU)])
-                    elif words[0] == "T":
-                        self.SelectProjectTreeItem(root, [(words[1], ITEM_POU), (words[2], ITEM_TRANSITION)])
-                    elif words[0] == "A":
-                        self.SelectProjectTreeItem(root, [(words[1], ITEM_POU), (words[2], ITEM_ACTION)])
-                    elif words[0] == "C":
-                        self.SelectProjectTreeItem(root, [(words[1], ITEM_CONFIGURATION)])
-                    elif words[0] == "R":
-                        self.SelectProjectTreeItem(root, [(words[1], ITEM_CONFIGURATION), (words[2], ITEM_RESOURCE)])
+                self.SelectProjectTreeItem(window.GetTagName())
                 window.RefreshView()
                 self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName())
                 self.RefreshFileMenu()
@@ -1168,6 +1166,12 @@
         to_delete = []
         self.ProjectTree.SetItemText(root, infos["name"])
         self.ProjectTree.SetPyData(root, infos["type"])
+        if infos["tagname"] in self.Errors:
+            self.ProjectTree.SetItemBackgroundColour(root, wx.Colour(255, 255, 0))
+            self.ProjectTree.SetItemTextColour(root, wx.RED)
+        else:
+            self.ProjectTree.SetItemBackgroundColour(root, wx.WHITE)
+            self.ProjectTree.SetItemTextColour(root, wx.BLACK)
         if infos["type"] == ITEM_POU :
             self.ProjectTree.SetItemImage(root,self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
         else:
@@ -1190,7 +1194,25 @@
         for item in to_delete:
             self.ProjectTree.Delete(item)
 
-    def SelectProjectTreeItem(self, root, items):
+    def SelectProjectTreeItem(self, tagname):
+        if self.ProjectTree:
+            root = self.ProjectTree.GetRootItem()
+            words = tagname.split("::")
+            if words[0] == "D":
+                return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_DATATYPE)])
+            elif words[0] == "P":
+                return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU)])
+            elif words[0] == "T":
+                return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_TRANSITION)])
+            elif words[0] == "A":
+                return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_ACTION)])
+            elif words[0] == "C":
+                return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION)])
+            elif words[0] == "R":
+                return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION), (words[2], ITEM_RESOURCE)])
+        return False
+
+    def RecursiveProjectTreeItemSelection(self, root, items):
         found = False
         if self.ProjectTree:
             if wx.VERSION >= (2, 6, 0):
@@ -1205,9 +1227,9 @@
                         wx.CallAfter(self.ResetSelectedItem)
                         return True
                     else:
-                        found = self.SelectProjectTreeItem(item, items[1:])
+                        found = self.RecursiveProjectTreeItemSelection(item, items[1:])
                 else:
-                    found = self.SelectProjectTreeItem(item, items)
+                    found = self.RecursiveProjectTreeItemSelection(item, items)
                 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
         return found
 
@@ -1697,7 +1719,7 @@
 
 
 #-------------------------------------------------------------------------------
-#                           Tool Bar Items Functions
+#                           ToolBar Items Functions
 #-------------------------------------------------------------------------------
 
     def ResetCurrentMode(self):
@@ -2072,7 +2094,36 @@
     def OnAboutMenu(self, event):
         OpenHtmlFrame(self,"About PLCOpenEditor", os.path.join(CWD, "doc","about.html"), wx.Size(350, 350))
         event.Skip()
-        
+
+
+#-------------------------------------------------------------------------------
+#                        Errors showing functions
+#-------------------------------------------------------------------------------
+
+    def ShowError(self, infos, start, end):
+        print infos
+        self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0])
+        self.SelectProjectTreeItem(infos[0])
+        if infos[1] == "name":
+            self.Errors.append(infos[0])
+            self.RefreshProjectTree()
+            self.ProjectTree.Unselect()
+        elif infos[1] == "variable":
+            self.VariablePanelIndexer.AddVariableError(infos)
+        else:
+            selected = self.GetPageSelection()
+            if selected != -1:
+                viewer = self.GetPage(selected)
+                viewer.AddShownError(infos[1:], start, end)
+                viewer.RefreshView()
+    
+    def ClearErrors(self):
+        self.Errors = []
+        self.RefreshProjectTree()
+        self.VariablePanelIndexer.ClearErrors()
+        for i in xrange(self.GetPageCount()):
+            viewer = self.GetPage(i)
+            viewer.ClearErrors()
         
 current_num = 0
 def GetNewNum():
@@ -3228,6 +3279,15 @@
         if tagname in self.VariablePanelList:
             self.VariablePanelList[self.CurrentPanel].RefreshView()
 
+    def AddVariableError(self, infos):
+        self.ChangeVariablePanel(infos[0])
+        if self.CurrentPanel is not None:
+            self.VariablePanelList[self.CurrentPanel].AddVariableError(infos[2:])
+
+    def ClearErrors(self):
+        for panel in self.VariablePanelList.values():
+            panel.ClearErrors()
+
 #-------------------------------------------------------------------------------
 #                            Variables Editor Panel
 #-------------------------------------------------------------------------------
@@ -3243,6 +3303,7 @@
         self.data = data
         self.old_value = None
         self.colnames = colnames
+        self.Errors = {}
         self.Parent = parent
         # XXX
         # we need to store the row length and collength to
@@ -3374,7 +3435,13 @@
                 grid.SetCellEditor(row, col, editor)
                 grid.SetCellRenderer(row, col, renderer)
                 
-                grid.SetCellBackgroundColour(row, col, wx.WHITE)
+                if row in self.Errors and self.Errors[row][0] == colname.lower():
+                    grid.SetCellBackgroundColour(row, col, wx.Colour(255, 255, 0))
+                    grid.SetCellTextColour(row, col, wx.RED)
+                    grid.MakeCellVisible(row, col)
+                else:
+                    grid.SetCellTextColour(row, col, wx.BLACK)
+                    grid.SetCellBackgroundColour(row, col, wx.WHITE)
     
     def SetData(self, data):
         self.data = data
@@ -3401,6 +3468,12 @@
         self.data = []
         self.editors = []
 
+    def AddError(self, infos):
+        self.Errors[infos[0]] = infos[1:]
+
+    def ClearErrors(self):
+        self.Errors = {}
+
 class VariableDropTarget(wx.TextDropTarget):
     
     def __init__(self, parent):
@@ -3891,6 +3964,18 @@
             self.ParentWindow.RefreshTitle()
             self.ParentWindow.RefreshEditMenu()
 
+    def AddVariableError(self, infos):
+        if isinstance(infos[0], TupleType):
+            for i in xrange(*infos[0]):
+                self.Table.AddError((i,) + infos[1:])
+        else:
+            self.Table.AddError(infos)
+        self.Table.ResetView(self.VariablesGrid)
+
+    def ClearErrors(self):
+        self.Table.ClearErrors()
+        self.Table.ResetView(self.VariablesGrid)
+
 UPPER_DIV = lambda x, y: (x / y) + {True : 0, False : 1}[(x % y) == 0]
 
 class GraphicPrintout(wx.Printout):