PLCOpenEditor.py
changeset 570 37ba389e5c01
parent 569 4ce166451816
parent 568 31976c61c701
child 571 79af7b821233
--- a/PLCOpenEditor.py	Sun Oct 09 23:31:13 2011 +0200
+++ b/PLCOpenEditor.py	Sun Oct 09 23:31:50 2011 +0200
@@ -114,6 +114,7 @@
 from DataTypeEditor import *
 from PLCControler import *
 from VariablePanel import VariablePanel
+from SearchResultPanel import SearchResultPanel
 
 # Define PLCOpenEditor controls id
 [ID_PLCOPENEDITOR, ID_PLCOPENEDITORLEFTNOTEBOOK, 
@@ -135,8 +136,9 @@
 # Define PLCOpenEditor EditMenu extra items id
 [ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, ID_PLCOPENEDITOREDITMENUADDDATATYPE, 
  ID_PLCOPENEDITOREDITMENUADDFUNCTION, ID_PLCOPENEDITOREDITMENUADDFUNCTIONBLOCK, 
- ID_PLCOPENEDITOREDITMENUADDPROGRAM, ID_PLCOPENEDITOREDITMENUADDCONFIGURATION, 
-] = [wx.NewId() for _init_coll_EditMenu_Items in range(6)]
+ ID_PLCOPENEDITOREDITMENUADDPROGRAM, ID_PLCOPENEDITOREDITMENUADDCONFIGURATION,
+ ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, 
+] = [wx.NewId() for _init_coll_EditMenu_Items in range(7)]
 
 
 #-------------------------------------------------------------------------------
@@ -330,6 +332,9 @@
         AppendMenu(parent, help='', id=wx.ID_PASTE,
               kind=wx.ITEM_NORMAL, text=_(u'Paste\tCTRL+V'))
         parent.AppendSeparator()
+        AppendMenu(parent, help='', id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT,
+              kind=wx.ITEM_NORMAL, text=_(u'Search in Project'))
+        parent.AppendSeparator()
         addmenu = wx.Menu(title='')
         parent.AppendMenu(wx.ID_ADD, _("Add Element"), addmenu)
         AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDDATATYPE,
@@ -352,6 +357,8 @@
         self.Bind(wx.EVT_MENU, self.OnCutMenu, id=wx.ID_CUT)
         self.Bind(wx.EVT_MENU, self.OnCopyMenu, id=wx.ID_COPY)
         self.Bind(wx.EVT_MENU, self.OnPasteMenu, id=wx.ID_PASTE)
+        self.Bind(wx.EVT_MENU, self.OnSearchInProjectMenu, 
+              id=ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT)
         self.Bind(wx.EVT_MENU, self.OnAddDataTypeMenu,
               id=ID_PLCOPENEDITOREDITMENUADDDATATYPE)
         self.Bind(wx.EVT_MENU, self.GenerateAddPouFunction("function"),
@@ -594,6 +601,9 @@
         self.VariablePanelIndexer = VariablePanelIndexer(self.BottomNoteBook, self)
         self.BottomNoteBook.AddPage(self.VariablePanelIndexer, _("Variables"))
 
+        self.SearchResultPanel = SearchResultPanel(self.BottomNoteBook, self)
+        self.BottomNoteBook.AddPage(self.SearchResultPanel, _("Search"))
+
         self.LibraryPanel = wx.Panel(id=ID_PLCOPENEDITORLIBRARYPANEL,
               name='LibraryPanel', parent=self.RightNoteBook, pos=wx.Point(0,
               0), size=wx.Size(0, 0), style=0)
@@ -613,9 +623,9 @@
               id=ID_PLCOPENEDITORLIBRARYTREE)
         
         self.LibraryComment = wx.TextCtrl(id=ID_PLCOPENEDITORLIBRARYCOMMENT,
-                  name='LibraryComment', parent=self.LibraryPanel, 
-                  pos=wx.Point(0, 0), size=wx.Size(0, 160), 
-                  style=wx.TE_READONLY|wx.TE_MULTILINE)
+              name='LibraryComment', parent=self.LibraryPanel, 
+              pos=wx.Point(0, 0), size=wx.Size(0, 160), 
+              style=wx.TE_READONLY|wx.TE_MULTILINE)
         
         self._init_sizers()
         
@@ -683,7 +693,7 @@
         self.CurrentToolBar = []
         self.CurrentLanguage = ""
         self.SelectedItem = None
-        self.Errors = []
+        self.Highlights = {}
         self.DrawingMode = FREEDRAWING_MODE
         #self.DrawingMode = DRIVENDRAWING_MODE
         if USE_AUI:
@@ -992,6 +1002,7 @@
             #self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, True)
             #self.EditMenu.Check(ID_PLCOPENEDITOREDITMENUENABLEUNDOREDO, 
             #                self.Controler.IsProjectBufferEnabled())
+            self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, True)
             self.EditMenu.Enable(wx.ID_ADD, True)
             self.EditMenu.Enable(wx.ID_DELETE, True)
             if self.TabsOpened.GetPageCount() > 0:
@@ -1015,6 +1026,7 @@
             self.EditMenu.Enable(wx.ID_COPY, False)
             self.EditMenu.Enable(wx.ID_PASTE, False)
             self.EditMenu.Enable(wx.ID_SELECTALL, False)
+            self.EditMenu.Enable(ID_PLCOPENEDITOREDITMENUSEARCHINPROJECT, False)
             self.EditMenu.Enable(wx.ID_ADD, False)
             self.EditMenu.Enable(wx.ID_DELETE, False)
     
@@ -1086,7 +1098,15 @@
             event.m_keyCode = wx.WXK_DELETE
             window.ProcessEvent(event)
 
-
+    def OnSearchInProjectMenu(self, event):
+        dialog = SearchInProjectDialog(self)
+        if dialog.ShowModal() == wx.ID_OK:
+            criteria = dialog.GetCriteria()
+            result = self.Controler.SearchInProject(criteria)
+            self.ClearSearchResults()
+            self.SearchResultPanel.SetSearchResults(criteria, result)
+            self.BottomNoteBook.SetSelection(self.BottomNoteBook.GetPageIndex(self.SearchResultPanel))
+            
 #-------------------------------------------------------------------------------
 #                             Display Menu Functions
 #-------------------------------------------------------------------------------
@@ -1183,10 +1203,12 @@
         if USE_AUI:
             for child in self.TabsOpened.GetChildren():
                 if isinstance(child, wx.aui.AuiTabCtrl):
-                    window = child.GetWindowFromIdx(child.GetActivePage())
-                    window.RefreshView()
-                    if not window.IsDebugging() and self.TabsOpened.GetPageIndex(window) == selected and variablepanel:
-                        self.RefreshVariablePanel(window.GetTagName())
+                    active_page = child.GetActivePage()
+                    if active_page >= 0:
+                        window = child.GetWindowFromIdx(child.GetActivePage())
+                        window.RefreshView()
+                        if not window.IsDebugging() and self.TabsOpened.GetPageIndex(window) == selected and variablepanel:
+                            self.RefreshVariablePanel(window.GetTagName())
         elif selected >= 0:
             window = self.TabsOpened.GetPage(idx)
             window.RefreshView()
@@ -1273,12 +1295,9 @@
             item_name = _(item_name)
         self.TypesTree.SetItemText(root, item_name)
         self.TypesTree.SetPyData(root, infos["type"])
-        if infos.get("tagname", None) in self.Errors:
-            self.TypesTree.SetItemBackgroundColour(root, wx.Colour(255, 255, 0))
-            self.TypesTree.SetItemTextColour(root, wx.RED)
-        else:
-            self.TypesTree.SetItemBackgroundColour(root, wx.WHITE)
-            self.TypesTree.SetItemTextColour(root, wx.BLACK)
+        highlight_colours = self.Highlights.get(infos.get("tagname", None), (wx.WHITE, wx.BLACK))
+        self.TypesTree.SetItemBackgroundColour(root, highlight_colours[0])
+        self.TypesTree.SetItemTextColour(root, highlight_colours[1])
         if infos["type"] == ITEM_POU:
             self.TypesTree.SetItemImage(root, self.TreeImageDict[self.Controler.GetPouBodyType(infos["name"])])
         else:
@@ -2422,32 +2441,48 @@
 
 
 #-------------------------------------------------------------------------------
-#                        Errors showing functions
-#-------------------------------------------------------------------------------
-
-    def ShowError(self, infos, start, end):
-        self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0])
+#                        Highlights showing functions
+#-------------------------------------------------------------------------------
+
+    def ShowHighlight(self, infos, start, end, highlight_type):
+        print infos, start, end, highlight_type
         self.SelectTypesTreeItem(infos[0])
         if infos[1] == "name":
-            self.Errors.append(infos[0])
+            self.Highlights[infos[0]] = highlight_type
             self.RefreshTypesTree()
             self.TypesTree.Unselect()
-        elif infos[1] == "variable":
-            self.VariablePanelIndexer.AddVariableError(infos)
         else:
-            selected = self.TabsOpened.GetSelection()
-            if selected != -1:
-                viewer = self.TabsOpened.GetPage(selected)
-                viewer.AddShownError(infos[1:], start, end)
-                viewer.RefreshView()
-    
-    def ClearErrors(self):
-        self.Errors = []
+            self.EditProjectElement(self.Controler.GetElementType(infos[0]), infos[0])
+            if infos[1] in plcopen.searchResultVarTypes.values() + ["var_local"]:
+                self.VariablePanelIndexer.AddVariableHighlight(infos, highlight_type)
+            else:
+                selected = self.TabsOpened.GetSelection()
+                if selected != -1:
+                    viewer = self.TabsOpened.GetPage(selected)
+                    viewer.AddHighlight(infos[1:], start, end, highlight_type)
+
+    def ShowError(self, infos, start, end):
+        self.ShowHighlight(infos, start, end, ERROR_HIGHLIGHT)
+
+    def ShowSearchResult(self, infos, start, end):
+        self.ShowHighlight(infos, start, end, SEARCH_RESULT_HIGHLIGHT)
+
+    def ClearHighlights(self, highlight_type=None):
+        if highlight_type is None:
+            self.Highlights = {}
+        else:
+            self.Highlights = dict([(name, highlight) for name, highlight in self.Highlights.iteritems() if highlight != highlight_type])
         self.RefreshTypesTree()
-        self.VariablePanelIndexer.ClearErrors()
+        self.VariablePanelIndexer.ClearHighlights(highlight_type)
         for i in xrange(self.TabsOpened.GetPageCount()):
             viewer = self.TabsOpened.GetPage(i)
-            viewer.ClearErrors()
+            viewer.ClearHighlights(highlight_type)
+
+    def ClearErrors(self):
+        self.ClearHighlights(ERROR_HIGHLIGHT)
+
+    def ClearSearchResults(self):
+        self.ClearHighlights(SEARCH_RESULT_HIGHLIGHT)
 
 #-------------------------------------------------------------------------------
 #                            PLCOpenEditor Main Class
@@ -3814,6 +3849,12 @@
 #                            Variables Editor Panel
 #-------------------------------------------------------------------------------
 
+def PouTagname(tagname):
+    words = tagname.split("::")
+    if words[0] in ["T", "A"]:
+        return "P::%s" % words[1]
+    return tagname
+
 class VariablePanelIndexer(wx.Panel):
     
     def _init_sizers(self):
@@ -3837,58 +3878,72 @@
         self.CurrentPanel = None
         
     def AddVariablePanel(self, tagname, element_type):
-        new_panel = VariablePanel(self, self.ParentWindow, self.ParentWindow.Controler, element_type)
-        new_panel.SetTagName(tagname)
-        new_panel.Hide()
-        new_panel.RefreshView()
-        self.MainSizer.AddWindow(new_panel, 1, border=0, flag=wx.GROW)
-        self.VariablePanelList[tagname] = new_panel
+        tagname = PouTagname(tagname)
+        panel, users = self.VariablePanelList.get(tagname, (None, 0))
+        if panel is None:
+            panel = VariablePanel(self, self.ParentWindow, self.ParentWindow.Controler, element_type)
+            panel.SetTagName(tagname)
+            panel.Hide()
+            panel.RefreshView()
+            self.MainSizer.AddWindow(panel, 1, border=0, flag=wx.GROW)
+        self.VariablePanelList[tagname] = (panel, users + 1)
         
     def RemoveVariablePanel(self, tagname):
-        if tagname in self.VariablePanelList:
-            panel = self.VariablePanelList.pop(tagname)
+        tagname = PouTagname(tagname)
+        panel, users = self.VariablePanelList.pop(tagname, (None, 0))
+        if panel is not None:
+            if users > 1:
+                self.VariablePanelList[tagname] = (panel, users - 1)
+            else:
+                self.MainSizer.Remove(panel)
+                panel.Destroy()
+            if self.CurrentPanel == tagname:
+                self.CurrentPanel = None
+    
+    def RemoveAllPanels(self):
+        for panel, users in self.VariablePanelList.itervalues():
             self.MainSizer.Remove(panel)
             panel.Destroy()
-            if self.CurrentPanel == tagname:
-                self.CurrentPanel = None
-    
-    def RemoveAllPanels(self):
-        for tagname in self.VariablePanelList.keys():
-            self.RemoveVariablePanel(tagname)
+        self.VariablePanelList = {}
+        self.CurrentPanel = None
     
     def UpdateVariablePanelTagName(self, old_tagname, new_tagname):
-        if old_tagname in self.VariablePanelList:
+        old_tagname = PouTagname(old_tagname)
+        new_tagname = PouTagname(new_tagname)
+        if old_tagname in self.VariablePanelList and old_tagname != new_tagname:
             self.VariablePanelList[new_tagname] = self.VariablePanelList.pop(old_tagname)
             if self.CurrentPanel == old_tagname:
                 self.CurrentPanel = new_tagname
                 
     def ChangeVariablePanel(self, tagname):
-        if tagname in self.VariablePanelList:
-            if tagname != self.CurrentPanel:
-                if self.CurrentPanel is not None:
-                    self.VariablePanelList[self.CurrentPanel].Hide()
-                self.CurrentPanel = tagname
-                self.VariablePanelList[self.CurrentPanel].RefreshView()
-                self.VariablePanelList[self.CurrentPanel].Show()
-                self.MainSizer.Layout()
-        else:
+        tagname = PouTagname(tagname)
+        panel, users = self.VariablePanelList.get(tagname, (None, 0))
+        if panel is None:
             if self.CurrentPanel is not None:
-                self.VariablePanelList[self.CurrentPanel].Hide()
+                self.VariablePanelList[self.CurrentPanel][0].Hide()
             self.CurrentPanel = None
             self.MainSizer.Layout()
+        elif tagname != self.CurrentPanel:
+            if self.CurrentPanel is not None:
+                self.VariablePanelList[self.CurrentPanel][0].Hide()
+            self.CurrentPanel = tagname
+            panel.RefreshView()
+            panel.Show()
+            self.MainSizer.Layout()
 
     def RefreshVariablePanel(self, tagname):
-        if tagname in self.VariablePanelList:
-            self.VariablePanelList[self.CurrentPanel].RefreshView()
-
-    def AddVariableError(self, infos):
+        panel, users = self.VariablePanelList.get(PouTagname(tagname), (None, 0)) 
+        if panel is not None:
+            panel.RefreshView()
+
+    def AddVariableHighlight(self, infos, highlight_type):
         self.ChangeVariablePanel(infos[0])
         if self.CurrentPanel is not None:
-            self.VariablePanelList[self.CurrentPanel].AddVariableError(infos[2:])
-
-    def ClearErrors(self):
-        for panel in self.VariablePanelList.values():
-            panel.ClearErrors()
+            self.VariablePanelList[self.CurrentPanel][0].AddVariableHighlight(infos[2:], highlight_type)
+
+    def ClearHighlights(self, highlight_type=None):
+        for panel, users in self.VariablePanelList.values():
+            panel.ClearHighlights(highlight_type)
 
 #-------------------------------------------------------------------------------
 #                            Debug Variables Panel