def __init__(self, parent):
        """
        Initializes the find & replace form
        """
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_FindReplaceForm()
        self.ui.setupUi(self)

        self.ui.errorLabel.setText("")

        self.ui.textToFind.textChanged.connect(self.text_to_find_changed)
        self.ui.textToFind.textChanged.connect(self.validate_regexp)

        self.ui.regexCheckBox.toggled.connect(self.regexp_selected)

        self.ui.findButton.clicked.connect(self.find)
        self.ui.closeButton.clicked.connect(parent.close)

        self.ui.replaceButton.clicked.connect(self.replace)
        self.ui.replaceAllButton.clicked.connect(self.replace_all)

        self.textedit = None
        self.regexp = QtCore.QRegExp()
        self.textcursor = None
class FindReplaceForm(QtGui.QWidget):

    def __init__(self, parent):
        """
        Initializes the find & replace form
        """
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_FindReplaceForm()
        self.ui.setupUi(self)

        self.ui.errorLabel.setText("")

        self.ui.textToFind.textChanged.connect(self.text_to_find_changed)
        self.ui.textToFind.textChanged.connect(self.validate_regexp)

        self.ui.regexCheckBox.toggled.connect(self.regexp_selected)

        self.ui.findButton.clicked.connect(self.find)
        self.ui.closeButton.clicked.connect(parent.close)

        self.ui.replaceButton.clicked.connect(self.replace)
        self.ui.replaceAllButton.clicked.connect(self.replace_all)

        self.textedit = None
        self.regexp = QtCore.QRegExp()
        self.textcursor = None

    def hide_replace_widgets(self):
        """
        Hide widgets used to replace
        """
        self.ui.replaceLabel.setVisible(False)
        self.ui.textToReplace.setVisible(False)
        self.ui.replaceButton.setVisible(False)
        self.ui.replaceAllButton.setVisible(False)

    def set_text_edit(self, textedit):
        """
        Set the text edit and enable the buttons

        ...

        Parameters
        ----------
        textedit : str
        """
        self.textedit = textedit
        self.textedit.copyAvailable.connect(self.ui.replaceButton.setEnabled)
        self.textedit.copyAvailable.connect(
            self.ui.replaceAllButton.setEnabled)

        self.textcursor = self.textedit.textCursor()

    def changeEvent(self, event):
        """
        If the language has changed retranlate the UI accordingly

        ...

        Parameters
        ----------
        event : QEvent
        """
        QtGui.QWidget.changeEvent(self, event)
        if event.type() == QtCore.QEvent.LanguageChange:
            self.ui.retranslateUi(self)

    def text_to_find_changed(self, _):
        """
        Enable the find button if text to find is not null
        """
        self.ui.findButton.setEnabled(self.ui.textToFind.size() > 0)

    def regexp_selected(self, sel):
        """
        Validate regexp

        ...

        Parameters
        ----------
        sel : bool
        """
        if sel:
            self.validate_regexp(self.ui.textToFind.text())
        else:
            self.validate_regexp("")

    def validate_regexp(self, regexp):
        """
        Check if regexp is valid

        ...

        Parameters
        ----------
        regexp : str
        """
        if (not self.ui.regexCheckBox.isChecked()) or regexp.size() == 0:
            self.ui.errorLabel.setText("")

        self.regexp = QtCore.QRegExp(regexp,
            QtCore.Qt.CaseSensitive
            if self.ui.caseCheckBox.isChecked() else QtCore.Qt.CaseInsensitive)

        if self.regexp.isValid():
            self.show_error("")
        else:
            self.show_error(unicode(regexp.errorString()))

    def show_error(self, error):
        """
        Diplay error message

        ...

        Parameters
        ----------
        error : str
        """
        if (error == ""):
            self.ui.errorLabel.setText("")
        else:
            self.ui.errorLabel.setText("<span style=\"font-weight:600; color:#ff0000;\">{0}</span>".format(error))

    def show_message(self, message):
        """
        Display message

        ...

        Parameters
        ----------
        message : str
        """
        if (message == ""):
            self.ui.errorLabel.setText("")
        else:
            self.ui.errorLabel.setText("<span style=\"font-weight:600; color:green;\">{0}</span>".format(message))

    def find(self, next = None):
        """
        Search / find text

        ...

        Parameters
        ----------
        next : None
        """

        if not self.textedit:
            return

        if not next:
            next = self.ui.downRadioButton.isChecked()

        back = not next
        toSearch = self.ui.textToFind.text()
        result = False

        flags = QtGui.QTextDocument.FindFlags()
        if (back):
            flags |= QtGui.QTextDocument.FindBackward
        if self.ui.caseCheckBox.isChecked():
            flags |= QtGui.QTextDocument.FindCaseSensitively
        if self.ui.wholeCheckBox.isChecked():
            flags |= QtGui.QTextDocument.FindWholeWords

        if self.ui.regexCheckBox.isChecked():
            self.regexp = QtCore.QRegExp(toSearch,
                QtCore.Qt.CaseSensitive
                if self.ui.caseCheckBox.isChecked()
                else QtCore.Qt.CaseInsensitive)
            self.textcursor = self.textedit.document().find(regexp, self.textcursor, flags)
            self.textedit.setTextCursor(self.textcursor)
            result = not self.textcursor.isNull()
        else:
            result = self.textedit.find(toSearch, flags)

        if result:
            self.show_error("")
        else:
            self.show_error(self.tr("no text found"))
            self.textcursor.setPosition(0)
            self.textedit.setTextCursor(self.textcursor)

    def replace(self):
        """
        Replaces text
        """
        if not self.textedit.textCursor().hasSelection():
            self.find()
        else:
            self.textedit.textCursor().insertText(self.ui.textToReplace.text())
            self.find()

    def replace_all(self):
        """
        Replaces all the given text
        """
        i = 0
        while self.textedit.textCursor().hasSelection():
            self.textedit.textCursor().insertText(self.ui.textToReplace.text())
            self.find()
            i += 1
        self.show_message(unicode(self.tr("Replaced {0} occurrence(s)")).format(i))