QScintilla/SearchReplaceWidget.py

changeset 5742
dc9cd8059221
parent 5389
9b1c800daff3
child 5822
c61cd6803da2
--- 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.

eric ide

mercurial