PLCOpenEditor.py
changeset 566 6014ef82a98a
parent 563 3f92a5e18804
child 568 31976c61c701
equal deleted inserted replaced
565:94c11207aa6f 566:6014ef82a98a
   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 VariablePanel import VariablePanel
       
   117 from SearchResultPanel import SearchResultPanel
   117 
   118 
   118 # Define PLCOpenEditor controls id
   119 # Define PLCOpenEditor controls id
   119 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, 
   120 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, 
   120  ID_PLCOPENEDITORBOTTOMNOTEBOOK, ID_PLCOPENEDITORRIGHTNOTEBOOK, 
   121  ID_PLCOPENEDITORBOTTOMNOTEBOOK, ID_PLCOPENEDITORRIGHTNOTEBOOK, 
   121  ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, 
   122  ID_PLCOPENEDITORTYPESTREE, ID_PLCOPENEDITORINSTANCESTREE, 
   133 ] = [wx.NewId() for _init_coll_FileMenu_Items in range(1)]
   134 ] = [wx.NewId() for _init_coll_FileMenu_Items in range(1)]
   134 
   135 
   135 # Define PLCOpenEditor EditMenu extra items id
   136 # Define PLCOpenEditor EditMenu extra items id
   136 [ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, ID_PLCOPENEDITOREDITMENUADDDATATYPE, 
   137 [ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, ID_PLCOPENEDITOREDITMENUADDDATATYPE, 
   137  ID_PLCOPENEDITOREDITMENUADDFUNCTION, ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK, 
   138  ID_PLCOPENEDITOREDITMENUADDFUNCTION, ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK, 
   138  ID_PLCOPENEDITOREDITMENUADDPROGRAM, ID_PLCOPENEDITOREDITMENUADDCONFIGURATION, 
   139  ID_PLCOPENEDITOREDITMENUADDPROGRAM, ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
   139 ] = [wx.NewId() for _init_coll_EditMenu_Items in range(6)]
   140  ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, 
       
   141 ] = [wx.NewId() for _init_coll_EditMenu_Items in range(7)]
   140 
   142 
   141 
   143 
   142 #-------------------------------------------------------------------------------
   144 #-------------------------------------------------------------------------------
   143 #                            ToolBars definitions
   145 #                            ToolBars definitions
   144 #-------------------------------------------------------------------------------
   146 #-------------------------------------------------------------------------------
   328         AppendMenu(parent, help='', id=wx.ID_COPY,
   330         AppendMenu(parent, help='', id=wx.ID_COPY,
   329               kind=wx.ITEM_NORMAL, text=_(u'Copy\tCTRL+C'))
   331               kind=wx.ITEM_NORMAL, text=_(u'Copy\tCTRL+C'))
   330         AppendMenu(parent, help='', id=wx.ID_PASTE,
   332         AppendMenu(parent, help='', id=wx.ID_PASTE,
   331               kind=wx.ITEM_NORMAL, text=_(u'Paste\tCTRL+V'))
   333               kind=wx.ITEM_NORMAL, text=_(u'Paste\tCTRL+V'))
   332         parent.AppendSeparator()
   334         parent.AppendSeparator()
       
   335         AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT,
       
   336               kind=wx.ITEM_NORMAL, text=_(u'Search in Project'))
       
   337         parent.AppendSeparator()
   333         addmenu = wx.Menu(title='')
   338         addmenu = wx.Menu(title='')
   334         parent.AppendMenu(wx.ID_ADD, _("Add Element"), addmenu)
   339         parent.AppendMenu(wx.ID_ADD, _("Add Element"), addmenu)
   335         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
   340         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
   336               kind=wx.ITEM_NORMAL, text=_(u'Data Type'))
   341               kind=wx.ITEM_NORMAL, text=_(u'Data Type'))
   337         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION,
   342         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDFUNCTION,
   350         self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO)
   355         self.Bind(wx.EVT_MENU, self.OnRedoMenu, id=wx.ID_REDO)
   351         #self.Bind(wx.EVT_MENU, self.OnEnableUndoRedoMenu, id=ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO)
   356         #self.Bind(wx.EVT_MENU, self.OnEnableUndoRedoMenu, id=ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO)
   352         self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT)
   357         self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT)
   353         self.Bind(wx.EVT_MENU, self.OnCopyMenu, id=wx.ID_COPY)
   358         self.Bind(wx.EVT_MENU, self.OnCopyMenu, id=wx.ID_COPY)
   354         self.Bind(wx.EVT_MENU, self.OnPasteMenu, id=wx.ID_PASTE)
   359         self.Bind(wx.EVT_MENU, self.OnPasteMenu, id=wx.ID_PASTE)
       
   360         self.Bind(wx.EVT_MENU, self.OnSearchInProjectMenu, 
       
   361               id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT)
   355         self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu,
   362         self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu,
   356               id=ID_PLCOPENEDITOREDITMENUADDDATATYPE)
   363               id=ID_PLCOPENEDITOREDITMENUADDDATATYPE)
   357         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("function"),
   364         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("function"),
   358               id=ID_PLCOPENEDITOREDITMENUADDFUNCTION)
   365               id=ID_PLCOPENEDITOREDITMENUADDFUNCTION)
   359         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("functionBlock"),
   366         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("functionBlock"),
   592                   id=ID_PLCOPENEDITORTOOLBARSELECTION)
   599                   id=ID_PLCOPENEDITORTOOLBARSELECTION)
   593         
   600         
   594         self.VariablePanelIndexer = VariablePanelIndexer(self.BottomNoteBook, self)
   601         self.VariablePanelIndexer = VariablePanelIndexer(self.BottomNoteBook, self)
   595         self.BottomNoteBook.AddPage(self.VariablePanelIndexer, _("Variables"))
   602         self.BottomNoteBook.AddPage(self.VariablePanelIndexer, _("Variables"))
   596 
   603 
       
   604         self.SearchResultPanel = SearchResultPanel(self.BottomNoteBook, self)
       
   605         self.BottomNoteBook.AddPage(self.SearchResultPanel, _("Search"))
       
   606 
   597         self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
   607         self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
   598               name='LibraryPanel', parent=self.RightNoteBook, pos=wx.Point(0,
   608               name='LibraryPanel', parent=self.RightNoteBook, pos=wx.Point(0,
   599               0), size=wx.Size(0, 0), style=0)
   609               0), size=wx.Size(0, 0), style=0)
   600         self.RightNoteBook.AddPage(self.LibraryPanel, _("Library"))
   610         self.RightNoteBook.AddPage(self.LibraryPanel, _("Library"))
   601         
   611         
   611               id=ID_PLCOPENEDITORLIBRARYTREE)
   621               id=ID_PLCOPENEDITORLIBRARYTREE)
   612         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnLibraryTreeBeginDrag,
   622         self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.OnLibraryTreeBeginDrag,
   613               id=ID_PLCOPENEDITORLIBRARYTREE)
   623               id=ID_PLCOPENEDITORLIBRARYTREE)
   614         
   624         
   615         self.LibraryComment = wx.TextCtrl(id=ID_PLCOPENEDITORLIBRARYCOMMENT,
   625         self.LibraryComment = wx.TextCtrl(id=ID_PLCOPENEDITORLIBRARYCOMMENT,
   616                   name='LibraryComment', parent=self.LibraryPanel, 
   626               name='LibraryComment', parent=self.LibraryPanel, 
   617                   pos=wx.Point(0, 0), size=wx.Size(0, 160), 
   627               pos=wx.Point(0, 0), size=wx.Size(0, 160), 
   618                   style=wx.TE_READONLY|wx.TE_MULTILINE)
   628               style=wx.TE_READONLY|wx.TE_MULTILINE)
   619         
   629         
   620         self._init_sizers()
   630         self._init_sizers()
   621         
   631         
   622         if self.EnableDebug:
   632         if self.EnableDebug:
   623             self.DebugVariablePanel = DebugVariablePanel(self.RightNoteBook, self.Controler)
   633             self.DebugVariablePanel = DebugVariablePanel(self.RightNoteBook, self.Controler)
   681         self.InstancesTree.SetImageList(self.TreeImageList)
   691         self.InstancesTree.SetImageList(self.TreeImageList)
   682         
   692         
   683         self.CurrentToolBar = []
   693         self.CurrentToolBar = []
   684         self.CurrentLanguage = ""
   694         self.CurrentLanguage = ""
   685         self.SelectedItem = None
   695         self.SelectedItem = None
   686         self.Errors = []
   696         self.Highlights = {}
   687         self.DrawingMode = FREEDRAWING_MODE
   697         self.DrawingMode = FREEDRAWING_MODE
   688         #self.DrawingMode = DRIVENDRAWING_MODE
   698         #self.DrawingMode = DRIVENDRAWING_MODE
   689         if USE_AUI:
   699         if USE_AUI:
   690             self.AuiTabCtrl = []
   700             self.AuiTabCtrl = []
   691         
   701         
   990             self.EditMenu.Enable(wx.ID_UNDO, undo)
  1000             self.EditMenu.Enable(wx.ID_UNDO, undo)
   991             self.EditMenu.Enable(wx.ID_REDO, redo)
  1001             self.EditMenu.Enable(wx.ID_REDO, redo)
   992             #self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, True)
  1002             #self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, True)
   993             #self.EditMenu.Check(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, 
  1003             #self.EditMenu.Check(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, 
   994             #                self.Controler.IsProjectBufferEnabled())
  1004             #                self.Controler.IsProjectBufferEnabled())
       
  1005             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, True)
   995             self.EditMenu.Enable(wx.ID_ADD, True)
  1006             self.EditMenu.Enable(wx.ID_ADD, True)
   996             self.EditMenu.Enable(wx.ID_DELETE, True)
  1007             self.EditMenu.Enable(wx.ID_DELETE, True)
   997             if self.TabsOpened.GetPageCount() > 0:
  1008             if self.TabsOpened.GetPageCount() > 0:
   998                 self.EditMenu.Enable(wx.ID_CUT, True)
  1009                 self.EditMenu.Enable(wx.ID_CUT, True)
   999                 self.EditMenu.Enable(wx.ID_COPY, True)
  1010                 self.EditMenu.Enable(wx.ID_COPY, True)
  1013             #self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, False)
  1024             #self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, False)
  1014             self.EditMenu.Enable(wx.ID_CUT, False)
  1025             self.EditMenu.Enable(wx.ID_CUT, False)
  1015             self.EditMenu.Enable(wx.ID_COPY, False)
  1026             self.EditMenu.Enable(wx.ID_COPY, False)
  1016             self.EditMenu.Enable(wx.ID_PASTE, False)
  1027             self.EditMenu.Enable(wx.ID_PASTE, False)
  1017             self.EditMenu.Enable(wx.ID_SELECTALL, False)
  1028             self.EditMenu.Enable(wx.ID_SELECTALL, False)
       
  1029             self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, False)
  1018             self.EditMenu.Enable(wx.ID_ADD, False)
  1030             self.EditMenu.Enable(wx.ID_ADD, False)
  1019             self.EditMenu.Enable(wx.ID_DELETE, False)
  1031             self.EditMenu.Enable(wx.ID_DELETE, False)
  1020     
  1032     
  1021     def CloseTabsWithoutModel(self):
  1033     def CloseTabsWithoutModel(self):
  1022         idxs = range(self.TabsOpened.GetPageCount())
  1034         idxs = range(self.TabsOpened.GetPageCount())
  1084         elif isinstance(window, (Viewer, TextViewer)):
  1096         elif isinstance(window, (Viewer, TextViewer)):
  1085             event = wx.KeyEvent(wx.EVT_CHAR._getEvtType())
  1097             event = wx.KeyEvent(wx.EVT_CHAR._getEvtType())
  1086             event.m_keyCode = wx.WXK_DELETE
  1098             event.m_keyCode = wx.WXK_DELETE
  1087             window.ProcessEvent(event)
  1099             window.ProcessEvent(event)
  1088 
  1100 
  1089 
  1101     def OnSearchInProjectMenu(self, event):
       
  1102         dialog = SearchInProjectDialog(self)
       
  1103         if dialog.ShowModal() == wx.ID_OK:
       
  1104             criteria = dialog.GetCriteria()
       
  1105             result = self.Controler.SearchInProject(criteria)
       
  1106             self.ClearSearchResults()
       
  1107             self.SearchResultPanel.SetSearchResults(criteria, result)
       
  1108             self.BottomNoteBook.SetSelection(self.BottomNoteBook.GetPageIndex(self.SearchResultPanel))
       
  1109             
  1090 #-------------------------------------------------------------------------------
  1110 #-------------------------------------------------------------------------------
  1091 #                             Display Menu Functions
  1111 #                             Display Menu Functions
  1092 #-------------------------------------------------------------------------------
  1112 #-------------------------------------------------------------------------------
  1093 
  1113 
  1094     def RefreshDisplayMenu(self):
  1114     def RefreshDisplayMenu(self):
  1271         item_name = infos["name"]
  1291         item_name = infos["name"]
  1272         if infos["type"] in ITEMS_UNEDITABLE:
  1292         if infos["type"] in ITEMS_UNEDITABLE:
  1273             item_name = _(item_name)
  1293             item_name = _(item_name)
  1274         self.TypesTree.SetItemText(root, item_name)
  1294         self.TypesTree.SetItemText(root, item_name)
  1275         self.TypesTree.SetPyData(root, infos["type"])
  1295         self.TypesTree.SetPyData(root, infos["type"])
  1276         if infos.get("tagname", None) in self.Errors:
  1296         highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK))
  1277             self.TypesTree.SetItemBackgroundColour(root, wx.Colour(255, 255, 0))
  1297         self.TypesTree.SetItemBackgroundColour(root, highlight_colours[0])
  1278             self.TypesTree.SetItemTextColour(root, wx.RED)
  1298         self.TypesTree.SetItemTextColour(root, highlight_colours[1])
  1279         else:
       
  1280             self.TypesTree.SetItemBackgroundColour(root, wx.WHITE)
       
  1281             self.TypesTree.SetItemTextColour(root, wx.BLACK)
       
  1282         if infos["type"] == ITEM_POU:
  1299         if infos["type"] == ITEM_POU:
  1283             self.TypesTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1300             self.TypesTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
  1284         else:
  1301         else:
  1285             self.TypesTree.SetItemImage(root, self.TreeImageDict[infos["type"]])      
  1302             self.TypesTree.SetItemImage(root, self.TreeImageDict[infos["type"]])      
  1286             
  1303             
  2420     def OnAboutMenu(self, event):
  2437     def OnAboutMenu(self, event):
  2421         OpenHtmlFrame(self,_("About PLCOpenEditor"), os.path.join(CWD, "doc","about.html"), wx.Size(350, 350))
  2438         OpenHtmlFrame(self,_("About PLCOpenEditor"), os.path.join(CWD, "doc","about.html"), wx.Size(350, 350))
  2422 
  2439 
  2423 
  2440 
  2424 #-------------------------------------------------------------------------------
  2441 #-------------------------------------------------------------------------------
  2425 #                        Errors showing functions
  2442 #                        Highlights showing functions
  2426 #-------------------------------------------------------------------------------
  2443 #-------------------------------------------------------------------------------
  2427 
  2444 
  2428     def ShowError(self, infos, start, end):
  2445     def ShowHighlight(self, infos, start, end, highlight_type):
  2429         self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0])
  2446         print infos, start, end, highlight_type
  2430         self.SelectTypesTreeItem(infos[0])
  2447         self.SelectTypesTreeItem(infos[0])
  2431         if infos[1] == "name":
  2448         if infos[1] == "name":
  2432             self.Errors.append(infos[0])
  2449             self.Highlights[infos[0]] = highlight_type
  2433             self.RefreshTypesTree()
  2450             self.RefreshTypesTree()
  2434             self.TypesTree.Unselect()
  2451             self.TypesTree.Unselect()
  2435         elif infos[1] == "variable":
       
  2436             self.VariablePanelIndexer.AddVariableError(infos)
       
  2437         else:
  2452         else:
  2438             selected = self.TabsOpened.GetSelection()
  2453             self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0])
  2439             if selected != -1:
  2454             if infos[1] in plcopen.searchResultVarTypes.values() + ["var_local"]:
  2440                 viewer = self.TabsOpened.GetPage(selected)
  2455                 self.VariablePanelIndexer.AddVariableHighlight(infos, highlight_type)
  2441                 viewer.AddShownError(infos[1:], start, end)
  2456             else:
  2442                 viewer.RefreshView()
  2457                 selected = self.TabsOpened.GetSelection()
  2443     
  2458                 if selected != -1:
  2444     def ClearErrors(self):
  2459                     viewer = self.TabsOpened.GetPage(selected)
  2445         self.Errors = []
  2460                     viewer.AddHighlight(infos[1:], start, end, highlight_type)
       
  2461 
       
  2462     def ShowError(self, infos, start, end):
       
  2463         self.ShowHighlight(infos, start, end, ERROR_HIGHLIGHT)
       
  2464 
       
  2465     def ShowSearchResult(self, infos, start, end):
       
  2466         self.ShowHighlight(infos, start, end, SEARCH_RESULT_HIGHLIGHT)
       
  2467 
       
  2468     def ClearHighlights(self, highlight_type=None):
       
  2469         if highlight_type is None:
       
  2470             self.Highlights = {}
       
  2471         else:
       
  2472             self.Highlights = dict([(name, highlight) for name, highlight in self.Highlights.iteritems() if highlight != highlight_type])
  2446         self.RefreshTypesTree()
  2473         self.RefreshTypesTree()
  2447         self.VariablePanelIndexer.ClearErrors()
  2474         self.VariablePanelIndexer.ClearHighlights(highlight_type)
  2448         for i in xrange(self.TabsOpened.GetPageCount()):
  2475         for i in xrange(self.TabsOpened.GetPageCount()):
  2449             viewer = self.TabsOpened.GetPage(i)
  2476             viewer = self.TabsOpened.GetPage(i)
  2450             viewer.ClearErrors()
  2477             viewer.ClearHighlights(highlight_type)
       
  2478 
       
  2479     def ClearErrors(self):
       
  2480         self.ClearHighlights(ERROR_HIGHLIGHT)
       
  2481 
       
  2482     def ClearSearchResults(self):
       
  2483         self.ClearHighlights(SEARCH_RESULT_HIGHLIGHT)
  2451 
  2484 
  2452 #-------------------------------------------------------------------------------
  2485 #-------------------------------------------------------------------------------
  2453 #                            PLCOpenEditor Main Class
  2486 #                            PLCOpenEditor Main Class
  2454 #-------------------------------------------------------------------------------
  2487 #-------------------------------------------------------------------------------
  2455 
  2488 
  3812 
  3845 
  3813 #-------------------------------------------------------------------------------
  3846 #-------------------------------------------------------------------------------
  3814 #                            Variables Editor Panel
  3847 #                            Variables Editor Panel
  3815 #-------------------------------------------------------------------------------
  3848 #-------------------------------------------------------------------------------
  3816 
  3849 
       
  3850 def PouTagname(tagname):
       
  3851     words = tagname.split("::")
       
  3852     if words[0] in ["T", "A"]:
       
  3853         return "P::%s" % words[1]
       
  3854     return tagname
       
  3855 
  3817 class VariablePanelIndexer(wx.Panel):
  3856 class VariablePanelIndexer(wx.Panel):
  3818     
  3857     
  3819     def _init_sizers(self):
  3858     def _init_sizers(self):
  3820         self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
  3859         self.MainSizer = wx.BoxSizer(wx.HORIZONTAL)
  3821         
  3860         
  3835         
  3874         
  3836         self.VariablePanelList = {}
  3875         self.VariablePanelList = {}
  3837         self.CurrentPanel = None
  3876         self.CurrentPanel = None
  3838         
  3877         
  3839     def AddVariablePanel(self, tagname, element_type):
  3878     def AddVariablePanel(self, tagname, element_type):
  3840         new_panel = VariablePanel(self, self.ParentWindow, self.ParentWindow.Controler, element_type)
  3879         tagname = PouTagname(tagname)
  3841         new_panel.SetTagName(tagname)
  3880         panel, users = self.VariablePanelList.get(tagname, (None, 0))
  3842         new_panel.Hide()
  3881         if panel is None:
  3843         new_panel.RefreshView()
  3882             panel = VariablePanel(self, self.ParentWindow, self.ParentWindow.Controler, element_type)
  3844         self.MainSizer.AddWindow(new_panel, 1, border=0, flag=wx.GROW)
  3883             panel.SetTagName(tagname)
  3845         self.VariablePanelList[tagname] = new_panel
  3884             panel.Hide()
       
  3885             panel.RefreshView()
       
  3886             self.MainSizer.AddWindow(panel, 1, border=0, flag=wx.GROW)
       
  3887         self.VariablePanelList[tagname] = (panel, users + 1)
  3846         
  3888         
  3847     def RemoveVariablePanel(self, tagname):
  3889     def RemoveVariablePanel(self, tagname):
  3848         if tagname in self.VariablePanelList:
  3890         tagname = PouTagname(tagname)
  3849             panel = self.VariablePanelList.pop(tagname)
  3891         panel, users = self.VariablePanelList.pop(tagname, (None, 0))
       
  3892         if panel is not None:
       
  3893             if users > 1:
       
  3894                 self.VariablePanelList[tagname] = (panel, users - 1)
       
  3895             else:
       
  3896                 self.MainSizer.Remove(panel)
       
  3897                 panel.Destroy()
       
  3898             if self.CurrentPanel == tagname:
       
  3899                 self.CurrentPanel = None
       
  3900     
       
  3901     def RemoveAllPanels(self):
       
  3902         for panel, users in self.VariablePanelList.itervalues():
  3850             self.MainSizer.Remove(panel)
  3903             self.MainSizer.Remove(panel)
  3851             panel.Destroy()
  3904             panel.Destroy()
  3852             if self.CurrentPanel == tagname:
  3905         self.VariablePanelList = {}
  3853                 self.CurrentPanel = None
  3906         self.CurrentPanel = None
  3854     
       
  3855     def RemoveAllPanels(self):
       
  3856         for tagname in self.VariablePanelList.keys():
       
  3857             self.RemoveVariablePanel(tagname)
       
  3858     
  3907     
  3859     def UpdateVariablePanelTagName(self, old_tagname, new_tagname):
  3908     def UpdateVariablePanelTagName(self, old_tagname, new_tagname):
  3860         if old_tagname in self.VariablePanelList:
  3909         old_tagname = PouTagname(old_tagname)
       
  3910         new_tagname = PouTagname(new_tagname)
       
  3911         if old_tagname in self.VariablePanelList and old_tagname != new_tagname:
  3861             self.VariablePanelList[new_tagname] = self.VariablePanelList.pop(old_tagname)
  3912             self.VariablePanelList[new_tagname] = self.VariablePanelList.pop(old_tagname)
  3862             if self.CurrentPanel == old_tagname:
  3913             if self.CurrentPanel == old_tagname:
  3863                 self.CurrentPanel = new_tagname
  3914                 self.CurrentPanel = new_tagname
  3864                 
  3915                 
  3865     def ChangeVariablePanel(self, tagname):
  3916     def ChangeVariablePanel(self, tagname):
  3866         if tagname in self.VariablePanelList:
  3917         tagname = PouTagname(tagname)
  3867             if tagname != self.CurrentPanel:
  3918         panel, users = self.VariablePanelList.get(tagname, (None, 0))
  3868                 if self.CurrentPanel is not None:
  3919         if panel is None:
  3869                     self.VariablePanelList[self.CurrentPanel].Hide()
       
  3870                 self.CurrentPanel = tagname
       
  3871                 self.VariablePanelList[self.CurrentPanel].RefreshView()
       
  3872                 self.VariablePanelList[self.CurrentPanel].Show()
       
  3873                 self.MainSizer.Layout()
       
  3874         else:
       
  3875             if self.CurrentPanel is not None:
  3920             if self.CurrentPanel is not None:
  3876                 self.VariablePanelList[self.CurrentPanel].Hide()
  3921                 self.VariablePanelList[self.CurrentPanel][0].Hide()
  3877             self.CurrentPanel = None
  3922             self.CurrentPanel = None
  3878             self.MainSizer.Layout()
  3923             self.MainSizer.Layout()
       
  3924         elif tagname != self.CurrentPanel:
       
  3925             if self.CurrentPanel is not None:
       
  3926                 self.VariablePanelList[self.CurrentPanel][0].Hide()
       
  3927             self.CurrentPanel = tagname
       
  3928             panel.RefreshView()
       
  3929             panel.Show()
       
  3930             self.MainSizer.Layout()
  3879 
  3931 
  3880     def RefreshVariablePanel(self, tagname):
  3932     def RefreshVariablePanel(self, tagname):
  3881         if tagname in self.VariablePanelList:
  3933         panel, users = self.VariablePanelList.get(PouTagname(tagname), (None, 0)) 
  3882             self.VariablePanelList[self.CurrentPanel].RefreshView()
  3934         if panel is not None:
  3883 
  3935             panel.RefreshView()
  3884     def AddVariableError(self, infos):
  3936 
       
  3937     def AddVariableHighlight(self, infos, highlight_type):
  3885         self.ChangeVariablePanel(infos[0])
  3938         self.ChangeVariablePanel(infos[0])
  3886         if self.CurrentPanel is not None:
  3939         if self.CurrentPanel is not None:
  3887             self.VariablePanelList[self.CurrentPanel].AddVariableError(infos[2:])
  3940             self.VariablePanelList[self.CurrentPanel][0].AddVariableHighlight(infos[2:], highlight_type)
  3888 
  3941 
  3889     def ClearErrors(self):
  3942     def ClearHighlights(self, highlight_type=None):
  3890         for panel in self.VariablePanelList.values():
  3943         for panel, users in self.VariablePanelList.values():
  3891             panel.ClearErrors()
  3944             panel.ClearHighlights(highlight_type)
  3892 
  3945 
  3893 #-------------------------------------------------------------------------------
  3946 #-------------------------------------------------------------------------------
  3894 #                            Debug Variables Panel
  3947 #                            Debug Variables Panel
  3895 #-------------------------------------------------------------------------------
  3948 #-------------------------------------------------------------------------------
  3896 
  3949