--- 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):