From 73cf43f32370d8986b4c06511b95771582cc421d Mon Sep 17 00:00:00 2001 From: jkobus Date: Tue, 11 Feb 2014 13:00:35 +0100 Subject: [PATCH] Add DiffEditorManager, refactoring. GitDiffSwitcher operates now on IDocument. GitDiffHandler operates now on DiffEditorController. "source" property now attached to editor's document (VcsBasePlugin). Change-Id: Ie2570a597b8b992ac1dc33b9179eca459c8a751a Reviewed-by: Tobias Hunger Reviewed-by: Jarek Kobus --- src/plugins/diffeditor/diffeditor.cpp | 104 +++--- src/plugins/diffeditor/diffeditor.h | 16 +- src/plugins/diffeditor/diffeditor.pro | 2 + src/plugins/diffeditor/diffeditor.qbs | 2 + .../diffeditor/diffeditorcontroller.cpp | 8 +- src/plugins/diffeditor/diffeditorcontroller.h | 7 +- src/plugins/diffeditor/diffeditordocument.cpp | 6 +- src/plugins/diffeditor/diffeditordocument.h | 7 +- src/plugins/diffeditor/diffeditormanager.cpp | 118 +++++++ src/plugins/diffeditor/diffeditormanager.h | 66 ++++ src/plugins/diffeditor/diffeditorplugin.cpp | 18 +- src/plugins/diffeditor/diffeditorplugin.h | 2 +- .../diffeditor/sidebysidediffeditorwidget.cpp | 10 - .../diffeditor/sidebysidediffeditorwidget.h | 10 +- src/plugins/git/gitclient.cpp | 301 ++++++++++-------- src/plugins/git/gitclient.h | 14 +- src/plugins/vcsbase/vcsbaseeditor.cpp | 4 +- src/plugins/vcsbase/vcsbaseplugin.cpp | 10 +- src/plugins/vcsbase/vcsbaseplugin.h | 6 +- 19 files changed, 445 insertions(+), 266 deletions(-) create mode 100644 src/plugins/diffeditor/diffeditormanager.cpp create mode 100644 src/plugins/diffeditor/diffeditormanager.h diff --git a/src/plugins/diffeditor/diffeditor.cpp b/src/plugins/diffeditor/diffeditor.cpp index 682abc27b91..6e23f0558fa 100644 --- a/src/plugins/diffeditor/diffeditor.cpp +++ b/src/plugins/diffeditor/diffeditor.cpp @@ -118,7 +118,7 @@ void DescriptionEditorWidget::setDisplaySettings(const DisplaySettings &ds) DiffEditor::DiffEditor() : IEditor(0) - , m_document(new Internal::DiffEditorDocument(QLatin1String(Constants::DIFF_EDITOR_MIMETYPE))) + , m_document(new DiffEditorDocument(QLatin1String(Constants::DIFF_EDITOR_MIMETYPE))) , m_descriptionWidget(0) , m_diffWidget(0) , m_diffEditorController(0) @@ -163,9 +163,13 @@ void DiffEditor::ctor() m_descriptionWidget->setCodeStyle(TextEditorSettings::codeStyle()); m_descriptionWidget->baseTextDocument()->setFontSettings(TextEditorSettings::fontSettings()); - m_diffEditorController = m_document->diffEditorController(); + m_diffEditorController = m_document->controller(); m_diffWidget->setDiffEditorController(m_diffEditorController); + connect(m_diffEditorController, SIGNAL(cleared(QString)), + this, SLOT(slotCleared(QString))); + connect(m_diffEditorController, SIGNAL(diffContentsChanged(QList,QString)), + this, SLOT(slotDiffContentsChanged(QList,QString))); connect(m_diffEditorController, SIGNAL(currentDiffFileIndexChanged(int)), this, SLOT(activateEntry(int))); connect(m_diffEditorController, SIGNAL(descriptionChanged(QString)), @@ -209,11 +213,6 @@ Core::Id DiffEditor::id() const return Constants::DIFF_EDITOR_ID; } -QTextCodec *DiffEditor::codec() const -{ - return m_diffWidget->codec(); -} - static QToolBar *createToolBar(const QWidget *someWidget) { // Create @@ -275,24 +274,50 @@ QWidget *DiffEditor::toolBar() m_toggleDescriptionAction = m_toolBar->addWidget(toggleDescription); slotDescriptionVisibilityChanged(); - if (m_diffEditorController) { - connect(whitespaceButton, SIGNAL(clicked(bool)), - m_diffEditorController, SLOT(setIgnoreWhitespaces(bool))); - connect(contextSpinBox, SIGNAL(valueChanged(int)), - m_diffEditorController, SLOT(setContextLinesNumber(int))); - connect(toggleSync, SIGNAL(clicked(bool)), - m_diffEditorController, SLOT(setHorizontalScrollBarSynchronization(bool))); - connect(toggleDescription, SIGNAL(clicked(bool)), - m_diffEditorController, SLOT(setDescriptionVisible(bool))); - // TODO: synchronize in opposite direction too - } + connect(whitespaceButton, SIGNAL(clicked(bool)), + m_diffEditorController, SLOT(setIgnoreWhitespaces(bool))); + connect(contextSpinBox, SIGNAL(valueChanged(int)), + m_diffEditorController, SLOT(setContextLinesNumber(int))); + connect(toggleSync, SIGNAL(clicked(bool)), + m_diffEditorController, SLOT(setHorizontalScrollBarSynchronization(bool))); + connect(toggleDescription, SIGNAL(clicked(bool)), + m_diffEditorController, SLOT(setDescriptionVisible(bool))); + // TODO: synchronize in opposite direction too return m_toolBar; } -void DiffEditor::setDiff(const QList &diffFileList, - const QString &workingDirectory) +DiffEditorController * DiffEditor::controller() const { + return m_diffEditorController; +} + +void DiffEditor::updateEntryToolTip() +{ + const QString &toolTip = m_entriesComboBox->itemData( + m_entriesComboBox->currentIndex(), Qt::ToolTipRole).toString(); + m_entriesComboBox->setToolTip(toolTip); +} + +void DiffEditor::entryActivated(int index) +{ + updateEntryToolTip(); + m_diffEditorController->setCurrentDiffFileIndex(index); +} + +void DiffEditor::slotCleared(const QString &message) +{ + Q_UNUSED(message) + + m_entriesComboBox->clear(); + updateEntryToolTip(); +} + +void DiffEditor::slotDiffContentsChanged(const QList &diffFileList, + const QString &workingDirectory) +{ + Q_UNUSED(workingDirectory) + m_entriesComboBox->clear(); const int count = diffFileList.count(); for (int i = 0; i < count; i++) { @@ -331,42 +356,6 @@ void DiffEditor::setDiff(const QList &d m_entriesComboBox->setItemData(m_entriesComboBox->count() - 1, itemToolTip, Qt::ToolTipRole); } updateEntryToolTip(); - if (m_diffEditorController) - m_diffEditorController->setDiffContents(diffFileList, workingDirectory); -} - -void DiffEditor::setDescription(const QString &description) -{ - if (m_diffEditorController) - m_diffEditorController->setDescription(description); -} - -void DiffEditor::setDescriptionEnabled(bool on) -{ - if (m_diffEditorController) - m_diffEditorController->setDescriptionEnabled(on); -} - -void DiffEditor::clear(const QString &message) -{ - m_entriesComboBox->clear(); - updateEntryToolTip(); - if (m_diffEditorController) - m_diffEditorController->clear(message); -} - -void DiffEditor::updateEntryToolTip() -{ - const QString &toolTip = m_entriesComboBox->itemData( - m_entriesComboBox->currentIndex(), Qt::ToolTipRole).toString(); - m_entriesComboBox->setToolTip(toolTip); -} - -void DiffEditor::entryActivated(int index) -{ - updateEntryToolTip(); - if (m_diffEditorController) - m_diffEditorController->setCurrentDiffFileIndex(index); } void DiffEditor::activateEntry(int index) @@ -384,9 +373,6 @@ void DiffEditor::slotDescriptionChanged(const QString &description) void DiffEditor::slotDescriptionVisibilityChanged() { - if (!m_diffEditorController) - return; - const bool visible = m_diffEditorController->isDescriptionVisible(); const bool enabled = m_diffEditorController->isDescriptionEnabled(); diff --git a/src/plugins/diffeditor/diffeditor.h b/src/plugins/diffeditor/diffeditor.h index 73c28b212f7..0e9b3dfd008 100644 --- a/src/plugins/diffeditor/diffeditor.h +++ b/src/plugins/diffeditor/diffeditor.h @@ -45,9 +45,9 @@ QT_END_NAMESPACE namespace TextEditor { class BaseTextEditorWidget; } namespace DiffEditor { -class SideBySideDiffEditorWidget; -namespace Internal { class DiffEditorDocument; } +class DiffEditorDocument; +class SideBySideDiffEditorWidget; class DIFFEDITOR_EXPORT DiffEditor : public Core::IEditor { @@ -58,11 +58,7 @@ public: virtual ~DiffEditor(); public: - void setDiff(const QList &diffFileList, - const QString &workingDirectory = QString()); - void setDescription(const QString &description); - void setDescriptionEnabled(bool on); - void clear(const QString &message); + DiffEditorController *controller() const; // Core::IEditor bool duplicateSupported() const { return false; } @@ -71,7 +67,6 @@ public: bool open(QString *errorString, const QString &fileName, const QString &realFileName); Core::IDocument *document(); Core::Id id() const; - QTextCodec *codec() const; QWidget *toolBar(); @@ -79,6 +74,9 @@ public slots: void activateEntry(int index); private slots: + void slotCleared(const QString &message); + void slotDiffContentsChanged(const QList &diffFileList, + const QString &workingDirectory); void entryActivated(int index); void slotDescriptionChanged(const QString &description); void slotDescriptionVisibilityChanged(); @@ -87,7 +85,7 @@ private: void ctor(); void updateEntryToolTip(); - QSharedPointer m_document; + QSharedPointer m_document; TextEditor::BaseTextEditorWidget *m_descriptionWidget; SideBySideDiffEditorWidget *m_diffWidget; DiffEditorController *m_diffEditorController; diff --git a/src/plugins/diffeditor/diffeditor.pro b/src/plugins/diffeditor/diffeditor.pro index 38554f1c5cf..a698e4a17ea 100644 --- a/src/plugins/diffeditor/diffeditor.pro +++ b/src/plugins/diffeditor/diffeditor.pro @@ -7,6 +7,7 @@ HEADERS += diffeditor_global.h \ diffeditorcontroller.h \ diffeditordocument.h \ diffeditorfactory.h \ + diffeditormanager.h \ diffeditorplugin.h \ differ.h \ sidebysidediffeditorwidget.h @@ -15,6 +16,7 @@ SOURCES += diffeditor.cpp \ diffeditorcontroller.cpp \ diffeditordocument.cpp \ diffeditorfactory.cpp \ + diffeditormanager.cpp \ diffeditorplugin.cpp \ differ.cpp \ sidebysidediffeditorwidget.cpp diff --git a/src/plugins/diffeditor/diffeditor.qbs b/src/plugins/diffeditor/diffeditor.qbs index 6af0e8f37b4..f904ca5060f 100644 --- a/src/plugins/diffeditor/diffeditor.qbs +++ b/src/plugins/diffeditor/diffeditor.qbs @@ -23,6 +23,8 @@ QtcPlugin { "diffeditordocument.h", "diffeditorfactory.cpp", "diffeditorfactory.h", + "diffeditormanager.cpp", + "diffeditormanager.h", "diffeditorplugin.cpp", "diffeditorplugin.h", "differ.cpp", diff --git a/src/plugins/diffeditor/diffeditorcontroller.cpp b/src/plugins/diffeditor/diffeditorcontroller.cpp index a5994251fe5..b382efbdd28 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.cpp +++ b/src/plugins/diffeditor/diffeditorcontroller.cpp @@ -110,7 +110,8 @@ void DiffEditorController::clear(const QString &message) emit cleared(message); } -void DiffEditorController::setDiffContents(const QList &diffFileList, const QString &workingDirectory) +void DiffEditorController::setDiffContents(const QList &diffFileList, + const QString &workingDirectory) { m_diffFileList = diffFileList; m_workingDirectory = workingDirectory; @@ -188,8 +189,3 @@ void DiffEditorController::setCurrentDiffFileIndex(int diffFileIndex) } } // namespace DiffEditor - -//QTextCodec *DiffEditorWidget::codec() const -//{ -//} - diff --git a/src/plugins/diffeditor/diffeditorcontroller.h b/src/plugins/diffeditor/diffeditorcontroller.h index 5805b8d0f8d..e72e18345ea 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.h +++ b/src/plugins/diffeditor/diffeditorcontroller.h @@ -60,8 +60,6 @@ public: DiffEditorController(QObject *parent = 0); ~DiffEditorController(); -// QTextCodec *codec() const; - QString clearMessage() const; QList diffContents() const; @@ -78,7 +76,8 @@ public: public slots: void clear(); void clear(const QString &message); - void setDiffContents(const QList &diffFileList, const QString &workingDirectory = QString()); + void setDiffContents(const QList &diffFileList, + const QString &workingDirectory = QString()); void setDescription(const QString &description); void setDescriptionEnabled(bool on); @@ -90,7 +89,7 @@ public slots: signals: // This sets the current diff file index to -1 - void cleared(const QString message); + void cleared(const QString &message); // This sets the current diff file index to 0 (unless diffFileList is empty) void diffContentsChanged(const QList &diffFileList, const QString &workingDirectory); void descriptionChanged(const QString &description); diff --git a/src/plugins/diffeditor/diffeditordocument.cpp b/src/plugins/diffeditor/diffeditordocument.cpp index b96646e7652..36999ac8ca3 100644 --- a/src/plugins/diffeditor/diffeditordocument.cpp +++ b/src/plugins/diffeditor/diffeditordocument.cpp @@ -34,9 +34,6 @@ #include namespace DiffEditor { -namespace Internal { - -///////////////////////////////// DiffFile ////////////////////////////////// DiffEditorDocument::DiffEditorDocument(const QString &mimeType) : Core::IDocument(), @@ -51,7 +48,7 @@ DiffEditorDocument::~DiffEditorDocument() { } -DiffEditorController *DiffEditorDocument::diffEditorController() const +DiffEditorController *DiffEditorDocument::controller() const { return m_diffEditorController; } @@ -90,5 +87,4 @@ bool DiffEditorDocument::reload(QString *errorString, ReloadFlag flag, ChangeTyp return false; } -} // namespace Internal } // namespace DiffEditor diff --git a/src/plugins/diffeditor/diffeditordocument.h b/src/plugins/diffeditor/diffeditordocument.h index 94c65f3c922..259b60d0877 100644 --- a/src/plugins/diffeditor/diffeditordocument.h +++ b/src/plugins/diffeditor/diffeditordocument.h @@ -38,16 +38,14 @@ namespace DiffEditor { class DiffEditorController; -namespace Internal { - -class DiffEditorDocument : public Core::IDocument +class DIFFEDITOR_EXPORT DiffEditorDocument : public Core::IDocument { Q_OBJECT public: explicit DiffEditorDocument(const QString &mimeType); virtual ~DiffEditorDocument(); - DiffEditorController *diffEditorController() const; + DiffEditorController *controller() const; bool setContents(const QByteArray &contents); QString defaultPath() const { return QString(); } @@ -65,7 +63,6 @@ private: DiffEditorController *m_diffEditorController; }; -} // namespace Internal } // namespace DiffEditor #endif // DIFFEDITORDOCUMENT_H diff --git a/src/plugins/diffeditor/diffeditormanager.cpp b/src/plugins/diffeditor/diffeditormanager.cpp new file mode 100644 index 00000000000..3a793dd9bd3 --- /dev/null +++ b/src/plugins/diffeditor/diffeditormanager.cpp @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "diffeditormanager.h" +#include "diffeditor.h" +#include "diffeditorconstants.h" +#include "diffeditordocument.h" +#include +#include +#include + +namespace DiffEditor { + +static DiffEditorManager *m_instance = 0; + +DiffEditorManager::DiffEditorManager(QObject *parent) + : QObject(parent) +{ + QTC_ASSERT(!m_instance, return); + m_instance = this; + + Core::EditorManager *editorManager = Core::EditorManager::instance(); + connect(editorManager, SIGNAL(editorsClosed(QList)), + this, SLOT(slotEditorsClosed(QList))); +} + +DiffEditorManager::~DiffEditorManager() +{ + m_instance = 0; +} + +DiffEditorManager *DiffEditorManager::instance() +{ + return m_instance; +} + +void DiffEditorManager::slotEditorsClosed(const QList &editors) +{ + QMap editorsForDocument; + for (int i = 0; i < editors.count(); i++) { + DiffEditor *diffEditor = qobject_cast(editors.at(i)); + if (diffEditor) { + Core::IDocument *document = diffEditor->document(); + editorsForDocument[document]++; + } + } + Core::DocumentModel *documentModel = Core::EditorManager::documentModel(); + QMapIterator it(editorsForDocument); + while (it.hasNext()) { + it.next(); + if (documentModel->editorsForDocument(it.key()).count() == 0) { // no other editors use that document + DiffEditorDocument *document + = qobject_cast(it.key()); + if (document) { + const QString documentId = documentToId.value(document); + documentToId.remove(document); + idToDocument.remove(documentId); + } + } + } +} + +DiffEditorDocument *DiffEditorManager::find(const QString &documentId) +{ + return instance()->idToDocument.value(documentId); +} + +DiffEditorDocument *DiffEditorManager::findOrCreate(const QString &documentId, const QString &displayName) +{ + DiffEditorDocument *document = find(documentId); + if (document) + return document; + + const QString msgWait = tr("Waiting for data..."); + DiffEditor *diffEditor = qobject_cast( + Core::EditorManager::openEditorWithContents(Constants::DIFF_EDITOR_ID, + 0, msgWait.toUtf8())); + QTC_ASSERT(diffEditor, return 0); + + document = qobject_cast(diffEditor->document()); + QTC_ASSERT(diffEditor, return 0); + + document->setDisplayName(displayName); + + instance()->idToDocument.insert(documentId, document); + instance()->documentToId.insert(document, documentId); + + return document; +} + + +} // namespace DiffEditor diff --git a/src/plugins/diffeditor/diffeditormanager.h b/src/plugins/diffeditor/diffeditormanager.h new file mode 100644 index 00000000000..67041c03317 --- /dev/null +++ b/src/plugins/diffeditor/diffeditormanager.h @@ -0,0 +1,66 @@ +/**************************************************************************** +** +** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#ifndef DIFFEDITORMANAGER_H +#define DIFFEDITORMANAGER_H + +#include "diffeditor_global.h" + +#include +#include + +#include + +namespace DiffEditor { + +class DiffEditorDocument; + +class DIFFEDITOR_EXPORT DiffEditorManager : public QObject +{ + Q_OBJECT +public: + explicit DiffEditorManager(QObject *parent); + virtual ~DiffEditorManager(); + + static DiffEditorManager *instance(); + + static DiffEditorDocument *find(const QString &documentId); + static DiffEditorDocument *findOrCreate(const QString &documentId, const QString &displayName); + +private slots: + void slotEditorsClosed(const QList &editors); + +private: + QMap idToDocument; + QMap documentToId; +}; + +} // namespace DiffEditor + +#endif // DIFFEDITORMANAGER_H diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp index 4412514e0c2..1d3aed67ae1 100644 --- a/src/plugins/diffeditor/diffeditorplugin.cpp +++ b/src/plugins/diffeditor/diffeditorplugin.cpp @@ -31,7 +31,7 @@ #include "diffeditor.h" #include "diffeditorconstants.h" #include "diffeditorfactory.h" -#include "sidebysidediffeditorwidget.h" +#include "diffeditormanager.h" #include #include @@ -74,6 +74,8 @@ bool DiffEditorPlugin::initialize(const QStringList &arguments, QString *errorMe addAutoReleasedObject(new DiffEditorFactory(this)); + new DiffEditorManager(this); + return true; } @@ -107,10 +109,8 @@ void DiffEditorPlugin::diff() Core::EditorManager::activateEditor(editor); - QTextCodec *codec = editor->codec(); - - const QString text1 = getFileContents(fileName1, codec); - const QString text2 = getFileContents(fileName2, codec); + const QString text1 = getFileContents(fileName1); + const QString text2 = getFileContents(fileName2); DiffEditorController::DiffFilesContents dfc; dfc.leftFileInfo = fileName1; @@ -120,14 +120,14 @@ void DiffEditorPlugin::diff() QList list; list.append(dfc); - editor->setDiff(list); + editor->controller()->setDiffContents(list); } -QString DiffEditorPlugin::getFileContents(const QString &fileName, QTextCodec *codec) const +QString DiffEditorPlugin::getFileContents(const QString &fileName) const { QFile file(fileName); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) - return codec->toUnicode(file.readAll()); + return Core::EditorManager::defaultTextCodec()->toUnicode(file.readAll()); return QString(); } @@ -136,6 +136,8 @@ QString DiffEditorPlugin::getFileContents(const QString &fileName, QTextCodec *c #ifdef WITH_TESTS +#include "sidebysidediffeditorwidget.h" + void DiffEditor::Internal::DiffEditorPlugin::testAssemblyRows() { SideBySideDiffEditorWidget::testAssemblyRows(); diff --git a/src/plugins/diffeditor/diffeditorplugin.h b/src/plugins/diffeditor/diffeditorplugin.h index 774ce1b6e5f..e40a10014d3 100644 --- a/src/plugins/diffeditor/diffeditorplugin.h +++ b/src/plugins/diffeditor/diffeditorplugin.h @@ -58,7 +58,7 @@ private slots: #endif // WITH_TESTS private: - QString getFileContents(const QString &fileName, QTextCodec *codec) const; + QString getFileContents(const QString &fileName) const; }; diff --git a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp index b13f07d9de9..f4abe0ad2d6 100644 --- a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp +++ b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp @@ -405,11 +405,6 @@ public: SideDiffEditorWidget(QWidget *parent = 0); - // TODO: remove me, codec should be taken from somewhere else - QTextCodec *codec() const { - return const_cast(baseTextDocument()->codec()); - } - // block number, file info QMap fileInfo() const { return m_fileInfo; } @@ -1175,11 +1170,6 @@ void SideBySideDiffEditorWidget::setCurrentDiffFileIndex(int diffFileIndex) m_rightEditor->centerCursor(); } -QTextCodec *SideBySideDiffEditorWidget::codec() const -{ - return const_cast(m_leftEditor->codec()); -} - FileData SideBySideDiffEditorWidget::calculateContextData(const ChunkData &originalData) const { const int contextLinesNumber = m_controller ? m_controller->contextLinesNumber() : 3; diff --git a/src/plugins/diffeditor/sidebysidediffeditorwidget.h b/src/plugins/diffeditor/sidebysidediffeditorwidget.h index be013ae81e7..a01fc9ae675 100644 --- a/src/plugins/diffeditor/sidebysidediffeditorwidget.h +++ b/src/plugins/diffeditor/sidebysidediffeditorwidget.h @@ -36,15 +36,10 @@ #include -namespace TextEditor { -class BaseTextEditorWidget; -class FontSettings; -} +namespace TextEditor { class FontSettings; } QT_BEGIN_NAMESPACE -class QPlainTextEdit; class QSplitter; -class QSyntaxHighlighter; class QTextCharFormat; QT_END_NAMESPACE @@ -53,7 +48,6 @@ QT_END_NAMESPACE namespace DiffEditor { class SideDiffEditorWidget; -class TextLineData; class ChunkData; class FileData; @@ -67,8 +61,6 @@ public: void setDiffEditorController(DiffEditorController *controller); DiffEditorController *diffEditorController() const; - QTextCodec *codec() const; - #ifdef WITH_TESTS static void testAssemblyRows(); #endif // WITH_TESTS diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 5d23f7ebed5..953033ca355 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -59,8 +59,10 @@ #include #include -#include #include +#include +#include +#include #include #include @@ -106,26 +108,7 @@ public: DiffShow }; - GitDiffSwitcher(Core::IEditor *parentEditor, GitClient *gitClient) - : QObject(parentEditor), - m_editor(parentEditor), - m_gitClient(gitClient) - { - m_usingDiffEditor = gitClient->settings()->boolValue(GitSettings::useDiffEditorKey); - QIcon actionIcon = m_usingDiffEditor - ? QIcon(QLatin1String(Core::Constants::ICON_TEXT_DIFF)) - : QIcon(QLatin1String(Core::Constants::ICON_SIDE_BY_SIDE_DIFF)); - - const QString actionToolTip = m_usingDiffEditor - ? tr("Switch to Text Diff Editor") - : tr("Switch to Side By Side Diff Editor"); - - QAction *switchAction = new QAction(actionIcon, actionToolTip, parentEditor); - parentEditor->toolBar()->addAction(switchAction); - - // must be queued connection because execute() removes the editor & tool bar that the action was added to - connect(switchAction, SIGNAL(triggered()), this, SLOT(execute()), Qt::QueuedConnection); - } + GitDiffSwitcher(Core::IDocument *parentDocument, GitClient *gitClient); void setWorkingDirectory(const QString &workingDir) { m_workingDirectory = workingDir; } void setDiffType(DiffType type) { m_diffType = type; } @@ -141,11 +124,16 @@ public: void setDisplayName(const QString &displayName) { m_displayName = displayName; } void setBaseArguments(const QStringList &args) { m_baseArguments = args; } -public slots: - void execute(); +private slots: + void slotEditorOpened(Core::IEditor *editor); + void slotEditorClosed(Core::IEditor *editor); + void execute(QObject *editor); private: - Core::IEditor *m_editor; + void attachAction(Core::IEditor *editor); + QString actionText(); + + Core::IDocument *m_document; GitClient *m_gitClient; QString m_workingDirectory; DiffType m_diffType; @@ -158,11 +146,80 @@ private: QString m_id; QString m_displayName; QStringList m_baseArguments; + + QSignalMapper *m_signalMapper; + QMap m_editorToUsingSideBySideDiffEditor; }; -void GitDiffSwitcher::execute() +GitDiffSwitcher::GitDiffSwitcher(Core::IDocument *parentDocument, GitClient *gitClient) + : QObject(parentDocument), + m_document(parentDocument), + m_gitClient(gitClient), + m_signalMapper(new QSignalMapper(this)) { - m_gitClient->settings()->setValue(GitSettings::useDiffEditorKey, !m_usingDiffEditor); + Core::DocumentModel *documentModel = Core::EditorManager::documentModel(); + QList editors = documentModel->editorsForDocument(m_document); + for (int i = 0; i < editors.count(); i++) + attachAction(editors.at(i)); + + // must be queued connection because execute() removes the editor & tool bar that the action was added to + connect(m_signalMapper, SIGNAL(mapped(QObject*)), this, SLOT(execute(QObject*)), Qt::QueuedConnection); + connect(Core::EditorManager::instance(), SIGNAL(editorOpened(Core::IEditor*)), + this, SLOT(slotEditorOpened(Core::IEditor*))); + connect(Core::EditorManager::instance(), SIGNAL(editorAboutToClose(Core::IEditor*)), + this, SLOT(slotEditorClosed(Core::IEditor*))); +} + +void GitDiffSwitcher::attachAction(Core::IEditor *editor) +{ + if (m_editorToUsingSideBySideDiffEditor.contains(editor)) + return; + + const bool usingSideBySideDiffEditor = m_gitClient->settings()->boolValue(GitSettings::useDiffEditorKey); + QIcon actionIcon = usingSideBySideDiffEditor + ? QIcon(QLatin1String(Core::Constants::ICON_TEXT_DIFF)) + : QIcon(QLatin1String(Core::Constants::ICON_SIDE_BY_SIDE_DIFF)); + + const QString actionToolTip = usingSideBySideDiffEditor + ? tr("Switch to Text Diff Editor") + : tr("Switch to Side By Side Diff Editor"); + + QAction *switchAction = new QAction(actionIcon, actionToolTip, editor); + editor->toolBar()->addAction(switchAction); + connect(switchAction, SIGNAL(triggered()), + m_signalMapper, SLOT(map())); + m_signalMapper->setMapping(switchAction, editor); + + m_editorToUsingSideBySideDiffEditor.insert(editor, usingSideBySideDiffEditor); +} + +void GitDiffSwitcher::slotEditorOpened(Core::IEditor *editor) +{ + Core::IDocument *document = editor->document(); + if (document != m_document) + return; + + attachAction(editor); +} + +void GitDiffSwitcher::slotEditorClosed(Core::IEditor *editor) +{ + Core::IDocument *document = editor->document(); + if (document != m_document) + return; + + m_editorToUsingSideBySideDiffEditor.remove(editor); +} + +void GitDiffSwitcher::execute(QObject *editor) +{ + bool usingSideBySideEditor = !m_editorToUsingSideBySideDiffEditor.value(editor); + m_editorToUsingSideBySideDiffEditor[editor] = usingSideBySideEditor; + m_gitClient->settings()->setValue(GitSettings::useDiffEditorKey, usingSideBySideEditor); + + Core::IEditor *ieditor = qobject_cast(editor); + Core::EditorManager::activateEditor(ieditor); + switch (m_diffType) { case DiffRepository: m_gitClient->diff(m_workingDirectory, QStringList(), QStringList()); @@ -185,7 +242,8 @@ void GitDiffSwitcher::execute() default: break; } - Core::EditorManager::closeEditor(m_editor, false); + + Core::EditorManager::closeEditor(ieditor, false); } class GitDiffHandler : public QObject @@ -215,7 +273,7 @@ public: } }; - GitDiffHandler(DiffEditor::DiffEditor *editor, + GitDiffHandler(DiffEditor::DiffEditorController *editorController, const QString &gitPath, const QString &workingDirectory, const QProcessEnvironment &environment, @@ -248,7 +306,7 @@ private: void feedEditor(); QString workingTreeContents(const QString &fileName) const; - QPointer m_editor; + QPointer m_editorController; const QString m_gitPath; const QString m_workingDirectory; const QProcessEnvironment m_processEnvironment; @@ -279,12 +337,12 @@ inline bool operator<(const GitDiffHandler::Revision &rev1, const GitDiffHandler return rev1.id < rev2.id; } -GitDiffHandler::GitDiffHandler(DiffEditor::DiffEditor *editor, +GitDiffHandler::GitDiffHandler(DiffEditor::DiffEditorController *editorController, const QString &gitPath, const QString &workingDirectory, const QProcessEnvironment &environment, int timeout) - : m_editor(editor), + : m_editorController(editorController), m_gitPath(gitPath), m_workingDirectory(workingDirectory), m_processEnvironment(environment), @@ -359,11 +417,14 @@ void GitDiffHandler::show(const QString &id) void GitDiffHandler::collectShowDescription(const QString &id) { - if (m_editor.isNull()) + if (m_editorController.isNull()) { + deleteLater(); return; - m_editor->clear(m_waitMessage); + } + + m_editorController->clear(m_waitMessage); VcsBase::Command *command = new VcsBase::Command(m_gitPath, m_workingDirectory, m_processEnvironment); - command->setCodec(m_editor->codec()); + command->setCodec(Core::EditorManager::defaultTextCodec()); connect(command, SIGNAL(output(QString)), this, SLOT(slotShowDescriptionReceived(QString))); QStringList arguments; arguments << QLatin1String("show") << QLatin1String("-s") @@ -374,11 +435,13 @@ void GitDiffHandler::collectShowDescription(const QString &id) void GitDiffHandler::slotShowDescriptionReceived(const QString &description) { - if (m_editor.isNull()) + if (m_editorController.isNull()) { + deleteLater(); return; + } - m_editor->setDescription(GitPlugin::instance()->gitClient()-> - extendedShowDescription(m_workingDirectory, description)); + m_editorController->setDescription(GitPlugin::instance()->gitClient()-> + extendedShowDescription(m_workingDirectory, description)); collectFilesList(QStringList() << m_requestedRevisionRange.begin.id @@ -387,11 +450,14 @@ void GitDiffHandler::slotShowDescriptionReceived(const QString &description) void GitDiffHandler::collectFilesList(const QStringList &additionalArguments) { - if (m_editor.isNull()) + if (m_editorController.isNull()) { + deleteLater(); return; - m_editor->clear(m_waitMessage); + } + + m_editorController->clear(m_waitMessage); VcsBase::Command *command = new VcsBase::Command(m_gitPath, m_workingDirectory, m_processEnvironment); - command->setCodec(m_editor->codec()); + command->setCodec(Core::EditorManager::defaultTextCodec()); connect(command, SIGNAL(output(QString)), this, SLOT(slotFileListReceived(QString))); QStringList arguments; arguments << QLatin1String("diff") << QLatin1String("--name-only") << additionalArguments; @@ -402,8 +468,10 @@ void GitDiffHandler::collectFilesList(const QStringList &additionalArguments) void GitDiffHandler::slotFileListReceived(const QString &fileList) { - if (m_editor.isNull()) + if (m_editorController.isNull()) { + deleteLater(); return; + } QStringList fileNames = fileList.split(QLatin1Char('\n'), QString::SkipEmptyParts); fileNames.removeDuplicates(); @@ -459,8 +527,7 @@ void GitDiffHandler::collectFilesContents() // prepare job here VcsBase::Command *command = new VcsBase::Command(m_gitPath, m_workingDirectory, m_processEnvironment); - if (m_editor) - command->setCodec(m_editor->codec()); + command->setCodec(Core::EditorManager::defaultTextCodec()); connect(command, SIGNAL(output(QString)), this, SLOT(slotFileContentsReceived(QString))); QString revisionArgument = (revision.type == Other) @@ -483,8 +550,10 @@ void GitDiffHandler::collectFilesContents() void GitDiffHandler::slotFileContentsReceived(const QString &contents) { - if (m_editor.isNull()) + if (m_editorController.isNull()) { + deleteLater(); return; + } QMap >::iterator itFile = m_pendingRevisions.begin(); @@ -511,6 +580,11 @@ void GitDiffHandler::slotFileContentsReceived(const QString &contents) void GitDiffHandler::feedEditor() { + if (m_editorController.isNull()) { + deleteLater(); + return; + } + QList list; QMap >::const_iterator itFile @@ -535,7 +609,7 @@ void GitDiffHandler::feedEditor() ++itFile; } - m_editor->setDiff(list, m_workingDirectory); + m_editorController->setDiffContents(list, m_workingDirectory); deleteLater(); } @@ -546,7 +620,7 @@ QString GitDiffHandler::workingTreeContents(const QString &fileName) const QFile file(absoluteFileName); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) - return m_editor->codec()->toUnicode(file.readAll()); + return Core::EditorManager::defaultTextCodec()->toUnicode(file.readAll()); return QString(); } @@ -1021,33 +1095,14 @@ VcsBase::VcsBaseEditorWidget *GitClient::findExistingVCSEditor(const char *regis return rc; } -DiffEditor::DiffEditor *GitClient::findExistingDiffEditor(const char *registerDynamicProperty, - const QString &dynamicPropertyValue) const -{ - DiffEditor::DiffEditor *diffEditor = qobject_cast( - locateEditor(registerDynamicProperty, dynamicPropertyValue)); - if (diffEditor) { - diffEditor->document()->setContents(m_msgWait.toUtf8()); - Core::EditorManager::activateEditor(diffEditor); - } - return diffEditor; -} - -DiffEditor::DiffEditor *GitClient::createDiffEditor(const char *registerDynamicProperty, - const QString &dynamicPropertyValue, +DiffEditor::DiffEditorDocument *GitClient::createDiffEditor(const QString documentId, const QString &source, - const QString &titlePattern, - const Core::Id editorId) const + const QString &title) const { - QString title = titlePattern; - DiffEditor::DiffEditor *diffEditor = qobject_cast( - Core::EditorManager::openEditorWithContents(editorId, &title, m_msgWait.toUtf8())); - QTC_ASSERT(diffEditor, return 0); - diffEditor->document()->setProperty(registerDynamicProperty, dynamicPropertyValue); - VcsBasePlugin::setSource(diffEditor, source); - - Core::EditorManager::activateEditor(diffEditor); - return diffEditor; + DiffEditor::DiffEditorDocument *diffEditorDocument = DiffEditor::DiffEditorManager::findOrCreate(documentId, title); + QTC_ASSERT(diffEditorDocument, return 0); + VcsBasePlugin::setSource(diffEditorDocument, source); + return diffEditorDocument; } /* Create an editor associated to VCS output of a source file/directory @@ -1099,19 +1154,16 @@ void GitClient::diff(const QString &workingDirectory, { const QString title = tr("Git Diff"); const int timeout = settings()->intValue(GitSettings::timeoutKey); - Core::IEditor *newEditor = 0; + Core::IDocument *newDocument = 0; if (settings()->boolValue(GitSettings::useDiffEditorKey)) { - const char *propertyName = "sideBySideOriginalFileName"; - DiffEditor::DiffEditor *diffEditor = findExistingDiffEditor(propertyName, workingDirectory); - if (!diffEditor) { - newEditor = diffEditor = createDiffEditor(propertyName, - workingDirectory, - workingDirectory, - title, - DiffEditor::Constants::DIFF_EDITOR_ID); - } + const QString documentId = QLatin1String("sideBySideOriginalFileName") + workingDirectory; + DiffEditor::DiffEditorDocument *diffEditorDocument = DiffEditor::DiffEditorManager::find(documentId); + if (!diffEditorDocument) + newDocument = diffEditorDocument = createDiffEditor(documentId, workingDirectory, title); - GitDiffHandler *handler = new GitDiffHandler(diffEditor, + Core::EditorManager::activateEditorForDocument(diffEditorDocument); + + GitDiffHandler *handler = new GitDiffHandler(diffEditorDocument->controller(), gitBinaryPath(), workingDirectory, processEnvironment(), @@ -1144,7 +1196,7 @@ void GitClient::diff(const QString &workingDirectory, propertyName, workingDirectory, argWidget); - newEditor = vcsEditor->editor(); + newDocument = vcsEditor->editor()->document(); connect(vcsEditor, SIGNAL(diffChunkApplied(VcsBase::DiffChunk)), argWidget, SLOT(executeCommand())); connect(vcsEditor, SIGNAL(diffChunkReverted(VcsBase::DiffChunk)), @@ -1195,8 +1247,8 @@ void GitClient::diff(const QString &workingDirectory, command->addFlags(diffExecutionFlags()); command->execute(); } - if (newEditor) { - GitDiffSwitcher *switcher = new GitDiffSwitcher(newEditor, this); + if (newDocument) { + GitDiffSwitcher *switcher = new GitDiffSwitcher(newDocument, this); switcher->setWorkingDirectory(workingDirectory); if (unstagedFileNames.empty() && stagedFileNames.empty()) { // local repository diff @@ -1217,18 +1269,16 @@ void GitClient::diff(const QString &workingDirectory, const QString &fileName) { const QString title = tr("Git Diff \"%1\"").arg(fileName); const QString sourceFile = VcsBase::VcsBaseEditorWidget::getSource(workingDirectory, fileName); - Core::IEditor *newEditor = 0; + Core::IDocument *newDocument = 0; if (settings()->boolValue(GitSettings::useDiffEditorKey)) { - const char *propertyName = "sideBySideOriginalFileName"; - DiffEditor::DiffEditor *diffEditor = findExistingDiffEditor(propertyName, sourceFile); - if (!diffEditor) { - newEditor = diffEditor = createDiffEditor(propertyName, - sourceFile, - sourceFile, - title, - DiffEditor::Constants::DIFF_EDITOR_ID); - } - GitDiffHandler *handler = new GitDiffHandler(diffEditor, + const QString documentId = QLatin1String("sideBySideOriginalFileName") + sourceFile; + DiffEditor::DiffEditorDocument *diffEditorDocument = DiffEditor::DiffEditorManager::find(documentId); + if (!diffEditorDocument) + newDocument = diffEditorDocument = createDiffEditor(documentId, sourceFile, title); + + Core::EditorManager::activateEditorForDocument(diffEditorDocument); + + GitDiffHandler *handler = new GitDiffHandler(diffEditorDocument->controller(), gitBinaryPath(), workingDirectory, processEnvironment(), @@ -1248,7 +1298,7 @@ void GitClient::diff(const QString &workingDirectory, const QString &fileName) propertyName, sourceFile, argWidget); - newEditor = vcsEditor->editor(); + newDocument = vcsEditor->editor()->document(); connect(vcsEditor, SIGNAL(diffChunkApplied(VcsBase::DiffChunk)), argWidget, SLOT(executeCommand())); connect(vcsEditor, SIGNAL(diffChunkReverted(VcsBase::DiffChunk)), @@ -1265,8 +1315,8 @@ void GitClient::diff(const QString &workingDirectory, const QString &fileName) cmdArgs << QLatin1String("--") << fileName; executeGit(workingDirectory, cmdArgs, vcsEditor, false, diffExecutionFlags()); } - if (newEditor) { - GitDiffSwitcher *switcher = new GitDiffSwitcher(newEditor, this); + if (newDocument) { + GitDiffSwitcher *switcher = new GitDiffSwitcher(newDocument, this); switcher->setWorkingDirectory(workingDirectory); switcher->setDiffType(GitDiffSwitcher::DiffFile); switcher->setFileName(fileName); @@ -1278,19 +1328,16 @@ void GitClient::diffBranch(const QString &workingDirectory, const QString &branchName) { const QString title = tr("Git Diff Branch \"%1\"").arg(branchName); - Core::IEditor *newEditor = 0; + Core::IDocument *newDocument = 0; if (settings()->boolValue(GitSettings::useDiffEditorKey)) { - const char *propertyName = "sideBySideBranchName"; - DiffEditor::DiffEditor *diffEditor = findExistingDiffEditor(propertyName, branchName); - if (!diffEditor) { - newEditor = diffEditor = createDiffEditor(propertyName, - branchName, - workingDirectory, - title, - DiffEditor::Constants::DIFF_EDITOR_ID); - } + const QString documentId = QLatin1String("sideBySideBranchName") + branchName; + DiffEditor::DiffEditorDocument *diffEditorDocument = DiffEditor::DiffEditorManager::find(documentId); + if (!diffEditorDocument) + newDocument = diffEditorDocument = createDiffEditor(documentId, workingDirectory, title); - GitDiffHandler *handler = new GitDiffHandler(diffEditor, + Core::EditorManager::activateEditorForDocument(diffEditorDocument); + + GitDiffHandler *handler = new GitDiffHandler(diffEditorDocument->controller(), gitBinaryPath(), workingDirectory, processEnvironment(), @@ -1312,7 +1359,7 @@ void GitClient::diffBranch(const QString &workingDirectory, workingDirectory, diffArgs, branchName)); - newEditor = vcsEditor->editor(); + newDocument = vcsEditor->editor()->document(); } vcsEditor->setWorkingDirectory(workingDirectory); @@ -1324,8 +1371,8 @@ void GitClient::diffBranch(const QString &workingDirectory, executeGit(workingDirectory, cmdArgs, vcsEditor, false, diffExecutionFlags()); } - if (newEditor) { - GitDiffSwitcher *switcher = new GitDiffSwitcher(newEditor, this); + if (newDocument) { + GitDiffSwitcher *switcher = new GitDiffSwitcher(newDocument, this); switcher->setWorkingDirectory(workingDirectory); switcher->setDiffType(GitDiffSwitcher::DiffBranch); switcher->setBaseArguments(diffArgs); @@ -1436,20 +1483,18 @@ void GitClient::show(const QString &source, const QString &id, const QString title = tr("Git Show \"%1\"").arg(name.isEmpty() ? id : name); const QFileInfo sourceFi(source); const QString workingDirectory = sourceFi.isDir() ? sourceFi.absoluteFilePath() : sourceFi.absolutePath(); - Core::IEditor *newEditor = 0; + Core::IDocument *newDocument = 0; if (settings()->boolValue(GitSettings::useDiffEditorKey)) { - const char *propertyName = "sideBySideShow"; - DiffEditor::DiffEditor *diffEditor = findExistingDiffEditor(propertyName, id); - if (!diffEditor) { - newEditor = diffEditor = createDiffEditor(propertyName, - id, - source, - title, - DiffEditor::Constants::DIFF_EDITOR_ID); - diffEditor->setDescriptionEnabled(true); - } + const QString documentId = QLatin1String("sideBySideShow") + id; + DiffEditor::DiffEditorDocument *diffEditorDocument = DiffEditor::DiffEditorManager::find(documentId); + if (!diffEditorDocument) + newDocument = diffEditorDocument = createDiffEditor(documentId, source, title); - GitDiffHandler *handler = new GitDiffHandler(diffEditor, + diffEditorDocument->controller()->setDescriptionEnabled(true); + + Core::EditorManager::activateEditorForDocument(diffEditorDocument); + + GitDiffHandler *handler = new GitDiffHandler(diffEditorDocument->controller(), gitBinaryPath(), findRepositoryForDirectory(workingDirectory), processEnvironment(), @@ -1470,7 +1515,7 @@ void GitClient::show(const QString &source, const QString &id, source, args, id)); - newEditor = vcsEditor->editor(); + newDocument = vcsEditor->editor()->document(); } QStringList arguments; @@ -1483,8 +1528,8 @@ void GitClient::show(const QString &source, const QString &id, vcsEditor->setWorkingDirectory(workingDirectory); executeGit(workingDirectory, arguments, vcsEditor); } - if (newEditor) { - GitDiffSwitcher *switcher = new GitDiffSwitcher(newEditor, this); + if (newDocument) { + GitDiffSwitcher *switcher = new GitDiffSwitcher(newDocument, this); switcher->setDiffType(GitDiffSwitcher::DiffShow); switcher->setFileName(source); switcher->setBaseArguments(args); diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 4d6a5750311..5ca5424225a 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -56,11 +56,9 @@ namespace VcsBase { class VcsBaseEditorParameterWidget; } -namespace Utils { - struct SynchronousProcessResponse; -} +namespace Utils { struct SynchronousProcessResponse; } -namespace DiffEditor { class DiffEditor; } +namespace DiffEditor { class DiffEditorDocument; } namespace Git { namespace Internal { @@ -351,8 +349,6 @@ private: QTextCodec *getSourceCodec(const QString &file) const; VcsBase::VcsBaseEditorWidget *findExistingVCSEditor(const char *registerDynamicProperty, const QString &dynamicPropertyValue) const; - DiffEditor::DiffEditor *findExistingDiffEditor(const char *registerDynamicProperty, - const QString &dynamicPropertyValue) const; enum CodecType { CodecSource, CodecLogOutput, CodecNone }; VcsBase::VcsBaseEditorWidget *createVcsEditor(const Core::Id &kind, @@ -362,11 +358,9 @@ private: const char *registerDynamicProperty, const QString &dynamicPropertyValue, VcsBase::VcsBaseEditorParameterWidget *configWidget) const; - DiffEditor::DiffEditor *createDiffEditor(const char *registerDynamicProperty, - const QString &dynamicPropertyValue, + DiffEditor::DiffEditorDocument *createDiffEditor(const QString documentId, const QString &source, - const QString &titlePattern, - const Core::Id editorId) const; + const QString &title) const; VcsBase::Command *createCommand(const QString &workingDirectory, VcsBase::VcsBaseEditorWidget* editor = 0, diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index 26899f57fb7..49fd76a43ff 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -737,12 +737,12 @@ void VcsBaseEditorWidget::setForceReadOnly(bool b) QString VcsBaseEditorWidget::source() const { - return VcsBasePlugin::source(editor()); + return VcsBasePlugin::source(baseTextDocument()); } void VcsBaseEditorWidget::setSource(const QString &source) { - VcsBasePlugin::setSource(editor(), source); + VcsBasePlugin::setSource(baseTextDocument(), source); } QString VcsBaseEditorWidget::annotateRevisionTextFormat() const diff --git a/src/plugins/vcsbase/vcsbaseplugin.cpp b/src/plugins/vcsbase/vcsbaseplugin.cpp index 2d3d261ad29..d8dbb02961c 100644 --- a/src/plugins/vcsbase/vcsbaseplugin.cpp +++ b/src/plugins/vcsbase/vcsbaseplugin.cpp @@ -238,11 +238,7 @@ void StateListener::slotStateChanged() } else { state.currentFile = currentDocument->filePath(); if (state.currentFile.isEmpty()) { - const QList editors = - Core::EditorManager::documentModel()->editorsForDocument(currentDocument); - if (!editors.isEmpty()) { - state.currentFile = VcsBasePlugin::source(editors.first()); - } + state.currentFile = VcsBasePlugin::source(currentDocument); } } QScopedPointer currentFileInfo; // Instantiate QFileInfo only once if required. @@ -750,12 +746,12 @@ bool VcsBasePlugin::isSshPromptConfigured() static const char SOURCE_PROPERTY[] = "qtcreator_source"; -void VcsBasePlugin::setSource(Core::IEditor *editor, const QString &source) +void VcsBasePlugin::setSource(Core::IDocument *editor, const QString &source) { editor->setProperty(SOURCE_PROPERTY, source); } -QString VcsBasePlugin::source(Core::IEditor *editor) +QString VcsBasePlugin::source(Core::IDocument *editor) { return editor->property(SOURCE_PROPERTY).toString(); } diff --git a/src/plugins/vcsbase/vcsbaseplugin.h b/src/plugins/vcsbase/vcsbaseplugin.h index 890762a6947..9f5f23442be 100644 --- a/src/plugins/vcsbase/vcsbaseplugin.h +++ b/src/plugins/vcsbase/vcsbaseplugin.h @@ -48,7 +48,7 @@ namespace Utils { struct SynchronousProcessResponse; } namespace Core { class IVersionControl; class Id; -class IEditor; +class IDocument; } namespace VcsBase { @@ -157,9 +157,9 @@ public: static bool isSshPromptConfigured(); // Sets the source of editor contents, can be directory or file. - static void setSource(Core::IEditor *editor, const QString &source); + static void setSource(Core::IDocument *document, const QString &source); // Returns the source of editor contents. - static QString source(Core::IEditor *editor); + static QString source(Core::IDocument *document); // Convenience to synchronously run VCS commands enum RunVcsFlags {