eric6/QScintilla/SearchReplaceWidget.py

changeset 8129
52c76e6cb35b
parent 7923
91e843545d9a
child 8130
5fe4ff181b68
equal deleted inserted replaced
8128:8f012c58f27e 8129:52c76e6cb35b
5 5
6 """ 6 """
7 Module implementing the search and replace widget. 7 Module implementing the search and replace widget.
8 """ 8 """
9 9
10 import re
11
10 from PyQt5.QtCore import pyqtSignal, Qt, pyqtSlot, QEvent 12 from PyQt5.QtCore import pyqtSignal, Qt, pyqtSlot, QEvent
13 from PyQt5.QtGui import QColor, QPalette
11 from PyQt5.QtWidgets import ( 14 from PyQt5.QtWidgets import (
12 QWidget, QHBoxLayout, QToolButton, QScrollArea, QSizePolicy, QFrame 15 QWidget, QHBoxLayout, QToolButton, QScrollArea, QSizePolicy, QFrame
13 ) 16 )
14 17
15 from .Editor import Editor 18 from .Editor import Editor
129 self.ui.closeButton.setIcon(UI.PixmapCache.getIcon("close")) 132 self.ui.closeButton.setIcon(UI.PixmapCache.getIcon("close"))
130 self.ui.findPrevButton.setIcon( 133 self.ui.findPrevButton.setIcon(
131 UI.PixmapCache.getIcon("1leftarrow")) 134 UI.PixmapCache.getIcon("1leftarrow"))
132 self.ui.findNextButton.setIcon( 135 self.ui.findNextButton.setIcon(
133 UI.PixmapCache.getIcon("1rightarrow")) 136 UI.PixmapCache.getIcon("1rightarrow"))
137 self.ui.extendButton.setIcon(
138 UI.PixmapCache.getIcon("2rightarrow"))
134 139
135 if replace: 140 if replace:
136 self.ui.replaceButton.setIcon( 141 self.ui.replaceButton.setIcon(
137 UI.PixmapCache.getIcon("editReplace")) 142 UI.PixmapCache.getIcon("editReplace"))
138 self.ui.replaceSearchButton.setIcon( 143 self.ui.replaceSearchButton.setIcon(
146 self.__findByReturnPressed) 151 self.__findByReturnPressed)
147 if replace: 152 if replace:
148 self.ui.replacetextCombo.setCompleter(None) 153 self.ui.replacetextCombo.setCompleter(None)
149 self.ui.replacetextCombo.lineEdit().returnPressed.connect( 154 self.ui.replacetextCombo.lineEdit().returnPressed.connect(
150 self.on_replaceButton_clicked) 155 self.on_replaceButton_clicked)
156
157 self.ui.findtextCombo.lineEdit().textEdited.connect(self.__quickSearch)
158 self.ui.caseCheckBox.toggled.connect(
159 self.__updateQuickSearchMarkers)
160 self.ui.wordCheckBox.toggled.connect(
161 self.__updateQuickSearchMarkers)
162 self.ui.regexpCheckBox.toggled.connect(
163 self.__updateQuickSearchMarkers)
164 self.ui.selectionCheckBox.toggled.connect(
165 self.__updateQuickSearchMarkers)
151 166
152 # define actions 167 # define actions
153 self.findNextAct = E5Action( 168 self.findNextAct = E5Action(
154 self.tr('Find Next'), 169 self.tr('Find Next'),
155 self.tr('Find Next'), 170 self.tr('Find Next'),
322 else: 337 else:
323 startLine, startIndex, endLine, endIndex = -1, -1, -1, -1 338 startLine, startIndex, endLine, endIndex = -1, -1, -1, -1
324 339
325 return startLine, startIndex, endLine, endIndex 340 return startLine, startIndex, endLine, endIndex
326 341
342 @pyqtSlot(str)
327 def on_findtextCombo_editTextChanged(self, txt): 343 def on_findtextCombo_editTextChanged(self, txt):
328 """ 344 """
329 Private slot to enable/disable the find buttons. 345 Private slot to enable/disable the find buttons.
330 346
331 @param txt text of the find text combo (string) 347 @param txt text of the find text combo
332 """ 348 @type str
349 """
350 enable = bool(txt)
351
352 self.__setFindNextEnabled(enable)
353 self.__setFindPrevEnabled(enable)
354 self.ui.extendButton.setEnabled(enable)
355 if self.__replace:
356 self.__setReplaceSelectionEnabled(False)
357 self.__setReplaceAndSearchEnabled(False)
358 self.__setReplaceAllEnabled(enable)
359
360 @pyqtSlot(str)
361 def __quickSearch(self, txt):
362 """
363 Private slot to search for the entered text while typing.
364
365 @param txt text of the search edit
366 @type str
367 """
368 aw = self.__viewmanager.activeWindow()
369 aw.hideFindIndicator()
370 if Preferences.getEditor("QuickSearchMarkersEnabled"):
371 self.__quickSearchMarkOccurrences(txt)
372
373 lineFrom, indexFrom, lineTo, indexTo = aw.getSelection()
374 posixMode = (Preferences.getEditor("SearchRegexpMode") == 0 and
375 self.ui.regexpCheckBox.isChecked())
376 cxx11Mode = (Preferences.getEditor("SearchRegexpMode") == 1 and
377 self.ui.regexpCheckBox.isChecked())
378 ok = aw.findFirst(
379 txt,
380 self.ui.regexpCheckBox.isChecked(),
381 self.ui.caseCheckBox.isChecked(),
382 self.ui.wordCheckBox.isChecked(),
383 self.ui.wrapCheckBox.isChecked(),
384 not self.__findBackwards,
385 lineFrom, indexFrom,
386 posix=posixMode,
387 cxx11=cxx11Mode
388 )
389 if ok:
390 sline, sindex, eline, eindex = aw.getSelection()
391 aw.showFindIndicator(sline, sindex, eline, eindex)
392
333 if not txt: 393 if not txt:
334 self.__setFindNextEnabled(False) 394 ok = True # reset the color in case of an empty text
335 self.__setFindPrevEnabled(False) 395
336 if self.__replace: 396 self.__setSearchEditColors(ok)
337 self.__setReplaceSelectionEnabled(False) 397
338 self.__setReplaceAndSearchEnabled(False) 398 def __quickSearchMarkOccurrences(self, txt):
339 self.__setReplaceAllEnabled(False) 399 """
400 Private method to mark all occurrences of the search text.
401
402 @param txt text to search for (string)
403 """
404 aw = self.__viewmanager.activeWindow()
405
406 lineFrom = 0
407 indexFrom = 0
408 lineTo = -1
409 indexTo = -1
410
411 aw.clearSearchIndicators()
412 posixMode = (Preferences.getEditor("SearchRegexpMode") == 0 and
413 self.ui.regexpCheckBox.isChecked())
414 cxx11Mode = (Preferences.getEditor("SearchRegexpMode") == 1 and
415 self.ui.regexpCheckBox.isChecked())
416 ok = aw.findFirstTarget(
417 txt,
418 self.ui.regexpCheckBox.isChecked(),
419 self.ui.caseCheckBox.isChecked(),
420 self.ui.wordCheckBox.isChecked(),
421 lineFrom, indexFrom, lineTo, indexTo,
422 posix=posixMode,
423 cxx11=cxx11Mode
424 )
425 while ok:
426 tgtPos, tgtLen = aw.getFoundTarget()
427 aw.setSearchIndicator(tgtPos, tgtLen)
428 ok = aw.findNextTarget()
429
430 def __setSearchEditColors(self, ok):
431 """
432 Private method to set the search edit colors.
433
434 @param ok flag indicating a match
435 @type bool
436 """
437 if not ok:
438 palette = self.ui.findtextCombo.lineEdit().palette()
439 palette.setColor(QPalette.Base, QColor("red"))
440 palette.setColor(QPalette.Text, QColor("white"))
441 self.ui.findtextCombo.lineEdit().setPalette(palette)
340 else: 442 else:
341 self.__setFindNextEnabled(True) 443 palette = self.ui.findtextCombo.lineEdit().palette()
342 self.__setFindPrevEnabled(True) 444 palette.setColor(
343 if self.__replace: 445 QPalette.Base,
344 self.__setReplaceSelectionEnabled(False) 446 self.ui.findtextCombo.palette().color(QPalette.Base))
345 self.__setReplaceAndSearchEnabled(False) 447 palette.setColor(
346 self.__setReplaceAllEnabled(True) 448 QPalette.Text,
347 449 self.ui.findtextCombo.palette().color(QPalette.Text))
450 self.ui.findtextCombo.lineEdit().setPalette(palette)
451
452 @pyqtSlot()
453 def on_extendButton_clicked(self):
454 """
455 Private slot to handle the quicksearch extend action.
456 """
457 aw = self.__viewmanager.activeWindow()
458 if aw is None:
459 return
460
461 txt = self.ui.findtextCombo.currentText()
462 if not txt:
463 return
464
465 line, index = aw.getCursorPosition()
466 text = aw.text(line)
467
468 rx = re.compile(r'[^\w_]')
469 match = rx.search(text, index)
470 if match:
471 end = match.start()
472 if end > index:
473 ext = text[index:end]
474 txt += ext
475 self.ui.findtextCombo.setEditText(txt)
476 self.ui.findtextCombo.lineEdit().selectAll()
477 self.__quickSearch(txt)
478
479 @pyqtSlot(bool)
480 def __updateQuickSearchMarkers(self, on):
481 """
482 Private slot to handle the selection of the various check boxes.
483
484 @param on status of the check box (ignored)
485 @type bool
486 """
487 txt = self.ui.findtextCombo.currentText()
488 self.__quickSearch(txt)
489
348 @pyqtSlot() 490 @pyqtSlot()
349 def on_findNextButton_clicked(self): 491 def on_findNextButton_clicked(self):
350 """ 492 """
351 Private slot to find the next occurrence of text. 493 Private slot to find the next occurrence of text.
352 """ 494 """
374 self.ui.findtextCombo.clear() 516 self.ui.findtextCombo.clear()
375 self.ui.findtextCombo.addItems(self.findHistory) 517 self.ui.findtextCombo.addItems(self.findHistory)
376 self.searchListChanged.emit() 518 self.searchListChanged.emit()
377 519
378 ok = self.__findNextPrev(txt, False) 520 ok = self.__findNextPrev(txt, False)
521 self.__setSearchEditColors(ok)
379 if ok: 522 if ok:
380 if self.__replace: 523 if self.__replace:
381 self.__setReplaceSelectionEnabled(True) 524 self.__setReplaceSelectionEnabled(True)
382 self.__setReplaceAndSearchEnabled(True) 525 self.__setReplaceAndSearchEnabled(True)
383 else: 526 else:
411 self.ui.findtextCombo.clear() 554 self.ui.findtextCombo.clear()
412 self.ui.findtextCombo.addItems(self.findHistory) 555 self.ui.findtextCombo.addItems(self.findHistory)
413 self.searchListChanged.emit() 556 self.searchListChanged.emit()
414 557
415 ok = self.__findNextPrev(txt, True) 558 ok = self.__findNextPrev(txt, True)
559 self.__setSearchEditColors(ok)
416 if ok: 560 if ok:
417 if self.__replace: 561 if self.__replace:
418 self.__setReplaceSelectionEnabled(True) 562 self.__setReplaceSelectionEnabled(True)
419 self.__setReplaceAndSearchEnabled(True) 563 self.__setReplaceAndSearchEnabled(True)
420 else: 564 else:
714 858
715 @param text text to be shown in the findtext edit (string) 859 @param text text to be shown in the findtext edit (string)
716 """ 860 """
717 self.__replace = False 861 self.__replace = False
718 862
863 self.__setSearchEditColors(True)
719 self.ui.findtextCombo.clear() 864 self.ui.findtextCombo.clear()
720 self.ui.findtextCombo.addItems(self.findHistory) 865 self.ui.findtextCombo.addItems(self.findHistory)
721 self.ui.findtextCombo.setEditText(text) 866 self.ui.findtextCombo.setEditText(text)
722 self.ui.findtextCombo.lineEdit().selectAll() 867 self.ui.findtextCombo.lineEdit().selectAll()
723 self.ui.findtextCombo.setFocus() 868 self.ui.findtextCombo.setFocus()
829 aw.hideFindIndicator() 974 aw.hideFindIndicator()
830 aw.replace(rtxt) 975 aw.replace(rtxt)
831 976
832 if searchNext: 977 if searchNext:
833 ok = self.__findNextPrev(ftxt, self.__findBackwards) 978 ok = self.__findNextPrev(ftxt, self.__findBackwards)
979 self.__setSearchEditColors(ok)
834 980
835 if not ok: 981 if not ok:
836 self.__setReplaceSelectionEnabled(False) 982 self.__setReplaceSelectionEnabled(False)
837 self.__setReplaceAndSearchEnabled(False) 983 self.__setReplaceAndSearchEnabled(False)
838 E5MessageBox.information( 984 E5MessageBox.information(
839 self, self.windowTitle(), 985 self, self.windowTitle(),
840 self.tr("'{0}' was not found.").format(ftxt)) 986 self.tr("'{0}' was not found.").format(ftxt))
841 else: 987 else:
842 self.__setReplaceSelectionEnabled(False) 988 self.__setReplaceSelectionEnabled(False)
843 self.__setReplaceAndSearchEnabled(False) 989 self.__setReplaceAndSearchEnabled(False)
990 self.__setSearchEditColors(True)
844 991
845 self.__finding = False 992 self.__finding = False
846 993
847 def replaceAll(self): 994 def replaceAll(self):
848 """ 995 """
1001 1148
1002 @param text text to be shown in the findtext edit 1149 @param text text to be shown in the findtext edit
1003 """ 1150 """
1004 self.__replace = True 1151 self.__replace = True
1005 1152
1153 self.__setSearchEditColors(True)
1006 self.ui.findtextCombo.clear() 1154 self.ui.findtextCombo.clear()
1007 self.ui.findtextCombo.addItems(self.findHistory) 1155 self.ui.findtextCombo.addItems(self.findHistory)
1008 self.ui.findtextCombo.setEditText(text) 1156 self.ui.findtextCombo.setEditText(text)
1009 self.ui.findtextCombo.lineEdit().selectAll() 1157 self.ui.findtextCombo.lineEdit().selectAll()
1010 self.ui.findtextCombo.setFocus() 1158 self.ui.findtextCombo.setFocus()

eric ide

mercurial