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 """ |
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 """ |