From e38cec518b7481a77b909dac0aaef33cea2e543e Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Mon, 13 Jul 2009 14:48:45 +0200
Subject: [PATCH] Find implementations now tell what find flags are actually
 supported.

---
 src/plugins/bineditor/bineditorplugin.cpp |  5 ++++
 src/plugins/find/basetextfind.cpp         |  6 ++++
 src/plugins/find/basetextfind.h           |  1 +
 src/plugins/find/currentdocumentfind.cpp  |  6 ++++
 src/plugins/find/currentdocumentfind.h    |  1 +
 src/plugins/find/findtoolbar.cpp          | 36 +++++++++++++++++------
 src/plugins/find/findtoolbar.h            |  1 +
 src/plugins/find/ifindsupport.h           |  1 +
 src/plugins/help/helpfindsupport.cpp      | 12 ++++++++
 src/plugins/help/helpfindsupport.h        |  3 ++
 10 files changed, 63 insertions(+), 9 deletions(-)

diff --git a/src/plugins/bineditor/bineditorplugin.cpp b/src/plugins/bineditor/bineditorplugin.cpp
index fab5586963b..99a1b286819 100644
--- a/src/plugins/bineditor/bineditorplugin.cpp
+++ b/src/plugins/bineditor/bineditorplugin.cpp
@@ -63,6 +63,11 @@ public:
     ~BinEditorFind() {}
 
     bool supportsReplace() const { return false; }
+    IFindSupport::FindFlags supportedFindFlags() const
+    {
+        return IFindSupport::FindBackward | IFindSupport::FindCaseSensitively;
+    }
+
     void resetIncrementalSearch() { m_incrementalStartPos = -1; }
     void clearResults() { m_editor->highlightSearchResults(QByteArray()); }
     QString currentFindString() const { return QString(); }
diff --git a/src/plugins/find/basetextfind.cpp b/src/plugins/find/basetextfind.cpp
index 4f055e12a24..da3c1de3d9d 100644
--- a/src/plugins/find/basetextfind.cpp
+++ b/src/plugins/find/basetextfind.cpp
@@ -75,6 +75,12 @@ bool BaseTextFind::supportsReplace() const
     return !isReadOnly();
 }
 
+IFindSupport::FindFlags BaseTextFind::supportedFindFlags() const
+{
+    return IFindSupport::FindBackward | IFindSupport::FindCaseSensitively
+            | IFindSupport::FindRegularExpression | IFindSupport::FindWholeWords;
+}
+
 void BaseTextFind::resetIncrementalSearch()
 {
     m_incrementalStartPos = -1;
diff --git a/src/plugins/find/basetextfind.h b/src/plugins/find/basetextfind.h
index f0718738ccc..bad6e4d8c8d 100644
--- a/src/plugins/find/basetextfind.h
+++ b/src/plugins/find/basetextfind.h
@@ -47,6 +47,7 @@ public:
     BaseTextFind(QTextEdit *editor);
 
     bool supportsReplace() const;
+    IFindSupport::FindFlags supportedFindFlags() const;
     void resetIncrementalSearch();
     void clearResults();
     QString currentFindString() const;
diff --git a/src/plugins/find/currentdocumentfind.cpp b/src/plugins/find/currentdocumentfind.cpp
index f9e57e1e4a5..dbd9071240d 100644
--- a/src/plugins/find/currentdocumentfind.cpp
+++ b/src/plugins/find/currentdocumentfind.cpp
@@ -77,6 +77,12 @@ bool CurrentDocumentFind::supportsReplace() const
     return m_currentFind->supportsReplace();
 }
 
+IFindSupport::FindFlags CurrentDocumentFind::supportedFindFlags() const
+{
+    QTC_ASSERT(m_currentFind, return 0);
+    return m_currentFind->supportedFindFlags();
+}
+
 QString CurrentDocumentFind::currentFindString() const
 {
     QTC_ASSERT(m_currentFind, return QString());
diff --git a/src/plugins/find/currentdocumentfind.h b/src/plugins/find/currentdocumentfind.h
index 59d734dcd23..eb8bdf38e0c 100644
--- a/src/plugins/find/currentdocumentfind.h
+++ b/src/plugins/find/currentdocumentfind.h
@@ -48,6 +48,7 @@ public:
     void resetIncrementalSearch();
     void clearResults();
     bool supportsReplace() const;
+    IFindSupport::FindFlags supportedFindFlags() const;
     QString currentFindString() const;
     QString completedFindString() const;
 
diff --git a/src/plugins/find/findtoolbar.cpp b/src/plugins/find/findtoolbar.cpp
index 49fcd0d9258..8b7a4bb6af0 100644
--- a/src/plugins/find/findtoolbar.cpp
+++ b/src/plugins/find/findtoolbar.cpp
@@ -228,7 +228,6 @@ FindToolBar::FindToolBar(FindPlugin *plugin, CurrentDocumentFind *currentDocumen
 
     connect(m_currentDocumentFind, SIGNAL(changed()), this, SLOT(updateActions()));
     updateActions();
-    updateIcons();
 }
 
 FindToolBar::~FindToolBar()
@@ -300,6 +299,8 @@ void FindToolBar::updateActions()
     m_ui.replaceLabel->setEnabled(replaceEnabled);
     if (!replaceEnabled && enabled && replaceFocus)
         m_ui.findEdit->setFocus();
+    updateIcons();
+    updateFlagMenus();
 }
 
 void FindToolBar::invokeFindEnter()
@@ -365,7 +366,7 @@ void FindToolBar::invokeFindStep()
 {
     if (m_currentDocumentFind->isEnabled()) {
         m_plugin->updateFindCompletion(getFindText());
-        m_currentDocumentFind->findStep(getFindText(), m_findFlags);
+        m_currentDocumentFind->findStep(getFindText(), effectiveFindFlags());
     }
 }
 
@@ -373,7 +374,7 @@ void FindToolBar::invokeFindIncremental()
 {
     if (m_currentDocumentFind->isEnabled()) {
         QString text = getFindText();
-        m_currentDocumentFind->findIncremental(text, m_findFlags);
+        m_currentDocumentFind->findIncremental(text, effectiveFindFlags());
         if (text.isEmpty())
             m_currentDocumentFind->clearResults();
     }
@@ -396,7 +397,7 @@ void FindToolBar::invokeReplaceStep()
     if (m_currentDocumentFind->isEnabled() && m_currentDocumentFind->supportsReplace()) {
         m_plugin->updateFindCompletion(getFindText());
         m_plugin->updateReplaceCompletion(getReplaceText());
-        m_currentDocumentFind->replaceStep(getFindText(), getReplaceText(), m_findFlags);
+        m_currentDocumentFind->replaceStep(getFindText(), getReplaceText(), effectiveFindFlags());
     }
 }
 
@@ -405,7 +406,7 @@ void FindToolBar::invokeReplaceAll()
     m_plugin->updateFindCompletion(getFindText());
     m_plugin->updateReplaceCompletion(getReplaceText());
     if (m_currentDocumentFind->isEnabled() && m_currentDocumentFind->supportsReplace()) {
-        m_currentDocumentFind->replaceAll(getFindText(), getReplaceText(), m_findFlags);
+        m_currentDocumentFind->replaceAll(getFindText(), getReplaceText(), effectiveFindFlags());
     }
 }
 
@@ -442,9 +443,10 @@ void FindToolBar::findFlagsChanged()
 
 void FindToolBar::updateIcons()
 {
-    bool casesensitive = m_findFlags & IFindSupport::FindCaseSensitively;
-    bool wholewords = m_findFlags & IFindSupport::FindWholeWords;
-    bool regexp = m_findFlags & IFindSupport::FindRegularExpression;
+    IFindSupport::FindFlags effectiveFlags = effectiveFindFlags();
+    bool casesensitive = effectiveFlags & IFindSupport::FindCaseSensitively;
+    bool wholewords = effectiveFlags & IFindSupport::FindWholeWords;
+    bool regexp = effectiveFlags & IFindSupport::FindRegularExpression;
     QPixmap pixmap(17, 17);
     QPainter painter(&pixmap);
     painter.eraseRect(0, 0, 17, 17);
@@ -468,6 +470,16 @@ void FindToolBar::updateIcons()
     m_ui.findEdit->setPixmap(pixmap);
 }
 
+IFindSupport::FindFlags FindToolBar::effectiveFindFlags()
+{
+    IFindSupport::FindFlags supportedFlags;
+    if (m_currentDocumentFind->isEnabled())
+        supportedFlags = m_currentDocumentFind->supportedFindFlags();
+    else
+        supportedFlags = (IFindSupport::FindFlags)0xFFFFFF;
+    return supportedFlags & m_findFlags;
+}
+
 void FindToolBar::updateFlagMenus()
 {
     bool wholeOnly = ((m_findFlags & IFindSupport::FindWholeWords));
@@ -479,6 +491,12 @@ void FindToolBar::updateFlagMenus()
         m_caseSensitiveAction->setChecked(sensitive);
     if (m_regularExpressionAction->isChecked() != regexp)
         m_regularExpressionAction->setChecked(regexp);
+    IFindSupport::FindFlags supportedFlags;
+    if (m_currentDocumentFind->isEnabled())
+        supportedFlags = m_currentDocumentFind->supportedFindFlags();
+    m_wholeWordAction->setEnabled(supportedFlags & IFindSupport::FindWholeWords);
+    m_caseSensitiveAction->setEnabled(supportedFlags & IFindSupport::FindCaseSensitively);
+    m_regularExpressionAction->setEnabled(supportedFlags & IFindSupport::FindRegularExpression);
 }
 
 bool FindToolBar::setFocusToCurrentFindSupport()
@@ -509,7 +527,7 @@ void FindToolBar::openFind()
     if (!text.isEmpty())
         setFindText(text);
     m_currentDocumentFind->defineFindScope();
-    m_currentDocumentFind->highlightAll(getFindText(), m_findFlags);
+    m_currentDocumentFind->highlightAll(getFindText(), effectiveFindFlags());
     selectFindText();
 }
 
diff --git a/src/plugins/find/findtoolbar.h b/src/plugins/find/findtoolbar.h
index 44e96b6ad0f..4b85c1a9e83 100644
--- a/src/plugins/find/findtoolbar.h
+++ b/src/plugins/find/findtoolbar.h
@@ -88,6 +88,7 @@ private:
     bool setFocusToCurrentFindSupport();
     void setFindFlag(IFindSupport::FindFlag flag, bool enabled);
     bool hasFindFlag(IFindSupport::FindFlag flag);
+    IFindSupport::FindFlags effectiveFindFlags();
 
     bool eventFilter(QObject *obj, QEvent *event);
     void setFindText(const QString &text);
diff --git a/src/plugins/find/ifindsupport.h b/src/plugins/find/ifindsupport.h
index 977dc831687..c61ab3bda0e 100644
--- a/src/plugins/find/ifindsupport.h
+++ b/src/plugins/find/ifindsupport.h
@@ -54,6 +54,7 @@ public:
     virtual ~IFindSupport() {}
 
     virtual bool supportsReplace() const = 0;
+    virtual FindFlags supportedFindFlags() const = 0;
     virtual void resetIncrementalSearch() = 0;
     virtual void clearResults() = 0;
     virtual QString currentFindString() const = 0;
diff --git a/src/plugins/help/helpfindsupport.cpp b/src/plugins/help/helpfindsupport.cpp
index 80f3f17baa0..abc7e2d239c 100644
--- a/src/plugins/help/helpfindsupport.cpp
+++ b/src/plugins/help/helpfindsupport.cpp
@@ -48,6 +48,12 @@ bool HelpFindSupport::isEnabled() const
     return true;
 }
 
+Find::IFindSupport::FindFlags HelpFindSupport::supportedFindFlags() const
+{
+    return Find::IFindSupport::FindBackward | Find::IFindSupport::FindCaseSensitively
+            | Find::IFindSupport::FindWholeWords;
+}
+
 QString HelpFindSupport::currentFindString() const
 {
     QTC_ASSERT(m_centralWidget, return QString());
@@ -84,6 +90,12 @@ HelpViewerFindSupport::HelpViewerFindSupport(HelpViewer *viewer)
 {
 }
 
+Find::IFindSupport::FindFlags HelpViewerFindSupport::supportedFindFlags() const
+{
+    return Find::IFindSupport::FindBackward | Find::IFindSupport::FindCaseSensitively
+            | Find::IFindSupport::FindWholeWords;
+}
+
 QString HelpViewerFindSupport::currentFindString() const
 {
     QTC_ASSERT(m_viewer, return QString());
diff --git a/src/plugins/help/helpfindsupport.h b/src/plugins/help/helpfindsupport.h
index 789c15a77dd..ce57be8acb0 100644
--- a/src/plugins/help/helpfindsupport.h
+++ b/src/plugins/help/helpfindsupport.h
@@ -50,6 +50,8 @@ public:
 
     bool isEnabled() const;
     bool supportsReplace() const { return false; }
+    IFindSupport::FindFlags supportedFindFlags() const;
+
     void resetIncrementalSearch() {}
     void clearResults() {}
     QString currentFindString() const;
@@ -76,6 +78,7 @@ public:
 
     bool isEnabled() const { return true; }
     bool supportsReplace() const { return false; }
+    IFindSupport::FindFlags supportedFindFlags() const;
     void resetIncrementalSearch() {}
     void clearResults() {}
     QString currentFindString() const;
-- 
GitLab