| /* |
| * Copyright (C) 2009 Lorenzo Bettini <http://www.lorenzobettini.it> |
| * See COPYING file that comes with this distribution |
| */ |
| |
| #include <QtGui> |
| #include <QTextEdit> |
| #include <QRegExp> |
| #include <QSettings> |
| |
| #include "varianteditor.h" |
| #include "findreplaceform.h" |
| #include "ui_findreplaceform.h" |
| |
| #define TEXT_TO_FIND "textToFind" |
| #define TEXT_TO_REPLACE "textToReplace" |
| #define DOWN_RADIO "downRadio" |
| #define UP_RADIO "upRadio" |
| #define CASE_CHECK "caseCheck" |
| #define WHOLE_CHECK "wholeCheck" |
| #define REGEXP_CHECK "regexpCheck" |
| |
| FindReplaceForm::FindReplaceForm(QWidget *parent) : |
| QWidget(parent), |
| ui(new Ui::FindReplaceForm), textEdit(0) |
| { |
| ui->setupUi(this); |
| |
| ui->errorLabel->setText(""); |
| |
| connect(ui->textToFind, SIGNAL(textChanged(QString)), this, SLOT(textToFindChanged())); |
| connect(ui->textToFind, SIGNAL(textChanged(QString)), this, SLOT(validateRegExp(QString))); |
| |
| connect(ui->regexCheckBox, SIGNAL(toggled(bool)), this, SLOT(regexpSelected(bool))); |
| |
| connect(ui->findButton, SIGNAL(clicked()), this, SLOT(find())); |
| connect(ui->closeButton, SIGNAL(clicked()), parent, SLOT(close())); |
| |
| connect(ui->replaceButton, SIGNAL(clicked()), this, SLOT(replace())); |
| connect(ui->replaceAllButton, SIGNAL(clicked()), this, SLOT(replaceAll())); |
| } |
| |
| FindReplaceForm::~FindReplaceForm() |
| { |
| delete ui; |
| if(textEdit) |
| delete textEdit; |
| } |
| |
| void FindReplaceForm::hideReplaceWidgets() { |
| ui->replaceLabel->setVisible(false); |
| ui->textToReplace->setVisible(false); |
| ui->replaceButton->setVisible(false); |
| ui->replaceAllButton->setVisible(false); |
| } |
| |
| void FindReplaceForm::setTextEdit(QTextEdit *textEdit_) { |
| textEdit = new VariantEditor(textEdit_); |
| textEdit->connectToSetEnabled(ui->replaceButton); |
| textEdit->connectToSetEnabled(ui->replaceAllButton); |
| } |
| |
| void FindReplaceForm::setTextEdit(QPlainTextEdit *textEdit_) |
| { |
| textEdit = new VariantEditor(textEdit_); |
| textEdit->connectToSetEnabled(ui->replaceButton); |
| textEdit->connectToSetEnabled(ui->replaceAllButton); |
| } |
| |
| void FindReplaceForm::changeEvent(QEvent *e) |
| { |
| QWidget::changeEvent(e); |
| switch (e->type()) { |
| case QEvent::LanguageChange: |
| ui->retranslateUi(this); |
| break; |
| default: |
| break; |
| } |
| } |
| |
| void FindReplaceForm::textToFindChanged() { |
| ui->findButton->setEnabled(ui->textToFind->text().size() > 0); |
| } |
| |
| void FindReplaceForm::regexpSelected(bool sel) { |
| if (sel) |
| validateRegExp(ui->textToFind->text()); |
| else |
| validateRegExp(""); |
| } |
| |
| void FindReplaceForm::validateRegExp(const QString &text) { |
| if (!ui->regexCheckBox->isChecked() || text.size() == 0) { |
| ui->errorLabel->setText(""); |
| return; // nothing to validate |
| } |
| |
| QRegExp reg(text, |
| (ui->caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive)); |
| |
| if (reg.isValid()) { |
| showError(""); |
| } else { |
| showError(reg.errorString()); |
| } |
| } |
| |
| void FindReplaceForm::showError(const QString &error) { |
| if (error == "") { |
| ui->errorLabel->setText(""); |
| } else { |
| ui->errorLabel->setText("<span style=\" font-weight:600; color:#ff0000;\">" + |
| error + |
| "</span>"); |
| } |
| } |
| |
| void FindReplaceForm::showMessage(const QString &message) { |
| if (message == "") { |
| ui->errorLabel->setText(""); |
| } else { |
| ui->errorLabel->setText("<span style=\" font-weight:600; color:green;\">" + |
| message + |
| "</span>"); |
| } |
| } |
| |
| void FindReplaceForm::find() { |
| find(ui->downRadioButton->isChecked()); |
| } |
| |
| void FindReplaceForm::find(bool next) { |
| if (!textEdit) |
| return; // TODO: show some warning? |
| |
| // backward search |
| bool back = !next; |
| |
| const QString &toSearch = ui->textToFind->text(); |
| |
| bool result = false; |
| |
| QTextDocument::FindFlags flags; |
| |
| if (back) |
| flags |= QTextDocument::FindBackward; |
| if (ui->caseCheckBox->isChecked()) |
| flags |= QTextDocument::FindCaseSensitively; |
| if (ui->wholeCheckBox->isChecked()) |
| flags |= QTextDocument::FindWholeWords; |
| |
| if (ui->regexCheckBox->isChecked()) { |
| QRegExp reg(toSearch, |
| (ui->caseCheckBox->isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive)); |
| |
| qDebug() << "searching for regexp: " << reg.pattern(); |
| |
| textCursor = textEdit->document()->find(reg, textCursor, flags); |
| textEdit->setTextCursor(textCursor); |
| result = (!textCursor.isNull()); |
| } else { |
| qDebug() << "searching for: " << toSearch; |
| |
| result = textEdit->find(toSearch, flags); |
| } |
| |
| if (result) { |
| showError(""); |
| } else { |
| showError(tr("no match found")); |
| // move to the beginning of the document for the next find |
| textEdit->setTextCursor(QTextCursor(textEdit->document()->begin())); |
| } |
| } |
| |
| void FindReplaceForm::replace() { |
| if (!textEdit->textCursor().hasSelection()) { |
| find(); |
| } else { |
| textEdit->textCursor().insertText(ui->textToReplace->text()); |
| find(); |
| } |
| } |
| |
| void FindReplaceForm::replaceAll() { |
| int i=0; |
| while (textEdit->textCursor().hasSelection()){ |
| textEdit->textCursor().insertText(ui->textToReplace->text()); |
| find(); |
| i++; |
| } |
| showMessage(tr("Replaced %1 occurrence(s)").arg(i)); |
| } |
| |
| void FindReplaceForm::writeSettings(QSettings &settings, const QString &prefix) { |
| settings.beginGroup(prefix); |
| settings.setValue(TEXT_TO_FIND, ui->textToFind->text()); |
| settings.setValue(TEXT_TO_REPLACE, ui->textToReplace->text()); |
| settings.setValue(DOWN_RADIO, ui->downRadioButton->isChecked()); |
| settings.setValue(UP_RADIO, ui->upRadioButton->isChecked()); |
| settings.setValue(CASE_CHECK, ui->caseCheckBox->isChecked()); |
| settings.setValue(WHOLE_CHECK, ui->wholeCheckBox->isChecked()); |
| settings.setValue(REGEXP_CHECK, ui->regexCheckBox->isChecked()); |
| settings.endGroup(); |
| } |
| |
| void FindReplaceForm::readSettings(QSettings &settings, const QString &prefix) { |
| settings.beginGroup(prefix); |
| ui->textToFind->setText(settings.value(TEXT_TO_FIND, "").toString()); |
| ui->textToReplace->setText(settings.value(TEXT_TO_REPLACE, "").toString()); |
| ui->downRadioButton->setChecked(settings.value(DOWN_RADIO, true).toBool()); |
| ui->upRadioButton->setChecked(settings.value(UP_RADIO, false).toBool()); |
| ui->caseCheckBox->setChecked(settings.value(CASE_CHECK, false).toBool()); |
| ui->wholeCheckBox->setChecked(settings.value(WHOLE_CHECK, false).toBool()); |
| ui->regexCheckBox->setChecked(settings.value(REGEXP_CHECK, false).toBool()); |
| settings.endGroup(); |
| } |