diff options
author | Jarek Kobus <jaroslaw.kobus@qt.io> | 2016-11-25 15:23:52 +0100 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@qt.io> | 2017-03-28 14:36:54 +0000 |
commit | 9774f117381008eaa14de9822609b954bf144628 (patch) | |
tree | 3c21cde9c080b29235858b8cf897f76b5752d3de /src | |
parent | ecacea18cbf9fe24dbe1b559811da68cb0dfb3dc (diff) | |
download | qt-creator-9774f117381008eaa14de9822609b954bf144628.tar.gz |
Support diff a file from project explorer against the current file
Task-number: QTCREATORBUG-9432
Change-Id: Ie370bbffdb67dac520f392a73c1358f887157806
Reviewed-by: André Hartmann <aha_1980@gmx.de>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/coreplugin/diffservice.h | 1 | ||||
-rw-r--r-- | src/plugins/diffeditor/diffeditorplugin.cpp | 16 | ||||
-rw-r--r-- | src/plugins/diffeditor/diffeditorplugin.h | 1 | ||||
-rw-r--r-- | src/plugins/projectexplorer/projectexplorer.cpp | 64 | ||||
-rw-r--r-- | src/plugins/texteditor/textdocument.cpp | 5 | ||||
-rw-r--r-- | src/plugins/texteditor/textdocument.h | 1 |
6 files changed, 88 insertions, 0 deletions
diff --git a/src/plugins/coreplugin/diffservice.h b/src/plugins/coreplugin/diffservice.h index 3b282170dd..25f2d69848 100644 --- a/src/plugins/coreplugin/diffservice.h +++ b/src/plugins/coreplugin/diffservice.h @@ -37,6 +37,7 @@ class CORE_EXPORT DiffService public: virtual ~DiffService() {} + virtual void diffFiles(const QString &leftFileName, const QString &rightFileName) = 0; virtual void diffModifiedFiles(const QStringList &fileNames) = 0; }; diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp index e324d60aa3..be04222148 100644 --- a/src/plugins/diffeditor/diffeditorplugin.cpp +++ b/src/plugins/diffeditor/diffeditorplugin.cpp @@ -426,6 +426,22 @@ DiffEditorServiceImpl::DiffEditorServiceImpl(QObject *parent) : { } +void DiffEditorServiceImpl::diffFiles(const QString &leftFileName, const QString &rightFileName) +{ + const QString documentId = Constants::DIFF_EDITOR_PLUGIN + + QLatin1String(".DiffFiles.") + leftFileName + QLatin1Char('.') + rightFileName; + const QString title = tr("Diff Files"); + auto const document = qobject_cast<DiffEditorDocument *>( + DiffEditorController::findOrCreateDocument(documentId, title)); + if (!document) + return; + + if (!DiffEditorController::controller(document)) + new DiffExternalFilesController(document, leftFileName, rightFileName); + EditorManager::activateEditorForDocument(document); + document->reload(); +} + void DiffEditorServiceImpl::diffModifiedFiles(const QStringList &fileNames) { const QString documentId = Constants::DIFF_EDITOR_PLUGIN diff --git a/src/plugins/diffeditor/diffeditorplugin.h b/src/plugins/diffeditor/diffeditorplugin.h index 688ba1ccfc..848de9b6cf 100644 --- a/src/plugins/diffeditor/diffeditorplugin.h +++ b/src/plugins/diffeditor/diffeditorplugin.h @@ -44,6 +44,7 @@ class DiffEditorServiceImpl : public QObject, public Core::DiffService public: explicit DiffEditorServiceImpl(QObject *parent = nullptr); + void diffFiles(const QString &leftFileName, const QString &rightFileName) override; void diffModifiedFiles(const QStringList &fileNames) override; }; diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 2bbb0e5037..f381b3e74c 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -115,7 +115,10 @@ #include <coreplugin/iversioncontrol.h> #include <coreplugin/fileutils.h> #include <coreplugin/removefiledialog.h> +#include <coreplugin/diffservice.h> #include <texteditor/findinfiles.h> +#include <texteditor/textdocument.h> +#include <texteditor/texteditorconstants.h> #include <ssh/sshconnection.h> #include <utils/algorithm.h> @@ -211,6 +214,7 @@ const char REMOVEFILE[] = "ProjectExplorer.RemoveFile"; const char DUPLICATEFILE[] = "ProjectExplorer.DuplicateFile"; const char DELETEFILE[] = "ProjectExplorer.DeleteFile"; const char RENAMEFILE[] = "ProjectExplorer.RenameFile"; +const char DIFFFILE[] = "ProjectExplorer.DiffFile"; const char SETSTARTUP[] = "ProjectExplorer.SetStartup"; const char PROJECTTREE_COLLAPSE_ALL[] = "ProjectExplorer.CollapseAll"; @@ -255,6 +259,17 @@ static Kit *currentKit() return target ? target->kit() : nullptr; } +static bool isTextFile(const QString &fileName) +{ + return Utils::mimeTypeForFile(fileName).inherits( + TextEditor::Constants::C_TEXTEDITOR_MIMETYPE_TEXT); +} + +static bool isDiffServiceAvailable() +{ + return ExtensionSystem::PluginManager::getObject<DiffService>(); +} + class ProjectExplorerPluginPrivate : public QObject { Q_DECLARE_TR_FUNCTIONS(ProjectExplorer::ProjectExplorerPlugin) @@ -303,6 +318,7 @@ public: void duplicateFile(); void deleteFile(); void handleRenameFile(); + void handleDiffFile(); void handleSetStartupProject(); void setStartupProject(ProjectExplorer::Project *project); @@ -375,6 +391,7 @@ public: QAction *m_removeProjectAction; QAction *m_deleteFileAction; QAction *m_renameFileAction; + QAction *m_diffFileAction; QAction *m_openFileAction; QAction *m_projectTreeCollapseAllAction; QAction *m_searchOnFileSystem; @@ -1063,6 +1080,12 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er cmd = ActionManager::registerAction(dd->m_renameFileAction, Constants::RENAMEFILE, projecTreeContext); mfileContextMenu->addAction(cmd, Constants::G_FILE_OTHER); + + // diff file action + dd->m_diffFileAction = new QAction(tr("Diff Against Current File"), this); + cmd = ActionManager::registerAction(dd->m_diffFileAction, Constants::DIFFFILE, projecTreeContext); + mfileContextMenu->addAction(cmd, Constants::G_FILE_OTHER); + // Not yet used by anyone, so hide for now // mfolder->addAction(cmd, Constants::G_FOLDER_FILES); // msubProject->addAction(cmd, Constants::G_FOLDER_FILES); @@ -1302,6 +1325,8 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er dd, &ProjectExplorerPluginPrivate::deleteFile); connect(dd->m_renameFileAction, &QAction::triggered, dd, &ProjectExplorerPluginPrivate::handleRenameFile); + connect(dd->m_diffFileAction, &QAction::triggered, + dd, &ProjectExplorerPluginPrivate::handleDiffFile); connect(dd->m_setStartupProjectAction, &QAction::triggered, dd, &ProjectExplorerPluginPrivate::handleSetStartupProject); connect(dd->m_projectTreeCollapseAllAction, &QAction::triggered, @@ -2889,6 +2914,7 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions() m_duplicateFileAction->setEnabled(false); m_deleteFileAction->setEnabled(false); m_renameFileAction->setEnabled(false); + m_diffFileAction->setEnabled(false); m_addExistingFilesAction->setVisible(true); m_addExistingDirectoryAction->setVisible(true); @@ -2899,6 +2925,7 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions() m_duplicateFileAction->setVisible(false); m_deleteFileAction->setVisible(true); m_runActionContextMenu->setVisible(false); + m_diffFileAction->setVisible(isDiffServiceAvailable()); m_openTerminalHere->setVisible(true); m_showInGraphicalShell->setVisible(true); @@ -2966,6 +2993,10 @@ void ProjectExplorerPluginPrivate::updateContextMenuActions() m_removeFileAction->setVisible(!enableDelete || enableRemove); m_renameFileAction->setEnabled(actions.contains(Rename)); + const bool currentNodeIsTextFile = isTextFile( + ProjectTree::currentNode()->filePath().toString()); + m_diffFileAction->setEnabled(isDiffServiceAvailable() + && currentNodeIsTextFile && TextEditor::TextDocument::currentTextDocument()); m_duplicateFileAction->setVisible(actions.contains(DuplicateFile)); m_duplicateFileAction->setEnabled(actions.contains(DuplicateFile)); @@ -3249,6 +3280,39 @@ void ProjectExplorerPluginPrivate::handleRenameFile() } } +void ProjectExplorerPluginPrivate::handleDiffFile() +{ + // current editor's file + auto textDocument = TextEditor::TextDocument::currentTextDocument(); + + if (!textDocument) + return; + + const QString leftFileName = textDocument->filePath().toString(); + + if (leftFileName.isEmpty()) + return; + + // current item's file + Node *currentNode = ProjectTree::currentNode(); + QTC_ASSERT(currentNode && currentNode->nodeType() == NodeType::File, return); + + FileNode *fileNode = currentNode->asFileNode(); + + if (!fileNode) + return; + + const QString rightFileName = currentNode->filePath().toString(); + if (rightFileName.isEmpty()) + return; + + if (!isTextFile(rightFileName)) + return; + + if (auto diffService = ExtensionSystem::PluginManager::getObject<DiffService>()) + diffService->diffFiles(leftFileName, rightFileName); +} + void ProjectExplorerPlugin::renameFile(Node *node, const QString &newFilePath) { const QString oldFilePath = node->filePath().toFileInfo().absoluteFilePath(); diff --git a/src/plugins/texteditor/textdocument.cpp b/src/plugins/texteditor/textdocument.cpp index a6280978f7..707d87a97a 100644 --- a/src/plugins/texteditor/textdocument.cpp +++ b/src/plugins/texteditor/textdocument.cpp @@ -291,6 +291,11 @@ QMap<QString, QTextCodec *> TextDocument::openedTextDocumentEncodings() return workingCopy; } +TextDocument *TextDocument::currentTextDocument() +{ + return qobject_cast<TextDocument *>(EditorManager::currentDocument()); +} + QString TextDocument::plainText() const { return document()->toPlainText(); diff --git a/src/plugins/texteditor/textdocument.h b/src/plugins/texteditor/textdocument.h index 4bb466382c..38719dd848 100644 --- a/src/plugins/texteditor/textdocument.h +++ b/src/plugins/texteditor/textdocument.h @@ -65,6 +65,7 @@ public: static QMap<QString, QString> openedTextDocumentContents(); static QMap<QString, QTextCodec *> openedTextDocumentEncodings(); + static TextDocument *currentTextDocument(); virtual QString plainText() const; virtual QString textAt(int pos, int length) const; |