PLCOpenEditor.py
changeset 231 fc2d6cbb8b39
parent 223 ea857c3a0427
child 235 7b58a3b5b6ec
equal deleted inserted replaced
230:45d70748e45a 231:fc2d6cbb8b39
   263             self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_CLOSE_ALL)
   263             self.Bind(wx.EVT_MENU, self.OnQuitMenu, id=wx.ID_CLOSE_ALL)
   264     
   264     
   265     def _init_coll_EditMenu_Items(self, parent):
   265     def _init_coll_EditMenu_Items(self, parent):
   266         AppendMenu(parent, help='', id=wx.ID_REFRESH,
   266         AppendMenu(parent, help='', id=wx.ID_REFRESH,
   267               kind=wx.ITEM_NORMAL, text=u'Refresh\tCTRL+R')
   267               kind=wx.ITEM_NORMAL, text=u'Refresh\tCTRL+R')
       
   268         if not self.ModeSolo:
       
   269             AppendMenu(parent, help='', id=wx.ID_CLEAR,
       
   270                   kind=wx.ITEM_NORMAL, text=u'Clear Errors\tCTRL+K')
   268         AppendMenu(parent, help='', id=wx.ID_UNDO,
   271         AppendMenu(parent, help='', id=wx.ID_UNDO,
   269               kind=wx.ITEM_NORMAL, text=u'Undo\tCTRL+Z')
   272               kind=wx.ITEM_NORMAL, text=u'Undo\tCTRL+Z')
   270         AppendMenu(parent, help='', id=wx.ID_REDO,
   273         AppendMenu(parent, help='', id=wx.ID_REDO,
   271               kind=wx.ITEM_NORMAL, text=u'Redo\tCTRL+Y')
   274               kind=wx.ITEM_NORMAL, text=u'Redo\tCTRL+Y')
   272         parent.AppendSeparator()
   275         parent.AppendSeparator()
   290         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
   293         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
   291               kind=wx.ITEM_NORMAL, text=u'Configuration')
   294               kind=wx.ITEM_NORMAL, text=u'Configuration')
   292         AppendMenu(parent, help='', id=wx.ID_DELETE,
   295         AppendMenu(parent, help='', id=wx.ID_DELETE,
   293               kind=wx.ITEM_NORMAL, text=u'Delete')
   296               kind=wx.ITEM_NORMAL, text=u'Delete')
   294         self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
   297         self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH)
       
   298         if not self.ModeSolo:
       
   299             self.Bind(wx.EVT_MENU, self.OnClearErrorsMenu, id=wx.ID_CLEAR)
   295         self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO)
   300         self.Bind(wx.EVT_MENU, self.OnUndoMenu, id=wx.ID_UNDO)
   296         self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO)
   301         self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO)
   297         self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT)
   302         self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT)
   298         self.Bind(wx.EVT_MENU, self.OnCopyMenu, id=wx.ID_COPY)
   303         self.Bind(wx.EVT_MENU, self.OnCopyMenu, id=wx.ID_COPY)
   299         self.Bind(wx.EVT_MENU, self.OnPasteMenu, id=wx.ID_PASTE)
   304         self.Bind(wx.EVT_MENU, self.OnPasteMenu, id=wx.ID_PASTE)
   487         self.ProjectTree.AssignImageList(self.TreeImageList)
   492         self.ProjectTree.AssignImageList(self.TreeImageList)
   488         
   493         
   489         self.CurrentToolBar = []
   494         self.CurrentToolBar = []
   490         self.CurrentLanguage = ""
   495         self.CurrentLanguage = ""
   491         self.SelectedItem = None
   496         self.SelectedItem = None
       
   497         self.Errors = []
   492         self.DrawingMode = FREEDRAWING_MODE
   498         self.DrawingMode = FREEDRAWING_MODE
   493         #self.DrawingMode = DRIVENDRAWING_MODE
   499         #self.DrawingMode = DRIVENDRAWING_MODE
   494         
   500         
   495         self.PrintData = wx.PrintData()
   501         self.PrintData = wx.PrintData()
   496         self.PrintData.SetPaperId(wx.PAPER_A4)
   502         self.PrintData.SetPaperId(wx.PAPER_A4)
   932         selected = self.GetPageSelection()
   938         selected = self.GetPageSelection()
   933         if selected != -1:
   939         if selected != -1:
   934             window = self.GetPage(selected)
   940             window = self.GetPage(selected)
   935             window.RefreshView()
   941             window.RefreshView()
   936             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
   942             self.VariablePanelIndexer.RefreshVariablePanel(window.GetTagName())
       
   943         event.Skip()
       
   944 
       
   945     def OnClearErrorsMenu(self, event):
       
   946         self.ClearErrors()
   937         event.Skip()
   947         event.Skip()
   938 
   948 
   939     def OnUndoMenu(self, event):
   949     def OnUndoMenu(self, event):
   940         self.Controler.LoadPrevious()
   950         self.Controler.LoadPrevious()
   941         idxs = range(self.GetPageCount())
   951         idxs = range(self.GetPageCount())
  1083                 if selected >= 0:
  1093                 if selected >= 0:
  1084                     window = self.GetPage(selected)
  1094                     window = self.GetPage(selected)
  1085                 else:
  1095                 else:
  1086                     window = None
  1096                     window = None
  1087             if window:
  1097             if window:
  1088                 if self.ProjectTree:
  1098                 self.SelectProjectTreeItem(window.GetTagName())
  1089                     root = self.ProjectTree.GetRootItem()
       
  1090                     words = window.GetTagName().split("::")
       
  1091                     if words[0] == "P":
       
  1092                         self.SelectProjectTreeItem(root, [(words[1], ITEM_POU)])
       
  1093                     elif words[0] == "T":
       
  1094                         self.SelectProjectTreeItem(root, [(words[1], ITEM_POU), (words[2], ITEM_TRANSITION)])
       
  1095                     elif words[0] == "A":
       
  1096                         self.SelectProjectTreeItem(root, [(words[1], ITEM_POU), (words[2], ITEM_ACTION)])
       
  1097                     elif words[0] == "C":
       
  1098                         self.SelectProjectTreeItem(root, [(words[1], ITEM_CONFIGURATION)])
       
  1099                     elif words[0] == "R":
       
  1100                         self.SelectProjectTreeItem(root, [(words[1], ITEM_CONFIGURATION), (words[2], ITEM_RESOURCE)])
       
  1101                 window.RefreshView()
  1099                 window.RefreshView()
  1102                 self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName())
  1100                 self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName())
  1103                 self.RefreshFileMenu()
  1101                 self.RefreshFileMenu()
  1104                 self.RefreshEditMenu()
  1102                 self.RefreshEditMenu()
  1105                 self.RefreshToolBar()
  1103                 self.RefreshToolBar()
  1166 
  1164 
  1167     def GenerateTreeBranch(self, root, infos):
  1165     def GenerateTreeBranch(self, root, infos):
  1168         to_delete = []
  1166         to_delete = []
  1169         self.ProjectTree.SetItemText(root, infos["name"])
  1167         self.ProjectTree.SetItemText(root, infos["name"])
  1170         self.ProjectTree.SetPyData(root, infos["type"])
  1168         self.ProjectTree.SetPyData(root, infos["type"])
       
  1169         if infos["tagname"] in self.Errors:
       
  1170             self.ProjectTree.SetItemBackgroundColour(root, wx.Colour(255, 255, 0))
       
  1171             self.ProjectTree.SetItemTextColour(root, wx.RED)
       
  1172         else:
       
  1173             self.ProjectTree.SetItemBackgroundColour(root, wx.WHITE)
       
  1174             self.ProjectTree.SetItemTextColour(root, wx.BLACK)
  1171         if infos["type"] == ITEM_POU :
  1175         if infos["type"] == ITEM_POU :
  1172             self.ProjectTree.SetItemImage(root,self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1176             self.ProjectTree.SetItemImage(root,self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1173         else:
  1177         else:
  1174             self.ProjectTree.SetItemImage(root,self.TreeImageDict[infos["type"]])      
  1178             self.ProjectTree.SetItemImage(root,self.TreeImageDict[infos["type"]])      
  1175             
  1179             
  1188             to_delete.append(item)
  1192             to_delete.append(item)
  1189             item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1193             item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1190         for item in to_delete:
  1194         for item in to_delete:
  1191             self.ProjectTree.Delete(item)
  1195             self.ProjectTree.Delete(item)
  1192 
  1196 
  1193     def SelectProjectTreeItem(self, root, items):
  1197     def SelectProjectTreeItem(self, tagname):
       
  1198         if self.ProjectTree:
       
  1199             root = self.ProjectTree.GetRootItem()
       
  1200             words = tagname.split("::")
       
  1201             if words[0] == "D":
       
  1202                 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_DATATYPE)])
       
  1203             elif words[0] == "P":
       
  1204                 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU)])
       
  1205             elif words[0] == "T":
       
  1206                 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_TRANSITION)])
       
  1207             elif words[0] == "A":
       
  1208                 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_POU), (words[2], ITEM_ACTION)])
       
  1209             elif words[0] == "C":
       
  1210                 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION)])
       
  1211             elif words[0] == "R":
       
  1212                 return self.RecursiveProjectTreeItemSelection(root, [(words[1], ITEM_CONFIGURATION), (words[2], ITEM_RESOURCE)])
       
  1213         return False
       
  1214 
       
  1215     def RecursiveProjectTreeItemSelection(self, root, items):
  1194         found = False
  1216         found = False
  1195         if self.ProjectTree:
  1217         if self.ProjectTree:
  1196             if wx.VERSION >= (2, 6, 0):
  1218             if wx.VERSION >= (2, 6, 0):
  1197                 item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1219                 item, root_cookie = self.ProjectTree.GetFirstChild(root)
  1198             else:
  1220             else:
  1203                         self.SelectedItem = item
  1225                         self.SelectedItem = item
  1204                         self.ProjectTree.SelectItem(item)
  1226                         self.ProjectTree.SelectItem(item)
  1205                         wx.CallAfter(self.ResetSelectedItem)
  1227                         wx.CallAfter(self.ResetSelectedItem)
  1206                         return True
  1228                         return True
  1207                     else:
  1229                     else:
  1208                         found = self.SelectProjectTreeItem(item, items[1:])
  1230                         found = self.RecursiveProjectTreeItemSelection(item, items[1:])
  1209                 else:
  1231                 else:
  1210                     found = self.SelectProjectTreeItem(item, items)
  1232                     found = self.RecursiveProjectTreeItemSelection(item, items)
  1211                 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1233                 item, root_cookie = self.ProjectTree.GetNextChild(root, root_cookie)
  1212         return found
  1234         return found
  1213 
  1235 
  1214     def OnProjectTreeBeginDrag(self, event):
  1236     def OnProjectTreeBeginDrag(self, event):
  1215         if wx.Platform == '__WXMSW__':
  1237         if wx.Platform == '__WXMSW__':
  1695             self.CurrentLanguage = language
  1717             self.CurrentLanguage = language
  1696         self.ResetCurrentMode()
  1718         self.ResetCurrentMode()
  1697 
  1719 
  1698 
  1720 
  1699 #-------------------------------------------------------------------------------
  1721 #-------------------------------------------------------------------------------
  1700 #                           Tool Bar Items Functions
  1722 #                           ToolBar Items Functions
  1701 #-------------------------------------------------------------------------------
  1723 #-------------------------------------------------------------------------------
  1702 
  1724 
  1703     def ResetCurrentMode(self):
  1725     def ResetCurrentMode(self):
  1704         selected = self.GetPageSelection()
  1726         selected = self.GetPageSelection()
  1705         if selected != -1:
  1727         if selected != -1:
  2070         event.Skip()
  2092         event.Skip()
  2071     
  2093     
  2072     def OnAboutMenu(self, event):
  2094     def OnAboutMenu(self, event):
  2073         OpenHtmlFrame(self,"About PLCOpenEditor", os.path.join(CWD, "doc","about.html"), wx.Size(350, 350))
  2095         OpenHtmlFrame(self,"About PLCOpenEditor", os.path.join(CWD, "doc","about.html"), wx.Size(350, 350))
  2074         event.Skip()
  2096         event.Skip()
  2075         
  2097 
       
  2098 
       
  2099 #-------------------------------------------------------------------------------
       
  2100 #                        Errors showing functions
       
  2101 #-------------------------------------------------------------------------------
       
  2102 
       
  2103     def ShowError(self, infos, start, end):
       
  2104         print infos
       
  2105         self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0])
       
  2106         self.SelectProjectTreeItem(infos[0])
       
  2107         if infos[1] == "name":
       
  2108             self.Errors.append(infos[0])
       
  2109             self.RefreshProjectTree()
       
  2110             self.ProjectTree.Unselect()
       
  2111         elif infos[1] == "variable":
       
  2112             self.VariablePanelIndexer.AddVariableError(infos)
       
  2113         else:
       
  2114             selected = self.GetPageSelection()
       
  2115             if selected != -1:
       
  2116                 viewer = self.GetPage(selected)
       
  2117                 viewer.AddShownError(infos[1:], start, end)
       
  2118                 viewer.RefreshView()
       
  2119     
       
  2120     def ClearErrors(self):
       
  2121         self.Errors = []
       
  2122         self.RefreshProjectTree()
       
  2123         self.VariablePanelIndexer.ClearErrors()
       
  2124         for i in xrange(self.GetPageCount()):
       
  2125             viewer = self.GetPage(i)
       
  2126             viewer.ClearErrors()
  2076         
  2127         
  2077 current_num = 0
  2128 current_num = 0
  2078 def GetNewNum():
  2129 def GetNewNum():
  2079     global current_num
  2130     global current_num
  2080     current_num += 1
  2131     current_num += 1
  3226 
  3277 
  3227     def RefreshVariablePanel(self, tagname):
  3278     def RefreshVariablePanel(self, tagname):
  3228         if tagname in self.VariablePanelList:
  3279         if tagname in self.VariablePanelList:
  3229             self.VariablePanelList[self.CurrentPanel].RefreshView()
  3280             self.VariablePanelList[self.CurrentPanel].RefreshView()
  3230 
  3281 
       
  3282     def AddVariableError(self, infos):
       
  3283         self.ChangeVariablePanel(infos[0])
       
  3284         if self.CurrentPanel is not None:
       
  3285             self.VariablePanelList[self.CurrentPanel].AddVariableError(infos[2:])
       
  3286 
       
  3287     def ClearErrors(self):
       
  3288         for panel in self.VariablePanelList.values():
       
  3289             panel.ClearErrors()
       
  3290 
  3231 #-------------------------------------------------------------------------------
  3291 #-------------------------------------------------------------------------------
  3232 #                            Variables Editor Panel
  3292 #                            Variables Editor Panel
  3233 #-------------------------------------------------------------------------------
  3293 #-------------------------------------------------------------------------------
  3234 
  3294 
  3235 class VariableTable(wx.grid.PyGridTableBase):
  3295 class VariableTable(wx.grid.PyGridTableBase):
  3241         # The base class must be initialized *first*
  3301         # The base class must be initialized *first*
  3242         wx.grid.PyGridTableBase.__init__(self)
  3302         wx.grid.PyGridTableBase.__init__(self)
  3243         self.data = data
  3303         self.data = data
  3244         self.old_value = None
  3304         self.old_value = None
  3245         self.colnames = colnames
  3305         self.colnames = colnames
       
  3306         self.Errors = {}
  3246         self.Parent = parent
  3307         self.Parent = parent
  3247         # XXX
  3308         # XXX
  3248         # we need to store the row length and collength to
  3309         # we need to store the row length and collength to
  3249         # see if the table has changed size
  3310         # see if the table has changed size
  3250         self._rows = self.GetNumberRows()
  3311         self._rows = self.GetNumberRows()
  3372                     grid.SetReadOnly(row, col, True)
  3433                     grid.SetReadOnly(row, col, True)
  3373                 
  3434                 
  3374                 grid.SetCellEditor(row, col, editor)
  3435                 grid.SetCellEditor(row, col, editor)
  3375                 grid.SetCellRenderer(row, col, renderer)
  3436                 grid.SetCellRenderer(row, col, renderer)
  3376                 
  3437                 
  3377                 grid.SetCellBackgroundColour(row, col, wx.WHITE)
  3438                 if row in self.Errors and self.Errors[row][0] == colname.lower():
       
  3439                     grid.SetCellBackgroundColour(row, col, wx.Colour(255, 255, 0))
       
  3440                     grid.SetCellTextColour(row, col, wx.RED)
       
  3441                     grid.MakeCellVisible(row, col)
       
  3442                 else:
       
  3443                     grid.SetCellTextColour(row, col, wx.BLACK)
       
  3444                     grid.SetCellBackgroundColour(row, col, wx.WHITE)
  3378     
  3445     
  3379     def SetData(self, data):
  3446     def SetData(self, data):
  3380         self.data = data
  3447         self.data = data
  3381     
  3448     
  3382     def GetData(self):
  3449     def GetData(self):
  3398         return self.data[row_index]
  3465         return self.data[row_index]
  3399 
  3466 
  3400     def Empty(self):
  3467     def Empty(self):
  3401         self.data = []
  3468         self.data = []
  3402         self.editors = []
  3469         self.editors = []
       
  3470 
       
  3471     def AddError(self, infos):
       
  3472         self.Errors[infos[0]] = infos[1:]
       
  3473 
       
  3474     def ClearErrors(self):
       
  3475         self.Errors = {}
  3403 
  3476 
  3404 class VariableDropTarget(wx.TextDropTarget):
  3477 class VariableDropTarget(wx.TextDropTarget):
  3405     
  3478     
  3406     def __init__(self, parent):
  3479     def __init__(self, parent):
  3407         wx.TextDropTarget.__init__(self)
  3480         wx.TextDropTarget.__init__(self)
  3889         if buffer:
  3962         if buffer:
  3890             self.Controler.BufferProject()
  3963             self.Controler.BufferProject()
  3891             self.ParentWindow.RefreshTitle()
  3964             self.ParentWindow.RefreshTitle()
  3892             self.ParentWindow.RefreshEditMenu()
  3965             self.ParentWindow.RefreshEditMenu()
  3893 
  3966 
       
  3967     def AddVariableError(self, infos):
       
  3968         if isinstance(infos[0], TupleType):
       
  3969             for i in xrange(*infos[0]):
       
  3970                 self.Table.AddError((i,) + infos[1:])
       
  3971         else:
       
  3972             self.Table.AddError(infos)
       
  3973         self.Table.ResetView(self.VariablesGrid)
       
  3974 
       
  3975     def ClearErrors(self):
       
  3976         self.Table.ClearErrors()
       
  3977         self.Table.ResetView(self.VariablesGrid)
       
  3978 
  3894 UPPER_DIV = lambda x, y: (x / y) + {True : 0, False : 1}[(x % y) == 0]
  3979 UPPER_DIV = lambda x, y: (x / y) + {True : 0, False : 1}[(x % y) == 0]
  3895 
  3980 
  3896 class GraphicPrintout(wx.Printout):
  3981 class GraphicPrintout(wx.Printout):
  3897     def __init__(self, viewer, page_size, margins, preview = False):
  3982     def __init__(self, viewer, page_size, margins, preview = False):
  3898         wx.Printout.__init__(self)
  3983         wx.Printout.__init__(self)