E5Gui/E5TextEditSearchWidget.py

changeset 4039
661167a99aef
child 4586
9221c0c5c66f
diff -r 175f13f4eb9d -r 661167a99aef E5Gui/E5TextEditSearchWidget.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/E5Gui/E5TextEditSearchWidget.py	Thu Jan 15 19:29:38 2015 +0100
@@ -0,0 +1,141 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2012 - 2015 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a horizontal search widget for QTextEdit.
+"""
+
+from __future__ import unicode_literals
+
+from PyQt5.QtCore import pyqtSlot, Qt
+from PyQt5.QtGui import QTextDocument
+from PyQt5.QtWidgets import QWidget
+
+from E5Gui import E5MessageBox
+
+from .Ui_E5TextEditSearchWidget import Ui_E5TextEditSearchWidget
+
+import UI.PixmapCache
+
+
+class E5TextEditSearchWidget(QWidget, Ui_E5TextEditSearchWidget):
+    """
+    Class implementing a horizontal search widget for QTextEdit.
+    """
+    def __init__(self, parent=None):
+        """
+        Constructor
+        
+        @param parent reference to the parent widget (QWidget)
+        """
+        super(E5TextEditSearchWidget, self).__init__(parent)
+        self.setupUi(self)
+        
+        self.__textedit = None
+        self.__findBackwards = True
+        
+        self.findPrevButton.setIcon(UI.PixmapCache.getIcon("1leftarrow.png"))
+        self.findNextButton.setIcon(UI.PixmapCache.getIcon("1rightarrow.png"))
+        
+        self.findHistory = []
+        
+        self.findtextCombo.setCompleter(None)
+        self.findtextCombo.lineEdit().returnPressed.connect(
+            self.__findByReturnPressed)
+        
+        self.__setSearchButtons(False)
+    
+    def attachTextEdit(self, textedit):
+        """
+        Public method to attach a QTextEdit widget.
+        
+        @param textedit reference to the QTextEdit to be attached (QTextEdit)
+        """
+        self.__textedit = textedit
+    
+    def keyPressEvent(self, event):
+        """
+        Protected slot to handle key press events.
+        
+        @param event reference to the key press event (QKeyEvent)
+        """
+        if self.__textedit and event.key() == Qt.Key_Escape:
+            self.__textedit.setFocus(Qt.ActiveWindowFocusReason)
+            event.accept()
+    
+    @pyqtSlot(str)
+    def on_findtextCombo_editTextChanged(self, txt):
+        """
+        Private slot to enable/disable the find buttons.
+        
+        @param txt text of the combobox (string)
+        """
+        self.__setSearchButtons(txt != "")
+    
+    def __setSearchButtons(self, enabled):
+        """
+        Private slot to set the state of the search buttons.
+        
+        @param enabled flag indicating the state (boolean)
+        """
+        self.findPrevButton.setEnabled(enabled)
+        self.findNextButton.setEnabled(enabled)
+    
+    def __findByReturnPressed(self):
+        """
+        Private slot to handle the returnPressed signal of the findtext
+        combobox.
+        """
+        self.__find(self.__findBackwards)
+    
+    @pyqtSlot()
+    def on_findPrevButton_clicked(self):
+        """
+        Private slot to find the previous occurrence.
+        """
+        self.__find(True)
+    
+    @pyqtSlot()
+    def on_findNextButton_clicked(self):
+        """
+        Private slot to find the next occurrence.
+        """
+        self.__find(False)
+    
+    def __find(self, backwards):
+        """
+        Private method to search the associated text edit.
+        
+        @param backwards flag indicating a backwards search (boolean)
+        """
+        if not self.__textedit:
+            return
+        
+        txt = self.findtextCombo.currentText()
+        self.__findBackwards = backwards
+        
+        # This moves any previous occurrence of this statement to the head
+        # of the list and updates the combobox
+        if txt in self.findHistory:
+            self.findHistory.remove(txt)
+        self.findHistory.insert(0, txt)
+        self.findtextCombo.clear()
+        self.findtextCombo.addItems(self.findHistory)
+        
+        if backwards:
+            flags = QTextDocument.FindFlags(QTextDocument.FindBackward)
+        else:
+            flags = QTextDocument.FindFlags()
+        if self.caseCheckBox.isChecked():
+            flags |= QTextDocument.FindCaseSensitively
+        if self.wordCheckBox.isChecked():
+            flags |= QTextDocument.FindWholeWords
+        ok = self.__textedit.find(txt, flags)
+        
+        if not ok:
+            E5MessageBox.information(
+                self,
+                self.tr("Find"),
+                self.tr("""'{0}' was not found.""").format(txt))

eric ide

mercurial