From 2ddb726dd537a1505b8d0208fe638cc759a68c38 Mon Sep 17 00:00:00 2001 From: jkobus <jaroslaw.kobus@digia.com> Date: Thu, 23 May 2013 13:36:27 +0200 Subject: [PATCH] Add file list combobox to diff editor Change-Id: I2a40207ed3c4a5c07ba544d681aed6649a0b1a11 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com> Reviewed-by: Tobias Hunger <tobias.hunger@digia.com> --- src/plugins/diffeditor/diffeditoreditable.cpp | 96 +++++++++++++++++-- src/plugins/diffeditor/diffeditoreditable.h | 20 +++- src/plugins/diffeditor/diffeditorplugin.cpp | 45 ++++----- src/plugins/diffeditor/diffeditorplugin.h | 1 - src/plugins/diffeditor/diffeditorwidget.cpp | 76 +++++++++++++-- src/plugins/diffeditor/diffeditorwidget.h | 6 ++ src/plugins/git/gitclient.cpp | 67 ++++++------- src/plugins/git/gitclient.h | 7 +- 8 files changed, 230 insertions(+), 88 deletions(-) diff --git a/src/plugins/diffeditor/diffeditoreditable.cpp b/src/plugins/diffeditor/diffeditoreditable.cpp index 4f836177ad7..c1018ae14bb 100644 --- a/src/plugins/diffeditor/diffeditoreditable.cpp +++ b/src/plugins/diffeditor/diffeditoreditable.cpp @@ -39,6 +39,9 @@ #include <QStyle> #include <QLabel> #include <QHBoxLayout> +#include <QToolBar> +#include <QComboBox> +#include <QFileInfo> namespace DiffEditor { @@ -48,9 +51,12 @@ DiffEditorEditable::DiffEditorEditable(DiffEditorWidget *editorWidget) : IEditor(0), m_file(new Internal::DiffEditorFile(QLatin1String(Constants::DIFF_EDITOR_MIMETYPE), this)), m_editorWidget(editorWidget), - m_toolWidget(0) + m_toolWidget(0), + m_entriesComboBox(0) { setWidget(editorWidget); + connect(m_editorWidget, SIGNAL(navigatedToDiffFile(int)), + this, SLOT(activateEntry(int))); } DiffEditorEditable::~DiffEditorEditable() @@ -115,7 +121,6 @@ static QToolBar *createToolBar(const QWidget *someWidget) toolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); const int size = someWidget->style()->pixelMetric(QStyle::PM_SmallIconSize); toolBar->setIconSize(QSize(size, size)); - toolBar->addSeparator(); return toolBar; } @@ -128,12 +133,15 @@ QWidget *DiffEditorEditable::toolBar() // Create m_toolWidget = createToolBar(m_editorWidget); - QWidget *spacerWidget = new QWidget(); - QLayout *spacerLayout = new QHBoxLayout(); - spacerLayout->setMargin(0); - spacerLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed)); - spacerWidget->setLayout(spacerLayout); - m_toolWidget->addWidget(spacerWidget); + m_entriesComboBox = new QComboBox; + m_entriesComboBox->setMinimumContentsLength(20); + // Make the combo box prefer to expand + QSizePolicy policy = m_entriesComboBox->sizePolicy(); + policy.setHorizontalPolicy(QSizePolicy::Expanding); + m_entriesComboBox->setSizePolicy(policy); + connect(m_entriesComboBox, SIGNAL(activated(int)), + this, SLOT(entryActivated(int))); + m_toolWidget->addWidget(m_entriesComboBox); QToolButton *whitespaceButton = new QToolButton(m_toolWidget); whitespaceButton->setText(tr("Ignore Whitespace")); @@ -156,6 +164,78 @@ QWidget *DiffEditorEditable::toolBar() return m_toolWidget; } +void DiffEditorEditable::setDiff(const QList<DiffEditorWidget::DiffFilesContents> &diffFileList, + const QString &workingDirectory) +{ + m_entriesComboBox->clear(); + const int count = diffFileList.count(); + for (int i = 0; i < count; i++) { + const DiffEditorWidget::DiffFileInfo leftEntry = diffFileList.at(i).leftFileInfo; + const DiffEditorWidget::DiffFileInfo rightEntry = diffFileList.at(i).rightFileInfo; + const QString leftShortFileName = QFileInfo(leftEntry.fileName).fileName(); + const QString rightShortFileName = QFileInfo(rightEntry.fileName).fileName(); + QString itemText; + QString itemToolTip; + if (leftEntry.fileName == rightEntry.fileName) { + itemText = leftShortFileName; + + if (leftEntry.typeInfo.isEmpty() && rightEntry.typeInfo.isEmpty()) { + itemToolTip = leftEntry.fileName; + } else { + itemToolTip = tr("[%1] vs. [%2] %3") + .arg(leftEntry.typeInfo, rightEntry.typeInfo, leftEntry.fileName); + } + } else { + if (leftShortFileName == rightShortFileName) { + itemText = leftShortFileName; + } else { + itemText = tr("%1 vs. %2") + .arg(leftShortFileName, rightShortFileName); + } + + if (leftEntry.typeInfo.isEmpty() && rightEntry.typeInfo.isEmpty()) { + itemToolTip = tr("%1 vs. %2") + .arg(leftEntry.fileName, rightEntry.fileName); + } else { + itemToolTip = tr("[%1] %2 vs. [%3] %4") + .arg(leftEntry.typeInfo, leftEntry.fileName, rightEntry.typeInfo, rightEntry.fileName); + } + } + m_entriesComboBox->addItem(itemText); + m_entriesComboBox->setItemData(m_entriesComboBox->count() - 1, itemToolTip, Qt::ToolTipRole); + } + updateEntryToolTip(); + m_editorWidget->setDiff(diffFileList, workingDirectory); +} + +void DiffEditorEditable::clear(const QString &message) +{ + m_entriesComboBox->clear(); + updateEntryToolTip(); + m_editorWidget->clear(message); +} + +void DiffEditorEditable::updateEntryToolTip() +{ + const QString &toolTip = m_entriesComboBox->itemData( + m_entriesComboBox->currentIndex(), Qt::ToolTipRole).toString(); + m_entriesComboBox->setToolTip(toolTip); +} + +void DiffEditorEditable::entryActivated(int index) +{ + updateEntryToolTip(); + m_editorWidget->navigateToDiffFile(index); +} + +void DiffEditorEditable::activateEntry(int index) +{ + m_entriesComboBox->blockSignals(true); + m_entriesComboBox->setCurrentIndex(index); + m_entriesComboBox->blockSignals(false); + updateEntryToolTip(); +} + QByteArray DiffEditorEditable::saveState() const { return QByteArray(); diff --git a/src/plugins/diffeditor/diffeditoreditable.h b/src/plugins/diffeditor/diffeditoreditable.h index 8047fce312a..859a543e86a 100644 --- a/src/plugins/diffeditor/diffeditoreditable.h +++ b/src/plugins/diffeditor/diffeditoreditable.h @@ -31,16 +31,18 @@ #define DIFFEDITOREDITABLE_H #include "diffeditor_global.h" +#include "diffeditorwidget.h" #include <coreplugin/editormanager/ieditor.h> #include <coreplugin/idocument.h> -#include <QToolBar> +QT_BEGIN_NAMESPACE +class QToolBar; +class QComboBox; +QT_END_NAMESPACE namespace DiffEditor { -class DiffEditorWidget; - namespace Internal { class DiffEditorFile; } @@ -53,6 +55,10 @@ public: virtual ~DiffEditorEditable(); public: + void setDiff(const QList<DiffEditorWidget::DiffFilesContents> &diffFileList, + const QString &workingDirectory = QString()); + void clear(const QString &message); + // Core::IEditor bool createNew(const QString &contents); bool open(QString *errorString, const QString &fileName, const QString &realFileName); @@ -69,11 +75,19 @@ public: QByteArray saveState() const; bool restoreState(const QByteArray &state); +public slots: + void activateEntry(int index); + +private slots: + void entryActivated(int index); private: + void updateEntryToolTip(); + Internal::DiffEditorFile *m_file; DiffEditorWidget *m_editorWidget; QToolBar *m_toolWidget; + QComboBox *m_entriesComboBox; mutable QString m_displayName; }; diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp index a4a1429539a..2fe36185745 100644 --- a/src/plugins/diffeditor/diffeditorplugin.cpp +++ b/src/plugins/diffeditor/diffeditorplugin.cpp @@ -136,31 +136,28 @@ void DiffEditorPlugin::diff() const Core::Id editorId = Constants::DIFF_EDITOR_ID; //: Editor title QString title = tr("Diff \"%1\", \"%2\"").arg(fileName1).arg(fileName2); - Core::IEditor *outputEditor = Core::EditorManager::openEditorWithContents(editorId, &title, QString()); - Core::EditorManager::activateEditor(outputEditor, Core::EditorManager::ModeSwitch); - - DiffEditorWidget *editorWidget = getDiffEditorWidget(outputEditor); - if (editorWidget) { - const QString text1 = getFileContents(fileName1, editorWidget->codec()); - const QString text2 = getFileContents(fileName2, editorWidget->codec()); - - DiffEditorWidget::DiffFilesContents dfc; - dfc.leftFileInfo = fileName1; - dfc.leftText = text1; - dfc.rightFileInfo = fileName2; - dfc.rightText = text2; - QList<DiffEditorWidget::DiffFilesContents> list; - list.append(dfc); - - editorWidget->setDiff(list); - } -} + DiffEditorEditable *editorEditable = qobject_cast<DiffEditorEditable *> + (Core::EditorManager::openEditorWithContents(editorId, &title, QString())); -DiffEditorWidget *DiffEditorPlugin::getDiffEditorWidget(const Core::IEditor *editor) const -{ - if (const DiffEditorEditable *de = qobject_cast<const DiffEditorEditable *>(editor)) - return de->editorWidget(); - return 0; + if (!editorEditable) + return; + + Core::EditorManager::activateEditor(editorEditable, Core::EditorManager::ModeSwitch); + + DiffEditorWidget *editorWidget = editorEditable->editorWidget(); + + const QString text1 = getFileContents(fileName1, editorWidget->codec()); + const QString text2 = getFileContents(fileName2, editorWidget->codec()); + + DiffEditorWidget::DiffFilesContents dfc; + dfc.leftFileInfo = fileName1; + dfc.leftText = text1; + dfc.rightFileInfo = fileName2; + dfc.rightText = text2; + QList<DiffEditorWidget::DiffFilesContents> list; + list.append(dfc); + + editorEditable->setDiff(list); } QString DiffEditorPlugin::getFileContents(const QString &fileName, QTextCodec *codec) const diff --git a/src/plugins/diffeditor/diffeditorplugin.h b/src/plugins/diffeditor/diffeditorplugin.h index 39b6e4bf510..8c1303d7a46 100644 --- a/src/plugins/diffeditor/diffeditorplugin.h +++ b/src/plugins/diffeditor/diffeditorplugin.h @@ -66,7 +66,6 @@ private slots: void diff(); private: - DiffEditorWidget *getDiffEditorWidget(const Core::IEditor *editor) const; QString getFileContents(const QString &fileName, QTextCodec *codec) const; }; diff --git a/src/plugins/diffeditor/diffeditorwidget.cpp b/src/plugins/diffeditor/diffeditorwidget.cpp index f68381adafd..7d9bba20014 100644 --- a/src/plugins/diffeditor/diffeditorwidget.cpp +++ b/src/plugins/diffeditor/diffeditorwidget.cpp @@ -131,6 +131,8 @@ public: void setSkippedLines(int blockNumber, int skippedLines) { m_skippedLines[blockNumber] = skippedLines; setSeparator(blockNumber, true); } void setSeparator(int blockNumber, bool separator) { m_separators[blockNumber] = separator; } bool isFileLine(int blockNumber) const { return m_fileInfo.contains(blockNumber); } + int blockNumberForFileIndex(int fileIndex) const; + int fileIndexForBlockNumber(int blockNumber) const; bool isChunkLine(int blockNumber) const { return m_skippedLines.contains(blockNumber); } void clearAll(); void clearAll(const QString &message); @@ -243,6 +245,36 @@ void DiffViewEditorWidget::setLineNumber(int blockNumber, int lineNumber) m_lineNumberDigits = qMax(m_lineNumberDigits, lineNumberString.count()); } +int DiffViewEditorWidget::blockNumberForFileIndex(int fileIndex) const +{ + if (fileIndex < 0 || fileIndex >= m_fileInfo.count()) + return -1; + + QMap<int, DiffEditorWidget::DiffFileInfo>::const_iterator it + = m_fileInfo.constBegin(); + for (int i = 0; i < fileIndex; i++) + ++it; + + return it.key(); +} + +int DiffViewEditorWidget::fileIndexForBlockNumber(int blockNumber) const +{ + QMap<int, DiffEditorWidget::DiffFileInfo>::const_iterator it + = m_fileInfo.constBegin(); + QMap<int, DiffEditorWidget::DiffFileInfo>::const_iterator itEnd + = m_fileInfo.constEnd(); + + int i = -1; + while (it != itEnd) { + if (it.key() > blockNumber) + break; + ++it; + ++i; + } + return i; +} + void DiffViewEditorWidget::clearAll() { clearAll(tr("No difference")); @@ -512,16 +544,14 @@ DiffEditorWidget::DiffEditorWidget(QWidget *parent) this, SLOT(leftVSliderChanged())); connect(m_leftEditor->verticalScrollBar(), SIGNAL(actionTriggered(int)), this, SLOT(leftVSliderChanged())); - connect(m_leftEditor, SIGNAL(cursorPositionChanged()), - this, SLOT(leftVSliderChanged())); connect(m_leftEditor->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(leftHSliderChanged())); connect(m_leftEditor->horizontalScrollBar(), SIGNAL(actionTriggered(int)), this, SLOT(leftHSliderChanged())); - connect(m_leftEditor, SIGNAL(cursorPositionChanged()), - this, SLOT(leftHSliderChanged())); + connect(m_leftEditor, SIGNAL(cursorPositionChanged()), + this, SLOT(leftCursorPositionChanged())); connect(m_leftEditor->document()->documentLayout(), SIGNAL(documentSizeChanged(QSizeF)), this, SLOT(leftDocumentSizeChanged())); @@ -529,16 +559,14 @@ DiffEditorWidget::DiffEditorWidget(QWidget *parent) this, SLOT(rightVSliderChanged())); connect(m_rightEditor->verticalScrollBar(), SIGNAL(actionTriggered(int)), this, SLOT(rightVSliderChanged())); - connect(m_rightEditor, SIGNAL(cursorPositionChanged()), - this, SLOT(rightVSliderChanged())); connect(m_rightEditor->horizontalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(rightHSliderChanged())); connect(m_rightEditor->horizontalScrollBar(), SIGNAL(actionTriggered(int)), this, SLOT(rightHSliderChanged())); - connect(m_rightEditor, SIGNAL(cursorPositionChanged()), - this, SLOT(rightHSliderChanged())); + connect(m_rightEditor, SIGNAL(cursorPositionChanged()), + this, SLOT(rightCursorPositionChanged())); connect(m_rightEditor->document()->documentLayout(), SIGNAL(documentSizeChanged(QSizeF)), this, SLOT(rightDocumentSizeChanged())); @@ -630,6 +658,24 @@ void DiffEditorWidget::setIgnoreWhitespaces(bool ignore) setDiff(m_diffList); } +void DiffEditorWidget::navigateToDiffFile(int diffFileIndex) +{ + const int blockNumber = m_leftEditor->blockNumberForFileIndex(diffFileIndex); + + QTextBlock leftBlock = m_leftEditor->document()->findBlockByNumber(blockNumber); + QTextCursor leftCursor = m_leftEditor->textCursor(); + leftCursor.setPosition(leftBlock.position()); + m_leftEditor->setTextCursor(leftCursor); + + QTextBlock rightBlock = m_rightEditor->document()->findBlockByNumber(blockNumber); + QTextCursor rightCursor = m_rightEditor->textCursor(); + rightCursor.setPosition(rightBlock.position()); + m_rightEditor->setTextCursor(rightCursor); + + m_leftEditor->centerCursor(); + m_rightEditor->centerCursor(); +} + QTextCodec *DiffEditorWidget::codec() const { return const_cast<QTextCodec *>(m_leftEditor->codec()); @@ -1329,6 +1375,20 @@ void DiffEditorWidget::rightHSliderChanged() m_leftEditor->horizontalScrollBar()->setValue(m_rightEditor->horizontalScrollBar()->value()); } +void DiffEditorWidget::leftCursorPositionChanged() +{ + leftVSliderChanged(); + leftHSliderChanged(); + emit navigatedToDiffFile(m_leftEditor->fileIndexForBlockNumber(m_leftEditor->textCursor().blockNumber())); +} + +void DiffEditorWidget::rightCursorPositionChanged() +{ + rightVSliderChanged(); + rightHSliderChanged(); + emit navigatedToDiffFile(m_rightEditor->fileIndexForBlockNumber(m_rightEditor->textCursor().blockNumber())); +} + void DiffEditorWidget::leftDocumentSizeChanged() { synchronizeFoldings(m_leftEditor, m_rightEditor); diff --git a/src/plugins/diffeditor/diffeditorwidget.h b/src/plugins/diffeditor/diffeditorwidget.h index eaa71f0495d..a5057deab63 100644 --- a/src/plugins/diffeditor/diffeditorwidget.h +++ b/src/plugins/diffeditor/diffeditorwidget.h @@ -86,6 +86,10 @@ public: public slots: void setContextLinesNumber(int lines); void setIgnoreWhitespaces(bool ignore); + void navigateToDiffFile(int diffFileIndex); + +signals: + void navigatedToDiffFile(int diffFileIndex); protected: TextEditor::SnippetEditorWidget *leftEditor() const; @@ -96,6 +100,8 @@ private slots: void rightVSliderChanged(); void leftHSliderChanged(); void rightHSliderChanged(); + void leftCursorPositionChanged(); + void rightCursorPositionChanged(); void leftDocumentSizeChanged(); void rightDocumentSizeChanged(); void toggleScrollBarSynchronization(bool on); diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 6b7bf664bc1..78c2017ac2a 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -84,10 +84,10 @@ class GitDiffHandler : public QObject Q_OBJECT public: - GitDiffHandler(const QString &gitPath, + GitDiffHandler(DiffEditor::DiffEditorEditable *editor, + const QString &gitPath, const QString &workingDirectory, const QProcessEnvironment &environment, - DiffEditor::DiffEditorWidget *editor, int timeout); // index -> working tree @@ -110,10 +110,10 @@ private: void feedEditor(); QString workingTreeContents(const QString &fileName) const; + QPointer<DiffEditor::DiffEditorEditable> m_editor; const QString m_gitPath; const QString m_workingDirectory; const QProcessEnvironment m_processEnvironment; - QWeakPointer<DiffEditor::DiffEditorWidget> m_editor; const int m_timeout; const QString m_waitMessage; @@ -133,15 +133,15 @@ private: QStringList m_indexContents; }; -GitDiffHandler::GitDiffHandler(const QString &gitPath, +GitDiffHandler::GitDiffHandler(DiffEditor::DiffEditorEditable *editor, + const QString &gitPath, const QString &workingDirectory, const QProcessEnvironment &environment, - DiffEditor::DiffEditorWidget *editor, int timeout) - : m_gitPath(gitPath), + : m_editor(editor), + m_gitPath(gitPath), m_workingDirectory(workingDirectory), m_processEnvironment(environment), - m_editor(editor), m_timeout(timeout), m_waitMessage(tr("Waiting for data...")) { @@ -182,7 +182,7 @@ void GitDiffHandler::diffRepository() void GitDiffHandler::collectFilesList(const QStringList &additionalArguments) { - m_editor.data()->clear(m_waitMessage); + m_editor->clear(m_waitMessage); VcsBase::Command *command = new VcsBase::Command(m_gitPath, m_workingDirectory, m_processEnvironment); connect(command, SIGNAL(outputData(QByteArray)), this, SLOT(slotFileListReceived(QByteArray))); QStringList arguments; @@ -196,7 +196,7 @@ void GitDiffHandler::slotFileListReceived(const QByteArray &data) if (m_editor.isNull()) return; - const QString fileList = m_editor.data()->codec()->toUnicode(data); + const QString fileList = m_editor->editorWidget()->codec()->toUnicode(data); m_requestedIndexFileNames = fileList.split(QLatin1Char('\n'), QString::SkipEmptyParts); m_requestedIndexFileNames.removeDuplicates(); m_indexFileNames = m_requestedIndexFileNames; @@ -237,7 +237,7 @@ void GitDiffHandler::slotFileContentsReceived(const QByteArray &data) const int headFilesReceived = m_headContents.count(); const int indexFilesReceived = m_indexContents.count(); - const QString contents = m_editor.data()->codec()->toUnicode(data); + const QString contents = m_editor->editorWidget()->codec()->toUnicode(data); if (headFilesReceived < m_headFileNames.count()) m_headContents.append(contents); else if (indexFilesReceived < m_indexFileNames.count()) @@ -279,7 +279,7 @@ void GitDiffHandler::feedEditor() list.append(dfc); } } - m_editor.data()->setDiff(list, m_workingDirectory); + m_editor->setDiff(list, m_workingDirectory); deleteLater(); } @@ -290,7 +290,7 @@ QString GitDiffHandler::workingTreeContents(const QString &fileName) const QFile file(absoluteFileName); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - return m_editor.data()->codec()->toUnicode(file.readAll()); + return m_editor->editorWidget()->codec()->toUnicode(file.readAll()); } return QString(); } @@ -728,10 +728,9 @@ VcsBase::VcsBaseEditorWidget *GitClient::findExistingVCSEditor(const char *regis return rc; } -DiffEditor::DiffEditorWidget *GitClient::findExistingDiffEditor(const char *registerDynamicProperty, +DiffEditor::DiffEditorEditable *GitClient::findExistingDiffEditor(const char *registerDynamicProperty, const QString &dynamicPropertyValue) const { - DiffEditor::DiffEditorWidget *editorWidget = 0; Core::IEditor *outputEditor = locateEditor(registerDynamicProperty, dynamicPropertyValue); if (!outputEditor) return 0; @@ -739,9 +738,8 @@ DiffEditor::DiffEditorWidget *GitClient::findExistingDiffEditor(const char *regi // Exists already Core::EditorManager::activateEditor(outputEditor, Core::EditorManager::ModeSwitch); outputEditor->createNew(m_msgWait); - editorWidget = diffEditorWidget(outputEditor); - return editorWidget; + return qobject_cast<DiffEditor::DiffEditorEditable *>(outputEditor); } /* Create an editor associated to VCS output of a source file/directory @@ -787,13 +785,6 @@ VcsBase::VcsBaseEditorWidget *GitClient::createVcsEditor(const Core::Id &id, return rc; } -DiffEditor::DiffEditorWidget *GitClient::diffEditorWidget(const Core::IEditor *editor) const -{ - if (const DiffEditor::DiffEditorEditable *de = qobject_cast<const DiffEditor::DiffEditorEditable *>(editor)) - return de->editorWidget(); - return 0; -} - void GitClient::diff(const QString &workingDirectory, const QStringList &diffArgs, const QStringList &unstagedFileNames, @@ -803,18 +794,17 @@ void GitClient::diff(const QString &workingDirectory, const Core::Id editorId = DiffEditor::Constants::DIFF_EDITOR_ID; QString title = tr("Git Diff"); - DiffEditor::DiffEditorWidget *editorWidget = findExistingDiffEditor("originalFileName", workingDirectory); - - if (!editorWidget) { - Core::IEditor *outputEditor = Core::EditorManager::openEditorWithContents(editorId, &title, m_msgWait); - outputEditor->document()->setProperty("originalFileName", workingDirectory); - Core::EditorManager::activateEditor(outputEditor, Core::EditorManager::ModeSwitch); // should probably go outside this block + DiffEditor::DiffEditorEditable *editorEditable = findExistingDiffEditor("originalFileName", workingDirectory); - editorWidget = diffEditorWidget(outputEditor); + if (!editorEditable) { + editorEditable = qobject_cast<DiffEditor::DiffEditorEditable *>( + Core::EditorManager::openEditorWithContents(editorId, &title, m_msgWait)); + editorEditable->document()->setProperty("originalFileName", workingDirectory); + Core::EditorManager::activateEditor(editorEditable, Core::EditorManager::ModeSwitch); // should probably go outside this block } int timeout = settings()->intValue(GitSettings::timeoutKey); - GitDiffHandler *handler = new GitDiffHandler(gitBinaryPath(), workingDirectory, processEnvironment(), editorWidget, timeout); + GitDiffHandler *handler = new GitDiffHandler(editorEditable, gitBinaryPath(), workingDirectory, processEnvironment(), timeout); if (unstagedFileNames.empty() && stagedFileNames.empty()) { // local repository diff @@ -892,18 +882,17 @@ void GitClient::diff(const QString &workingDirectory, QString title = tr("Git Diff \"%1\"").arg(fileName); const QString sourceFile = VcsBase::VcsBaseEditorWidget::getSource(workingDirectory, fileName); - DiffEditor::DiffEditorWidget *editorWidget = findExistingDiffEditor("originalFileName", sourceFile); - if (!editorWidget) { - Core::IEditor *outputEditor = Core::EditorManager::openEditorWithContents(editorId, &title, m_msgWait); - outputEditor->document()->setProperty("originalFileName", sourceFile); - Core::EditorManager::activateEditor(outputEditor, Core::EditorManager::ModeSwitch); - - editorWidget = diffEditorWidget(outputEditor); + DiffEditor::DiffEditorEditable *editorEditable = findExistingDiffEditor("originalFileName", sourceFile); + if (!editorEditable) { + editorEditable = qobject_cast<DiffEditor::DiffEditorEditable *>( + Core::EditorManager::openEditorWithContents(editorId, &title, m_msgWait)); + editorEditable->document()->setProperty("originalFileName", sourceFile); + Core::EditorManager::activateEditor(editorEditable, Core::EditorManager::ModeSwitch); } if (!fileName.isEmpty()) { int timeout = settings()->intValue(GitSettings::timeoutKey); - GitDiffHandler *handler = new GitDiffHandler(gitBinaryPath(), workingDirectory, processEnvironment(), editorWidget, timeout); + GitDiffHandler *handler = new GitDiffHandler(editorEditable, gitBinaryPath(), workingDirectory, processEnvironment(), timeout); handler->diffFile(fileName); } } else { diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 003cf6b92cd..b1b81c89b0b 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -61,7 +61,7 @@ namespace Utils { } namespace DiffEditor { - class DiffEditorWidget; + class DiffEditorEditable; } namespace Git { @@ -69,7 +69,6 @@ namespace Internal { class GitPlugin; class GitOutputWindow; -class GitDiffEditorWidget; class CommitData; struct GitSubmitEditorPanelData; class Stash; @@ -133,8 +132,6 @@ public: QString findRepositoryForDirectory(const QString &dir); QString findGitDirForRepository(const QString &repositoryDir) const; - DiffEditor::DiffEditorWidget *diffEditorWidget(const Core::IEditor *editor) const; - void diff(const QString &workingDirectory, const QStringList &diffArgs, const QString &fileName); void diff(const QString &workingDirectory, const QStringList &diffArgs, const QStringList &unstagedFileNames, const QStringList &stagedFileNames= QStringList()); @@ -326,7 +323,7 @@ private: QTextCodec *getSourceCodec(const QString &file) const; VcsBase::VcsBaseEditorWidget *findExistingVCSEditor(const char *registerDynamicProperty, const QString &dynamicPropertyValue) const; - DiffEditor::DiffEditorWidget *findExistingDiffEditor(const char *registerDynamicProperty, + DiffEditor::DiffEditorEditable *findExistingDiffEditor(const char *registerDynamicProperty, const QString &dynamicPropertyValue) const; enum CodecType { CodecSource, CodecLogOutput, CodecNone }; -- GitLab