DiffEditor: Refactor the user-facing parts

* Move all data handling into DiffEditorDocument
* Move much of the logic of how to update views into the
  DiffEditor.
* Introduce a base class for the different views on the diff
  to implement.
* Remove DiffEditorGuiController
* Make DiffEditorController smaller and merge the DiffEditorReloader
  into the class
* Simplify communication between the classes involved
* Make much of the implementation private to the plugin

Change-Id: I7ccb9df6061923bcb34cf3090d6d8331895e83c7
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Jarek Kobus <jaroslaw.kobus@theqtcompany.com>
This commit is contained in:
Tobias Hunger
2015-01-30 16:59:25 +01:00
parent 59640aa7aa
commit b2b8b867d6
28 changed files with 1306 additions and 1948 deletions

View File

@@ -31,10 +31,10 @@
#include "diffeditorplugin.h"
#include "diffeditor.h"
#include "diffeditorconstants.h"
#include "diffeditorcontroller.h"
#include "diffeditordocument.h"
#include "diffeditorfactory.h"
#include "diffeditormanager.h"
#include "diffeditorreloader.h"
#include "differ.h"
#include <QAction>
@@ -53,12 +53,12 @@
namespace DiffEditor {
namespace Internal {
class SimpleDiffEditorReloader : public DiffEditorReloader
class FileDiffController : public DiffEditorController
{
Q_OBJECT
public:
SimpleDiffEditorReloader(const QString &leftFileName,
const QString &rightFileName);
FileDiffController(Core::IDocument *document, const QString &leftFileName,
const QString &rightFileName);
protected:
void reload();
@@ -68,14 +68,12 @@ private:
QString m_rightFileName;
};
SimpleDiffEditorReloader::SimpleDiffEditorReloader(const QString &leftFileName,
const QString &rightFileName)
: m_leftFileName(leftFileName),
m_rightFileName(rightFileName)
{
}
FileDiffController::FileDiffController(Core::IDocument *document, const QString &leftFileName,
const QString &rightFileName) :
DiffEditorController(document), m_leftFileName(leftFileName), m_rightFileName(rightFileName)
{ }
void SimpleDiffEditorReloader::reload()
void FileDiffController::reload()
{
QString errorString;
Utils::TextFileFormat format;
@@ -86,7 +84,6 @@ void SimpleDiffEditorReloader::reload()
format.codec,
&leftText, &format, &errorString)
!= Utils::TextFileFormat::ReadSuccess) {
return;
}
@@ -95,13 +92,11 @@ void SimpleDiffEditorReloader::reload()
format.codec,
&rightText, &format, &errorString)
!= Utils::TextFileFormat::ReadSuccess) {
return;
}
Differ differ;
QList<Diff> diffList = differ.cleanupSemantics(
differ.diff(leftText, rightText));
QList<Diff> diffList = differ.cleanupSemantics(differ.diff(leftText, rightText));
QList<Diff> leftDiffList;
QList<Diff> rightDiffList;
@@ -109,15 +104,13 @@ void SimpleDiffEditorReloader::reload()
QList<Diff> outputLeftDiffList;
QList<Diff> outputRightDiffList;
if (controller()->isIgnoreWhitespace()) {
const QList<Diff> leftIntermediate =
Differ::moveWhitespaceIntoEqualities(leftDiffList);
const QList<Diff> rightIntermediate =
Differ::moveWhitespaceIntoEqualities(rightDiffList);
Differ::ignoreWhitespaceBetweenEqualities(leftIntermediate,
rightIntermediate,
&outputLeftDiffList,
&outputRightDiffList);
if (ignoreWhitespace()) {
const QList<Diff> leftIntermediate
= Differ::moveWhitespaceIntoEqualities(leftDiffList);
const QList<Diff> rightIntermediate
= Differ::moveWhitespaceIntoEqualities(rightDiffList);
Differ::ignoreWhitespaceBetweenEqualities(leftIntermediate, rightIntermediate,
&outputLeftDiffList, &outputRightDiffList);
} else {
outputLeftDiffList = leftDiffList;
outputRightDiffList = rightDiffList;
@@ -125,45 +118,31 @@ void SimpleDiffEditorReloader::reload()
const ChunkData chunkData = DiffUtils::calculateOriginalData(
outputLeftDiffList, outputRightDiffList);
FileData fileData = DiffUtils::calculateContextData(
chunkData, controller()->contextLinesNumber(), 0);
FileData fileData = DiffUtils::calculateContextData(chunkData, contextLineCount(), 0);
fileData.leftFileInfo.fileName = m_leftFileName;
fileData.rightFileInfo.fileName = m_rightFileName;
QList<FileData> fileDataList;
fileDataList << fileData;
controller()->requestSaveState();
controller()->setDiffFiles(fileDataList);
controller()->requestRestoreState();
reloadFinished();
setDiffFiles(fileDataList);
reloadFinished(true);
}
/////////////////
DiffEditorPlugin::DiffEditorPlugin()
{
}
DiffEditorPlugin::~DiffEditorPlugin()
{
}
bool DiffEditorPlugin::initialize(const QStringList &arguments, QString *errorMessage)
{
Q_UNUSED(arguments)
Q_UNUSED(errorMessage)
//register actions
Core::ActionContainer *toolsContainer =
Core::ActionManager::actionContainer(Core::Constants::M_TOOLS);
toolsContainer->insertGroup(Core::Constants::G_TOOLS_OPTIONS,
Constants::G_TOOLS_DIFF);
Core::ActionContainer *toolsContainer
= Core::ActionManager::actionContainer(Core::Constants::M_TOOLS);
toolsContainer->insertGroup(Core::Constants::G_TOOLS_OPTIONS, Constants::G_TOOLS_DIFF);
QAction *diffAction = new QAction(tr("Diff..."), this);
Core::Command *diffCommand = Core::ActionManager::registerAction(diffAction,
"DiffEditor.Diff");
Core::Command *diffCommand = Core::ActionManager::registerAction(diffAction, "DiffEditor.Diff");
connect(diffAction, &QAction::triggered, this, &DiffEditorPlugin::diff);
toolsContainer->addAction(diffCommand, Constants::G_TOOLS_DIFF);
@@ -175,8 +154,7 @@ bool DiffEditorPlugin::initialize(const QStringList &arguments, QString *errorMe
}
void DiffEditorPlugin::extensionsInitialized()
{
}
{ }
void DiffEditorPlugin::diff()
{
@@ -193,24 +171,19 @@ void DiffEditorPlugin::diff()
return;
const QString documentId = QLatin1String("Diff ") + fileName1
+ QLatin1String(", ") + fileName2;
const QString documentId = QLatin1String("Diff ") + fileName1 + QLatin1String(", ") + fileName2;
QString title = tr("Diff \"%1\", \"%2\"").arg(fileName1).arg(fileName2);
Core::IDocument *const document = DiffEditorManager::findOrCreate(documentId, title);
auto const document
= qobject_cast<DiffEditorDocument *>(DiffEditorManager::findOrCreate(documentId, title));
if (!document)
return;
DiffEditorController *controller = DiffEditorManager::controller(document);
if (!controller)
controller = new FileDiffController(document, fileName1, fileName2);
QTC_ASSERT(controller, return);
if (!controller->reloader()) {
SimpleDiffEditorReloader *reloader =
new SimpleDiffEditorReloader(fileName1, fileName2);
controller->setReloader(reloader);
}
Core::EditorManager::activateEditorForDocument(document);
controller->requestReload();
document->reload();
}
} // namespace Internal