PLCOpenEditor.py
changeset 586 9aa96a36cf33
parent 577 9dbb79722fbc
child 587 98445f90f45d
equal deleted inserted replaced
585:bd8c7a033b17 586:9aa96a36cf33
   111 from TextViewer import *
   111 from TextViewer import *
   112 from GraphicViewer import *
   112 from GraphicViewer import *
   113 from RessourceEditor import *
   113 from RessourceEditor import *
   114 from DataTypeEditor import *
   114 from DataTypeEditor import *
   115 from PLCControler import *
   115 from PLCControler import *
   116 from VariablePanel import VariablePanel
   116 from controls.VariablePanel import VariablePanel
   117 from SearchResultPanel import SearchResultPanel
   117 from SearchResultPanel import SearchResultPanel
   118 from controls import CustomGrid
   118 from controls import CustomGrid
   119 
   119 
   120 # Define PLCOpenEditor controls id
   120 # Define PLCOpenEditor controls id
   121 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, 
   121 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, 
   265         parent.Append(help=help, id=id, kind=kind, text=text)
   265         parent.Append(help=help, id=id, kind=kind, text=text)
   266     else:
   266     else:
   267         parent.Append(helpString=help, id=id, kind=kind, item=text)
   267         parent.Append(helpString=help, id=id, kind=kind, item=text)
   268 
   268 
   269 [TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, TYPESTREE, 
   269 [TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU, TYPESTREE, 
   270  INSTANCESTREE, LIBRARYTREE, SCALING
   270  INSTANCESTREE, LIBRARYTREE, SCALING, PAGETITLES
   271 ] = range(9)
   271 ] = range(10)
   272 
   272 
   273 def GetShortcutKeyCallbackFunction(viewer_function):
   273 def GetShortcutKeyCallbackFunction(viewer_function):
   274     def ShortcutKeyFunction(self, event):
   274     def ShortcutKeyFunction(self, event):
   275         control = self.FindFocus()
   275         control = self.FindFocus()
   276         if isinstance(control, (Viewer, TextViewer)):
   276         if control.GetName() in ["Viewer", "TextViewer"]:
   277             getattr(control, viewer_function)()
   277             getattr(control.Parent, viewer_function)()
   278         elif isinstance(control, wx.TextCtrl):
   278         elif isinstance(control, wx.TextCtrl):
   279             control.ProcessEvent(event)
   279             control.ProcessEvent(event)
   280     return ShortcutKeyFunction
   280     return ShortcutKeyFunction
   281 
   281 
   282 def GetParentName(tree, item, parent_type):
   282 def GetParentName(tree, item, parent_type):
   606             self.ToolBar.Realize()
   606             self.ToolBar.Realize()
   607             
   607             
   608         self.Bind(wx.EVT_TOOL, self.OnSelectionTool, 
   608         self.Bind(wx.EVT_TOOL, self.OnSelectionTool, 
   609               id=ID_PLCOPENEDITORTOOLBARSELECTION)
   609               id=ID_PLCOPENEDITORTOOLBARSELECTION)
   610         
   610         
   611         self.VariablePanelIndexer = VariablePanelIndexer(self.BottomNoteBook, self)
       
   612         self.BottomNoteBook.AddPage(self.VariablePanelIndexer, _("Variables"))
       
   613 
       
   614         self.SearchResultPanel = SearchResultPanel(self.BottomNoteBook, self)
   611         self.SearchResultPanel = SearchResultPanel(self.BottomNoteBook, self)
   615         self.BottomNoteBook.AddPage(self.SearchResultPanel, _("Search"))
   612         self.BottomNoteBook.AddPage(self.SearchResultPanel, _("Search"))
   616 
   613 
   617         self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
   614         self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
   618               name='LibraryPanel', parent=self.RightNoteBook, pos=wx.Point(0,
   615               name='LibraryPanel', parent=self.RightNoteBook, pos=wx.Point(0,
   752             EDITMENU : self.RefreshEditMenu,
   749             EDITMENU : self.RefreshEditMenu,
   753             DISPLAYMENU : self.RefreshDisplayMenu,
   750             DISPLAYMENU : self.RefreshDisplayMenu,
   754             TYPESTREE : self.RefreshTypesTree,
   751             TYPESTREE : self.RefreshTypesTree,
   755             INSTANCESTREE : self.RefreshInstancesTree, 
   752             INSTANCESTREE : self.RefreshInstancesTree, 
   756             LIBRARYTREE : self.RefreshLibraryTree,
   753             LIBRARYTREE : self.RefreshLibraryTree,
   757             SCALING : self.RefreshScaling}
   754             SCALING : self.RefreshScaling,
       
   755             PAGETITLES: self.RefreshPageTitles}
   758 
   756 
   759     ## Call PLCOpenEditor refresh functions.
   757     ## Call PLCOpenEditor refresh functions.
   760     #  @param elements List of elements to refresh.
   758     #  @param elements List of elements to refresh.
   761     def _Refresh(self, *elements):
   759     def _Refresh(self, *elements):
   762         for element in elements:
   760         for element in elements:
   763             self.RefreshFunctions[element]()
   761             self.RefreshFunctions[element]()
   764 
   762 
   765     ## Callback function when AUINotebook Page closed with CloseButton
   763     ## Callback function when AUINotebook Page closed with CloseButton
   766     #  @param event AUINotebook Event.
   764     #  @param event AUINotebook Event.
   767     def OnPageClose(self, event):
   765     def OnPageClose(self, event):
   768         # Get Selected Tab
       
   769         selected = event.GetSelection()
       
   770         if selected >= 0:
       
   771             # Remove corresponding VariablePanel
       
   772             window = self.TabsOpened.GetPage(selected)
       
   773             if not window.IsDebugging():
       
   774                 self.VariablePanelIndexer.RemoveVariablePanel(window.GetTagName())
       
   775         
       
   776         wx.CallAfter(self.RefreshTabCtrlEvent)
   766         wx.CallAfter(self.RefreshTabCtrlEvent)
   777         event.Skip()
   767         event.Skip()
   778 
   768 
   779     def GetCopyBuffer(self):
   769     def GetCopyBuffer(self):
   780         data = None
   770         data = None
   923     def RefreshFileMenu(self):
   913     def RefreshFileMenu(self):
   924         pass
   914         pass
   925 
   915 
   926     def ResetView(self):
   916     def ResetView(self):
   927         self.DeleteAllPages()
   917         self.DeleteAllPages()
   928         self.VariablePanelIndexer.RemoveAllPanels()
       
   929         self.TypesTree.DeleteAllItems()
   918         self.TypesTree.DeleteAllItems()
   930         self.InstancesTree.DeleteAllItems()
   919         self.InstancesTree.DeleteAllItems()
   931         self.LibraryTree.DeleteAllItems()
   920         self.LibraryTree.DeleteAllItems()
   932         self.Controler = None
   921         self.Controler = None
   933 
   922 
   934     def OnCloseTabMenu(self, event):
   923     def OnCloseTabMenu(self, event):
   935         selected = self.TabsOpened.GetSelection()
   924         selected = self.TabsOpened.GetSelection()
   936         if selected >= 0:
   925         if selected >= 0:
   937             window = self.TabsOpened.GetPage(selected)
       
   938             if not window.IsDebugging():
       
   939                 self.VariablePanelIndexer.RemoveVariablePanel(window.GetTagName())
       
   940             self.TabsOpened.DeletePage(selected)
   926             self.TabsOpened.DeletePage(selected)
   941             if self.TabsOpened.GetPageCount() > 0:
   927             if self.TabsOpened.GetPageCount() > 0:
   942                 new_index = min(selected, self.TabsOpened.GetPageCount() - 1)
   928                 new_index = min(selected, self.TabsOpened.GetPageCount() - 1)
   943                 self.TabsOpened.SetSelection(new_index)
   929                 self.TabsOpened.SetSelection(new_index)
   944                 window = self.TabsOpened.GetPage(new_index)
       
   945                 if not window.IsDebugging():
       
   946                     self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName())
       
   947         # Refresh all window elements that have changed
   930         # Refresh all window elements that have changed
   948         self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
   931         self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU, DISPLAYMENU)
   949         self.RefreshTabCtrlEvent()
   932         self.RefreshTabCtrlEvent()
   950 
   933 
   951     def OnPageSetupMenu(self, event):
   934     def OnPageSetupMenu(self, event):
  1004 #                            Edit Menu Functions
   987 #                            Edit Menu Functions
  1005 #-------------------------------------------------------------------------------
   988 #-------------------------------------------------------------------------------
  1006 
   989 
  1007     def RefreshEditMenu(self):
   990     def RefreshEditMenu(self):
  1008         if self.Controler is not None:
   991         if self.Controler is not None:
  1009             undo, redo = self.Controler.GetBufferState()
   992             selected = self.TabsOpened.GetSelection()
       
   993             if selected > -1:
       
   994                 window = self.TabsOpened.GetPage(selected)
       
   995                 undo, redo = window.GetBufferState()
       
   996             else:
       
   997                 undo, redo = False, False
  1010             self.EditMenu.Enable(wx.ID_UNDO, undo)
   998             self.EditMenu.Enable(wx.ID_UNDO, undo)
  1011             self.EditMenu.Enable(wx.ID_REDO, redo)
   999             self.EditMenu.Enable(wx.ID_REDO, redo)
  1012             #self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, True)
  1000             #self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, True)
  1013             #self.EditMenu.Check(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, 
  1001             #self.EditMenu.Check(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, 
  1014             #                self.Controler.IsProjectBufferEnabled())
  1002             #                self.Controler.IsProjectBufferEnabled())
  1043     def CloseTabsWithoutModel(self):
  1031     def CloseTabsWithoutModel(self):
  1044         idxs = range(self.TabsOpened.GetPageCount())
  1032         idxs = range(self.TabsOpened.GetPageCount())
  1045         idxs.reverse()
  1033         idxs.reverse()
  1046         for idx in idxs:
  1034         for idx in idxs:
  1047             window = self.TabsOpened.GetPage(idx)
  1035             window = self.TabsOpened.GetPage(idx)
  1048             if not window.IsDebugging():
  1036             if window.HasNoModel():
  1049                 tagname = window.GetTagName()
  1037                 self.TabsOpened.DeletePage(idx)
  1050                 if self.Controler.GetEditedElement(tagname) is None:
       
  1051                     self.VariablePanelIndexer.RemoveVariablePanel(tagname)
       
  1052                     self.TabsOpened.DeletePage(idx)
       
  1053 
  1038 
  1054     def OnUndoMenu(self, event):
  1039     def OnUndoMenu(self, event):
  1055         self.Controler.LoadPrevious()
  1040         selected = self.TabsOpened.GetSelection()
  1056         self.CloseTabsWithoutModel()
  1041         if selected != -1:
  1057         self.RefreshEditor()
  1042             window = self.TabsOpened.GetPage(selected)
  1058         self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, 
  1043             window.Undo()
  1059                       SCALING)
  1044             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, 
       
  1045                           SCALING, PAGETITLES)
  1060     
  1046     
  1061     def OnRedoMenu(self, event):
  1047     def OnRedoMenu(self, event):
  1062         self.Controler.LoadNext()
  1048         selected = self.TabsOpened.GetSelection()
  1063         self.CloseTabsWithoutModel()
  1049         if selected != -1:
  1064         self.RefreshEditor()
  1050             window = self.TabsOpened.GetPage(selected)
  1065         self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, 
  1051             window.Redo()
  1066                       SCALING)
  1052             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE, 
       
  1053                           SCALING, PAGETITLES)
  1067     
  1054     
  1068     def OnEnableUndoRedoMenu(self, event):
  1055     def OnEnableUndoRedoMenu(self, event):
  1069         self.Controler.EnableProjectBuffer(event.IsChecked())
  1056         self.Controler.EnableProjectBuffer(event.IsChecked())
  1070         self.RefreshEditMenu()
  1057         self.RefreshEditMenu()
  1071 
  1058 
  1073     OnCopyMenu = GetShortcutKeyCallbackFunction("Copy")
  1060     OnCopyMenu = GetShortcutKeyCallbackFunction("Copy")
  1074     OnPasteMenu = GetShortcutKeyCallbackFunction("Paste")
  1061     OnPasteMenu = GetShortcutKeyCallbackFunction("Paste")
  1075 
  1062 
  1076     def OnSelectAllMenu(self, event):
  1063     def OnSelectAllMenu(self, event):
  1077         control = self.FindFocus()
  1064         control = self.FindFocus()
  1078         if isinstance(control, (Viewer, TextViewer)):
  1065         if control.GetName() in ["Viewer", "TextViewer"]:
  1079             control.SelectAll()
  1066             control.Parent.SelectAll()
  1080         elif isinstance(control, wx.TextCtrl):
  1067         elif isinstance(control, wx.TextCtrl):
  1081             control.SetSelection(0, control.GetLastPosition())
  1068             control.SetSelection(0, control.GetLastPosition())
  1082         elif isinstance(control, wx.ComboBox):
  1069         elif isinstance(control, wx.ComboBox):
  1083             control.SetMark(0, control.GetLastPosition() + 1)
  1070             control.SetMark(0, control.GetLastPosition() + 1)
  1084     
  1071     
  1201             if not window.IsDebugging():
  1188             if not window.IsDebugging():
  1202                 wx.CallAfter(self.SelectTypesTreeItem, window.GetTagName())
  1189                 wx.CallAfter(self.SelectTypesTreeItem, window.GetTagName())
  1203             else:
  1190             else:
  1204                 wx.CallAfter(self.SelectInstancesTreeItem, self.InstancesTree.GetRootItem(), window.GetInstancePath())
  1191                 wx.CallAfter(self.SelectInstancesTreeItem, self.InstancesTree.GetRootItem(), window.GetInstancePath())
  1205             window.RefreshView()
  1192             window.RefreshView()
  1206             if not window.IsDebugging():
       
  1207                 self.VariablePanelIndexer.ChangeVariablePanel(window.GetTagName())
       
  1208             self._Refresh(FILEMENU, EDITMENU, DISPLAYMENU, TOOLBAR)
  1193             self._Refresh(FILEMENU, EDITMENU, DISPLAYMENU, TOOLBAR)
  1209         event.Skip()
  1194         event.Skip()
  1210 
  1195 
  1211     def RefreshEditor(self, variablepanel = True):
  1196     def RefreshEditor(self):
  1212         selected = self.TabsOpened.GetSelection()
  1197         selected = self.TabsOpened.GetSelection()
  1213         if USE_AUI:
  1198         if USE_AUI:
  1214             for child in self.TabsOpened.GetChildren():
  1199             for child in self.TabsOpened.GetChildren():
  1215                 if isinstance(child, wx.aui.AuiTabCtrl):
  1200                 if isinstance(child, wx.aui.AuiTabCtrl):
  1216                     active_page = child.GetActivePage()
  1201                     active_page = child.GetActivePage()
  1217                     if active_page >= 0:
  1202                     if active_page >= 0:
  1218                         window = child.GetWindowFromIdx(child.GetActivePage())
  1203                         window = child.GetWindowFromIdx(active_page)
  1219                         window.RefreshView()
  1204                         window.RefreshView()
  1220                         if not window.IsDebugging() and self.TabsOpened.GetPageIndex(window) == selected and variablepanel:
       
  1221                             self.RefreshVariablePanel(window.GetTagName())
       
  1222         elif selected >= 0:
  1205         elif selected >= 0:
  1223             window = self.TabsOpened.GetPage(idx)
  1206             window = self.TabsOpened.GetPage(idx)
  1224             window.RefreshView()
  1207             window.RefreshView()
  1225             if not window.IsDebugging() and variablepanel:
  1208     
  1226                 self.RefreshVariablePanel(window.GetTagName())
       
  1227 
       
  1228     def RefreshVariablePanel(self, tagname):
       
  1229         self.VariablePanelIndexer.RefreshVariablePanel(tagname)
       
  1230 
       
  1231     def RefreshEditorNames(self, old_tagname, new_tagname):
  1209     def RefreshEditorNames(self, old_tagname, new_tagname):
  1232         for i in xrange(self.TabsOpened.GetPageCount()):
  1210         for i in xrange(self.TabsOpened.GetPageCount()):
  1233             editor = self.TabsOpened.GetPage(i)
  1211             editor = self.TabsOpened.GetPage(i)
  1234             if editor.GetTagName() == old_tagname:
  1212             if editor.GetTagName() == old_tagname:
  1235                 editor.SetTagName(new_tagname)
  1213                 editor.SetTagName(new_tagname)
  1236         self.VariablePanelIndexer.UpdateVariablePanelTagName(old_tagname, new_tagname)
  1214     
  1237 
       
  1238     def IsOpened(self, tagname):
  1215     def IsOpened(self, tagname):
  1239         for idx in xrange(self.TabsOpened.GetPageCount()):
  1216         for idx in xrange(self.TabsOpened.GetPageCount()):
  1240             if self.TabsOpened.GetPage(idx).IsViewing(tagname):
  1217             if self.TabsOpened.GetPage(idx).IsViewing(tagname):
  1241                 return idx
  1218                 return idx
  1242         return None
  1219         return None
  1243 
  1220 
  1244     def RefreshPageTitles(self):
  1221     def RefreshPageTitles(self):
  1245         for idx in xrange(self.TabsOpened.GetPageCount()):
  1222         for idx in xrange(self.TabsOpened.GetPageCount()):
  1246             window = self.TabsOpened.GetPage(idx)
  1223             window = self.TabsOpened.GetPage(idx)
  1247             debug = window.IsDebugging()
  1224             icon = window.GetIcon()
  1248             words = window.GetTagName().split("::")
  1225             if icon is not None:
  1249             if words[0] == "P":
  1226                 self.SetPageBitmap(idx, icon)
  1250                 pou_type = self.Controler.GetEditedElementType(window.GetTagName(), debug)[1].upper()
  1227             self.TabsOpened.SetPageText(idx, window.GetTitle())
  1251                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName(), debug)
       
  1252                 self.SetPageBitmap(idx, self.GenerateBitmap(pou_type, pou_body_type))
       
  1253             elif words[0] == "T":
       
  1254                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName(), debug)
       
  1255                 self.SetPageBitmap(idx, self.GenerateBitmap("TRANSITION", pou_body_type))
       
  1256             elif words[0] == "A":
       
  1257                 pou_body_type = self.Controler.GetEditedElementBodyType(window.GetTagName(), debug)
       
  1258                 self.SetPageBitmap(idx, self.GenerateBitmap("ACTION", pou_body_type))
       
  1259             elif words[0] == "C":
       
  1260                 self.SetPageBitmap(idx, self.GenerateBitmap("CONFIGURATION"))
       
  1261             elif words[0] == "R":
       
  1262                 self.SetPageBitmap(idx, self.GenerateBitmap("RESOURCE"))
       
  1263             elif words[0] == "D":
       
  1264                 self.SetPageBitmap(idx, self.GenerateBitmap("DATATYPE"))
       
  1265             if debug:
       
  1266                 text = window.GetInstancePath()
       
  1267                 if len(text) > 15:
       
  1268                     text = "..." + text[-12:]
       
  1269                 self.TabsOpened.SetPageText(idx, text)
       
  1270             else:
       
  1271                 self.TabsOpened.SetPageText(idx, "-".join(words[1:]))
       
  1272 
  1228 
  1273     def GetTabsOpenedDClickFunction(self, tabctrl):
  1229     def GetTabsOpenedDClickFunction(self, tabctrl):
  1274         def OnTabsOpenedDClick(event):
  1230         def OnTabsOpenedDClick(event):
  1275             pos = event.GetPosition()
  1231             pos = event.GetPosition()
  1276             if tabctrl.TabHitTest(pos.x, pos.y, None):
  1232             if tabctrl.TabHitTest(pos.x, pos.y, None):
  1561             self.SelectedItem = event.GetItem()
  1517             self.SelectedItem = event.GetItem()
  1562             event.Veto()
  1518             event.Veto()
  1563         else:
  1519         else:
  1564             event.Skip()
  1520             event.Skip()
  1565     
  1521     
  1566     def EditProjectElement(self, elementtype, tagname, onlyopened = False):
  1522     def EditProjectElement(self, element, tagname, onlyopened = False):
  1567         openedidx = self.IsOpened(tagname)
  1523         openedidx = self.IsOpened(tagname)
  1568         if openedidx is not None:
  1524         if openedidx is not None:
  1569             old_selected = self.TabsOpened.GetSelection()
  1525             old_selected = self.TabsOpened.GetSelection()
  1570             if old_selected != openedidx:
  1526             if old_selected != openedidx:
  1571                 if old_selected >= 0:
  1527                 if old_selected >= 0:
  1572                     self.TabsOpened.GetPage(old_selected).ResetBuffer()
  1528                     self.TabsOpened.GetPage(old_selected).ResetBuffer()
  1573                 self.TabsOpened.SetSelection(openedidx)
  1529                 self.TabsOpened.SetSelection(openedidx)
  1574             self.VariablePanelIndexer.ChangeVariablePanel(tagname)
  1530             self._Refresh(FILEMENU, EDITMENU, TOOLBAR, PAGETITLES)
  1575             self.RefreshPageTitles()
       
  1576             self._Refresh(FILEMENU, EDITMENU, TOOLBAR)
       
  1577         elif not onlyopened:
  1531         elif not onlyopened:
  1578             if elementtype == ITEM_CONFIGURATION:
  1532             new_window = None
       
  1533             if element == ITEM_CONFIGURATION:
  1579                 new_window = ConfigurationEditor(self.TabsOpened, tagname, self, self.Controler)
  1534                 new_window = ConfigurationEditor(self.TabsOpened, tagname, self, self.Controler)
       
  1535                 new_window.SetIcon(self.GenerateBitmap("CONFIGURATION"))
  1580                 self.AddPage(new_window, "")
  1536                 self.AddPage(new_window, "")
  1581                 self.VariablePanelIndexer.AddVariablePanel(tagname, "config")
  1537             elif element == ITEM_RESOURCE:
  1582             elif elementtype == ITEM_RESOURCE:
       
  1583                 new_window = ResourceEditor(self.TabsOpened, tagname, self, self.Controler)
  1538                 new_window = ResourceEditor(self.TabsOpened, tagname, self, self.Controler)
       
  1539                 new_window.SetIcon(self.GenerateBitmap("RESOURCE"))
  1584                 self.AddPage(new_window, "")
  1540                 self.AddPage(new_window, "")
  1585                 self.VariablePanelIndexer.AddVariablePanel(tagname, "resource")
  1541             elif element in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
  1586             elif elementtype in [ITEM_POU, ITEM_TRANSITION, ITEM_ACTION]:
       
  1587                 bodytype = self.Controler.GetEditedElementBodyType(tagname)
  1542                 bodytype = self.Controler.GetEditedElementBodyType(tagname)
  1588                 if bodytype == "FBD":
  1543                 if bodytype == "FBD":
  1589                     new_window = Viewer(self.TabsOpened, tagname, self, self.Controler)
  1544                     new_window = Viewer(self.TabsOpened, tagname, self, self.Controler)
  1590                     new_window.RefreshScaling(False)
  1545                     new_window.RefreshScaling(False)
  1591                 elif bodytype == "LD":
  1546                 elif bodytype == "LD":
  1599                     new_window.SetTextSyntax(bodytype)
  1554                     new_window.SetTextSyntax(bodytype)
  1600                     if bodytype == "IL":
  1555                     if bodytype == "IL":
  1601                         new_window.SetKeywords(IL_KEYWORDS)
  1556                         new_window.SetKeywords(IL_KEYWORDS)
  1602                     else:
  1557                     else:
  1603                         new_window.SetKeywords(ST_KEYWORDS)
  1558                         new_window.SetKeywords(ST_KEYWORDS)
       
  1559                 if element == ITEM_POU:
       
  1560                     pou_type = self.Controler.GetEditedElementType(tagname)[1].upper()
       
  1561                     icon = self.GenerateBitmap(pou_type, bodytype)
       
  1562                 elif element == ITEM_TRANSITION:
       
  1563                     icon = self.GenerateBitmap("TRANSITION", bodytype)
       
  1564                 elif element == ITEM_ACTION:
       
  1565                     icon = self.GenerateBitmap("ACTION", bodytype)
       
  1566                 new_window.SetIcon(icon)
  1604                 self.AddPage(new_window, "")
  1567                 self.AddPage(new_window, "")
  1605                 words = tagname.split("::")
  1568                 words = tagname.split("::")
  1606                 self.VariablePanelIndexer.AddVariablePanel(tagname, self.Controler.GetPouType(words[1]))
  1569             elif element == ITEM_DATATYPE:
  1607             elif elementtype == ITEM_DATATYPE:
       
  1608                 new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler)
  1570                 new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler)
       
  1571                 new_window.SetIcon(self.GenerateBitmap("DATATYPE"))
  1609                 self.AddPage(new_window, "")
  1572                 self.AddPage(new_window, "")
  1610             self.VariablePanelIndexer.ChangeVariablePanel(tagname)
  1573             elif isinstance(element, EditorPanel):
  1611             openedidx = self.IsOpened(tagname)
  1574                 new_window = element
  1612             old_selected = self.TabsOpened.GetSelection()
  1575                 self.AddPage(element, "")
  1613             if old_selected != openedidx:
  1576             if new_window is not None:
  1614                 if old_selected >= 0:
  1577                 openedidx = self.IsOpened(tagname)
  1615                     self.TabsOpened.GetPage(old_selected).ResetBuffer()
  1578                 old_selected = self.TabsOpened.GetSelection()
  1616             for i in xrange(self.TabsOpened.GetPageCount()):
  1579                 if old_selected != openedidx:
  1617                 window = self.TabsOpened.GetPage(i)
  1580                     if old_selected >= 0:
  1618                 if window.GetTagName() == tagname:
  1581                         self.TabsOpened.GetPage(old_selected).ResetBuffer()
  1619                     self.TabsOpened.SetSelection(i)
  1582                 for i in xrange(self.TabsOpened.GetPageCount()):
  1620                     window.SetFocus()
  1583                     window = self.TabsOpened.GetPage(i)
  1621                     self.RefreshPageTitles()
  1584                     if window == new_window:
       
  1585                         self.TabsOpened.SetSelection(i)
       
  1586                         window.SetFocus()
       
  1587                 self.RefreshPageTitles()
  1622     
  1588     
  1623     def OnTypesTreeRightUp(self, event):
  1589     def OnTypesTreeRightUp(self, event):
  1624         if wx.Platform == '__WXMSW__':
  1590         if wx.Platform == '__WXMSW__':
  1625             item = event.GetItem()
  1591             item = event.GetItem()
  1626         else:
  1592         else:
  1834                         new_window.SetTextSyntax(bodytype)
  1800                         new_window.SetTextSyntax(bodytype)
  1835                         if bodytype == "IL":
  1801                         if bodytype == "IL":
  1836                             new_window.SetKeywords(IL_KEYWORDS)
  1802                             new_window.SetKeywords(IL_KEYWORDS)
  1837                         else:
  1803                         else:
  1838                             new_window.SetKeywords(ST_KEYWORDS)
  1804                             new_window.SetKeywords(ST_KEYWORDS)
       
  1805                     if selected_infos[0] in [ITEM_FUNCTIONBLOCK, ITEM_PROGRAM]:
       
  1806                         pou_type = self.Controler.GetEditedElementType(selected_infos[1], True)[1].upper()
       
  1807                         icon = self.GenerateBitmap(pou_type, bodytype)
       
  1808                     elif selected_infos[0] == ITEM_TRANSITION:
       
  1809                         icon = self.GenerateBitmap("TRANSITION", bodytype)
       
  1810                     elif selected_infos[0] == ITEM_ACTION:
       
  1811                         icon = self.GenerateBitmap("ACTION", bodytype)
       
  1812                     new_window.SetIcon(icon)
  1839                     self.AddPage(new_window, "")
  1813                     self.AddPage(new_window, "")
  1840                     new_window.SetFocus()
  1814                     new_window.SetFocus()
  1841                     self.RefreshPageTitles()
  1815                     self.RefreshPageTitles()
  1842             if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE:
  1816             if selected_item is not None and selected_infos[0] in ITEMS_VARIABLE:
  1843                 var_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (")
  1817                 var_path, var_type = self.InstancesTree.GetItemText(selected_item).split(" (")
  2357             if not self.Controler.PouIsUsed(name):
  2331             if not self.Controler.PouIsUsed(name):
  2358                 self.Controler.ProjectRemovePou(name)
  2332                 self.Controler.ProjectRemovePou(name)
  2359                 tagname = self.Controler.ComputePouName(name)
  2333                 tagname = self.Controler.ComputePouName(name)
  2360                 idx = self.IsOpened(tagname)
  2334                 idx = self.IsOpened(tagname)
  2361                 if idx is not None:
  2335                 if idx is not None:
  2362                     self.VariablePanelIndexer.RemoveVariablePanel(tagname)
       
  2363                     self.TabsOpened.DeletePage(idx)
  2336                     self.TabsOpened.DeletePage(idx)
  2364                 self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE)
  2337                 self._Refresh(TITLE, TOOLBAR, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE, LIBRARYTREE)
  2365             else:
  2338             else:
  2366                 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!"))
  2339                 self.ShowErrorMessage(_("\"%s\" is used by one or more POUs. It can't be removed!"))
  2367 
  2340 
  2377             pou_name = self.TypesTree.GetItemText(item)
  2350             pou_name = self.TypesTree.GetItemText(item)
  2378             self.Controler.ProjectRemovePouTransition(pou_name, transition)
  2351             self.Controler.ProjectRemovePouTransition(pou_name, transition)
  2379             tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
  2352             tagname = self.Controler.ComputePouTransitionName(pou_name, transition)
  2380             idx = self.IsOpened(tagname)
  2353             idx = self.IsOpened(tagname)
  2381             if idx is not None:
  2354             if idx is not None:
  2382                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
       
  2383                 self.TabsOpened.DeletePage(idx)
  2355                 self.TabsOpened.DeletePage(idx)
  2384             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE)
  2356             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE)
  2385 
  2357 
  2386     def OnRemoveActionMenu(self, event):
  2358     def OnRemoveActionMenu(self, event):
  2387         selected = self.TypesTree.GetSelection()
  2359         selected = self.TypesTree.GetSelection()
  2395             pou_name = self.TypesTree.GetItemText(item)
  2367             pou_name = self.TypesTree.GetItemText(item)
  2396             self.Controler.ProjectRemovePouAction(pou_name, action)
  2368             self.Controler.ProjectRemovePouAction(pou_name, action)
  2397             tagname = self.Controler.ComputePouActionName(pou_name, action)
  2369             tagname = self.Controler.ComputePouActionName(pou_name, action)
  2398             idx = self.IsOpened(tagname)
  2370             idx = self.IsOpened(tagname)
  2399             if idx is not None:
  2371             if idx is not None:
  2400                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
       
  2401                 self.TabsOpened.DeletePage(idx)
  2372                 self.TabsOpened.DeletePage(idx)
  2402             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE)
  2373             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE)
  2403 
  2374 
  2404     def OnRemoveConfigurationMenu(self, event):
  2375     def OnRemoveConfigurationMenu(self, event):
  2405         selected = self.TypesTree.GetSelection()
  2376         selected = self.TypesTree.GetSelection()
  2407             name = self.TypesTree.GetItemText(selected)
  2378             name = self.TypesTree.GetItemText(selected)
  2408             self.Controler.ProjectRemoveConfiguration(name)
  2379             self.Controler.ProjectRemoveConfiguration(name)
  2409             tagname = self.Controler.ComputeConfigurationName(name)
  2380             tagname = self.Controler.ComputeConfigurationName(name)
  2410             idx = self.IsOpened(tagname)
  2381             idx = self.IsOpened(tagname)
  2411             if idx is not None:
  2382             if idx is not None:
  2412                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
       
  2413                 self.TabsOpened.DeletePage(idx)
  2383                 self.TabsOpened.DeletePage(idx)
  2414             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE)
  2384             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE)
  2415 
  2385 
  2416     def OnRemoveResourceMenu(self, event):
  2386     def OnRemoveResourceMenu(self, event):
  2417         selected = self.TypesTree.GetSelection()
  2387         selected = self.TypesTree.GetSelection()
  2425             config_name = self.TypesTree.GetItemText(item)
  2395             config_name = self.TypesTree.GetItemText(item)
  2426             self.Controler.ProjectRemoveConfigurationResource(config_name, resource)
  2396             self.Controler.ProjectRemoveConfigurationResource(config_name, resource)
  2427             tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
  2397             tagname = self.Controler.ComputeConfigurationResourceName(config_name, selected)
  2428             idx = self.IsOpened(tagname)
  2398             idx = self.IsOpened(tagname)
  2429             if idx is not None:
  2399             if idx is not None:
  2430                 self.VariablePanelIndexer.RemoveVariablePanel(tagname)
       
  2431                 self.TabsOpened.DeletePage(idx)
  2400                 self.TabsOpened.DeletePage(idx)
  2432             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE)
  2401             self._Refresh(TITLE, FILEMENU, EDITMENU, TYPESTREE, INSTANCESTREE)
  2433     
  2402     
  2434     def OnPLCOpenEditorMenu(self, event):
  2403     def OnPLCOpenEditorMenu(self, event):
  2435         wx.MessageBox(_("No documentation available.\nComing soon."))
  2404         wx.MessageBox(_("No documentation available.\nComing soon."))
  2451             self.Highlights[infos[0]] = highlight_type
  2420             self.Highlights[infos[0]] = highlight_type
  2452             self.RefreshTypesTree()
  2421             self.RefreshTypesTree()
  2453             self.TypesTree.Unselect()
  2422             self.TypesTree.Unselect()
  2454         else:
  2423         else:
  2455             self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0])
  2424             self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0])
  2456             if infos[1] in plcopen.searchResultVarTypes.values() + ["var_local"]:
  2425             selected = self.TabsOpened.GetSelection()
  2457                 self.VariablePanelIndexer.AddVariableHighlight(infos, highlight_type)
  2426             if selected != -1:
  2458             else:
  2427                 viewer = self.TabsOpened.GetPage(selected)
  2459                 selected = self.TabsOpened.GetSelection()
  2428                 viewer.AddHighlight(infos[1:], start, end, highlight_type)
  2460                 if selected != -1:
       
  2461                     viewer = self.TabsOpened.GetPage(selected)
       
  2462                     viewer.AddHighlight(infos[1:], start, end, highlight_type)
       
  2463 
  2429 
  2464     def ShowError(self, infos, start, end):
  2430     def ShowError(self, infos, start, end):
  2465         self.ShowHighlight(infos, start, end, ERROR_HIGHLIGHT)
  2431         self.ShowHighlight(infos, start, end, ERROR_HIGHLIGHT)
  2466 
  2432 
  2467     def ShowSearchResult(self, infos, start, end):
  2433     def ShowSearchResult(self, infos, start, end):
  2471         if highlight_type is None:
  2437         if highlight_type is None:
  2472             self.Highlights = {}
  2438             self.Highlights = {}
  2473         else:
  2439         else:
  2474             self.Highlights = dict([(name, highlight) for name, highlight in self.Highlights.iteritems() if highlight != highlight_type])
  2440             self.Highlights = dict([(name, highlight) for name, highlight in self.Highlights.iteritems() if highlight != highlight_type])
  2475         self.RefreshTypesTree()
  2441         self.RefreshTypesTree()
  2476         self.VariablePanelIndexer.ClearHighlights(highlight_type)
       
  2477         for i in xrange(self.TabsOpened.GetPageCount()):
  2442         for i in xrange(self.TabsOpened.GetPageCount()):
  2478             viewer = self.TabsOpened.GetPage(i)
  2443             viewer = self.TabsOpened.GetPage(i)
  2479             viewer.ClearHighlights(highlight_type)
  2444             viewer.ClearHighlights(highlight_type)
  2480 
  2445 
  2481     def ClearErrors(self):
  2446     def ClearErrors(self):
  2719     def SaveProject(self):
  2684     def SaveProject(self):
  2720         result = self.Controler.SaveXMLFile()
  2685         result = self.Controler.SaveXMLFile()
  2721         if not result:
  2686         if not result:
  2722             self.SaveProjectAs()
  2687             self.SaveProjectAs()
  2723         else:
  2688         else:
  2724             self.RefreshTitle()
  2689             self._Refresh(TITLE, FILEMENU, PAGETITLES)
  2725             self.RefreshFileMenu()
  2690         
  2726     
       
  2727     def SaveProjectAs(self):
  2691     def SaveProjectAs(self):
  2728         filepath = self.Controler.GetFilePath()
  2692         filepath = self.Controler.GetFilePath()
  2729         if filepath != "":
  2693         if filepath != "":
  2730             directory, filename = os.path.split(filepath)
  2694             directory, filename = os.path.split(filepath)
  2731         else:
  2695         else:
  2737                 result = self.Controler.SaveXMLFile(filepath)
  2701                 result = self.Controler.SaveXMLFile(filepath)
  2738                 if not result:
  2702                 if not result:
  2739                     self.ShowErrorMessage(_("Can't save project to file %s!")%filepath)
  2703                     self.ShowErrorMessage(_("Can't save project to file %s!")%filepath)
  2740             else:
  2704             else:
  2741                 self.ShowErrorMessage(_("\"%s\" is not a valid folder!")%os.path.dirname(filepath))
  2705                 self.ShowErrorMessage(_("\"%s\" is not a valid folder!")%os.path.dirname(filepath))
  2742             self.RefreshTitle()
  2706             self._Refresh(TITLE, FILEMENU, PAGETITLES)
  2743             self.RefreshFileMenu()
       
  2744         dialog.Destroy()
  2707         dialog.Destroy()
  2745 
  2708 
  2746 #-------------------------------------------------------------------------------
  2709 #-------------------------------------------------------------------------------
  2747 #                            Create Project Dialog
  2710 #                            Create Project Dialog
  2748 #-------------------------------------------------------------------------------
  2711 #-------------------------------------------------------------------------------
  3844     
  3807     
  3845     def GetValue(self):
  3808     def GetValue(self):
  3846         return self.GetSizer().GetItem(1).GetWindow().GetValue()
  3809         return self.GetSizer().GetItem(1).GetWindow().GetValue()
  3847 
  3810 
  3848 #-------------------------------------------------------------------------------
  3811 #-------------------------------------------------------------------------------
  3849 #                            Variables Editor Panel
       
  3850 #-------------------------------------------------------------------------------
       
  3851 
       
  3852 def PouTagname(tagname):
       
  3853     words = tagname.split("::")
       
  3854     if words[0] in ["T", "A"]:
       
  3855         return "P::%s" % words[1]
       
  3856     return tagname
       
  3857 
       
  3858 class VariablePanelIndexer(wx.Panel):
       
  3859     
       
  3860     def _init_sizers(self):
       
  3861         self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
       
  3862         
       
  3863         self.SetSizer(self.MainSizer)
       
  3864     
       
  3865     def _init_ctrls(self, prnt):
       
  3866         wx.Panel.__init__(self, id=wx.NewId(),
       
  3867               name='VariablePanelIndexer', parent=prnt, pos=wx.Point(0, 0),
       
  3868               size=wx.Size(0, 300), style=wx.TAB_TRAVERSAL)
       
  3869         
       
  3870         self._init_sizers()
       
  3871     
       
  3872     def __init__(self, parent, window):
       
  3873         self._init_ctrls(parent)
       
  3874         
       
  3875         self.ParentWindow = window
       
  3876         
       
  3877         self.VariablePanelList = {}
       
  3878         self.CurrentPanel = None
       
  3879         
       
  3880     def AddVariablePanel(self, tagname, element_type):
       
  3881         tagname = PouTagname(tagname)
       
  3882         panel, users = self.VariablePanelList.get(tagname, (None, 0))
       
  3883         if panel is None:
       
  3884             panel = VariablePanel(self, self.ParentWindow, self.ParentWindow.Controler, element_type)
       
  3885             panel.SetTagName(tagname)
       
  3886             panel.Hide()
       
  3887             panel.RefreshView()
       
  3888             self.MainSizer.AddWindow(panel, 1, border=0, flag=wx.GROW)
       
  3889         self.VariablePanelList[tagname] = (panel, users + 1)
       
  3890         
       
  3891     def RemoveVariablePanel(self, tagname):
       
  3892         tagname = PouTagname(tagname)
       
  3893         panel, users = self.VariablePanelList.pop(tagname, (None, 0))
       
  3894         if panel is not None:
       
  3895             if users > 1:
       
  3896                 self.VariablePanelList[tagname] = (panel, users - 1)
       
  3897             else:
       
  3898                 self.MainSizer.Remove(panel)
       
  3899                 panel.Destroy()
       
  3900             if self.CurrentPanel == tagname:
       
  3901                 self.CurrentPanel = None
       
  3902     
       
  3903     def RemoveAllPanels(self):
       
  3904         for panel, users in self.VariablePanelList.itervalues():
       
  3905             self.MainSizer.Remove(panel)
       
  3906             panel.Destroy()
       
  3907         self.VariablePanelList = {}
       
  3908         self.CurrentPanel = None
       
  3909     
       
  3910     def UpdateVariablePanelTagName(self, old_tagname, new_tagname):
       
  3911         old_tagname = PouTagname(old_tagname)
       
  3912         new_tagname = PouTagname(new_tagname)
       
  3913         if old_tagname in self.VariablePanelList and old_tagname != new_tagname:
       
  3914             self.VariablePanelList[new_tagname] = self.VariablePanelList.pop(old_tagname)
       
  3915             if self.CurrentPanel == old_tagname:
       
  3916                 self.CurrentPanel = new_tagname
       
  3917                 
       
  3918     def ChangeVariablePanel(self, tagname):
       
  3919         tagname = PouTagname(tagname)
       
  3920         panel, users = self.VariablePanelList.get(tagname, (None, 0))
       
  3921         if panel is None:
       
  3922             if self.CurrentPanel is not None:
       
  3923                 self.VariablePanelList[self.CurrentPanel][0].Hide()
       
  3924             self.CurrentPanel = None
       
  3925             self.MainSizer.Layout()
       
  3926         elif tagname != self.CurrentPanel:
       
  3927             if self.CurrentPanel is not None:
       
  3928                 self.VariablePanelList[self.CurrentPanel][0].Hide()
       
  3929             self.CurrentPanel = tagname
       
  3930             panel.RefreshView()
       
  3931             panel.Show()
       
  3932             self.MainSizer.Layout()
       
  3933 
       
  3934     def RefreshVariablePanel(self, tagname):
       
  3935         panel, users = self.VariablePanelList.get(PouTagname(tagname), (None, 0)) 
       
  3936         if panel is not None:
       
  3937             panel.RefreshView()
       
  3938 
       
  3939     def AddVariableHighlight(self, infos, highlight_type):
       
  3940         self.ChangeVariablePanel(infos[0])
       
  3941         if self.CurrentPanel is not None:
       
  3942             self.VariablePanelList[self.CurrentPanel][0].AddVariableHighlight(infos[2:], highlight_type)
       
  3943 
       
  3944     def ClearHighlights(self, highlight_type=None):
       
  3945         for panel, users in self.VariablePanelList.values():
       
  3946             panel.ClearHighlights(highlight_type)
       
  3947 
       
  3948 #-------------------------------------------------------------------------------
       
  3949 #                            Debug Variables Panel
  3812 #                            Debug Variables Panel
  3950 #-------------------------------------------------------------------------------
  3813 #-------------------------------------------------------------------------------
  3951 
  3814 
  3952 def GetDebugVariablesTableColnames():
  3815 def GetDebugVariablesTableColnames():
  3953     _ = lambda x : x
  3816     _ = lambda x : x