summaryrefslogtreecommitdiff
path: root/src/plugins/coreplugin/find/ifindfilter.cpp
diff options
context:
space:
mode:
authorhjk <hjk121@nokiamail.com>2014-01-13 16:17:34 +0100
committerEike Ziller <eike.ziller@digia.com>2014-01-14 07:43:00 +0100
commit4d96fa7aba7be35800d61d8bed89d3f6c3ef9329 (patch)
treec9b102981cf81023e1488224a24758af18aa064e /src/plugins/coreplugin/find/ifindfilter.cpp
parent8b854270a6c214479b2cdf302072a3e74fa854da (diff)
downloadqt-creator-4d96fa7aba7be35800d61d8bed89d3f6c3ef9329.tar.gz
Core: Merge Find and Locator into Core plugin
Change-Id: I7053310272235d854c9f409670ff52a10a7add8b Reviewed-by: Christian Kandeler <christian.kandeler@digia.com> Reviewed-by: Orgad Shaneh <orgads@gmail.com> Reviewed-by: Eike Ziller <eike.ziller@digia.com>
Diffstat (limited to 'src/plugins/coreplugin/find/ifindfilter.cpp')
-rw-r--r--src/plugins/coreplugin/find/ifindfilter.cpp285
1 files changed, 285 insertions, 0 deletions
diff --git a/src/plugins/coreplugin/find/ifindfilter.cpp b/src/plugins/coreplugin/find/ifindfilter.cpp
new file mode 100644
index 0000000000..c9fda43f2a
--- /dev/null
+++ b/src/plugins/coreplugin/find/ifindfilter.cpp
@@ -0,0 +1,285 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+#include "ifindfilter.h"
+
+#include <QPainter>
+#include <QPixmap>
+
+/*!
+ \class Find::IFindFilter
+ \brief The IFindFilter class is the base class for find implementations
+ that are invoked by selecting \gui Edit > \gui {Find/Replace} >
+ \gui {Advanced Find}.
+
+ Implementations of this class add an additional \gui Scope to the \gui {Advanced
+ Find} dialog. That can be any search that requires the user to provide
+ a text based search term (potentially with find flags like
+ searching case sensitively or using regular expressions). Existing
+ scopes are \gui {All Projects} that searches from all files in all projects
+ and \gui {Files on File System} where the user provides a directory and file
+ patterns to search.
+
+ To make your find scope available to the user, you need to implement this
+ class, and register an instance of your subclass in the plugin manager.
+
+ A common way to present the search results to the user, is to use the
+ shared \gui{Search Results} panel.
+
+ If you want to implement a find filter that is doing a file based text
+ search, you should use Find::BaseFileFind, which already implements all
+ the details for this kind of search, only requiring you to provide an
+ iterator over the file names of the files that should be searched.
+
+ If you want to implement a more specialized find filter, you need to:
+ \list
+ \li Start your search in a separate thread
+ \li Make this known to the Core::ProgressManager, for a progress bar
+ and the ability to cancel the search
+ \li Interface with the shared \gui{Search Results} panel, to show
+ the search results, handle the event that the user click on one
+ of the search result items, and possible handle a global replace
+ of all or some of the search result items.
+ \endlist
+
+ Luckily QtConcurrent and the search result panel provide the frameworks
+ that make it relatively easy to implement,
+ while ensuring a common way for the user.
+
+ The common pattern is roughly this:
+
+ Implement the actual search within a QtConcurrent based function, that is
+ a function that takes a \c{QFutureInterface<MySearchResult> &future}
+ as the first parameter and the other information needed for the search
+ as additional parameters. It should set useful progress information
+ on the QFutureInterface, regularly check for \c{future.isPaused()}
+ and \c{future.isCanceled()}, and report the search results
+ (possibly in chunks) via \c{future.reportResult}.
+
+ In the find filter's find/replaceAll function, get the shared
+ \gui{Search Results} window, initiate a new search and connect the
+ signals for handling selection of results and the replace action
+ (see the Core::SearchResultWindow class for details).
+ Start your search implementation via the corresponding QtConcurrent
+ functions. Add the returned QFuture object to the Core::ProgressManager.
+ Use a QFutureWatcher on the returned QFuture object to receive a signal
+ when your search implementation reports search results, and add these
+ to the shared \gui{Search Results} window.
+*/
+
+/*!
+ \fn IFindFilter::~IFindFilter()
+ \internal
+*/
+
+/*!
+ \fn QString IFindFilter::id() const
+ Returns the unique string identifier for this find filter.
+
+ Usually should be something like "MyPlugin.MyFindFilter".
+*/
+
+/*!
+ \fn QString IFindFilter::displayName() const
+ Returns the name of the find filter or scope as presented to the user.
+
+ This is the name that appears in the scope selection combo box, for example.
+ Always return a translatable string (that is, use tr() for the return value).
+*/
+
+/*!
+ \fn bool IFindFilter::isEnabled() const
+ Returns whether the user should be able to select this find filter
+ at the moment.
+
+ This is used for the \gui {Current Projects} scope, for example. If the user
+ has not
+ opened a project, the scope is disabled.
+
+ \sa changed()
+*/
+
+/*!
+ \fn QKeySequence IFindFilter::defaultShortcut() const
+ Returns the shortcut that can be used to open the advanced find
+ dialog with this filter or scope preselected.
+
+ Usually return an empty shortcut here, the user can still choose and
+ assign a specific shortcut to this find scope via the preferences.
+*/
+
+/*!
+ \fn bool IFindFilter::isReplaceSupported() const
+ Returns whether the find filter supports search and replace.
+
+ The default value is false, override this function to return \c true, if
+ your find filter supports global search and replace.
+*/
+
+/*!
+ \fn void IFindFilter::findAll(const QString &txt, Core::FindFlags findFlags)
+ This function is called when the user selected this find scope and
+ initiated a search.
+
+ You should start a thread which actually performs the search for \a txt
+ using the given \a findFlags
+ (add it to Core::ProgressManager for a progress bar!) and presents the
+ search results to the user (using the \gui{Search Results} output pane).
+ For more information, see the descriptions of this class,
+ Core::ProgressManager, and Core::SearchResultWindow.
+
+ \sa replaceAll()
+ \sa Core::ProgressManager
+ \sa Core::SearchResultWindow
+*/
+
+/*!
+ \fn void IFindFilter::replaceAll(const QString &txt, Core::FindFlags findFlags)
+ Override this function if you want to support search and replace.
+
+ This function is called when the user selected this find scope and
+ initiated a search and replace.
+ The default implementation does nothing.
+
+ You should start a thread which actually performs the search for \a txt
+ using the given \a findFlags
+ (add it to Core::ProgressManager for a progress bar!) and presents the
+ search results to the user (using the \gui{Search Results} output pane).
+ For more information see the descriptions of this class,
+ Core::ProgressManager, and Core::SearchResultWindow.
+
+ \sa findAll()
+ \sa Core::ProgressManager
+ \sa Core::SearchResultWindow
+*/
+
+/*!
+ \fn QWidget *IFindFilter::createConfigWidget()
+ Returns a widget that contains additional controls for options
+ for this find filter.
+
+ The widget will be shown below the common options in the \gui {Advanced Find}
+ dialog. It will be reparented and deleted by the find plugin.
+*/
+
+/*!
+ \fn void IFindFilter::writeSettings(QSettings *settings)
+ Called at shutdown to write the state of the additional options
+ for this find filter to the \a settings.
+*/
+
+/*!
+ \fn void IFindFilter::readSettings(QSettings *settings)
+ Called at startup to read the state of the additional options
+ for this find filter from the \a settings.
+*/
+
+/*!
+ \fn void IFindFilter::enabledChanged(bool enabled)
+
+ Signals that the enabled state of this find filter has changed.
+*/
+
+/*!
+ \fn Core::FindFlags BaseTextFind::supportedFindFlags() const
+ Returns the find flags, like whole words or regular expressions,
+ that this find filter supports.
+
+ Depending on the returned value, the default find option widgets are
+ enabled or disabled.
+ The default is Find::FindCaseSensitively, Find::FindRegularExpression
+ and Find::FindWholeWords
+*/
+
+namespace Core {
+
+FindFlags IFindFilter::supportedFindFlags() const
+{
+ return FindCaseSensitively
+ | FindRegularExpression | FindWholeWords;
+}
+
+QPixmap IFindFilter::pixmapForFindFlags(FindFlags flags)
+{
+ static const QPixmap casesensitiveIcon = QPixmap(QLatin1String(":/find/images/casesensitively.png"));
+ static const QPixmap regexpIcon = QPixmap(QLatin1String(":/find/images/regexp.png"));
+ static const QPixmap wholewordsIcon = QPixmap(QLatin1String(":/find/images/wholewords.png"));
+ static const QPixmap preservecaseIcon = QPixmap(QLatin1String(":/find/images/preservecase.png"));
+ bool casesensitive = flags & FindCaseSensitively;
+ bool wholewords = flags & FindWholeWords;
+ bool regexp = flags & FindRegularExpression;
+ bool preservecase = flags & FindPreserveCase;
+ int width = 0;
+ if (casesensitive) width += 6;
+ if (wholewords) width += 6;
+ if (regexp) width += 6;
+ if (preservecase) width += 6;
+ if (width > 0) --width;
+ QPixmap pixmap(width, 17);
+ pixmap.fill(Qt::transparent);
+ QPainter painter(&pixmap);
+ int x = 0;
+
+ if (casesensitive) {
+ painter.drawPixmap(x - 6, 0, casesensitiveIcon);
+ x += 6;
+ }
+ if (wholewords) {
+ painter.drawPixmap(x - 6, 0, wholewordsIcon);
+ x += 6;
+ }
+ if (regexp) {
+ painter.drawPixmap(x - 6, 0, regexpIcon);
+ x += 6;
+ }
+ if (preservecase)
+ painter.drawPixmap(x - 6, 0, preservecaseIcon);
+ return pixmap;
+}
+
+QString IFindFilter::descriptionForFindFlags(FindFlags flags)
+{
+ QStringList flagStrings;
+ if (flags & FindCaseSensitively)
+ flagStrings.append(tr("Case sensitive"));
+ if (flags & FindWholeWords)
+ flagStrings.append(tr("Whole words"));
+ if (flags & FindRegularExpression)
+ flagStrings.append(tr("Regular expressions"));
+ if (flags & FindPreserveCase)
+ flagStrings.append(tr("Preserve case"));
+ QString description = tr("Flags: %1");
+ if (flagStrings.isEmpty())
+ description = description.arg(tr("None"));
+ else
+ description = description.arg(flagStrings.join(tr(", ")));
+ return description;
+}
+
+} // namespace Core