#include "headerfilterprogress.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace Core; using namespace Utils; using namespace TextEditor; struct HeaderFilterProgressData { HeaderFilterProgressData() : projectPlugin(0), m_searchResultWindow(0){} QFutureWatcher watcher; QLabel* resultLabel; ProjectExplorer::ProjectExplorerPlugin* projectExplorer() { if(projectPlugin) return projectPlugin; ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); projectPlugin = pm->getObject(); 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(); 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 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 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()); //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); }