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