--- a/src/eric7/QScintilla/SearchReplaceWidget.py Thu Mar 23 20:51:13 2023 +0100 +++ b/src/eric7/QScintilla/SearchReplaceWidget.py Sat Mar 25 17:39:59 2023 +0100 @@ -8,7 +8,6 @@ """ import contextlib -import re from PyQt6.QtCore import QEvent, Qt, pyqtSignal, pyqtSlot from PyQt6.QtWidgets import ( @@ -162,6 +161,7 @@ self.ui.caseCheckBox.toggled.connect(self.__updateQuickSearchMarkers) self.ui.wordCheckBox.toggled.connect(self.__updateQuickSearchMarkers) self.ui.regexpCheckBox.toggled.connect(self.__updateQuickSearchMarkers) + self.ui.selectionCheckBox.toggled.connect(self.__updateQuickSearchMarkers) self.__findtextComboStyleSheet = self.ui.findtextCombo.styleSheet() @@ -394,40 +394,53 @@ @param txt text of the search edit @type str """ - aw = self.__viewmanager.activeWindow() - aw.hideFindIndicator() - if Preferences.getEditor("QuickSearchMarkersEnabled"): - self.__quickSearchMarkOccurrences(txt) + if Preferences.getEditor("QuickSearchEnabled"): + aw = self.__viewmanager.activeWindow() + aw.hideFindIndicator() + if Preferences.getEditor("QuickSearchMarkersEnabled"): + self.__quickSearchMarkOccurrences(txt) + + if self.ui.selectionCheckBox.isChecked(): + lineFrom, indexFrom, lineTo, indexTo = self.__selectionBoundary() + else: + lineFrom, indexFrom, lineTo, indexTo = 0, 0, -1, -1 + posixMode = ( + Preferences.getEditor("SearchRegexpMode") == 0 + and self.ui.regexpCheckBox.isChecked() + ) + cxx11Mode = ( + Preferences.getEditor("SearchRegexpMode") == 1 + and self.ui.regexpCheckBox.isChecked() + ) - lineFrom, indexFrom, lineTo, indexTo = aw.getSelection() - posixMode = ( - Preferences.getEditor("SearchRegexpMode") == 0 - and self.ui.regexpCheckBox.isChecked() - ) - cxx11Mode = ( - Preferences.getEditor("SearchRegexpMode") == 1 - and self.ui.regexpCheckBox.isChecked() - ) - ok = aw.findFirst( - txt, - self.ui.regexpCheckBox.isChecked(), - self.ui.caseCheckBox.isChecked(), - self.ui.wordCheckBox.isChecked(), - self.ui.wrapCheckBox.isChecked(), - not self.__findBackwards, - lineFrom, - indexFrom, - posix=posixMode, - cxx11=cxx11Mode, - ) - if ok: - sline, sindex, eline, eindex = aw.getSelection() - aw.showFindIndicator(sline, sindex, eline, eindex) + self.__finding = True + ok = aw.findFirst( + txt, + self.ui.regexpCheckBox.isChecked(), + self.ui.caseCheckBox.isChecked(), + self.ui.wordCheckBox.isChecked(), + self.ui.wrapCheckBox.isChecked(), + not self.__findBackwards, + lineFrom, + indexFrom, + posix=posixMode, + cxx11=cxx11Mode, + ) + if ok: + sline, sindex, eline, eindex = aw.getSelection() + if ( + (sline == lineFrom and sindex >= indexFrom) + or (sline > lineFrom and sline < lineTo) + or (sline == lineTo and sindex <= indexTo) + ): + aw.showFindIndicator(sline, sindex, eline, eindex) - if not txt: - ok = True # reset the color in case of an empty text + self.__finding = False - self.__setSearchEditColors(ok) + if not txt: + ok = True # reset the color in case of an empty text + + self.__setSearchEditColors(ok) def __quickSearchMarkOccurrences(self, txt): """ @@ -437,10 +450,10 @@ """ aw = self.__viewmanager.activeWindow() - lineFrom = 0 - indexFrom = 0 - lineTo = -1 - indexTo = -1 + if self.ui.selectionCheckBox.isChecked(): + lineFrom, indexFrom, lineTo, indexTo = self.__selectionBoundary() + else: + lineFrom, indexFrom, lineTo, indexTo = 0, 0, -1, -1 aw.clearSearchIndicators() posixMode = ( @@ -465,7 +478,20 @@ ) while ok: tgtPos, tgtLen = aw.getFoundTarget() - aw.setSearchIndicator(tgtPos, tgtLen) + if tgtLen == 0: + break + if len(self.__selections) > 1: + sline, sindex = aw.lineIndexFromPosition(tgtPos) + eline, eindex = aw.lineIndexFromPosition(tgtPos + tgtLen) + indicate = ( + (sline == lineFrom and sindex >= indexFrom) + or (sline > lineFrom and sline < lineTo) + or (sline == lineTo and sindex <= indexTo) + ) + else: + indicate = True + if indicate: + aw.setSearchIndicator(tgtPos, tgtLen) ok = aw.findNextTarget() def __setSearchEditColors(self, ok): @@ -496,18 +522,10 @@ return line, index = aw.getCursorPosition() - text = aw.text(line) - - rx = re.compile(r"[^\w_]") - match = rx.search(text, index) - if match: - end = match.start() - if end > index: - ext = text[index:end] - txt += ext - self.ui.findtextCombo.setEditText(txt) - self.ui.findtextCombo.lineEdit().selectAll() - self.__quickSearch(txt) + word = aw.getWord(line, index) + self.ui.findtextCombo.setEditText(word) + self.ui.findtextCombo.lineEdit().selectAll() + self.__quickSearch(word) @pyqtSlot(bool) def __updateQuickSearchMarkers(self, on): @@ -616,12 +634,10 @@ @param txt text to search for (string) """ aw = self.__viewmanager.activeWindow() - lineFrom = 0 - indexFrom = 0 - lineTo = -1 - indexTo = -1 if self.ui.selectionCheckBox.isChecked(): lineFrom, indexFrom, lineTo, indexTo = self.__selectionBoundary() + else: + lineFrom, indexFrom, lineTo, indexTo = 0, 0, -1, -1 posixMode = ( Preferences.getEditor("SearchRegexpMode") == 0 and self.ui.regexpCheckBox.isChecked()