diff options
author | jkobus <jaroslaw.kobus@digia.com> | 2014-06-30 15:04:36 +0200 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@digia.com> | 2014-07-04 14:31:01 +0200 |
commit | 656c3343ee47d495c0008482a73e021e2536bd2a (patch) | |
tree | 07b21054f4f06fa5cb52d02d3ac0ccf30f758dfd | |
parent | 337c1b3b69223c2056576e305e0fa04744e68985 (diff) |
Make it possible to save diff editor contents
Task-number: QTCREATORBUG-12548
Task-number: QTCREATORBUG-12549
Change-Id: Ia27080cc689da48fc5401010e2277edaf0a01f4d
Reviewed-by: Eike Ziller <eike.ziller@digia.com>
-rw-r--r-- | src/plugins/diffeditor/diffeditor.cpp | 13 | ||||
-rw-r--r-- | src/plugins/diffeditor/diffeditordocument.cpp | 34 | ||||
-rw-r--r-- | src/plugins/diffeditor/diffeditordocument.h | 8 | ||||
-rw-r--r-- | src/plugins/diffeditor/diffeditorplugin.cpp | 33 | ||||
-rw-r--r-- | src/plugins/diffeditor/diffutils.cpp | 47 | ||||
-rw-r--r-- | src/plugins/diffeditor/diffutils.h | 3 |
6 files changed, 108 insertions, 30 deletions
diff --git a/src/plugins/diffeditor/diffeditor.cpp b/src/plugins/diffeditor/diffeditor.cpp index d18e7bbfb2..bfcf435d96 100644 --- a/src/plugins/diffeditor/diffeditor.cpp +++ b/src/plugins/diffeditor/diffeditor.cpp @@ -51,6 +51,7 @@ #include <QToolBar> #include <QComboBox> #include <QFileInfo> +#include <QDir> #include <QTextCodec> #include <QTextBlock> @@ -316,13 +317,9 @@ bool DiffEditor::open(QString *errorString, if (!m_controller) return false; - QFile file(fileName); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - *errorString = tr("Could not open patch file \"%1\".").arg(fileName); + QString patch; + if (m_document->read(fileName, &patch, errorString) != Utils::TextFileFormat::ReadSuccess) return false; - } - - const QString patch = Core::EditorManager::defaultTextCodec()->toUnicode(file.readAll()); bool ok = false; QList<FileData> fileDataList @@ -336,7 +333,9 @@ bool DiffEditor::open(QString *errorString, return false; } - m_controller->setDiffFiles(fileDataList, QFileInfo(fileName).absolutePath()); + const QFileInfo fi(fileName); + m_document->setFilePath(QDir::cleanPath(fi.absoluteFilePath())); + m_controller->setDiffFiles(fileDataList, fi.absolutePath()); return true; } diff --git a/src/plugins/diffeditor/diffeditordocument.cpp b/src/plugins/diffeditor/diffeditordocument.cpp index a13e23f2e5..e36fcd6a8e 100644 --- a/src/plugins/diffeditor/diffeditordocument.cpp +++ b/src/plugins/diffeditor/diffeditordocument.cpp @@ -30,17 +30,22 @@ #include "diffeditordocument.h" #include "diffeditorconstants.h" #include "diffeditorcontroller.h" +#include "diffutils.h" + +#include <coreplugin/editormanager/editormanager.h> #include <QCoreApplication> +#include <QFile> +#include <QDir> +#include <QTextCodec> namespace DiffEditor { DiffEditorDocument::DiffEditorDocument() : - Core::IDocument(), + Core::TextDocument(), m_diffEditorController(new DiffEditorController(this)) { setId(Constants::DIFF_EDITOR_ID); - setDisplayName(QCoreApplication::translate("DiffEditor", Constants::DIFF_EDITOR_DISPLAY_NAME)); setTemporary(true); } @@ -59,12 +64,33 @@ bool DiffEditorDocument::setContents(const QByteArray &contents) return true; } +QString DiffEditorDocument::defaultPath() const +{ + if (!m_diffEditorController) + return QString(); + + return m_diffEditorController->workingDirectory(); +} + bool DiffEditorDocument::save(QString *errorString, const QString &fileName, bool autoSave) { Q_UNUSED(errorString) - Q_UNUSED(fileName) Q_UNUSED(autoSave) - return false; + + if (!m_diffEditorController) + return false; + + const QString contents = DiffUtils::makePatch(m_diffEditorController->diffFiles()); + + const bool ok = write(fileName, format(), contents, errorString); + + if (!ok) + return false; + + const QFileInfo fi(fileName); + setFilePath(QDir::cleanPath(fi.absoluteFilePath())); + setDisplayName(QString()); + return true; } Core::IDocument::ReloadBehavior DiffEditorDocument::reloadBehavior(ChangeTrigger state, ChangeType type) const diff --git a/src/plugins/diffeditor/diffeditordocument.h b/src/plugins/diffeditor/diffeditordocument.h index 8626356288..022bfad607 100644 --- a/src/plugins/diffeditor/diffeditordocument.h +++ b/src/plugins/diffeditor/diffeditordocument.h @@ -32,13 +32,13 @@ #include "diffeditor_global.h" -#include <coreplugin/idocument.h> +#include <coreplugin/textdocument.h> namespace DiffEditor { class DiffEditorController; -class DIFFEDITOR_EXPORT DiffEditorDocument : public Core::IDocument +class DIFFEDITOR_EXPORT DiffEditorDocument : public Core::TextDocument { Q_OBJECT public: @@ -48,11 +48,11 @@ public: DiffEditorController *controller() const; bool setContents(const QByteArray &contents); - QString defaultPath() const { return QString(); } + QString defaultPath() const; QString suggestedFileName() const { return QString(); } bool isModified() const { return false; } - bool isSaveAsAllowed() const { return false; } + bool isSaveAsAllowed() const { return true; } bool save(QString *errorString, const QString &fileName, bool autoSave); ReloadBehavior reloadBehavior(ChangeTrigger state, ChangeType type) const; bool reload(QString *errorString, ReloadFlag flag, ChangeType type); diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp index 7dbf1bb28b..980c3a6e7e 100644 --- a/src/plugins/diffeditor/diffeditorplugin.cpp +++ b/src/plugins/diffeditor/diffeditorplugin.cpp @@ -61,8 +61,6 @@ protected: void reload(); private: - QString getFileContents(const QString &fileName) const; - QString m_leftFileName; QString m_rightFileName; }; @@ -78,8 +76,27 @@ SimpleDiffEditorReloader::SimpleDiffEditorReloader(QObject *parent, void SimpleDiffEditorReloader::reload() { - const QString leftText = getFileContents(m_leftFileName); - const QString rightText = getFileContents(m_rightFileName); + QString errorString; + Utils::TextFileFormat format; + format.codec = Core::EditorManager::defaultTextCodec(); + + QString leftText; + if (Utils::TextFileFormat::readFile(m_leftFileName, + format.codec, + &leftText, &format, &errorString) + != Utils::TextFileFormat::ReadSuccess) { + + return; + } + + QString rightText; + if (Utils::TextFileFormat::readFile(m_rightFileName, + format.codec, + &rightText, &format, &errorString) + != Utils::TextFileFormat::ReadSuccess) { + + return; + } Differ differ; QList<Diff> diffList = differ.cleanupSemantics( @@ -120,14 +137,6 @@ void SimpleDiffEditorReloader::reload() reloadFinished(); } -QString SimpleDiffEditorReloader::getFileContents(const QString &fileName) const -{ - QFile file(fileName); - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) - return Core::EditorManager::defaultTextCodec()->toUnicode(file.readAll()); - return QString(); -} - ///////////////// DiffEditorPlugin::DiffEditorPlugin() diff --git a/src/plugins/diffeditor/diffutils.cpp b/src/plugins/diffeditor/diffutils.cpp index e12d257439..0785e815bc 100644 --- a/src/plugins/diffeditor/diffutils.cpp +++ b/src/plugins/diffeditor/diffutils.cpp @@ -346,9 +346,7 @@ QString DiffUtils::makePatchLine(const QChar &startLineCharacter, } QString DiffUtils::makePatch(const ChunkData &chunkData, - const QString &leftFileName, - const QString &rightFileName, - bool lastChunk) + bool lastChunk) { QString diffText; int leftLineCount = 0; @@ -425,6 +423,16 @@ QString DiffUtils::makePatch(const ChunkData &chunkData, diffText.prepend(chunkLine); + return diffText; +} + +QString DiffUtils::makePatch(const ChunkData &chunkData, + const QString &leftFileName, + const QString &rightFileName, + bool lastChunk) +{ + QString diffText = makePatch(chunkData, lastChunk); + const QString rightFileInfo = QLatin1String("+++ ") + rightFileName + QLatin1Char('\n'); const QString leftFileInfo = QLatin1String("--- ") + leftFileName + QLatin1Char('\n'); @@ -434,6 +442,39 @@ QString DiffUtils::makePatch(const ChunkData &chunkData, return diffText; } +QString DiffUtils::makePatch(const QList<FileData> &fileDataList) +{ + QString diffText; + + for (int i = 0; i < fileDataList.count(); i++) { + const FileData &fileData = fileDataList.at(i); + + if (fileData.binaryFiles) { + const QString binaryLine = QLatin1String("Binary files ") + + fileData.leftFileInfo.fileName + + QLatin1String(" and ") + + fileData.rightFileInfo.fileName + + QLatin1String(" differ\n"); + diffText += binaryLine; + } else { + const QString leftFileInfo = QLatin1String("--- ") + + fileData.leftFileInfo.fileName + QLatin1Char('\n'); + const QString rightFileInfo = QLatin1String("+++ ") + + fileData.rightFileInfo.fileName + QLatin1Char('\n'); + + diffText += leftFileInfo; + diffText += rightFileInfo; + + for (int j = 0; j < fileData.chunks.count(); j++) { + diffText += makePatch(fileData.chunks.at(j), + (j == fileData.chunks.count() - 1) + && fileData.lastChunkAtTheEndOfFile); + } + } + } + return diffText; +} + static QList<RowData> readLines(const QString &patch, bool ignoreWhitespace, bool lastChunk, diff --git a/src/plugins/diffeditor/diffutils.h b/src/plugins/diffeditor/diffutils.h index 9043969929..1c5d237e2d 100644 --- a/src/plugins/diffeditor/diffutils.h +++ b/src/plugins/diffeditor/diffutils.h @@ -129,9 +129,12 @@ public: bool lastChunk, bool lastLine); static QString makePatch(const ChunkData &chunkData, + bool lastChunk = false); + static QString makePatch(const ChunkData &chunkData, const QString &leftFileName, const QString &rightFileName, bool lastChunk = false); + static QString makePatch(const QList<FileData> &fileDataList); static QList<FileData> readPatch(const QString &patch, bool ignoreWhitespace, bool *ok = 0); |