diff -r d51af006fa6b -r 64d8f52bc8c8 controls/SearchResultPanel.py --- a/controls/SearchResultPanel.py Fri Aug 11 15:18:19 2017 +0300 +++ b/controls/SearchResultPanel.py Mon Aug 14 19:13:01 2017 +0300 @@ -45,7 +45,7 @@ #------------------------------------------------------------------------------- [ID_SEARCHRESULTPANEL, ID_SEARCHRESULTPANELHEADERLABEL, - ID_SEARCHRESULTPANELSEARCHRESULTSTREE, ID_SEARCHRESULTPANELRESETBUTTON, + ID_SEARCHRESULTPANELSEARCHRESULTSTREE, ID_SEARCHRESULTPANELRESETBUTTON, ] = [wx.NewId() for _init_ctrls in range(4)] class SearchResultPanel(wx.Panel): @@ -60,7 +60,7 @@ def _init_coll_MainSizer_Items(self, parent): parent.AddSizer(self.HeaderSizer, 0, border=0, flag=wx.GROW) parent.AddWindow(self.SearchResultsTree, 1, border=0, flag=wx.GROW) - + def _init_coll_MainSizer_Growables(self, parent): parent.AddGrowableCol(0) parent.AddGrowableRow(1) @@ -68,18 +68,18 @@ def _init_coll_HeaderSizer_Items(self, parent): parent.AddWindow(self.HeaderLabel, 1, border=5, flag=wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL) parent.AddWindow(self.ResetButton, 0, border=0, flag=0) - + def _init_coll_HeaderSizer_Growables(self, parent): parent.AddGrowableCol(0) - + def _init_sizers(self): self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0) self.HeaderSizer = wx.BoxSizer(wx.HORIZONTAL) - + self._init_coll_MainSizer_Items(self.MainSizer) self._init_coll_MainSizer_Growables(self.MainSizer) self._init_coll_HeaderSizer_Items(self.HeaderSizer) - + self.SetSizer(self.MainSizer) def _init_ctrls(self, prnt): @@ -90,7 +90,7 @@ self.HeaderLabel = wx.StaticText(id=ID_SEARCHRESULTPANELHEADERLABEL, name='HeaderLabel', parent=self, pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0) - + search_results_tree_style = CT.TR_HAS_BUTTONS|CT.TR_NO_LINES|CT.TR_HAS_VARIABLE_ROW_HEIGHT self.SearchResultsTree = CT.CustomTreeCtrl(id=ID_SEARCHRESULTPANELSEARCHRESULTSTREE, name="SearchResultsTree", parent=self, @@ -99,23 +99,23 @@ self.SearchResultsTree.SetAGWWindowStyleFlag(search_results_tree_style) self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnSearchResultsTreeItemActivated, id=ID_SEARCHRESULTPANELSEARCHRESULTSTREE) - + self.ResetButton = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap("reset"), size=wx.Size(28, 28), style=wx.NO_BORDER) self.ResetButton.SetToolTipString(_("Reset search result")) self.Bind(wx.EVT_BUTTON, self.OnResetButton, self.ResetButton) - + self._init_sizers() def __init__(self, parent, window): self.ParentWindow = window - + self._init_ctrls(parent) - + # Define Tree item icon list self.TreeImageList = wx.ImageList(16, 16) self.TreeImageDict = {} - + # Icons for other items for imgname, itemtype in [ #editables @@ -129,40 +129,40 @@ ("IL", "IL"), ("ST", "ST")]: self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(imgname)) - + for itemtype in ["function", "functionBlock", "program", "comment", "block", "io_variable", "connector", "contact", "coil", - "step", "transition", "jump", - "var_local", "var_input", + "step", "transition", "jump", + "var_local", "var_input", "var_inout", "var_output"]: self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(itemtype.upper())) - + # Assign icon list to TreeCtrl self.SearchResultsTree.SetImageList(self.TreeImageList) - + self.ResetSearchResults() def SetSearchResults(self, criteria, search_results): self.Criteria = criteria self.SearchResults = {} self.ElementsOrder = [] - + for infos, start, end, text in search_results: if infos[0] not in self.ElementsOrder: self.ElementsOrder.append(infos[0]) - + results = self.SearchResults.setdefault(infos[0], []) results.append((infos, start, end, text)) - + self.RefreshView() - + def ResetSearchResults(self): self.Criteria = None self.ElementsOrder = [] self.SearchResults = {} self.RefreshView() - + def RefreshView(self): self.SearchResultsTree.DeleteAllItems() if self.Criteria is None: @@ -180,19 +180,19 @@ for tagname in self.ElementsOrder: results = self.SearchResults.get(tagname, []) matches_number += len(results) - + words = tagname.split("::") - + element_type = self.ParentWindow.Controler.GetElementType(tagname) if element_type == ITEM_POU: element_type = self.ParentWindow.Controler.GetPouType(words[1]) - + element_infos = {"name": words[-1], "type": element_type, "data": tagname, "text": None, "matches": len(results)} - + children = element_infos.setdefault("children", []) for infos, start, end, text in results: if infos[1] == "name" or element_type == ITEM_DATATYPE: @@ -223,7 +223,7 @@ "children": [], } children.append(child_infos) - + if len(words) > 2: for _element_infos in search_results_tree_children: if _element_infos["name"] == words[1]: @@ -234,41 +234,41 @@ search_results_tree_children.append(element_infos) else: search_results_tree_children.append(element_infos) - + if matches_number < 2: header_format = _("'{a1}' - {a2} match in project") else: header_format = _("'{a1}' - {a2} matches in project") - + self.HeaderLabel.SetLabel(header_format.format(a1 = self.Criteria["find_pattern"], a2 = matches_number)) self.ResetButton.Enable(True) - + if matches_number > 0: root = self.SearchResultsTree.GetRootItem() if root is None: root = self.SearchResultsTree.AddRoot(search_results_tree_infos["name"]) self.GenerateSearchResultsTreeBranch(root, search_results_tree_infos) self.SearchResultsTree.Expand(root) - + def GetTextCtrlClickFunction(self, item): def OnTextCtrlClick(event): self.SearchResultsTree.SelectItem(item) event.Skip() return OnTextCtrlClick - + def GetTextCtrlDClickFunction(self, item): def OnTextCtrlDClick(event): self.ShowSearchResults(item) event.Skip() return OnTextCtrlDClick - + def GenerateSearchResultsTreeBranch(self, root, infos): to_delete = [] if infos["name"] == "body": item_name = "%d:" % infos["data"][1][0] else: item_name = infos["name"] - + self.SearchResultsTree.SetItemText(root, item_name) self.SearchResultsTree.SetPyData(root, infos["data"]) self.SearchResultsTree.SetItemBackgroundColour(root, wx.WHITE) @@ -278,7 +278,7 @@ self.SearchResultsTree.SetItemImage(root, self.TreeImageDict[self.ParentWindow.Controler.GetPouType(infos["name"])]) else: self.SearchResultsTree.SetItemImage(root, self.TreeImageDict[infos["type"]]) - + text = None if infos["text"] is not None: text = infos["text"] @@ -291,12 +291,12 @@ text = _("(%d matches)") % infos["matches"] start_idx, end_idx = 0, len(text) style = wx.TextAttr(wx.Colour(0, 127, 174)) - + if text is not None: text_ctrl_style = wx.BORDER_NONE|wx.TE_READONLY|wx.TE_RICH2 if wx.Platform != '__WXMSW__' or len(text.splitlines()) > 1: text_ctrl_style |= wx.TE_MULTILINE - text_ctrl = wx.TextCtrl(id=-1, parent=self.SearchResultsTree, pos=wx.Point(0, 0), + text_ctrl = wx.TextCtrl(id=-1, parent=self.SearchResultsTree, pos=wx.Point(0, 0), value=text, style=text_ctrl_style) width, height = text_ctrl.GetTextExtent(text) text_ctrl.SetClientSize(wx.Size(width + 1, height)) @@ -306,7 +306,7 @@ text_ctrl.SetInsertionPoint(0) text_ctrl.SetStyle(start_idx, end_idx, style) self.SearchResultsTree.SetItemWindow(root, text_ctrl) - + if wx.VERSION >= (2, 6, 0): item, root_cookie = self.SearchResultsTree.GetFirstChild(root) else: @@ -317,7 +317,7 @@ item, root_cookie = self.SearchResultsTree.GetNextChild(root, root_cookie) self.GenerateSearchResultsTreeBranch(item, child) item, root_cookie = self.SearchResultsTree.GetNextChild(root, root_cookie) - + def ShowSearchResults(self, item): data = self.SearchResultsTree.GetPyData(item) if isinstance(data, TupleType): @@ -327,11 +327,11 @@ self.ParentWindow.ClearHighlights(SEARCH_RESULT_HIGHLIGHT) for infos, start, end, text in search_results: self.ParentWindow.ShowSearchResult(infos, start, end) - + def OnSearchResultsTreeItemActivated(self, event): self.ShowSearchResults(event.GetItem()) event.Skip() - + def OnResetButton(self, event): self.ResetSearchResults() self.ParentWindow.ClearSearchResults()