diff --git a/src/plugins/diffeditor/diffeditor.cpp b/src/plugins/diffeditor/diffeditor.cpp index 02bdaeeebca..3b681376167 100644 --- a/src/plugins/diffeditor/diffeditor.cpp +++ b/src/plugins/diffeditor/diffeditor.cpp @@ -74,6 +74,8 @@ class DescriptionEditorWidget : public TextEditorWidget Q_OBJECT public: DescriptionEditorWidget(QWidget *parent = 0); + ~DescriptionEditorWidget(); + virtual QSize sizeHint() const override; signals: @@ -92,6 +94,7 @@ protected: private: QTextCursor m_currentCursor; + Core::IContext *m_context; }; DescriptionEditorWidget::DescriptionEditorWidget(QWidget *parent) @@ -112,6 +115,16 @@ DescriptionEditorWidget::DescriptionEditorWidget(QWidget *parent) setFrameStyle(QFrame::NoFrame); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + + m_context = new Core::IContext(this); + m_context->setWidget(this); + m_context->setContext(Core::Context(Constants::C_DIFF_EDITOR_DESCRIPTION)); + Core::ICore::addContextObject(m_context); +} + +DescriptionEditorWidget::~DescriptionEditorWidget() +{ + Core::ICore::removeContextObject(m_context); } QSize DescriptionEditorWidget::sizeHint() const @@ -226,8 +239,11 @@ DiffEditor::DiffEditor() m_stackedWidget = new QStackedWidget(splitter); splitter->addWidget(m_stackedWidget); - addView(new SideBySideView); - addView(new UnifiedView); + m_unifiedView = new UnifiedView; + m_sideBySideView = new SideBySideView; + + addView(m_sideBySideView); + addView(m_unifiedView); setWidget(splitter); @@ -351,6 +367,26 @@ QWidget *DiffEditor::toolBar() return m_toolBar; } +TextEditorWidget *DiffEditor::descriptionWidget() const +{ + return m_descriptionWidget; +} + +TextEditorWidget *DiffEditor::unifiedEditorWidget() const +{ + return m_unifiedView->textEditorWidget(); +} + +TextEditorWidget *DiffEditor::leftEditorWidget() const +{ + return m_sideBySideView->leftEditorWidget(); +} + +TextEditorWidget *DiffEditor::rightEditorWidget() const +{ + return m_sideBySideView->rightEditorWidget(); +} + void DiffEditor::documentHasChanged() { Utils::GuardLocker guard(m_ignoreChanges); diff --git a/src/plugins/diffeditor/diffeditor.h b/src/plugins/diffeditor/diffeditor.h index 57541d009e4..0777aed00e5 100644 --- a/src/plugins/diffeditor/diffeditor.h +++ b/src/plugins/diffeditor/diffeditor.h @@ -47,6 +47,8 @@ namespace Internal { class DescriptionEditorWidget; class DiffEditorDocument; class IDiffView; +class UnifiedView; +class SideBySideView; class DiffEditor : public Core::IEditor { @@ -59,6 +61,10 @@ public: Core::IEditor *duplicate() override; Core::IDocument *document() override; QWidget *toolBar() override; + TextEditor::TextEditorWidget *descriptionWidget() const; + TextEditor::TextEditorWidget *unifiedEditorWidget() const; + TextEditor::TextEditorWidget *leftEditorWidget() const; + TextEditor::TextEditorWidget *rightEditorWidget() const; private: DiffEditor(); @@ -89,6 +95,8 @@ private: QSharedPointer m_document; DescriptionEditorWidget *m_descriptionWidget; + UnifiedView *m_unifiedView; + SideBySideView *m_sideBySideView; QStackedWidget *m_stackedWidget; QVector m_views; QToolBar *m_toolBar; diff --git a/src/plugins/diffeditor/diffeditorconstants.h b/src/plugins/diffeditor/diffeditorconstants.h index a7b4185a4f5..c44a5fb84d7 100644 --- a/src/plugins/diffeditor/diffeditorconstants.h +++ b/src/plugins/diffeditor/diffeditorconstants.h @@ -35,6 +35,10 @@ const char DIFF_EDITOR_PLUGIN[] = "DiffEditorPlugin"; const char DIFF_EDITOR_ID[] = "Diff Editor"; const char DIFF_EDITOR_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("DiffEditor", "Diff Editor"); const char DIFF_EDITOR_MIMETYPE[] = "text/x-patch"; +const char C_DIFF_EDITOR_DESCRIPTION[] = "DiffEditor.Description"; +const char SIDE_BY_SIDE_VIEW_ID[] = "DiffEditor.SideBySide"; +const char UNIFIED_VIEW_ID[] = "DiffEditor.Unified"; + const char G_TOOLS_DIFF[] = "QtCreator.Group.Tools.Options"; const char EXPAND_BRANCHES[] = "Branches: "; diff --git a/src/plugins/diffeditor/diffeditorfactory.cpp b/src/plugins/diffeditor/diffeditorfactory.cpp index 714b0d25ca5..9944bec558a 100644 --- a/src/plugins/diffeditor/diffeditorfactory.cpp +++ b/src/plugins/diffeditor/diffeditorfactory.cpp @@ -29,6 +29,8 @@ #include "diffeditorfactory.h" #include "sidebysidediffeditorwidget.h" +#include "texteditor/texteditoractionhandler.h" + #include namespace DiffEditor { @@ -40,6 +42,26 @@ DiffEditorFactory::DiffEditorFactory(QObject *parent) setId(Constants::DIFF_EDITOR_ID); setDisplayName(QCoreApplication::translate("DiffEditorFactory", Constants::DIFF_EDITOR_DISPLAY_NAME)); addMimeType(Constants::DIFF_EDITOR_MIMETYPE); + auto descriptionHandler = new TextEditor::TextEditorActionHandler( + this, id(), Constants::C_DIFF_EDITOR_DESCRIPTION); + descriptionHandler->setTextEditorWidgetResolver([](Core::IEditor *e) { + return static_cast(e)->descriptionWidget(); + }); + auto unifiedHandler = new TextEditor::TextEditorActionHandler( + this, id(), Constants::UNIFIED_VIEW_ID); + unifiedHandler->setTextEditorWidgetResolver([](Core::IEditor *e) { + return static_cast(e)->unifiedEditorWidget(); + }); + auto leftHandler = new TextEditor::TextEditorActionHandler( + this, id(), Core::Id(Constants::SIDE_BY_SIDE_VIEW_ID).withSuffix(1)); + leftHandler->setTextEditorWidgetResolver([](Core::IEditor *e) { + return static_cast(e)->leftEditorWidget(); + }); + auto rightHandler = new TextEditor::TextEditorActionHandler( + this, id(), Core::Id(Constants::SIDE_BY_SIDE_VIEW_ID).withSuffix(2)); + rightHandler->setTextEditorWidgetResolver([](Core::IEditor *e) { + return static_cast(e)->rightEditorWidget(); + }); } Core::IEditor *DiffEditorFactory::createEditor() diff --git a/src/plugins/diffeditor/diffview.cpp b/src/plugins/diffeditor/diffview.cpp index 8ad53395940..5a8938ba0c0 100644 --- a/src/plugins/diffeditor/diffview.cpp +++ b/src/plugins/diffeditor/diffview.cpp @@ -25,6 +25,7 @@ #include "diffview.h" +#include "diffeditorconstants.h" #include "diffeditordocument.h" #include "diffeditoricons.h" #include "unifieddiffeditorwidget.h" @@ -90,14 +91,19 @@ void IDiffView::setSyncToolTip(const QString &text) m_syncToolTip = text; } -UnifiedView::UnifiedView() : m_widget(0) +UnifiedView::UnifiedView() { - setId(UNIFIED_VIEW_ID); + setId(Constants::UNIFIED_VIEW_ID); setIcon(Icons::UNIFIED_DIFF.icon()); setToolTip(QCoreApplication::translate("DiffEditor::UnifiedView", "Switch to Unified Diff Editor")); } QWidget *UnifiedView::widget() +{ + return textEditorWidget(); +} + +TextEditor::TextEditorWidget *UnifiedView::textEditorWidget() { if (!m_widget) { m_widget = new UnifiedDiffEditorWidget; @@ -152,7 +158,7 @@ void UnifiedView::setSync(bool sync) SideBySideView::SideBySideView() : m_widget(0) { - setId(SIDE_BY_SIDE_VIEW_ID); + setId(Constants::SIDE_BY_SIDE_VIEW_ID); setIcon(Icons::SIDEBYSIDE_DIFF.icon()); setToolTip(QCoreApplication::translate("DiffEditor::SideBySideView", "Switch to Side By Side Diff Editor")); @@ -170,6 +176,18 @@ QWidget *SideBySideView::widget() return m_widget; } +TextEditor::TextEditorWidget *SideBySideView::leftEditorWidget() +{ + widget(); // ensure widget creation + return m_widget->leftEditorWidget(); +} + +TextEditor::TextEditorWidget *SideBySideView::rightEditorWidget() +{ + widget(); // ensure widget creation + return m_widget->rightEditorWidget(); +} + void SideBySideView::setDocument(DiffEditorDocument *document) { QTC_ASSERT(m_widget, return); diff --git a/src/plugins/diffeditor/diffview.h b/src/plugins/diffeditor/diffview.h index bf5342f273d..34c473d00c4 100644 --- a/src/plugins/diffeditor/diffview.h +++ b/src/plugins/diffeditor/diffview.h @@ -33,6 +33,8 @@ QT_FORWARD_DECLARE_CLASS(QWidget) +namespace TextEditor { class TextEditorWidget; } + namespace DiffEditor { class DiffEditorController; @@ -44,9 +46,6 @@ class DiffEditorDocument; class SideBySideDiffEditorWidget; class UnifiedDiffEditorWidget; -const char SIDE_BY_SIDE_VIEW_ID[] = "SideBySide"; -const char UNIFIED_VIEW_ID[] = "Unified"; - class IDiffView : public QObject { Q_OBJECT @@ -96,6 +95,8 @@ public: UnifiedView(); QWidget *widget(); + TextEditor::TextEditorWidget *textEditorWidget(); + void setDocument(DiffEditorDocument *document); void beginOperation(); @@ -106,7 +107,7 @@ public: void setSync(bool sync); private: - UnifiedDiffEditorWidget *m_widget; + UnifiedDiffEditorWidget *m_widget = nullptr; }; class SideBySideView : public IDiffView @@ -117,6 +118,9 @@ public: SideBySideView(); QWidget *widget(); + TextEditor::TextEditorWidget *leftEditorWidget(); + TextEditor::TextEditorWidget *rightEditorWidget(); + void setDocument(DiffEditorDocument *document); void beginOperation(); diff --git a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp index 2561d611c45..d18045f8b89 100644 --- a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp +++ b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp @@ -25,6 +25,7 @@ #include "sidebysidediffeditorwidget.h" #include "selectabletexteditorwidget.h" +#include "diffeditorconstants.h" #include "diffeditordocument.h" #include "diffutils.h" @@ -40,6 +41,7 @@ #include #include +#include #include #include @@ -556,6 +558,31 @@ SideBySideDiffEditorWidget::SideBySideDiffEditorWidget(QWidget *parent) l->setMargin(0); l->addWidget(m_splitter); setFocusProxy(m_rightEditor); + + m_leftContext = new IContext(this); + m_leftContext->setWidget(m_leftEditor); + m_leftContext->setContext(Core::Context(Core::Id(Constants::SIDE_BY_SIDE_VIEW_ID).withSuffix(1))); + Core::ICore::addContextObject(m_leftContext); + m_rightContext = new IContext(this); + m_rightContext->setWidget(m_rightEditor); + m_rightContext->setContext(Core::Context(Core::Id(Constants::SIDE_BY_SIDE_VIEW_ID).withSuffix(2))); + Core::ICore::addContextObject(m_rightContext); +} + +SideBySideDiffEditorWidget::~SideBySideDiffEditorWidget() +{ + Core::ICore::removeContextObject(m_leftContext); + Core::ICore::removeContextObject(m_rightContext); +} + +TextEditorWidget *SideBySideDiffEditorWidget::leftEditorWidget() const +{ + return m_leftEditor; +} + +TextEditorWidget *SideBySideDiffEditorWidget::rightEditorWidget() const +{ + return m_rightEditor; } void SideBySideDiffEditorWidget::setDocument(DiffEditorDocument *document) diff --git a/src/plugins/diffeditor/sidebysidediffeditorwidget.h b/src/plugins/diffeditor/sidebysidediffeditorwidget.h index a80c11aa7cc..2b03308c9eb 100644 --- a/src/plugins/diffeditor/sidebysidediffeditorwidget.h +++ b/src/plugins/diffeditor/sidebysidediffeditorwidget.h @@ -30,7 +30,12 @@ #include #include -namespace TextEditor { class FontSettings; } +namespace Core { class IContext; } + +namespace TextEditor { +class FontSettings; +class TextEditorWidget; +} QT_BEGIN_NAMESPACE class QMenu; @@ -52,6 +57,10 @@ class SideBySideDiffEditorWidget : public QWidget Q_OBJECT public: explicit SideBySideDiffEditorWidget(QWidget *parent = 0); + ~SideBySideDiffEditorWidget(); + + TextEditor::TextEditorWidget *leftEditorWidget() const; + TextEditor::TextEditorWidget *rightEditorWidget() const; void setDocument(DiffEditorDocument *document); DiffEditorDocument *diffDocument() const; @@ -98,6 +107,8 @@ private: bool m_horizontalSync = false; QTextCharFormat m_spanLineFormat; + Core::IContext *m_leftContext; + Core::IContext *m_rightContext; }; } // namespace Internal diff --git a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp index 34009eaf868..544adb5fbf6 100644 --- a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp +++ b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp @@ -24,6 +24,8 @@ ****************************************************************************/ #include "unifieddiffeditorwidget.h" + +#include "diffeditorconstants.h" #include "diffeditordocument.h" #include "diffutils.h" @@ -32,6 +34,8 @@ #include #include +#include + #include #include #include @@ -73,6 +77,16 @@ UnifiedDiffEditorWidget::UnifiedDiffEditorWidget(QWidget *parent) connect(this, &QPlainTextEdit::cursorPositionChanged, this, &UnifiedDiffEditorWidget::slotCursorPositionChangedInEditor); + + m_context = new Core::IContext(this); + m_context->setWidget(this); + m_context->setContext(Core::Context(Constants::UNIFIED_VIEW_ID)); + Core::ICore::addContextObject(m_context); +} + +UnifiedDiffEditorWidget::~UnifiedDiffEditorWidget() +{ + Core::ICore::removeContextObject(m_context); } void UnifiedDiffEditorWidget::setDocument(DiffEditorDocument *document) diff --git a/src/plugins/diffeditor/unifieddiffeditorwidget.h b/src/plugins/diffeditor/unifieddiffeditorwidget.h index 5812c5b234e..260bf2d81b3 100644 --- a/src/plugins/diffeditor/unifieddiffeditorwidget.h +++ b/src/plugins/diffeditor/unifieddiffeditorwidget.h @@ -28,6 +28,8 @@ #include "selectabletexteditorwidget.h" #include "diffeditorwidgetcontroller.h" +namespace Core { class IContext; } + namespace TextEditor { class DisplaySettings; class FontSettings; @@ -52,6 +54,7 @@ class UnifiedDiffEditorWidget : public SelectableTextEditorWidget Q_OBJECT public: UnifiedDiffEditorWidget(QWidget *parent = 0); + ~UnifiedDiffEditorWidget(); void setDocument(DiffEditorDocument *document); DiffEditorDocument *diffDocument() const; @@ -114,6 +117,7 @@ private: QMap > m_chunkInfo; QByteArray m_state; + Core::IContext *m_context; }; } // namespace Internal