diff --git a/src/widgets/widgets/qplaintextedit.cpp b/src/widgets/widgets/qplaintextedit.cpp index d67e4735b3..6b9e2640db 100644 --- a/src/widgets/widgets/qplaintextedit.cpp +++ b/src/widgets/widgets/qplaintextedit.cpp @@ -2798,6 +2798,27 @@ bool QPlainTextEdit::find(const QString &exp, QTextDocument::FindFlags options) return d->control->find(exp, options); } +/*! + \fn bool QPlainTextEdit::find(const QRegExp &exp, QTextDocument::FindFlags options) + + \since 5.3 + \overload + + Finds the next occurrence, matching the regular expression, \a exp, using the given + \a options. The QTextDocument::FindCaseSensitively option is ignored for this overload, + use QRegExp::caseSensitivity instead. + + Returns \c true if a match was found and changes the cursor to select the match; + otherwise returns \c false. +*/ +#ifndef QT_NO_REGEXP +bool QPlainTextEdit::find(const QRegExp &exp, QTextDocument::FindFlags options) +{ + Q_D(QPlainTextEdit); + return d->control->find(exp, options); +} +#endif + /*! \fn void QPlainTextEdit::copyAvailable(bool yes) diff --git a/src/widgets/widgets/qplaintextedit.h b/src/widgets/widgets/qplaintextedit.h index c276c23571..1fb4625fb1 100644 --- a/src/widgets/widgets/qplaintextedit.h +++ b/src/widgets/widgets/qplaintextedit.h @@ -145,6 +145,9 @@ public: bool centerOnScroll() const; bool find(const QString &exp, QTextDocument::FindFlags options = 0); +#ifndef QT_NO_REGEXP + bool find(const QRegExp &exp, QTextDocument::FindFlags options = 0); +#endif inline QString toPlainText() const { return document()->toPlainText(); } diff --git a/src/widgets/widgets/qtextedit.cpp b/src/widgets/widgets/qtextedit.cpp index e47abace4d..e4a705464a 100644 --- a/src/widgets/widgets/qtextedit.cpp +++ b/src/widgets/widgets/qtextedit.cpp @@ -2455,6 +2455,27 @@ bool QTextEdit::find(const QString &exp, QTextDocument::FindFlags options) return d->control->find(exp, options); } +/*! + \fn bool QTextEdit::find(const QRegExp &exp, QTextDocument::FindFlags options) + + \since 5.3 + \overload + + Finds the next occurrence, matching the regular expression, \a exp, using the given + \a options. The QTextDocument::FindCaseSensitively option is ignored for this overload, + use QRegExp::caseSensitivity instead. + + Returns \c true if a match was found and changes the cursor to select the match; + otherwise returns \c false. +*/ +#ifndef QT_NO_REGEXP +bool QTextEdit::find(const QRegExp &exp, QTextDocument::FindFlags options) +{ + Q_D(QTextEdit); + return d->control->find(exp, options); +} +#endif + /*! \fn void QTextEdit::copyAvailable(bool yes) diff --git a/src/widgets/widgets/qtextedit.h b/src/widgets/widgets/qtextedit.h index 06ec5fb889..406d8b2c4b 100644 --- a/src/widgets/widgets/qtextedit.h +++ b/src/widgets/widgets/qtextedit.h @@ -162,6 +162,9 @@ public: void setWordWrapMode(QTextOption::WrapMode policy); bool find(const QString &exp, QTextDocument::FindFlags options = 0); +#ifndef QT_NO_REGEXP + bool find(const QRegExp &exp, QTextDocument::FindFlags options = 0); +#endif QString toPlainText() const; #ifndef QT_NO_TEXTHTMLPARSER diff --git a/src/widgets/widgets/qwidgettextcontrol.cpp b/src/widgets/widgets/qwidgettextcontrol.cpp index 9112e738da..06b513f3e0 100644 --- a/src/widgets/widgets/qwidgettextcontrol.cpp +++ b/src/widgets/widgets/qwidgettextcontrol.cpp @@ -2958,6 +2958,19 @@ bool QWidgetTextControl::find(const QString &exp, QTextDocument::FindFlags optio return true; } +#ifndef QT_NO_REGEXP +bool QWidgetTextControl::find(const QRegExp &exp, QTextDocument::FindFlags options) +{ + Q_D(QWidgetTextControl); + QTextCursor search = d->doc->find(exp, d->cursor, options); + if (search.isNull()) + return false; + + setTextCursor(search); + return true; +} +#endif + QString QWidgetTextControl::toPlainText() const { return document()->toPlainText(); diff --git a/src/widgets/widgets/qwidgettextcontrol_p.h b/src/widgets/widgets/qwidgettextcontrol_p.h index e857fffba5..847371e194 100644 --- a/src/widgets/widgets/qwidgettextcontrol_p.h +++ b/src/widgets/widgets/qwidgettextcontrol_p.h @@ -110,6 +110,9 @@ public: QTextCharFormat currentCharFormat() const; bool find(const QString &exp, QTextDocument::FindFlags options = 0); +#ifndef QT_NO_REGEXP + bool find(const QRegExp &exp, QTextDocument::FindFlags options = 0); +#endif QString toPlainText() const; #ifndef QT_NO_TEXTHTMLPARSER diff --git a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp index 11c4e238ec..61eb390fd3 100644 --- a/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp +++ b/tests/auto/widgets/widgets/qplaintextedit/tst_qplaintextedit.cpp @@ -149,6 +149,11 @@ private slots: void insertAndScrollToBottom(); void inputMethodQueryImHints_data(); void inputMethodQueryImHints(); +#ifndef QT_NO_REGEXP + void findWithRegExp(); + void findBackwardWithRegExp(); + void findWithRegExpReturnsFalseIfNoMoreResults(); +#endif private: void createSelection(); @@ -1523,5 +1528,44 @@ void tst_QPlainTextEdit::inputMethodQueryImHints() QCOMPARE(static_cast(value.toInt()), hints); } +#ifndef QT_NO_REGEXP +void tst_QPlainTextEdit::findWithRegExp() +{ + ed->setPlainText(QStringLiteral("arbitrary text")); + QRegExp rx("\\w{2}xt"); + + bool found = ed->find(rx); + + QVERIFY(found == true); + QCOMPARE(ed->textCursor().selectedText(), QStringLiteral("text")); +} + +void tst_QPlainTextEdit::findBackwardWithRegExp() +{ + ed->setPlainText(QStringLiteral("arbitrary text")); + QTextCursor cursor = ed->textCursor(); + cursor.movePosition(QTextCursor::End); + ed->setTextCursor(cursor); + QRegExp rx("a\\w*t"); + + bool found = ed->find(rx, QTextDocument::FindBackward); + + QVERIFY(found == true); + QCOMPARE(ed->textCursor().selectedText(), QStringLiteral("arbit")); +} + +void tst_QPlainTextEdit::findWithRegExpReturnsFalseIfNoMoreResults() +{ + ed->setPlainText(QStringLiteral("arbitrary text")); + QRegExp rx("t.xt"); + ed->find(rx); + + bool found = ed->find(rx); + + QVERIFY(found == false); + QCOMPARE(ed->textCursor().selectedText(), QStringLiteral("text")); +} +#endif + QTEST_MAIN(tst_QPlainTextEdit) #include "tst_qplaintextedit.moc" diff --git a/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp b/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp index d06807eedb..53c76a0da6 100644 --- a/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp +++ b/tests/auto/widgets/widgets/qtextedit/tst_qtextedit.cpp @@ -205,6 +205,12 @@ private slots: void countTextChangedOnRemove(); +#ifndef QT_NO_REGEXP + void findWithRegExp(); + void findBackwardWithRegExp(); + void findWithRegExpReturnsFalseIfNoMoreResults(); +#endif + private: void createSelection(); int blockCount() const; @@ -2515,5 +2521,44 @@ void tst_QTextEdit::countTextChangedOnRemove() QCOMPARE(spy.count(), 1); } +#ifndef QT_NO_REGEXP +void tst_QTextEdit::findWithRegExp() +{ + ed->setHtml(QStringLiteral("arbitrary text")); + QRegExp rx("\\w{2}xt"); + + bool found = ed->find(rx); + + QVERIFY(found == true); + QCOMPARE(ed->textCursor().selectedText(), QStringLiteral("text")); +} + +void tst_QTextEdit::findBackwardWithRegExp() +{ + ed->setPlainText(QStringLiteral("arbitrary text")); + QTextCursor cursor = ed->textCursor(); + cursor.movePosition(QTextCursor::End); + ed->setTextCursor(cursor); + QRegExp rx("a\\w*t"); + + bool found = ed->find(rx, QTextDocument::FindBackward); + + QVERIFY(found == true); + QCOMPARE(ed->textCursor().selectedText(), QStringLiteral("arbit")); +} + +void tst_QTextEdit::findWithRegExpReturnsFalseIfNoMoreResults() +{ + ed->setPlainText(QStringLiteral("arbitrary text")); + QRegExp rx("t.xt"); + ed->find(rx); + + bool found = ed->find(rx); + + QVERIFY(found == false); + QCOMPARE(ed->textCursor().selectedText(), QStringLiteral("text")); +} +#endif + QTEST_MAIN(tst_QTextEdit) #include "tst_qtextedit.moc"