--- a/QScintilla/SearchReplaceWidget.py Sat May 20 14:33:00 2017 +0200 +++ b/QScintilla/SearchReplaceWidget.py Sat May 20 16:13:23 2017 +0200 @@ -43,8 +43,9 @@ """ super(SearchReplaceWidget, self).__init__(parent) - self.viewmanager = vm - self.replace = replace + self.__viewmanager = vm + self.__isMiniEditor = vm is parent + self.__replace = replace self.__sliding = sliding if sliding: self.__topWidget = parent @@ -122,6 +123,7 @@ ) self.setWhatsThis(whatsThis) + # set icons self.ui.closeButton.setIcon(UI.PixmapCache.getIcon("close.png")) self.ui.findPrevButton.setIcon( UI.PixmapCache.getIcon("1leftarrow.png")) @@ -136,6 +138,7 @@ self.ui.replaceAllButton.setIcon( UI.PixmapCache.getIcon("editReplaceAll.png")) + # set line edit completers self.ui.findtextCombo.setCompleter(None) self.ui.findtextCombo.lineEdit().returnPressed.connect( self.__findByReturnPressed) @@ -144,21 +147,66 @@ self.ui.replacetextCombo.lineEdit().returnPressed.connect( self.on_replaceButton_clicked) + # define actions self.findNextAct = E5Action( self.tr('Find Next'), self.tr('Find Next'), 0, 0, self, 'search_widget_find_next') self.findNextAct.triggered.connect(self.on_findNextButton_clicked) - self.findNextAct.setEnabled(False) - self.ui.findtextCombo.addAction(self.findNextAct) + self.findNextAct.setShortcutContext(Qt.WidgetWithChildrenShortcut) self.findPrevAct = E5Action( self.tr('Find Prev'), self.tr('Find Prev'), 0, 0, self, 'search_widget_find_prev') self.findPrevAct.triggered.connect(self.on_findPrevButton_clicked) - self.findPrevAct.setEnabled(False) - self.ui.findtextCombo.addAction(self.findPrevAct) + self.findPrevAct.setShortcutContext(Qt.WidgetWithChildrenShortcut) + + if replace: + self.replaceAndSearchAct = E5Action( + self.tr("Replace and Search"), + self.tr("Replace and Search"), + 0, 0, self, "replace_widget_replace_search") + self.replaceAndSearchAct.triggered.connect( + self.on_replaceSearchButton_clicked) + self.replaceAndSearchAct.setEnabled(False) + self.replaceAndSearchAct.setShortcutContext( + Qt.WidgetWithChildrenShortcut) + + self.replaceSelectionAct = E5Action( + self.tr("Replace Occurrence"), + self.tr("Replace Occurrence"), + 0, 0, self, "replace_widget_replace_occurrence") + self.replaceSelectionAct.triggered.connect( + self.on_replaceButton_clicked) + self.replaceSelectionAct.setEnabled(False) + self.replaceSelectionAct.setShortcutContext( + Qt.WidgetWithChildrenShortcut) + + self.replaceAllAct = E5Action( + self.tr("Replace All"), + self.tr("Replace All"), + 0, 0, self, "replace_widget_replace_all") + self.replaceAllAct.triggered.connect( + self.on_replaceAllButton_clicked) + self.replaceAllAct.setEnabled(False) + self.replaceAllAct.setShortcutContext( + Qt.WidgetWithChildrenShortcut) + + self.addAction(self.findNextAct) + self.addAction(self.findPrevAct) + if replace: + self.addAction(self.replaceAndSearchAct) + self.addAction(self.replaceSelectionAct) + self.addAction(self.replaceAllAct) + + # disable search and replace buttons and actions + self.__setFindNextEnabled(False) + self.__setFindPrevEnabled(False) + if replace: + self.__setReplaceAndSearchEnabled(False) + self.__setReplaceSelectionEnabled(False) + self.__setReplaceAllEnabled(False) self.adjustSize() @@ -168,6 +216,75 @@ self.__selections = [] self.__finding = False + def __setShortcuts(self): + """ + Private method to set the local action's shortcuts to the same key + sequences as in the view manager. + """ + if not self.__isMiniEditor: + self.findNextAct.setShortcuts( + self.__viewmanager.searchNextAct.shortcuts()) + self.findPrevAct.setShortcuts( + self.__viewmanager.searchPrevAct.shortcuts()) + + if self.__replace: + self.replaceAndSearchAct.setShortcuts( + self.__viewmanager.replaceAndSearchAct.shortcuts()) + self.replaceSelectionAct.setShortcuts( + self.__viewmanager.replaceSelectionAct.shortcuts()) + self.replaceAllAct.setShortcuts( + self.__viewmanager.replaceAllAct.shortcuts()) + + def __setFindNextEnabled(self, enable): + """ + Private method to set the enabled state of "Find Next". + + @param enable flag indicating the enable state to be set + @type bool + """ + self.ui.findNextButton.setEnabled(enable) + self.findNextAct.setEnabled(enable) + + def __setFindPrevEnabled(self, enable): + """ + Private method to set the enabled state of "Find Prev". + + @param enable flag indicating the enable state to be set + @type bool + """ + self.ui.findPrevButton.setEnabled(enable) + self.findPrevAct.setEnabled(enable) + + def __setReplaceAndSearchEnabled(self, enable): + """ + Private method to set the enabled state of "Replace And Search". + + @param enable flag indicating the enable state to be set + @type bool + """ + self.ui.replaceSearchButton.setEnabled(enable) + self.replaceAndSearchAct.setEnabled(enable) + + def __setReplaceSelectionEnabled(self, enable): + """ + Private method to set the enabled state of "Replace Occurrence". + + @param enable flag indicating the enable state to be set + @type bool + """ + self.ui.replaceButton.setEnabled(enable) + self.replaceSelectionAct.setEnabled(enable) + + def __setReplaceAllEnabled(self, enable): + """ + Private method to set the enabled state of "Replace All". + + @param enable flag indicating the enable state to be set + @type bool + """ + self.ui.replaceAllButton.setEnabled(enable) + self.replaceAllAct.setEnabled(enable) + def changeEvent(self, evt): """ Protected method handling state changes. @@ -208,23 +325,19 @@ @param txt text of the find text combo (string) """ if not txt: - self.ui.findNextButton.setEnabled(False) - self.findNextAct.setEnabled(False) - self.ui.findPrevButton.setEnabled(False) - self.findPrevAct.setEnabled(False) - if self.replace: - self.ui.replaceButton.setEnabled(False) - self.ui.replaceSearchButton.setEnabled(False) - self.ui.replaceAllButton.setEnabled(False) + self.__setFindNextEnabled(False) + self.__setFindPrevEnabled(False) + if self.__replace: + self.__setReplaceSelectionEnabled(False) + self.__setReplaceAndSearchEnabled(False) + self.__setReplaceAllEnabled(False) else: - self.ui.findNextButton.setEnabled(True) - self.findNextAct.setEnabled(True) - self.ui.findPrevButton.setEnabled(True) - self.findPrevAct.setEnabled(True) - if self.replace: - self.ui.replaceButton.setEnabled(False) - self.ui.replaceSearchButton.setEnabled(False) - self.ui.replaceAllButton.setEnabled(True) + self.__setFindNextEnabled(True) + self.__setFindPrevEnabled(True) + if self.__replace: + self.__setReplaceSelectionEnabled(False) + self.__setReplaceAndSearchEnabled(False) + self.__setReplaceAllEnabled(False) @pyqtSlot() def on_findNextButton_clicked(self): @@ -238,7 +351,10 @@ Public slot to find the next occurrence of text. """ if not self.havefound or not self.ui.findtextCombo.currentText(): - self.show(self.viewmanager.textForFind()) + if self.__replace: + self.__viewmanager.showReplaceWidget() + else: + self.__viewmanager.showSearchWidget() return self.__findBackwards = False @@ -255,9 +371,9 @@ ok = self.__findNextPrev(txt, False) if ok: - if self.replace: - self.ui.replaceButton.setEnabled(True) - self.ui.replaceSearchButton.setEnabled(True) + if self.__replace: + self.__setReplaceSelectionEnabled(True) + self.__setReplaceAndSearchEnabled(True) else: E5MessageBox.information( self, self.windowTitle(), @@ -275,7 +391,7 @@ Public slot to find the next previous of text. """ if not self.havefound or not self.ui.findtextCombo.currentText(): - self.show(self.viewmanager.textForFind()) + self.show(self.__viewmanager.textForFind()) return self.__findBackwards = True @@ -292,9 +408,9 @@ ok = self.__findNextPrev(txt, True) if ok: - if self.replace: - self.ui.replaceButton.setEnabled(True) - self.ui.replaceSearchButton.setEnabled(True) + if self.__replace: + self.__setReplaceSelectionEnabled(True) + self.__setReplaceAndSearchEnabled(True) else: E5MessageBox.information( self, self.windowTitle(), @@ -316,7 +432,7 @@ @param txt text to search for (string) """ - aw = self.viewmanager.activeWindow() + aw = self.__viewmanager.activeWindow() lineFrom = 0 indexFrom = 0 lineTo = -1 @@ -370,7 +486,7 @@ if Preferences.getEditor("SearchMarkersEnabled"): self.__markOccurrences(txt) - aw = self.viewmanager.activeWindow() + aw = self.__viewmanager.activeWindow() aw.hideFindIndicator() cline, cindex = aw.getCursorPosition() @@ -553,7 +669,7 @@ @param text text to be shown in the findtext edit (string) """ - self.replace = False + self.__replace = False self.ui.findtextCombo.clear() self.ui.findtextCombo.addItems(self.findHistory) @@ -567,20 +683,13 @@ self.ui.wrapCheckBox.setChecked(True) self.ui.regexpCheckBox.setChecked(False) - aw = self.viewmanager.activeWindow() + aw = self.__viewmanager.activeWindow() self.updateSelectionCheckBox(aw) - self.findNextAct.setShortcut(self.viewmanager.searchNextAct.shortcut()) - self.findNextAct.setAlternateShortcut( - self.viewmanager.searchNextAct.alternateShortcut()) - self.findNextAct.setShortcutContext(Qt.WidgetShortcut) - self.findPrevAct.setShortcut(self.viewmanager.searchPrevAct.shortcut()) - self.findPrevAct.setAlternateShortcut( - self.viewmanager.searchPrevAct.alternateShortcut()) - self.findPrevAct.setShortcutContext(Qt.WidgetShortcut) - self.havefound = True self.__findBackwards = False + + self.__setShortcuts() def selectionChanged(self): """ @@ -610,7 +719,21 @@ self.ui.selectionCheckBox.setEnabled(False) self.ui.selectionCheckBox.setChecked(False) self.__selections = [] - + + def replace(self): + """ + Public method to replace the current selection. + """ + if self.ui.replaceButton.isEnabled(): + self.__doReplace(False) + + def replaceSearch(self): + """ + Public method to replace the current selection and search again. + """ + if self.ui.replaceSearchButton.isEnabled(): + self.__doReplace(True) + @pyqtSlot() def on_replaceButton_clicked(self): """ @@ -651,7 +774,7 @@ self.ui.replacetextCombo.clear() self.ui.replacetextCombo.addItems(self.replaceHistory) - aw = self.viewmanager.activeWindow() + aw = self.__viewmanager.activeWindow() aw.hideFindIndicator() aw.replace(rtxt) @@ -659,17 +782,24 @@ ok = self.__findNextPrev(ftxt, self.__findBackwards) if not ok: - self.ui.replaceButton.setEnabled(False) - self.ui.replaceSearchButton.setEnabled(False) + self.__setReplaceSelectionEnabled(False) + self.__setReplaceAndSearchEnabled(False) E5MessageBox.information( self, self.windowTitle(), self.tr("'{0}' was not found.").format(ftxt)) else: - self.ui.replaceButton.setEnabled(False) - self.ui.replaceSearchButton.setEnabled(False) + self.__setReplaceSelectionEnabled(False) + self.__setReplaceAndSearchEnabled(False) self.__finding = False + def replaceAll(self): + """ + Public method to replace all occurrences. + """ + if self.ui.replaceAllButton.isEnabled(): + self.on_replaceAllButton_clicked() + @pyqtSlot() def on_replaceAllButton_clicked(self): """ @@ -695,7 +825,7 @@ self.ui.replacetextCombo.clear() self.ui.replacetextCombo.addItems(self.replaceHistory) - aw = self.viewmanager.activeWindow() + aw = self.__viewmanager.activeWindow() aw.hideFindIndicator() cline, cindex = aw.getCursorPosition() boundary = self.__selectionBoundary() @@ -779,8 +909,8 @@ aw.endUndoAction() if wordWrap: self.ui.wrapCheckBox.setChecked(True) - self.ui.replaceButton.setEnabled(False) - self.ui.replaceSearchButton.setEnabled(False) + self.__setReplaceSelectionEnabled(False) + self.__setReplaceAndSearchEnabled(False) if found: E5MessageBox.information( @@ -804,7 +934,7 @@ @param text text to be shown in the findtext edit """ - self.replace = True + self.__replace = True self.ui.findtextCombo.clear() self.ui.findtextCombo.addItems(self.findHistory) @@ -823,7 +953,7 @@ self.havefound = True - aw = self.viewmanager.activeWindow() + aw = self.__viewmanager.activeWindow() self.updateSelectionCheckBox(aw) if aw.hasSelectedText(): line1, index1, line2, index2 = aw.getSelection() @@ -831,14 +961,7 @@ aw.setSelection(line1, index1, line1, index1) self.findNext() - self.findNextAct.setShortcut(self.viewmanager.searchNextAct.shortcut()) - self.findNextAct.setAlternateShortcut( - self.viewmanager.searchNextAct.alternateShortcut()) - self.findNextAct.setShortcutContext(Qt.WidgetShortcut) - self.findPrevAct.setShortcut(self.viewmanager.searchPrevAct.shortcut()) - self.findPrevAct.setAlternateShortcut( - self.viewmanager.searchPrevAct.alternateShortcut()) - self.findPrevAct.setShortcutContext(Qt.WidgetShortcut) + self.__setShortcuts() def show(self, text=''): """ @@ -846,7 +969,7 @@ @param text text to be shown in the findtext edit (string) """ - if self.replace: + if self.__replace: self.__showReplace(text) else: self.__showFind(text) @@ -858,7 +981,7 @@ """ Private slot to close the widget. """ - aw = self.viewmanager.activeWindow() + aw = self.__viewmanager.activeWindow() if aw: aw.hideFindIndicator() @@ -874,7 +997,7 @@ @param event reference to the key press event (QKeyEvent) """ if event.key() == Qt.Key_Escape: - aw = self.viewmanager.activeWindow() + aw = self.__viewmanager.activeWindow() if aw: aw.setFocus(Qt.ActiveWindowFocusReason) aw.hideFindIndicator() @@ -967,6 +1090,24 @@ """ self.__searchReplaceWidget.findPrev() + def replace(self): + """ + Public method to replace the current selection. + """ + self.__searchReplaceWidget.replace() + + def replaceSearch(self): + """ + Public method to replace the current selection and search again. + """ + self.__searchReplaceWidget.replaceSearch() + + def replaceAll(self): + """ + Public method to replace all occurrences. + """ + self.__searchReplaceWidget.replaceAll() + def selectionChanged(self): """ Public slot tracking changes of selected text.