diff -r 4ce166451816 -r 37ba389e5c01 PLCOpenEditor.py --- 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