diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp index 95e1b8273dfd78eb60681fde5a5a6539786a8256..8faca99e0fca9ba4e502536d0bc526faf92d7b85 100644 --- a/src/plugins/cpptools/cppfindreferences.cpp +++ b/src/plugins/cpptools/cppfindreferences.cpp @@ -36,6 +36,7 @@ #include <extensionsystem/pluginmanager.h> #include <utils/filesearch.h> #include <coreplugin/progressmanager/progressmanager.h> +#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/icore.h> #include <ASTVisitor.h> @@ -574,6 +575,23 @@ void CppFindReferences::findAll_helper(Symbol *symbol) connect(progress, SIGNAL(clicked()), _resultWindow, SLOT(popup())); } +static void applyChanges(QTextDocument *doc, const QString &text, const QList<Find::SearchResultItem> &items) +{ + QList<QTextCursor> cursors; + + foreach (const Find::SearchResultItem &item, items) { + const int blockNumber = item.lineNumber - 1; + QTextCursor tc(doc->findBlockByNumber(blockNumber)); + tc.setPosition(tc.position() + item.searchTermStart); + tc.setPosition(tc.position() + item.searchTermLength, + QTextCursor::KeepAnchor); + cursors.append(tc); + } + + foreach (QTextCursor tc, cursors) + tc.insertText(text); +} + void CppFindReferences::onReplaceButtonClicked(const QString &text, const QList<Find::SearchResultItem> &items) { @@ -585,41 +603,48 @@ void CppFindReferences::onReplaceButtonClicked(const QString &text, foreach (const Find::SearchResultItem &item, items) changes[item.fileName].append(item); + Core::EditorManager *editorManager = Core::EditorManager::instance(); + QHashIterator<QString, QList<Find::SearchResultItem> > it(changes); while (it.hasNext()) { it.next(); const QString fileName = it.key(); - QFile file(fileName); - - if (file.open(QFile::ReadOnly)) { - QTextStream stream(&file); - // ### set the encoding - const QString plainText = stream.readAll(); - file.close(); - - QTextDocument doc; - doc.setPlainText(plainText); - - QList<QTextCursor> cursors; - const QList<Find::SearchResultItem> items = it.value(); - foreach (const Find::SearchResultItem &item, items) { - const int blockNumber = item.lineNumber - 1; - QTextCursor tc(doc.findBlockByNumber(blockNumber)); - tc.setPosition(tc.position() + item.searchTermStart); - tc.setPosition(tc.position() + item.searchTermLength, - QTextCursor::KeepAnchor); - cursors.append(tc); - } + const QList<Find::SearchResultItem> items = it.value(); - foreach (QTextCursor tc, cursors) - tc.insertText(text); + const QList<Core::IEditor *> editors = editorManager->editorsForFileName(fileName); + TextEditor::BaseTextEditor *textEditor = 0; + foreach (Core::IEditor *editor, editors) { + textEditor = qobject_cast<TextEditor::BaseTextEditor *>(editor->widget()); + if (textEditor != 0) + break; + } + + if (textEditor != 0) { + QTextCursor tc = textEditor->textCursor(); + tc.beginEditBlock(); + applyChanges(textEditor->document(), text, items); + tc.endEditBlock(); + } else { + QFile file(fileName); - QFile newFile(fileName); - if (newFile.open(QFile::WriteOnly)) { - QTextStream stream(&newFile); + if (file.open(QFile::ReadOnly)) { + QTextStream stream(&file); // ### set the encoding - stream << doc.toPlainText(); + const QString plainText = stream.readAll(); + file.close(); + + QTextDocument doc; + doc.setPlainText(plainText); + + applyChanges(&doc, text, items); + + QFile newFile(fileName); + if (newFile.open(QFile::WriteOnly)) { + QTextStream stream(&newFile); + // ### set the encoding + stream << doc.toPlainText(); + } } } }