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