Skip to content
Snippets Groups Projects
Commit b1b4cccc authored by Leandro Melo's avatar Leandro Melo Committed by Leandro T. C. Melo
Browse files

Editors: Make base replace use RefactoringChanges


This fixes the encoding related issue below and also makes the code cleaner.

Task-number: QTCREATORBUG-6147
Change-Id: Ia61815217433da327206590b515e10d654bcc03f
Reviewed-by: default avatarChristian Kamm <christian.d.kamm@nokia.com>
parent 8532e7b1
No related branches found
No related tags found
No related merge requests found
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
#include <find/textfindconstants.h> #include <find/textfindconstants.h>
#include <texteditor/itexteditor.h> #include <texteditor/itexteditor.h>
#include <texteditor/basetexteditor.h> #include <texteditor/basetexteditor.h>
#include <texteditor/refactoringchanges.h>
#include <utils/stylehelper.h> #include <utils/stylehelper.h>
#include <utils/fileutils.h> #include <utils/fileutils.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
...@@ -49,6 +50,8 @@ ...@@ -49,6 +50,8 @@
#include <QtCore/QDebug> #include <QtCore/QDebug>
#include <QtCore/QDirIterator> #include <QtCore/QDirIterator>
#include <QtCore/QSettings> #include <QtCore/QSettings>
#include <QtCore/QHash>
#include <QtCore/QPair>
#include <QtGui/QFileDialog> #include <QtGui/QFileDialog>
#include <QtGui/QCheckBox> #include <QtGui/QCheckBox>
#include <QtGui/QComboBox> #include <QtGui/QComboBox>
...@@ -313,108 +316,46 @@ void BaseFileFind::hideHighlightAll(bool visible) ...@@ -313,108 +316,46 @@ void BaseFileFind::hideHighlightAll(bool visible)
m_currentFindSupport->clearResults(); m_currentFindSupport->clearResults();
} }
// #pragma mark Static methods
static void applyChanges(QTextDocument *doc, const QString &text, const QList<Find::SearchResultItem> &items)
{
QList<QPair<QTextCursor, QString> > changes;
foreach (const Find::SearchResultItem &item, items) {
const int blockNumber = item.lineNumber - 1;
QTextCursor tc(doc->findBlockByNumber(blockNumber));
const int cursorPosition = tc.position() + item.textMarkPos;
int cursorIndex = 0;
for (; cursorIndex < changes.size(); ++cursorIndex) {
const QTextCursor &otherTc = changes.at(cursorIndex).first;
if (otherTc.position() == cursorPosition)
break;
}
if (cursorIndex != changes.size())
continue; // skip this change.
tc.setPosition(cursorPosition);
tc.setPosition(tc.position() + item.textMarkLength,
QTextCursor::KeepAnchor);
QString substitutionText;
if (item.userData.canConvert<QStringList>() && !item.userData.toStringList().isEmpty())
substitutionText = Utils::expandRegExpReplacement(text, item.userData.toStringList());
else
substitutionText = text;
changes.append(QPair<QTextCursor, QString>(tc, substitutionText));
}
for (int i = 0; i < changes.size(); ++i) {
QPair<QTextCursor, QString> &cursor = changes[i];
cursor.first.insertText(cursor.second);
}
}
QStringList BaseFileFind::replaceAll(const QString &text, QStringList BaseFileFind::replaceAll(const QString &text,
const QList<Find::SearchResultItem> &items) const QList<Find::SearchResultItem> &items)
{ {
if (items.isEmpty()) if (items.isEmpty())
return QStringList(); return QStringList();
QHash<QString, QList<Find::SearchResultItem> > changes; RefactoringChanges refactoring;
QHash<QString, QList<Find::SearchResultItem> > changes;
foreach (const Find::SearchResultItem &item, items) foreach (const Find::SearchResultItem &item, items)
changes[QDir::fromNativeSeparators(item.path.first())].append(item); changes[QDir::fromNativeSeparators(item.path.first())].append(item);
Core::EditorManager *editorManager = Core::EditorManager::instance();
QHashIterator<QString, QList<Find::SearchResultItem> > it(changes); QHashIterator<QString, QList<Find::SearchResultItem> > it(changes);
while (it.hasNext()) { while (it.hasNext()) {
it.next(); it.next();
const QString fileName = it.key(); const QString fileName = it.key();
const QList<Find::SearchResultItem> changeItems = it.value(); const QList<Find::SearchResultItem> changeItems = it.value();
const QList<Core::IEditor *> editors = editorManager->editorsForFileName(fileName); ChangeSet changeSet;
TextEditor::BaseTextEditorWidget *textEditor = 0; RefactoringFilePtr file = refactoring.file(fileName);
foreach (Core::IEditor *editor, editors) { QSet<QPair<int, int> > processed;
textEditor = qobject_cast<TextEditor::BaseTextEditorWidget *>(editor->widget()); foreach (const Find::SearchResultItem &item, changeItems) {
if (textEditor != 0) const QPair<int, int> &p = qMakePair(item.lineNumber, item.textMarkPos);
break; if (processed.contains(p))
} continue;
processed.insert(p);
if (textEditor != 0) {
QTextCursor tc = textEditor->textCursor(); QString replacement;
tc.beginEditBlock(); if (item.userData.canConvert<QStringList>() && !item.userData.toStringList().isEmpty())
applyChanges(textEditor->document(), text, changeItems); replacement = Utils::expandRegExpReplacement(text, item.userData.toStringList());
tc.endEditBlock(); else
} else { replacement = text;
Utils::FileReader reader;
if (reader.fetch(fileName, Core::ICore::instance()->mainWindow())) { const int start = file->position(item.lineNumber, item.textMarkPos + 1);
// Keep track of line ending since QTextDocument is '\n' based. const int end = file->position(item.lineNumber,
bool convertLineEnding = false; item.textMarkPos + item.textMarkLength + 1);
const QByteArray &data = reader.data(); changeSet.replace(start, end, replacement);
const int lf = data.indexOf('\n');
if (lf > 0 && data.at(lf - 1) == '\r')
convertLineEnding = true;
QTextDocument doc;
// ### set the encoding
doc.setPlainText(QString::fromLocal8Bit(data));
applyChanges(&doc, text, changeItems);
QString plainText = doc.toPlainText();
if (convertLineEnding)
plainText.replace(QLatin1Char('\n'), QLatin1String("\r\n"));
Utils::FileSaver saver(fileName);
if (!saver.hasError()) {
QTextStream stream(saver.file());
// ### set the encoding
stream << plainText;
saver.setResult(&stream);
}
saver.finalize(Core::ICore::instance()->mainWindow());
}
} }
file->setChangeSet(changeSet);
file->apply();
} }
return changes.keys(); return changes.keys();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment