diff options
Diffstat (limited to 'doc/pluginhowto/examples/progressbar/headerfilteprogress.cpp')
-rw-r--r-- | doc/pluginhowto/examples/progressbar/headerfilteprogress.cpp | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/doc/pluginhowto/examples/progressbar/headerfilteprogress.cpp b/doc/pluginhowto/examples/progressbar/headerfilteprogress.cpp new file mode 100644 index 0000000000..d436d1b996 --- /dev/null +++ b/doc/pluginhowto/examples/progressbar/headerfilteprogress.cpp @@ -0,0 +1,188 @@ +#include "headerfilterprogress.h" +#include <coreplugin/progressmanager/progressmanager.h> +#include <coreplugin/editormanager/editormanager.h> +#include <projectexplorer/projectexplorer.h> +#include <projectexplorer/iprojectmanager.h> +#include <extensionsystem/pluginmanager.h> +#include <texteditor/basetexteditor.h> +#include <find/searchresultwindow.h> +#include <projectexplorer/project.h> +#include <projectexplorer/session.h> +#include <find/textfindconstants.h> +#include <utils/stylehelper.h> +#include <utils/filesearch.h> +#include <coreplugin/icore.h> +#include <QtGui/QComboBox> +#include <QtGui/QCheckBox> +#include<QFutureWatcher> +#include<QStringListModel> +#include<QLabel> +#include<QFont> +#include<QMessageBox> +#include<QGridLayout> + +using namespace Core; +using namespace Utils; +using namespace TextEditor; + + +struct HeaderFilterProgressData + { + HeaderFilterProgressData() : projectPlugin(0), m_searchResultWindow(0){} + QFutureWatcher<FileSearchResult> watcher; + QLabel* resultLabel; + + + ProjectExplorer::ProjectExplorerPlugin* projectExplorer() + { + if(projectPlugin) + return projectPlugin; + + ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); + projectPlugin = pm->getObject<ProjectExplorer::ProjectExplorerPlugin>(); + return projectPlugin; + } + + // Method to search and return the search window + + Find::SearchResultWindow* searchResultWindow() + { + if(m_searchResultWindow) + return m_searchResultWindow; + + ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); + m_searchResultWindow = pm->getObject<Find::SearchResultWindow>(); + return m_searchResultWindow; + } + + + private: + ProjectExplorer::ProjectExplorerPlugin* projectPlugin; + Find::SearchResultWindow* m_searchResultWindow; + +}; + +HeaderFilterProgress::HeaderFilterProgress() +{ + d = new HeaderFilterProgressData; + d->watcher.setPendingResultsLimit(1); + d->resultLabel = 0 ; + + + // displayResult(int) is called when every a new + // search result is generated + connect(&d->watcher, SIGNAL(resultReadyAt(int)),this, SLOT(displayResult(int))); +} + +HeaderFilterProgress::~HeaderFilterProgress() +{ + delete d; +} + +QString HeaderFilterProgress::id() const +{ + return "HeaderFilter"; +} + +QString HeaderFilterProgress::name() const +{ + return tr("Header Filter"); +} + +bool HeaderFilterProgress::isEnabled() const +{ + QList<ProjectExplorer::Project*> projects = d->projectExplorer()->session()->projects(); + if(projects.count()) + return true; + + return false; +} + +QKeySequence HeaderFilterProgress::defaultShortcut() const +{ + return QKeySequence(); +} + + + +void HeaderFilterProgress::findAll(const QString &text,QTextDocument::FindFlags findFlags) + { + + // Fetch a list of all open projects + QList<ProjectExplorer::Project*> projects = d->projectExplorer()->session()->projects(); + + // Make a list of files in each project + QStringList files; + Q_FOREACH(ProjectExplorer::Project* project, projects) + files += project->files(ProjectExplorer::Project::AllFiles); + + // Remove duplicates + files.removeDuplicates(); + + //------------------------------------------------------------ + // Begin searching + QString includeline = "#include <" + text + ">"; + Find::SearchResult* result = d->searchResultWindow()->startNewSearch(); + + d->watcher.setFuture(QFuture<FileSearchResult>()); + + //When result gets activated it invokes the openEditor function + connect(result, SIGNAL(activated(Find::SearchResultItem)), + this, SLOT(openEditor(Find::SearchResultItem))); + + d->searchResultWindow()->popup(true); + + // Let the watcher monitor the search results + d->watcher.setFuture(Utils::findInFiles(includeline, files, findFlags)); + + //Creates the Progres bar + Core::FutureProgress* progress = + Core::ICore::instance()->progressManager()->addTask(d->watcher.future(), + "MySearch", + Find::Constants::TASK_SEARCH, + Core::ProgressManager::KeepOnFinish + ); + progress->setWidget(createProgressWidget()); + connect(progress, SIGNAL(clicked()), d->searchResultWindow(), SLOT(popup())); +} + + +QWidget* HeaderFilterProgress::createProgressWidget() +{ + d->resultLabel = new QLabel; + d->resultLabel->setAlignment(Qt::AlignCenter); + QFont f = d->resultLabel->font(); + f.setBold(true); + f.setPointSizeF(StyleHelper::sidebarFontSize()); + d->resultLabel->setFont(f); + d->resultLabel->setPalette(StyleHelper::sidebarFontPalette(d->resultLabel->palette())); + d->resultLabel->setText(tr("%1 found").arg(d->searchResultWindow()->numberOfResults())); + return d->resultLabel; +} + +QWidget* HeaderFilterProgress::createConfigWidget() +{ + return (new QLabel("This is a header filter")); +} + +void HeaderFilterProgress::displayResult(int index) +{ + FileSearchResult result = d->watcher.future().resultAt(index); + + d->searchResultWindow()->addResult(result.fileName, + result.lineNumber, + result.matchingLine, + result.matchStart, + result.matchLength); + if (d->resultLabel) + d->resultLabel->setText(tr("%1 found").arg(d->searchResultWindow()->numberOfResults())); +} + + + +void HeaderFilterProgress::openEditor(const Find::SearchResultItem &item) +{ + TextEditor::BaseTextEditor::openEditorAt(item.fileName, item.lineNumber, item.index); +} + + |