diff -r 85a4bc7dc31e -r 1ccd08cfae0c TextViewer.py --- a/TextViewer.py Wed Aug 01 12:44:51 2012 +0200 +++ b/TextViewer.py Fri Aug 10 00:32:05 2012 +0200 @@ -197,6 +197,9 @@ self.TextSyntax = None self.CurrentAction = None self.Highlights = [] + self.SearchParams = None + self.SearchResults = None + self.CurrentFindHighlight = None self.InstancePath = instancepath self.ContextStack = [] self.CallStack = [] @@ -739,6 +742,43 @@ self.RefreshModel() self.RefreshBuffer() + def Find(self, direction, search_params): + if self.SearchParams != search_params: + self.ClearHighlights(SEARCH_RESULT_HIGHLIGHT) + + self.SearchParams = search_params + criteria = { + "raw_pattern": search_params["find_pattern"], + "pattern": re.compile(search_params["find_pattern"]), + "case_sensitive": search_params["case_sensitive"], + "regular_expression": search_params["regular_expression"], + "filter": "all"} + + self.SearchResults = [ + (infos[1:], start, end, SEARCH_RESULT_HIGHLIGHT) + for infos, start, end, text in + self.Controler.SearchInPou(self.TagName, criteria, self.Debug)] + + if len(self.SearchResults) > 0: + if self.CurrentFindHighlight is not None: + old_idx = self.SearchResults.index(self.CurrentFindHighlight) + if self.SearchParams["wrap"]: + idx = (old_idx + direction) % len(self.SearchResults) + else: + idx = max(0, min(old_idx + direction, len(self.SearchResults) - 1)) + if idx != old_idx: + self.RemoveHighlight(*self.CurrentFindHighlight) + self.CurrentFindHighlight = self.SearchResults[idx] + self.AddHighlight(*self.CurrentFindHighlight) + else: + self.CurrentFindHighlight = self.SearchResults[0] + self.AddHighlight(*self.CurrentFindHighlight) + + else: + if self.CurrentFindHighlight is not None: + self.RemoveHighlight(*self.CurrentFindHighlight) + self.CurrentFindHighlight = None + def RefreshModel(self): self.RefreshJumpList() self.Controler.SetEditedElementText(self.TagName, self.GetText()) @@ -832,8 +872,18 @@ highlight_type = HIGHLIGHT_TYPES.get(highlight_type, None) if infos[0] == "body" and highlight_type is not None: self.Highlights.append((infos[1], start, end, highlight_type)) + self.Editor.GotoPos(self.Editor.PositionFromLine(start[0]) + start[1]) self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True) + def RemoveHighlight(self, infos, start, end, highlight_type): + EditorPanel.RemoveHighlight(self, infos, start, end, highlight_type) + + highlight_type = HIGHLIGHT_TYPES.get(highlight_type, None) + if (infos[0] == "body" and highlight_type is not None and + (infos[1], start, end, highlight_type) in self.Highlights): + self.Highlights.remove((infos[1], start, end, highlight_type)) + self.RefreshHighlightsTimer.Start(int(REFRESH_HIGHLIGHT_PERIOD * 1000), oneShot=True) + def ShowHighlights(self, start_pos, end_pos): for indent, start, end, highlight_type in self.Highlights: if start[0] == 0: