From 67466d0fb8c6d7cc6e5f070677739abeb188bfa3 Mon Sep 17 00:00:00 2001 From: con <qtc-committer@nokia.com> Date: Fri, 29 May 2009 16:52:12 +0200 Subject: [PATCH] Support regular expressions in basic text editors. --- src/plugins/find/basetextfind.cpp | 21 +++++++++++++-------- src/plugins/find/findtoolbar.cpp | 20 ++++++++++++++++++++ src/plugins/find/findtoolbar.h | 2 ++ src/plugins/find/ifindsupport.h | 1 + src/plugins/find/textfindconstants.h | 1 + src/plugins/texteditor/basetexteditor.cpp | 3 ++- 6 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/plugins/find/basetextfind.cpp b/src/plugins/find/basetextfind.cpp index fad7d469aa8..6f18db47900 100644 --- a/src/plugins/find/basetextfind.cpp +++ b/src/plugins/find/basetextfind.cpp @@ -166,14 +166,16 @@ int BaseTextFind::replaceAll(const QString &before, const QString &after, editCursor.movePosition(QTextCursor::Start); editCursor.beginEditBlock(); int count = 0; - QTextCursor found; - found = document()->find(before, editCursor, IFindSupport::textDocumentFlagsForFindFlags(findFlags)); + QRegExp regexp(before); + regexp.setPatternSyntax((findFlags&IFindSupport::FindRegularExpression) ? QRegExp::RegExp : QRegExp::FixedString); + regexp.setCaseSensitivity((findFlags&IFindSupport::FindCaseSensitively) ? Qt::CaseSensitive : Qt::CaseInsensitive); + QTextCursor found = document()->find(regexp, editCursor, IFindSupport::textDocumentFlagsForFindFlags(findFlags)); while (!found.isNull() && inScope(found.selectionStart(), found.selectionEnd())) { ++count; editCursor.setPosition(found.selectionStart()); editCursor.setPosition(found.selectionEnd(), QTextCursor::KeepAnchor); editCursor.insertText(after); - found = document()->find(before, editCursor, IFindSupport::textDocumentFlagsForFindFlags(findFlags)); + found = document()->find(regexp, editCursor, IFindSupport::textDocumentFlagsForFindFlags(findFlags)); } editCursor.endEditBlock(); return count; @@ -187,17 +189,20 @@ bool BaseTextFind::find(const QString &txt, setTextCursor(start); return true; } - QTextCursor found = document()->find(txt, start, IFindSupport::textDocumentFlagsForFindFlags(findFlags)); + QRegExp regexp(txt); + regexp.setPatternSyntax((findFlags&IFindSupport::FindRegularExpression) ? QRegExp::RegExp : QRegExp::FixedString); + regexp.setCaseSensitivity((findFlags&IFindSupport::FindCaseSensitively) ? Qt::CaseSensitive : Qt::CaseInsensitive); + QTextCursor found = document()->find(regexp, start, IFindSupport::textDocumentFlagsForFindFlags(findFlags)); if (!m_findScope.isNull()) { // scoped if (found.isNull() || !inScope(found.selectionStart(), found.selectionEnd())) { - if ((findFlags&QTextDocument::FindBackward) == 0) + if ((findFlags&IFindSupport::FindBackward) == 0) start.setPosition(m_findScope.selectionStart()); else start.setPosition(m_findScope.selectionEnd()); - found = document()->find(txt, start, IFindSupport::textDocumentFlagsForFindFlags(findFlags)); + found = document()->find(regexp, start, IFindSupport::textDocumentFlagsForFindFlags(findFlags)); if (found.isNull() || !inScope(found.selectionStart(), found.selectionEnd())) return false; } @@ -205,11 +210,11 @@ bool BaseTextFind::find(const QString &txt, // entire document if (found.isNull()) { - if ((findFlags&QTextDocument::FindBackward) == 0) + if ((findFlags&IFindSupport::FindBackward) == 0) start.movePosition(QTextCursor::Start); else start.movePosition(QTextCursor::End); - found = document()->find(txt, start, IFindSupport::textDocumentFlagsForFindFlags(findFlags)); + found = document()->find(regexp, start, IFindSupport::textDocumentFlagsForFindFlags(findFlags)); if (found.isNull()) { return false; } diff --git a/src/plugins/find/findtoolbar.cpp b/src/plugins/find/findtoolbar.cpp index 2b5056dca8c..cedfbbaf9a5 100644 --- a/src/plugins/find/findtoolbar.cpp +++ b/src/plugins/find/findtoolbar.cpp @@ -214,6 +214,14 @@ FindToolBar::FindToolBar(FindPlugin *plugin, CurrentDocumentFind *currentDocumen connect(m_wholeWordAction, SIGNAL(triggered(bool)), this, SLOT(setWholeWord(bool))); lineEditMenu->addAction(m_wholeWordAction); + m_regularExpressionAction = new QAction(tr("Use Regular Expressions"), this); + m_regularExpressionAction->setCheckable(true); + m_regularExpressionAction->setChecked(false); + cmd = am->registerAction(m_regularExpressionAction, Constants::REGULAR_EXPRESSIONS, globalcontext); + mfind->addAction(cmd, Constants::G_FIND_FLAGS); + connect(m_regularExpressionAction, SIGNAL(triggered(bool)), this, SLOT(setRegularExpressions(bool))); + lineEditMenu->addAction(m_regularExpressionAction); + connect(m_currentDocumentFind, SIGNAL(changed()), this, SLOT(updateActions())); updateActions(); updateIcons(); @@ -278,6 +286,7 @@ void FindToolBar::updateActions() m_replaceAllAction->setEnabled(replaceEnabled); m_caseSensitiveAction->setEnabled(enabled); m_wholeWordAction->setEnabled(enabled); + m_regularExpressionAction->setEnabled(enabled); if (QApplication::clipboard()->supportsFindBuffer()) m_enterFindStringAction->setEnabled(enabled); bool replaceFocus = m_ui.replaceEdit->hasFocus(); @@ -447,10 +456,13 @@ void FindToolBar::updateFlagMenus() { bool wholeOnly = ((m_findFlags & IFindSupport::FindWholeWords)); bool sensitive = ((m_findFlags & IFindSupport::FindCaseSensitively)); + bool regexp = ((m_findFlags & IFindSupport::FindRegularExpression)); if (m_wholeWordAction->isChecked() != wholeOnly) m_wholeWordAction->setChecked(wholeOnly); if (m_caseSensitiveAction->isChecked() != sensitive) m_caseSensitiveAction->setChecked(sensitive); + if (m_regularExpressionAction->isChecked() != regexp) + m_regularExpressionAction->setChecked(regexp); } bool FindToolBar::setFocusToCurrentFindSupport() @@ -506,6 +518,7 @@ void FindToolBar::writeSettings() settings->setValue("Backward", QVariant((m_findFlags & IFindSupport::FindBackward) != 0)); settings->setValue("CaseSensitively", QVariant((m_findFlags & IFindSupport::FindCaseSensitively) != 0)); settings->setValue("WholeWords", QVariant((m_findFlags & IFindSupport::FindWholeWords) != 0)); + settings->setValue("RegularExpression", QVariant((m_findFlags & IFindSupport::FindRegularExpression) != 0)); settings->endGroup(); settings->endGroup(); } @@ -522,6 +535,8 @@ void FindToolBar::readSettings() flags |= IFindSupport::FindCaseSensitively; if (settings->value("WholeWords", false).toBool()) flags |= IFindSupport::FindWholeWords; + if (settings->value("RegularExpression", false).toBool()) + flags |= IFindSupport::FindRegularExpression; settings->endGroup(); settings->endGroup(); m_findFlags = flags; @@ -555,3 +570,8 @@ void FindToolBar::setWholeWord(bool wholeOnly) { setFindFlag(IFindSupport::FindWholeWords, wholeOnly); } + +void FindToolBar::setRegularExpressions(bool regexp) +{ + setFindFlag(IFindSupport::FindRegularExpression, regexp); +} diff --git a/src/plugins/find/findtoolbar.h b/src/plugins/find/findtoolbar.h index c132a5fd88a..0e5d86bc900 100644 --- a/src/plugins/find/findtoolbar.h +++ b/src/plugins/find/findtoolbar.h @@ -78,6 +78,7 @@ private slots: void setCaseSensitive(bool sensitive); void setWholeWord(bool wholeOnly); + void setRegularExpressions(bool regexp); protected: bool focusNextPrevChild(bool next); @@ -110,6 +111,7 @@ private: QAction *m_replaceAllAction; QAction *m_caseSensitiveAction; QAction *m_wholeWordAction; + QAction *m_regularExpressionAction; QWidget *m_widget; IFindSupport::FindFlags m_findFlags; }; diff --git a/src/plugins/find/ifindsupport.h b/src/plugins/find/ifindsupport.h index e4b0dc20a4f..259700a679a 100644 --- a/src/plugins/find/ifindsupport.h +++ b/src/plugins/find/ifindsupport.h @@ -46,6 +46,7 @@ public: FindBackward = 0x01, FindCaseSensitively = 0x02, FindWholeWords = 0x04, + FindRegularExpression = 0x08 }; Q_DECLARE_FLAGS(FindFlags, FindFlag); diff --git a/src/plugins/find/textfindconstants.h b/src/plugins/find/textfindconstants.h index a430c998976..4aefcd84c8b 100644 --- a/src/plugins/find/textfindconstants.h +++ b/src/plugins/find/textfindconstants.h @@ -49,6 +49,7 @@ const char * const REPLACE_PREVIOUS = "Find.ReplacePrevious"; const char * const REPLACE_ALL = "Find.ReplaceAll"; const char * const CASE_SENSITIVE = "Find.CaseSensitive"; const char * const WHOLE_WORDS = "Find.WholeWords"; +const char * const REGULAR_EXPRESSIONS="Find.RegularExpressions"; const char * const TASK_SEARCH = "Find.Task.Search"; } // namespace Constants diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp index 170efaa8cb8..a4fb24dc41d 100644 --- a/src/plugins/texteditor/basetexteditor.cpp +++ b/src/plugins/texteditor/basetexteditor.cpp @@ -3446,7 +3446,8 @@ void BaseTextEditor::highlightSearchResults(const QString &txt, Find::IFindSuppo if (d->m_searchExpr.pattern() == txt) return; d->m_searchExpr.setPattern(txt); - d->m_searchExpr.setPatternSyntax(QRegExp::FixedString); + d->m_searchExpr.setPatternSyntax((findFlags & Find::IFindSupport::FindRegularExpression) ? + QRegExp::RegExp : QRegExp::FixedString); d->m_searchExpr.setCaseSensitivity((findFlags & Find::IFindSupport::FindCaseSensitively) ? Qt::CaseSensitive : Qt::CaseInsensitive); d->m_findFlags = findFlags; -- GitLab