diff --git a/src/libs/utils/filesearch.cpp b/src/libs/utils/filesearch.cpp index 109e4248f26..21d5e52daf9 100644 --- a/src/libs/utils/filesearch.cpp +++ b/src/libs/utils/filesearch.cpp @@ -30,6 +30,8 @@ #include "filesearch.h" #include +#include +#include #include #include #include @@ -69,7 +71,8 @@ namespace { void runFileSearch(QFutureInterface &future, QString searchTerm, QStringList files, - QTextDocument::FindFlags flags) + QTextDocument::FindFlags flags, + QMap fileToContentsMap) { future.setProgressRange(0, files.size()); int numFilesSearched = 0; @@ -90,6 +93,8 @@ void runFileSearch(QFutureInterface &future, int chunkSize = qMax(100000, sa.length()); + QFile file; + QBuffer buffer; foreach (QString s, files) { if (future.isPaused()) future.waitForResume(); @@ -97,18 +102,25 @@ void runFileSearch(QFutureInterface &future, future.setProgressValueAndText(numFilesSearched, msgCanceled(searchTerm, numMatches, numFilesSearched)); break; } - QFile file(s); - if (!file.open(QIODevice::ReadOnly)) + QIODevice *device; + if (fileToContentsMap.contains(s)) { + buffer.setData(fileToContentsMap.value(s).toLocal8Bit()); + device = &buffer; + } else { + file.setFileName(s); + device = &file; + } + if (!device->open(QIODevice::ReadOnly)) continue; int lineNr = 1; const char *startOfLastLine = NULL; bool firstChunk = true; - while (!file.atEnd()) { + while (!device->atEnd()) { if (!firstChunk) - file.seek(file.pos()-sa.length()+1); + device->seek(device->pos()-sa.length()+1); - const QByteArray chunk = file.read(chunkSize); + const QByteArray chunk = device->read(chunkSize); const char *chunkPtr = chunk.constData(); startOfLastLine = chunkPtr; for (const char *regionPtr = chunkPtr; regionPtr < chunkPtr + chunk.length()-scMaxIndex; ++regionPtr) { @@ -168,6 +180,7 @@ void runFileSearch(QFutureInterface &future, } ++numFilesSearched; future.setProgressValueAndText(numFilesSearched, msgFound(searchTerm, numMatches, numFilesSearched, files.size())); + device->close(); } if (!future.isCanceled()) future.setProgressValueAndText(numFilesSearched, msgFound(searchTerm, numMatches, numFilesSearched)); @@ -176,7 +189,8 @@ void runFileSearch(QFutureInterface &future, void runFileSearchRegExp(QFutureInterface &future, QString searchTerm, QStringList files, - QTextDocument::FindFlags flags) + QTextDocument::FindFlags flags, + QMap fileToContentsMap) { future.setProgressRange(0, files.size()); int numFilesSearched = 0; @@ -186,6 +200,9 @@ void runFileSearchRegExp(QFutureInterface &future, const Qt::CaseSensitivity caseSensitivity = (flags & QTextDocument::FindCaseSensitively) ? Qt::CaseSensitive : Qt::CaseInsensitive; const QRegExp expression(searchTerm, caseSensitivity); + QFile file; + QString str; + QTextStream stream; foreach (const QString &s, files) { if (future.isPaused()) future.waitForResume(); @@ -193,10 +210,18 @@ void runFileSearchRegExp(QFutureInterface &future, future.setProgressValueAndText(numFilesSearched, msgCanceled(searchTerm, numMatches, numFilesSearched)); break; } - QFile file(s); - if (!file.open(QIODevice::ReadOnly)) - continue; - QTextStream stream(&file); + + bool needsToCloseFile = false; + if (fileToContentsMap.contains(s)) { + str = fileToContentsMap.value(s); + stream.setString(&str); + } else { + file.setFileName(s); + if (!file.open(QIODevice::ReadOnly)) + continue; + needsToCloseFile = true; + stream.setDevice(&file); + } int lineNr = 1; QString line; while (!stream.atEnd()) { @@ -211,6 +236,8 @@ void runFileSearchRegExp(QFutureInterface &future, } ++numFilesSearched; future.setProgressValueAndText(numFilesSearched, msgFound(searchTerm, numMatches, numFilesSearched, files.size())); + if (needsToCloseFile) + file.close(); } if (!future.isCanceled()) future.setProgressValueAndText(numFilesSearched, msgFound(searchTerm, numMatches, numFilesSearched)); @@ -220,13 +247,15 @@ void runFileSearchRegExp(QFutureInterface &future, QFuture Core::Utils::findInFiles(const QString &searchTerm, const QStringList &files, - QTextDocument::FindFlags flags) + QTextDocument::FindFlags flags, QMap fileToContentsMap) { - return QtConcurrent::run(runFileSearch, searchTerm, files, flags); + return QtConcurrent::run > + (runFileSearch, searchTerm, files, flags, fileToContentsMap); } QFuture Core::Utils::findInFilesRegExp(const QString &searchTerm, const QStringList &files, - QTextDocument::FindFlags flags) + QTextDocument::FindFlags flags, QMap fileToContentsMap) { - return QtConcurrent::run(runFileSearchRegExp, searchTerm, files, flags); + return QtConcurrent::run > + (runFileSearchRegExp, searchTerm, files, flags, fileToContentsMap); } diff --git a/src/libs/utils/filesearch.h b/src/libs/utils/filesearch.h index 9eb1fc21f44..9c26f6701e6 100644 --- a/src/libs/utils/filesearch.h +++ b/src/libs/utils/filesearch.h @@ -34,6 +34,7 @@ #include #include +#include #include namespace Core { @@ -55,10 +56,10 @@ public: }; QTCREATOR_UTILS_EXPORT QFuture findInFiles(const QString &searchTerm, const QStringList &files, - QTextDocument::FindFlags flags); + QTextDocument::FindFlags flags, QMap fileToContentsMap = QMap()); QTCREATOR_UTILS_EXPORT QFuture findInFilesRegExp(const QString &searchTerm, const QStringList &files, - QTextDocument::FindFlags flags); + QTextDocument::FindFlags flags, QMap fileToContentsMap = QMap()); } // namespace Utils } // namespace Core diff --git a/src/plugins/texteditor/basefilefind.cpp b/src/plugins/texteditor/basefilefind.cpp index c43918dfd0b..881aff0f41a 100644 --- a/src/plugins/texteditor/basefilefind.cpp +++ b/src/plugins/texteditor/basefilefind.cpp @@ -89,9 +89,9 @@ void BaseFileFind::findAll(const QString &txt, QTextDocument::FindFlags findFlag m_resultWindow->clearContents(); m_resultWindow->popup(true); if (m_useRegExp) - m_watcher.setFuture(Core::Utils::findInFilesRegExp(txt, files(), findFlags)); + m_watcher.setFuture(Core::Utils::findInFilesRegExp(txt, files(), findFlags, ITextEditor::openedTextEditorsContents())); else - m_watcher.setFuture(Core::Utils::findInFiles(txt, files(), findFlags)); + m_watcher.setFuture(Core::Utils::findInFiles(txt, files(), findFlags, ITextEditor::openedTextEditorsContents())); Core::FutureProgress *progress = Core::ICore::instance()->progressManager()->addTask(m_watcher.future(), "Search", diff --git a/src/plugins/texteditor/itexteditor.cpp b/src/plugins/texteditor/itexteditor.cpp new file mode 100644 index 00000000000..6ecdddaa79a --- /dev/null +++ b/src/plugins/texteditor/itexteditor.cpp @@ -0,0 +1,47 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://www.qtsoftware.com/contact. +** +**************************************************************************/ + +#include "itexteditor.h" + +#include + +using namespace TextEditor; + +QMap ITextEditor::openedTextEditorsContents() +{ + QMap workingCopy; + foreach (Core::IEditor *editor, Core::EditorManager::instance()->openedEditors()) { + ITextEditor *textEditor = qobject_cast(editor); + if (!textEditor) + continue; + QString fileName = textEditor->file()->fileName(); + workingCopy[fileName] = textEditor->contents(); + } + return workingCopy; +} diff --git a/src/plugins/texteditor/itexteditor.h b/src/plugins/texteditor/itexteditor.h index 330fa0f49f4..81949bb3685 100644 --- a/src/plugins/texteditor/itexteditor.h +++ b/src/plugins/texteditor/itexteditor.h @@ -36,6 +36,7 @@ #include #include +#include #include #include @@ -118,6 +119,7 @@ public: virtual void setTextCodec(QTextCodec *) = 0; virtual QTextCodec *textCodec() const = 0; + static QMap openedTextEditorsContents(); signals: void contentsChanged(); diff --git a/src/plugins/texteditor/texteditor.pro b/src/plugins/texteditor/texteditor.pro index 38c5861d0b4..eb0cf26b511 100644 --- a/src/plugins/texteditor/texteditor.pro +++ b/src/plugins/texteditor/texteditor.pro @@ -28,7 +28,8 @@ SOURCES += texteditorplugin.cpp \ codecselector.cpp \ findincurrentfile.cpp \ colorscheme.cpp \ - colorschemeedit.cpp + colorschemeedit.cpp \ + itexteditor.cpp HEADERS += texteditorplugin.h \ textfilewizard.h \ plaintexteditor.h \