src/eric7/QScintilla/SearchReplaceWidget.py

branch
eric7
changeset 9931
e6e01a10c3a1
parent 9653
e67609152c5e
child 9938
b8005dd4fc9b
--- 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()

eric ide

mercurial