From faba06b553a9af352c5a033ce5e0e725a6160f07 Mon Sep 17 00:00:00 2001
From: dt <qtc-committer@nokia.com>
Date: Thu, 2 Sep 2010 16:13:33 +0200
Subject: [PATCH] Search Dialog: Make canceling possible

Task-Nr: QTCREATORBUG-2243
---
 src/plugins/cpptools/symbolsfindfilter.cpp | 10 +++++
 src/plugins/cpptools/symbolsfindfilter.h   |  2 +
 src/plugins/find/finddialog.ui             | 45 ++++++++++++----------
 src/plugins/find/findtoolwindow.cpp        |  9 +++++
 src/plugins/find/findtoolwindow.h          |  1 +
 src/plugins/find/ifindfilter.h             |  3 ++
 src/plugins/texteditor/basefilefind.cpp    | 10 +++++
 src/plugins/texteditor/basefilefind.h      |  2 +
 8 files changed, 62 insertions(+), 20 deletions(-)

diff --git a/src/plugins/cpptools/symbolsfindfilter.cpp b/src/plugins/cpptools/symbolsfindfilter.cpp
index f133831a256..a6934a66885 100644
--- a/src/plugins/cpptools/symbolsfindfilter.cpp
+++ b/src/plugins/cpptools/symbolsfindfilter.cpp
@@ -131,6 +131,16 @@ bool SymbolsFindFilter::isEnabled() const
     return !m_isRunning && m_enabled;
 }
 
+bool SymbolsFindFilter::canCancel() const
+{
+    return m_isRunning;
+}
+
+void SymbolsFindFilter::cancel()
+{
+    m_watcher.cancel();
+}
+
 Find::FindFlags SymbolsFindFilter::supportedFindFlags() const
 {
     return Find::FindCaseSensitively | Find::FindRegularExpression | Find::FindWholeWords;
diff --git a/src/plugins/cpptools/symbolsfindfilter.h b/src/plugins/cpptools/symbolsfindfilter.h
index 420420dc4af..73b67856e26 100644
--- a/src/plugins/cpptools/symbolsfindfilter.h
+++ b/src/plugins/cpptools/symbolsfindfilter.h
@@ -60,6 +60,8 @@ public:
     QString id() const;
     QString displayName() const;
     bool isEnabled() const;
+    bool canCancel() const;
+    void cancel();
     Find::FindFlags supportedFindFlags() const;
 
     void findAll(const QString &txt, Find::FindFlags findFlags);
diff --git a/src/plugins/find/finddialog.ui b/src/plugins/find/finddialog.ui
index 98ae78e1091..e2dd019f12a 100644
--- a/src/plugins/find/finddialog.ui
+++ b/src/plugins/find/finddialog.ui
@@ -73,7 +73,7 @@
        </property>
       </widget>
      </item>
-     <item row="1" column="0">
+     <item row="2" column="0">
       <widget class="QLabel" name="label_2">
        <property name="text">
         <string>Search &amp;for:</string>
@@ -86,17 +86,10 @@
        </property>
       </widget>
      </item>
-     <item row="1" column="1">
+     <item row="2" column="1">
       <widget class="QLineEdit" name="searchTerm"/>
      </item>
-     <item row="1" column="2">
-      <widget class="QPushButton" name="closeButton">
-       <property name="text">
-        <string>Close</string>
-       </property>
-      </widget>
-     </item>
-     <item row="5" column="0" colspan="2">
+     <item row="7" column="0" colspan="2">
       <widget class="QWidget" name="configWidget" native="true">
        <property name="sizePolicy">
         <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
@@ -106,14 +99,7 @@
        </property>
       </widget>
      </item>
-     <item row="2" column="2">
-      <widget class="QPushButton" name="replaceButton">
-       <property name="text">
-        <string>Search &amp;&amp; Replace</string>
-       </property>
-      </widget>
-     </item>
-     <item row="2" column="1" rowspan="3">
+     <item row="4" column="1" rowspan="3">
       <widget class="QWidget" name="widget" native="true">
        <layout class="QVBoxLayout" name="verticalLayout_2">
         <property name="margin">
@@ -143,6 +129,27 @@
        </layout>
       </widget>
      </item>
+     <item row="5" column="2">
+      <widget class="QPushButton" name="replaceButton">
+       <property name="text">
+        <string>Search &amp;&amp; Replace</string>
+       </property>
+      </widget>
+     </item>
+     <item row="4" column="2">
+      <widget class="QPushButton" name="closeButton">
+       <property name="text">
+        <string>Close</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="2">
+      <widget class="QPushButton" name="cancelButton">
+       <property name="text">
+        <string>Cancel</string>
+       </property>
+      </widget>
+     </item>
     </layout>
    </item>
    <item>
@@ -164,8 +171,6 @@
   <tabstop>filterList</tabstop>
   <tabstop>searchTerm</tabstop>
   <tabstop>searchButton</tabstop>
-  <tabstop>closeButton</tabstop>
-  <tabstop>replaceButton</tabstop>
  </tabstops>
  <resources/>
  <connections/>
diff --git a/src/plugins/find/findtoolwindow.cpp b/src/plugins/find/findtoolwindow.cpp
index 803b8e397d2..95b397da7f6 100644
--- a/src/plugins/find/findtoolwindow.cpp
+++ b/src/plugins/find/findtoolwindow.cpp
@@ -52,11 +52,13 @@ FindToolWindow::FindToolWindow(FindPlugin *plugin)
     connect(m_ui.closeButton, SIGNAL(clicked()), this, SLOT(reject()));
     connect(m_ui.searchButton, SIGNAL(clicked()), this, SLOT(search()));
     connect(m_ui.replaceButton, SIGNAL(clicked()), this, SLOT(replace()));
+    connect(m_ui.cancelButton, SIGNAL(clicked()), this, SLOT(cancelSearch()));
     connect(m_ui.matchCase, SIGNAL(toggled(bool)), m_plugin, SLOT(setCaseSensitive(bool)));
     connect(m_ui.wholeWords, SIGNAL(toggled(bool)), m_plugin, SLOT(setWholeWord(bool)));
     connect(m_ui.regExp, SIGNAL(toggled(bool)), m_plugin, SLOT(setRegularExpression(bool)));
     connect(m_ui.filterList, SIGNAL(activated(int)), this, SLOT(setCurrentFilter(int)));
     connect(m_ui.searchTerm, SIGNAL(textChanged(QString)), this, SLOT(updateButtonStates()));
+
     m_findCompleter->setModel(m_plugin->findCompletionModel());
     m_ui.searchTerm->setCompleter(m_findCompleter);
     m_ui.searchTerm->installEventFilter(this);
@@ -100,6 +102,7 @@ void FindToolWindow::updateButtonStates()
     m_ui.regExp->setEnabled(filterEnabled
                             && (m_currentFilter->supportedFindFlags() & Find::FindRegularExpression));
     m_ui.searchTerm->setEnabled(filterEnabled);
+    m_ui.cancelButton->setEnabled(m_currentFilter && m_currentFilter->canCancel());
 }
 
 void FindToolWindow::setFindFilters(const QList<IFindFilter *> &filters)
@@ -195,6 +198,12 @@ void FindToolWindow::replace()
     filter->replaceAll(term, m_plugin->findFlags());
 }
 
+void FindToolWindow::cancelSearch()
+{
+    if (m_currentFilter)
+        m_currentFilter->cancel();
+}
+
 void FindToolWindow::writeSettings()
 {
     QSettings *settings = Core::ICore::instance()->settings();
diff --git a/src/plugins/find/findtoolwindow.h b/src/plugins/find/findtoolwindow.h
index 52f0c1080ec..d8a39cb058a 100644
--- a/src/plugins/find/findtoolwindow.h
+++ b/src/plugins/find/findtoolwindow.h
@@ -63,6 +63,7 @@ protected:
 private slots:
     void search();
     void replace();
+    void cancelSearch();
     void setCurrentFilter(int index);
     void updateButtonStates();
 
diff --git a/src/plugins/find/ifindfilter.h b/src/plugins/find/ifindfilter.h
index d45dc83a7c2..fef767f05f4 100644
--- a/src/plugins/find/ifindfilter.h
+++ b/src/plugins/find/ifindfilter.h
@@ -52,7 +52,10 @@ public:
 
     virtual QString id() const = 0;
     virtual QString displayName() const = 0;
+    ///
     virtual bool isEnabled() const = 0;
+    virtual bool canCancel() const = 0;
+    virtual void cancel() = 0;
     virtual QKeySequence defaultShortcut() const { return QKeySequence(); }
     virtual bool isReplaceSupported() const { return false; }
     virtual FindFlags supportedFindFlags() const;
diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp
index 7360ade7712..6de00a8bc9a 100644
--- a/src/plugins/texteditor/basefilefind.cpp
+++ b/src/plugins/texteditor/basefilefind.cpp
@@ -70,6 +70,16 @@ bool BaseFileFind::isEnabled() const
     return !m_isSearching;
 }
 
+bool BaseFileFind::canCancel() const
+{
+    return m_isSearching;
+}
+
+void BaseFileFind::cancel()
+{
+    m_watcher.cancel();
+}
+
 QStringList BaseFileFind::fileNameFilters() const
 {
     QStringList filters;
diff --git a/src/plugins/texteditor/basefilefind.h b/src/plugins/texteditor/basefilefind.h
index 1a26154d405..b00c6a110c0 100644
--- a/src/plugins/texteditor/basefilefind.h
+++ b/src/plugins/texteditor/basefilefind.h
@@ -62,6 +62,8 @@ public:
     explicit BaseFileFind(Find::SearchResultWindow *resultWindow);
 
     bool isEnabled() const;
+    bool canCancel() const;
+    void cancel();
     bool isReplaceSupported() const { return true; }
     void findAll(const QString &txt, Find::FindFlags findFlags);
     void replaceAll(const QString &txt, Find::FindFlags findFlags);
-- 
GitLab