src/eric7/QScintilla/SearchReplaceWidget.py

branch
eric7
changeset 9931
e6e01a10c3a1
parent 9653
e67609152c5e
child 9938
b8005dd4fc9b
equal deleted inserted replaced
9930:4d82d809e816 9931:e6e01a10c3a1
6 """ 6 """
7 Module implementing the search and replace widget. 7 Module implementing the search and replace widget.
8 """ 8 """
9 9
10 import contextlib 10 import contextlib
11 import re
12 11
13 from PyQt6.QtCore import QEvent, Qt, pyqtSignal, pyqtSlot 12 from PyQt6.QtCore import QEvent, Qt, pyqtSignal, pyqtSlot
14 from PyQt6.QtWidgets import ( 13 from PyQt6.QtWidgets import (
15 QFrame, 14 QFrame,
16 QHBoxLayout, 15 QHBoxLayout,
160 159
161 self.ui.findtextCombo.lineEdit().textEdited.connect(self.__quickSearch) 160 self.ui.findtextCombo.lineEdit().textEdited.connect(self.__quickSearch)
162 self.ui.caseCheckBox.toggled.connect(self.__updateQuickSearchMarkers) 161 self.ui.caseCheckBox.toggled.connect(self.__updateQuickSearchMarkers)
163 self.ui.wordCheckBox.toggled.connect(self.__updateQuickSearchMarkers) 162 self.ui.wordCheckBox.toggled.connect(self.__updateQuickSearchMarkers)
164 self.ui.regexpCheckBox.toggled.connect(self.__updateQuickSearchMarkers) 163 self.ui.regexpCheckBox.toggled.connect(self.__updateQuickSearchMarkers)
164 self.ui.selectionCheckBox.toggled.connect(self.__updateQuickSearchMarkers)
165 165
166 self.__findtextComboStyleSheet = self.ui.findtextCombo.styleSheet() 166 self.__findtextComboStyleSheet = self.ui.findtextCombo.styleSheet()
167 167
168 # define actions 168 # define actions
169 self.findNextAct = EricAction( 169 self.findNextAct = EricAction(
392 Private slot to search for the entered text while typing. 392 Private slot to search for the entered text while typing.
393 393
394 @param txt text of the search edit 394 @param txt text of the search edit
395 @type str 395 @type str
396 """ 396 """
397 if Preferences.getEditor("QuickSearchEnabled"):
398 aw = self.__viewmanager.activeWindow()
399 aw.hideFindIndicator()
400 if Preferences.getEditor("QuickSearchMarkersEnabled"):
401 self.__quickSearchMarkOccurrences(txt)
402
403 if self.ui.selectionCheckBox.isChecked():
404 lineFrom, indexFrom, lineTo, indexTo = self.__selectionBoundary()
405 else:
406 lineFrom, indexFrom, lineTo, indexTo = 0, 0, -1, -1
407 posixMode = (
408 Preferences.getEditor("SearchRegexpMode") == 0
409 and self.ui.regexpCheckBox.isChecked()
410 )
411 cxx11Mode = (
412 Preferences.getEditor("SearchRegexpMode") == 1
413 and self.ui.regexpCheckBox.isChecked()
414 )
415
416 self.__finding = True
417 ok = aw.findFirst(
418 txt,
419 self.ui.regexpCheckBox.isChecked(),
420 self.ui.caseCheckBox.isChecked(),
421 self.ui.wordCheckBox.isChecked(),
422 self.ui.wrapCheckBox.isChecked(),
423 not self.__findBackwards,
424 lineFrom,
425 indexFrom,
426 posix=posixMode,
427 cxx11=cxx11Mode,
428 )
429 if ok:
430 sline, sindex, eline, eindex = aw.getSelection()
431 if (
432 (sline == lineFrom and sindex >= indexFrom)
433 or (sline > lineFrom and sline < lineTo)
434 or (sline == lineTo and sindex <= indexTo)
435 ):
436 aw.showFindIndicator(sline, sindex, eline, eindex)
437
438 self.__finding = False
439
440 if not txt:
441 ok = True # reset the color in case of an empty text
442
443 self.__setSearchEditColors(ok)
444
445 def __quickSearchMarkOccurrences(self, txt):
446 """
447 Private method to mark all occurrences of the search text.
448
449 @param txt text to search for (string)
450 """
397 aw = self.__viewmanager.activeWindow() 451 aw = self.__viewmanager.activeWindow()
398 aw.hideFindIndicator() 452
399 if Preferences.getEditor("QuickSearchMarkersEnabled"): 453 if self.ui.selectionCheckBox.isChecked():
400 self.__quickSearchMarkOccurrences(txt) 454 lineFrom, indexFrom, lineTo, indexTo = self.__selectionBoundary()
401 455 else:
402 lineFrom, indexFrom, lineTo, indexTo = aw.getSelection() 456 lineFrom, indexFrom, lineTo, indexTo = 0, 0, -1, -1
403 posixMode = (
404 Preferences.getEditor("SearchRegexpMode") == 0
405 and self.ui.regexpCheckBox.isChecked()
406 )
407 cxx11Mode = (
408 Preferences.getEditor("SearchRegexpMode") == 1
409 and self.ui.regexpCheckBox.isChecked()
410 )
411 ok = aw.findFirst(
412 txt,
413 self.ui.regexpCheckBox.isChecked(),
414 self.ui.caseCheckBox.isChecked(),
415 self.ui.wordCheckBox.isChecked(),
416 self.ui.wrapCheckBox.isChecked(),
417 not self.__findBackwards,
418 lineFrom,
419 indexFrom,
420 posix=posixMode,
421 cxx11=cxx11Mode,
422 )
423 if ok:
424 sline, sindex, eline, eindex = aw.getSelection()
425 aw.showFindIndicator(sline, sindex, eline, eindex)
426
427 if not txt:
428 ok = True # reset the color in case of an empty text
429
430 self.__setSearchEditColors(ok)
431
432 def __quickSearchMarkOccurrences(self, txt):
433 """
434 Private method to mark all occurrences of the search text.
435
436 @param txt text to search for (string)
437 """
438 aw = self.__viewmanager.activeWindow()
439
440 lineFrom = 0
441 indexFrom = 0
442 lineTo = -1
443 indexTo = -1
444 457
445 aw.clearSearchIndicators() 458 aw.clearSearchIndicators()
446 posixMode = ( 459 posixMode = (
447 Preferences.getEditor("SearchRegexpMode") == 0 460 Preferences.getEditor("SearchRegexpMode") == 0
448 and self.ui.regexpCheckBox.isChecked() 461 and self.ui.regexpCheckBox.isChecked()
463 posix=posixMode, 476 posix=posixMode,
464 cxx11=cxx11Mode, 477 cxx11=cxx11Mode,
465 ) 478 )
466 while ok: 479 while ok:
467 tgtPos, tgtLen = aw.getFoundTarget() 480 tgtPos, tgtLen = aw.getFoundTarget()
468 aw.setSearchIndicator(tgtPos, tgtLen) 481 if tgtLen == 0:
482 break
483 if len(self.__selections) > 1:
484 sline, sindex = aw.lineIndexFromPosition(tgtPos)
485 eline, eindex = aw.lineIndexFromPosition(tgtPos + tgtLen)
486 indicate = (
487 (sline == lineFrom and sindex >= indexFrom)
488 or (sline > lineFrom and sline < lineTo)
489 or (sline == lineTo and sindex <= indexTo)
490 )
491 else:
492 indicate = True
493 if indicate:
494 aw.setSearchIndicator(tgtPos, tgtLen)
469 ok = aw.findNextTarget() 495 ok = aw.findNextTarget()
470 496
471 def __setSearchEditColors(self, ok): 497 def __setSearchEditColors(self, ok):
472 """ 498 """
473 Private method to set the search edit colors. 499 Private method to set the search edit colors.
494 txt = self.ui.findtextCombo.currentText() 520 txt = self.ui.findtextCombo.currentText()
495 if not txt: 521 if not txt:
496 return 522 return
497 523
498 line, index = aw.getCursorPosition() 524 line, index = aw.getCursorPosition()
499 text = aw.text(line) 525 word = aw.getWord(line, index)
500 526 self.ui.findtextCombo.setEditText(word)
501 rx = re.compile(r"[^\w_]") 527 self.ui.findtextCombo.lineEdit().selectAll()
502 match = rx.search(text, index) 528 self.__quickSearch(word)
503 if match:
504 end = match.start()
505 if end > index:
506 ext = text[index:end]
507 txt += ext
508 self.ui.findtextCombo.setEditText(txt)
509 self.ui.findtextCombo.lineEdit().selectAll()
510 self.__quickSearch(txt)
511 529
512 @pyqtSlot(bool) 530 @pyqtSlot(bool)
513 def __updateQuickSearchMarkers(self, on): 531 def __updateQuickSearchMarkers(self, on):
514 """ 532 """
515 Private slot to handle the selection of the various check boxes. 533 Private slot to handle the selection of the various check boxes.
614 Private method to mark all occurrences of the search text. 632 Private method to mark all occurrences of the search text.
615 633
616 @param txt text to search for (string) 634 @param txt text to search for (string)
617 """ 635 """
618 aw = self.__viewmanager.activeWindow() 636 aw = self.__viewmanager.activeWindow()
619 lineFrom = 0
620 indexFrom = 0
621 lineTo = -1
622 indexTo = -1
623 if self.ui.selectionCheckBox.isChecked(): 637 if self.ui.selectionCheckBox.isChecked():
624 lineFrom, indexFrom, lineTo, indexTo = self.__selectionBoundary() 638 lineFrom, indexFrom, lineTo, indexTo = self.__selectionBoundary()
639 else:
640 lineFrom, indexFrom, lineTo, indexTo = 0, 0, -1, -1
625 posixMode = ( 641 posixMode = (
626 Preferences.getEditor("SearchRegexpMode") == 0 642 Preferences.getEditor("SearchRegexpMode") == 0
627 and self.ui.regexpCheckBox.isChecked() 643 and self.ui.regexpCheckBox.isChecked()
628 ) 644 )
629 cxx11Mode = ( 645 cxx11Mode = (

eric ide

mercurial