controls/SearchResultPanel.py
changeset 1730 64d8f52bc8c8
parent 1622 a0c7a6cb1690
child 1733 dea107dce0c4
equal deleted inserted replaced
1726:d51af006fa6b 1730:64d8f52bc8c8
    43 #-------------------------------------------------------------------------------
    43 #-------------------------------------------------------------------------------
    44 #                            Search Result Panel
    44 #                            Search Result Panel
    45 #-------------------------------------------------------------------------------
    45 #-------------------------------------------------------------------------------
    46 
    46 
    47 [ID_SEARCHRESULTPANEL, ID_SEARCHRESULTPANELHEADERLABEL,
    47 [ID_SEARCHRESULTPANEL, ID_SEARCHRESULTPANELHEADERLABEL,
    48  ID_SEARCHRESULTPANELSEARCHRESULTSTREE, ID_SEARCHRESULTPANELRESETBUTTON, 
    48  ID_SEARCHRESULTPANELSEARCHRESULTSTREE, ID_SEARCHRESULTPANELRESETBUTTON,
    49 ] = [wx.NewId() for _init_ctrls in range(4)]
    49 ] = [wx.NewId() for _init_ctrls in range(4)]
    50 
    50 
    51 class SearchResultPanel(wx.Panel):
    51 class SearchResultPanel(wx.Panel):
    52 
    52 
    53     if wx.VERSION < (2, 6, 0):
    53     if wx.VERSION < (2, 6, 0):
    58                 event(self, function)
    58                 event(self, function)
    59 
    59 
    60     def _init_coll_MainSizer_Items(self, parent):
    60     def _init_coll_MainSizer_Items(self, parent):
    61         parent.AddSizer(self.HeaderSizer, 0, border=0, flag=wx.GROW)
    61         parent.AddSizer(self.HeaderSizer, 0, border=0, flag=wx.GROW)
    62         parent.AddWindow(self.SearchResultsTree, 1, border=0, flag=wx.GROW)
    62         parent.AddWindow(self.SearchResultsTree, 1, border=0, flag=wx.GROW)
    63     
    63 
    64     def _init_coll_MainSizer_Growables(self, parent):
    64     def _init_coll_MainSizer_Growables(self, parent):
    65         parent.AddGrowableCol(0)
    65         parent.AddGrowableCol(0)
    66         parent.AddGrowableRow(1)
    66         parent.AddGrowableRow(1)
    67 
    67 
    68     def _init_coll_HeaderSizer_Items(self, parent):
    68     def _init_coll_HeaderSizer_Items(self, parent):
    69         parent.AddWindow(self.HeaderLabel, 1, border=5, flag=wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
    69         parent.AddWindow(self.HeaderLabel, 1, border=5, flag=wx.LEFT|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
    70         parent.AddWindow(self.ResetButton, 0, border=0, flag=0)
    70         parent.AddWindow(self.ResetButton, 0, border=0, flag=0)
    71     
    71 
    72     def _init_coll_HeaderSizer_Growables(self, parent):
    72     def _init_coll_HeaderSizer_Growables(self, parent):
    73         parent.AddGrowableCol(0)
    73         parent.AddGrowableCol(0)
    74     
    74 
    75     def _init_sizers(self):
    75     def _init_sizers(self):
    76         self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
    76         self.MainSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=0)
    77         self.HeaderSizer = wx.BoxSizer(wx.HORIZONTAL)
    77         self.HeaderSizer = wx.BoxSizer(wx.HORIZONTAL)
    78         
    78 
    79         self._init_coll_MainSizer_Items(self.MainSizer)
    79         self._init_coll_MainSizer_Items(self.MainSizer)
    80         self._init_coll_MainSizer_Growables(self.MainSizer)
    80         self._init_coll_MainSizer_Growables(self.MainSizer)
    81         self._init_coll_HeaderSizer_Items(self.HeaderSizer)
    81         self._init_coll_HeaderSizer_Items(self.HeaderSizer)
    82         
    82 
    83         self.SetSizer(self.MainSizer)
    83         self.SetSizer(self.MainSizer)
    84 
    84 
    85     def _init_ctrls(self, prnt):
    85     def _init_ctrls(self, prnt):
    86         wx.Panel.__init__(self, id=ID_SEARCHRESULTPANEL,
    86         wx.Panel.__init__(self, id=ID_SEARCHRESULTPANEL,
    87               name='SearchResultPanel', parent=prnt, pos=wx.Point(0, 0),
    87               name='SearchResultPanel', parent=prnt, pos=wx.Point(0, 0),
    88               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
    88               size=wx.Size(0, 0), style=wx.TAB_TRAVERSAL)
    89 
    89 
    90         self.HeaderLabel = wx.StaticText(id=ID_SEARCHRESULTPANELHEADERLABEL,
    90         self.HeaderLabel = wx.StaticText(id=ID_SEARCHRESULTPANELHEADERLABEL,
    91               name='HeaderLabel', parent=self,
    91               name='HeaderLabel', parent=self,
    92               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
    92               pos=wx.Point(0, 0), size=wx.Size(0, 17), style=0)
    93         
    93 
    94         search_results_tree_style = CT.TR_HAS_BUTTONS|CT.TR_NO_LINES|CT.TR_HAS_VARIABLE_ROW_HEIGHT
    94         search_results_tree_style = CT.TR_HAS_BUTTONS|CT.TR_NO_LINES|CT.TR_HAS_VARIABLE_ROW_HEIGHT
    95         self.SearchResultsTree = CT.CustomTreeCtrl(id=ID_SEARCHRESULTPANELSEARCHRESULTSTREE,
    95         self.SearchResultsTree = CT.CustomTreeCtrl(id=ID_SEARCHRESULTPANELSEARCHRESULTSTREE,
    96               name="SearchResultsTree", parent=self,
    96               name="SearchResultsTree", parent=self,
    97               pos=wx.Point(0, 0), style=search_results_tree_style)
    97               pos=wx.Point(0, 0), style=search_results_tree_style)
    98         if wx.VERSION >= (2, 8, 11):
    98         if wx.VERSION >= (2, 8, 11):
    99             self.SearchResultsTree.SetAGWWindowStyleFlag(search_results_tree_style)
    99             self.SearchResultsTree.SetAGWWindowStyleFlag(search_results_tree_style)
   100         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnSearchResultsTreeItemActivated,
   100         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnSearchResultsTreeItemActivated,
   101               id=ID_SEARCHRESULTPANELSEARCHRESULTSTREE)
   101               id=ID_SEARCHRESULTPANELSEARCHRESULTSTREE)
   102         
   102 
   103         self.ResetButton = wx.lib.buttons.GenBitmapButton(self,
   103         self.ResetButton = wx.lib.buttons.GenBitmapButton(self,
   104               bitmap=GetBitmap("reset"), size=wx.Size(28, 28), style=wx.NO_BORDER)
   104               bitmap=GetBitmap("reset"), size=wx.Size(28, 28), style=wx.NO_BORDER)
   105         self.ResetButton.SetToolTipString(_("Reset search result"))
   105         self.ResetButton.SetToolTipString(_("Reset search result"))
   106         self.Bind(wx.EVT_BUTTON, self.OnResetButton, self.ResetButton)
   106         self.Bind(wx.EVT_BUTTON, self.OnResetButton, self.ResetButton)
   107         
   107 
   108         self._init_sizers()
   108         self._init_sizers()
   109 
   109 
   110     def __init__(self, parent, window):
   110     def __init__(self, parent, window):
   111         self.ParentWindow = window
   111         self.ParentWindow = window
   112         
   112 
   113         self._init_ctrls(parent)
   113         self._init_ctrls(parent)
   114         
   114 
   115         # Define Tree item icon list
   115         # Define Tree item icon list
   116         self.TreeImageList = wx.ImageList(16, 16)
   116         self.TreeImageList = wx.ImageList(16, 16)
   117         self.TreeImageDict = {}
   117         self.TreeImageDict = {}
   118         
   118 
   119         # Icons for other items
   119         # Icons for other items
   120         for imgname, itemtype in [
   120         for imgname, itemtype in [
   121             #editables
   121             #editables
   122             ("PROJECT",        ITEM_PROJECT),
   122             ("PROJECT",        ITEM_PROJECT),
   123             ("TRANSITION",     ITEM_TRANSITION),
   123             ("TRANSITION",     ITEM_TRANSITION),
   127             ("DATATYPE",       ITEM_DATATYPE),
   127             ("DATATYPE",       ITEM_DATATYPE),
   128             ("ACTION",         "action_block"),
   128             ("ACTION",         "action_block"),
   129             ("IL",             "IL"),
   129             ("IL",             "IL"),
   130             ("ST",             "ST")]:
   130             ("ST",             "ST")]:
   131             self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(imgname))
   131             self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(imgname))
   132         
   132 
   133         for itemtype in ["function", "functionBlock", "program",
   133         for itemtype in ["function", "functionBlock", "program",
   134                          "comment", "block", "io_variable",
   134                          "comment", "block", "io_variable",
   135                          "connector", "contact", "coil",
   135                          "connector", "contact", "coil",
   136                          "step", "transition", "jump", 
   136                          "step", "transition", "jump",
   137                          "var_local", "var_input", 
   137                          "var_local", "var_input",
   138                          "var_inout", "var_output"]:
   138                          "var_inout", "var_output"]:
   139             self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(itemtype.upper()))
   139             self.TreeImageDict[itemtype] = self.TreeImageList.Add(GetBitmap(itemtype.upper()))
   140         
   140 
   141         # Assign icon list to TreeCtrl
   141         # Assign icon list to TreeCtrl
   142         self.SearchResultsTree.SetImageList(self.TreeImageList)
   142         self.SearchResultsTree.SetImageList(self.TreeImageList)
   143         
   143 
   144         self.ResetSearchResults()
   144         self.ResetSearchResults()
   145 
   145 
   146     def SetSearchResults(self, criteria, search_results):
   146     def SetSearchResults(self, criteria, search_results):
   147         self.Criteria = criteria
   147         self.Criteria = criteria
   148         self.SearchResults = {}
   148         self.SearchResults = {}
   149         self.ElementsOrder = []
   149         self.ElementsOrder = []
   150         
   150 
   151         for infos, start, end, text in search_results:
   151         for infos, start, end, text in search_results:
   152             if infos[0] not in self.ElementsOrder:
   152             if infos[0] not in self.ElementsOrder:
   153                 self.ElementsOrder.append(infos[0])
   153                 self.ElementsOrder.append(infos[0])
   154             
   154 
   155             results = self.SearchResults.setdefault(infos[0], [])
   155             results = self.SearchResults.setdefault(infos[0], [])
   156             results.append((infos, start, end, text))
   156             results.append((infos, start, end, text))
   157         
   157 
   158         self.RefreshView()
   158         self.RefreshView()
   159     
   159 
   160     def ResetSearchResults(self):
   160     def ResetSearchResults(self):
   161         self.Criteria = None
   161         self.Criteria = None
   162         self.ElementsOrder = []
   162         self.ElementsOrder = []
   163         self.SearchResults = {}
   163         self.SearchResults = {}
   164         self.RefreshView()
   164         self.RefreshView()
   165     
   165 
   166     def RefreshView(self):
   166     def RefreshView(self):
   167         self.SearchResultsTree.DeleteAllItems()
   167         self.SearchResultsTree.DeleteAllItems()
   168         if self.Criteria is None:
   168         if self.Criteria is None:
   169             self.HeaderLabel.SetLabel(_("No search results available."))
   169             self.HeaderLabel.SetLabel(_("No search results available."))
   170             self.ResetButton.Enable(False)
   170             self.ResetButton.Enable(False)
   178                                         }
   178                                         }
   179             search_results_tree_children = search_results_tree_infos.setdefault("children", [])
   179             search_results_tree_children = search_results_tree_infos.setdefault("children", [])
   180             for tagname in self.ElementsOrder:
   180             for tagname in self.ElementsOrder:
   181                 results = self.SearchResults.get(tagname, [])
   181                 results = self.SearchResults.get(tagname, [])
   182                 matches_number += len(results)
   182                 matches_number += len(results)
   183                 
   183 
   184                 words = tagname.split("::")
   184                 words = tagname.split("::")
   185                 
   185 
   186                 element_type = self.ParentWindow.Controler.GetElementType(tagname)
   186                 element_type = self.ParentWindow.Controler.GetElementType(tagname)
   187                 if element_type == ITEM_POU:
   187                 if element_type == ITEM_POU:
   188                     element_type = self.ParentWindow.Controler.GetPouType(words[1])
   188                     element_type = self.ParentWindow.Controler.GetPouType(words[1])
   189                 
   189 
   190                 element_infos = {"name": words[-1],
   190                 element_infos = {"name": words[-1],
   191                                  "type": element_type,
   191                                  "type": element_type,
   192                                  "data": tagname,
   192                                  "data": tagname,
   193                                  "text": None,
   193                                  "text": None,
   194                                  "matches": len(results)}
   194                                  "matches": len(results)}
   195                 
   195 
   196                 children = element_infos.setdefault("children", [])
   196                 children = element_infos.setdefault("children", [])
   197                 for infos, start, end, text in results:
   197                 for infos, start, end, text in results:
   198                     if infos[1] == "name" or element_type == ITEM_DATATYPE:
   198                     if infos[1] == "name" or element_type == ITEM_DATATYPE:
   199                         child_name = GenerateName(infos[1:])
   199                         child_name = GenerateName(infos[1:])
   200                         child_type = element_type
   200                         child_type = element_type
   221                                    "text": text,
   221                                    "text": text,
   222                                    "matches": 1,
   222                                    "matches": 1,
   223                                    "children": [],
   223                                    "children": [],
   224                                   }
   224                                   }
   225                     children.append(child_infos)
   225                     children.append(child_infos)
   226                 
   226 
   227                 if len(words) > 2:
   227                 if len(words) > 2:
   228                     for _element_infos in search_results_tree_children:
   228                     for _element_infos in search_results_tree_children:
   229                         if _element_infos["name"] == words[1]:
   229                         if _element_infos["name"] == words[1]:
   230                             _element_infos["matches"] += len(children)
   230                             _element_infos["matches"] += len(children)
   231                             _element_infos["children"].append(element_infos)
   231                             _element_infos["children"].append(element_infos)
   232                             break
   232                             break
   233                     if element_type == ITEM_RESOURCE:
   233                     if element_type == ITEM_RESOURCE:
   234                         search_results_tree_children.append(element_infos)
   234                         search_results_tree_children.append(element_infos)
   235                 else:
   235                 else:
   236                     search_results_tree_children.append(element_infos)
   236                     search_results_tree_children.append(element_infos)
   237             
   237 
   238             if matches_number < 2:
   238             if matches_number < 2:
   239                 header_format = _("'{a1}' - {a2} match in project")
   239                 header_format = _("'{a1}' - {a2} match in project")
   240             else:
   240             else:
   241                 header_format = _("'{a1}' - {a2} matches in project")
   241                 header_format = _("'{a1}' - {a2} matches in project")
   242             
   242 
   243             self.HeaderLabel.SetLabel(header_format.format(a1 = self.Criteria["find_pattern"], a2 = matches_number))
   243             self.HeaderLabel.SetLabel(header_format.format(a1 = self.Criteria["find_pattern"], a2 = matches_number))
   244             self.ResetButton.Enable(True)
   244             self.ResetButton.Enable(True)
   245             
   245 
   246             if matches_number > 0:
   246             if matches_number > 0:
   247                 root = self.SearchResultsTree.GetRootItem()
   247                 root = self.SearchResultsTree.GetRootItem()
   248                 if root is None:
   248                 if root is None:
   249                     root = self.SearchResultsTree.AddRoot(search_results_tree_infos["name"])
   249                     root = self.SearchResultsTree.AddRoot(search_results_tree_infos["name"])
   250                 self.GenerateSearchResultsTreeBranch(root, search_results_tree_infos)
   250                 self.GenerateSearchResultsTreeBranch(root, search_results_tree_infos)
   251                 self.SearchResultsTree.Expand(root)
   251                 self.SearchResultsTree.Expand(root)
   252     
   252 
   253     def GetTextCtrlClickFunction(self, item):
   253     def GetTextCtrlClickFunction(self, item):
   254         def OnTextCtrlClick(event):
   254         def OnTextCtrlClick(event):
   255             self.SearchResultsTree.SelectItem(item)
   255             self.SearchResultsTree.SelectItem(item)
   256             event.Skip()
   256             event.Skip()
   257         return OnTextCtrlClick
   257         return OnTextCtrlClick
   258     
   258 
   259     def GetTextCtrlDClickFunction(self, item):
   259     def GetTextCtrlDClickFunction(self, item):
   260         def OnTextCtrlDClick(event):
   260         def OnTextCtrlDClick(event):
   261             self.ShowSearchResults(item)
   261             self.ShowSearchResults(item)
   262             event.Skip()
   262             event.Skip()
   263         return OnTextCtrlDClick
   263         return OnTextCtrlDClick
   264     
   264 
   265     def GenerateSearchResultsTreeBranch(self, root, infos):
   265     def GenerateSearchResultsTreeBranch(self, root, infos):
   266         to_delete = []
   266         to_delete = []
   267         if infos["name"] == "body":
   267         if infos["name"] == "body":
   268             item_name = "%d:" % infos["data"][1][0]
   268             item_name = "%d:" % infos["data"][1][0]
   269         else:
   269         else:
   270             item_name = infos["name"]
   270             item_name = infos["name"]
   271         
   271 
   272         self.SearchResultsTree.SetItemText(root, item_name)
   272         self.SearchResultsTree.SetItemText(root, item_name)
   273         self.SearchResultsTree.SetPyData(root, infos["data"])
   273         self.SearchResultsTree.SetPyData(root, infos["data"])
   274         self.SearchResultsTree.SetItemBackgroundColour(root, wx.WHITE)
   274         self.SearchResultsTree.SetItemBackgroundColour(root, wx.WHITE)
   275         self.SearchResultsTree.SetItemTextColour(root, wx.BLACK)
   275         self.SearchResultsTree.SetItemTextColour(root, wx.BLACK)
   276         if infos["type"] is not None:
   276         if infos["type"] is not None:
   277             if infos["type"] == ITEM_POU:
   277             if infos["type"] == ITEM_POU:
   278                 self.SearchResultsTree.SetItemImage(root, self.TreeImageDict[self.ParentWindow.Controler.GetPouType(infos["name"])])
   278                 self.SearchResultsTree.SetItemImage(root, self.TreeImageDict[self.ParentWindow.Controler.GetPouType(infos["name"])])
   279             else:
   279             else:
   280                 self.SearchResultsTree.SetItemImage(root, self.TreeImageDict[infos["type"]])
   280                 self.SearchResultsTree.SetItemImage(root, self.TreeImageDict[infos["type"]])
   281         
   281 
   282         text = None
   282         text = None
   283         if infos["text"] is not None:
   283         if infos["text"] is not None:
   284             text = infos["text"]
   284             text = infos["text"]
   285             start, end = infos["data"][1:3]
   285             start, end = infos["data"][1:3]
   286             text_lines = infos["text"].splitlines()
   286             text_lines = infos["text"].splitlines()
   289             style = wx.TextAttr(wx.BLACK, wx.Colour(206, 204, 247))
   289             style = wx.TextAttr(wx.BLACK, wx.Colour(206, 204, 247))
   290         elif infos["type"] is not None and infos["matches"] > 1:
   290         elif infos["type"] is not None and infos["matches"] > 1:
   291             text = _("(%d matches)") % infos["matches"]
   291             text = _("(%d matches)") % infos["matches"]
   292             start_idx, end_idx = 0, len(text)
   292             start_idx, end_idx = 0, len(text)
   293             style = wx.TextAttr(wx.Colour(0, 127, 174))
   293             style = wx.TextAttr(wx.Colour(0, 127, 174))
   294         
   294 
   295         if text is not None:
   295         if text is not None:
   296             text_ctrl_style = wx.BORDER_NONE|wx.TE_READONLY|wx.TE_RICH2
   296             text_ctrl_style = wx.BORDER_NONE|wx.TE_READONLY|wx.TE_RICH2
   297             if wx.Platform != '__WXMSW__' or len(text.splitlines()) > 1:
   297             if wx.Platform != '__WXMSW__' or len(text.splitlines()) > 1:
   298                 text_ctrl_style |= wx.TE_MULTILINE
   298                 text_ctrl_style |= wx.TE_MULTILINE
   299             text_ctrl = wx.TextCtrl(id=-1, parent=self.SearchResultsTree, pos=wx.Point(0, 0), 
   299             text_ctrl = wx.TextCtrl(id=-1, parent=self.SearchResultsTree, pos=wx.Point(0, 0),
   300                     value=text, style=text_ctrl_style)
   300                     value=text, style=text_ctrl_style)
   301             width, height = text_ctrl.GetTextExtent(text)
   301             width, height = text_ctrl.GetTextExtent(text)
   302             text_ctrl.SetClientSize(wx.Size(width + 1, height))
   302             text_ctrl.SetClientSize(wx.Size(width + 1, height))
   303             text_ctrl.SetBackgroundColour(self.SearchResultsTree.GetBackgroundColour())
   303             text_ctrl.SetBackgroundColour(self.SearchResultsTree.GetBackgroundColour())
   304             text_ctrl.Bind(wx.EVT_LEFT_DOWN, self.GetTextCtrlClickFunction(root))
   304             text_ctrl.Bind(wx.EVT_LEFT_DOWN, self.GetTextCtrlClickFunction(root))
   305             text_ctrl.Bind(wx.EVT_LEFT_DCLICK, self.GetTextCtrlDClickFunction(root))
   305             text_ctrl.Bind(wx.EVT_LEFT_DCLICK, self.GetTextCtrlDClickFunction(root))
   306             text_ctrl.SetInsertionPoint(0)
   306             text_ctrl.SetInsertionPoint(0)
   307             text_ctrl.SetStyle(start_idx, end_idx, style)
   307             text_ctrl.SetStyle(start_idx, end_idx, style)
   308             self.SearchResultsTree.SetItemWindow(root, text_ctrl)
   308             self.SearchResultsTree.SetItemWindow(root, text_ctrl)
   309             
   309 
   310         if wx.VERSION >= (2, 6, 0):
   310         if wx.VERSION >= (2, 6, 0):
   311             item, root_cookie = self.SearchResultsTree.GetFirstChild(root)
   311             item, root_cookie = self.SearchResultsTree.GetFirstChild(root)
   312         else:
   312         else:
   313             item, root_cookie = self.SearchResultsTree.GetFirstChild(root, 0)
   313             item, root_cookie = self.SearchResultsTree.GetFirstChild(root, 0)
   314         for child in infos["children"]:
   314         for child in infos["children"]:
   315             if item is None:
   315             if item is None:
   316                 item = self.SearchResultsTree.AppendItem(root, "")
   316                 item = self.SearchResultsTree.AppendItem(root, "")
   317                 item, root_cookie = self.SearchResultsTree.GetNextChild(root, root_cookie)
   317                 item, root_cookie = self.SearchResultsTree.GetNextChild(root, root_cookie)
   318             self.GenerateSearchResultsTreeBranch(item, child)
   318             self.GenerateSearchResultsTreeBranch(item, child)
   319             item, root_cookie = self.SearchResultsTree.GetNextChild(root, root_cookie)
   319             item, root_cookie = self.SearchResultsTree.GetNextChild(root, root_cookie)
   320     
   320 
   321     def ShowSearchResults(self, item):
   321     def ShowSearchResults(self, item):
   322         data = self.SearchResultsTree.GetPyData(item)
   322         data = self.SearchResultsTree.GetPyData(item)
   323         if isinstance(data, TupleType):
   323         if isinstance(data, TupleType):
   324             search_results = [data]
   324             search_results = [data]
   325         else:
   325         else:
   326             search_results = self.SearchResults.get(data, [])
   326             search_results = self.SearchResults.get(data, [])
   327         self.ParentWindow.ClearHighlights(SEARCH_RESULT_HIGHLIGHT)
   327         self.ParentWindow.ClearHighlights(SEARCH_RESULT_HIGHLIGHT)
   328         for infos, start, end, text in search_results:
   328         for infos, start, end, text in search_results:
   329             self.ParentWindow.ShowSearchResult(infos, start, end)
   329             self.ParentWindow.ShowSearchResult(infos, start, end)
   330     
   330 
   331     def OnSearchResultsTreeItemActivated(self, event):
   331     def OnSearchResultsTreeItemActivated(self, event):
   332         self.ShowSearchResults(event.GetItem())
   332         self.ShowSearchResults(event.GetItem())
   333         event.Skip()
   333         event.Skip()
   334     
   334 
   335     def OnResetButton(self, event):
   335     def OnResetButton(self, event):
   336         self.ResetSearchResults()
   336         self.ResetSearchResults()
   337         self.ParentWindow.ClearSearchResults()
   337         self.ParentWindow.ClearSearchResults()
   338         event.Skip()
   338         event.Skip()