forked from qt-creator/qt-creator
		
	
		
			
	
	
		
			189 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			189 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								#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);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |