DiffEditor: Fix editor actions

The text editor widgets all need a TextEditorActionHandler that takes
care of the editor actions for them.
Each text editor needs its own context, so the editor with focus
receives the actions. This does not happen automatically for these text
editors, since the diff editor manages these itself.

Task-number: QTCREATORBUG-9445
Change-Id: Ib42f095ec23550e401e8ee9b36f3f49517a22877
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Eike Ziller
2017-05-09 12:19:11 +02:00
parent fd7edcb826
commit ee722a047c
10 changed files with 158 additions and 10 deletions

View File

@@ -74,6 +74,8 @@ class DescriptionEditorWidget : public TextEditorWidget
Q_OBJECT Q_OBJECT
public: public:
DescriptionEditorWidget(QWidget *parent = 0); DescriptionEditorWidget(QWidget *parent = 0);
~DescriptionEditorWidget();
virtual QSize sizeHint() const override; virtual QSize sizeHint() const override;
signals: signals:
@@ -92,6 +94,7 @@ protected:
private: private:
QTextCursor m_currentCursor; QTextCursor m_currentCursor;
Core::IContext *m_context;
}; };
DescriptionEditorWidget::DescriptionEditorWidget(QWidget *parent) DescriptionEditorWidget::DescriptionEditorWidget(QWidget *parent)
@@ -112,6 +115,16 @@ DescriptionEditorWidget::DescriptionEditorWidget(QWidget *parent)
setFrameStyle(QFrame::NoFrame); setFrameStyle(QFrame::NoFrame);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); 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 QSize DescriptionEditorWidget::sizeHint() const
@@ -226,8 +239,11 @@ DiffEditor::DiffEditor()
m_stackedWidget = new QStackedWidget(splitter); m_stackedWidget = new QStackedWidget(splitter);
splitter->addWidget(m_stackedWidget); splitter->addWidget(m_stackedWidget);
addView(new SideBySideView); m_unifiedView = new UnifiedView;
addView(new UnifiedView); m_sideBySideView = new SideBySideView;
addView(m_sideBySideView);
addView(m_unifiedView);
setWidget(splitter); setWidget(splitter);
@@ -351,6 +367,26 @@ QWidget *DiffEditor::toolBar()
return m_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() void DiffEditor::documentHasChanged()
{ {
Utils::GuardLocker guard(m_ignoreChanges); Utils::GuardLocker guard(m_ignoreChanges);

View File

@@ -47,6 +47,8 @@ namespace Internal {
class DescriptionEditorWidget; class DescriptionEditorWidget;
class DiffEditorDocument; class DiffEditorDocument;
class IDiffView; class IDiffView;
class UnifiedView;
class SideBySideView;
class DiffEditor : public Core::IEditor class DiffEditor : public Core::IEditor
{ {
@@ -59,6 +61,10 @@ public:
Core::IEditor *duplicate() override; Core::IEditor *duplicate() override;
Core::IDocument *document() override; Core::IDocument *document() override;
QWidget *toolBar() override; QWidget *toolBar() override;
TextEditor::TextEditorWidget *descriptionWidget() const;
TextEditor::TextEditorWidget *unifiedEditorWidget() const;
TextEditor::TextEditorWidget *leftEditorWidget() const;
TextEditor::TextEditorWidget *rightEditorWidget() const;
private: private:
DiffEditor(); DiffEditor();
@@ -89,6 +95,8 @@ private:
QSharedPointer<DiffEditorDocument> m_document; QSharedPointer<DiffEditorDocument> m_document;
DescriptionEditorWidget *m_descriptionWidget; DescriptionEditorWidget *m_descriptionWidget;
UnifiedView *m_unifiedView;
SideBySideView *m_sideBySideView;
QStackedWidget *m_stackedWidget; QStackedWidget *m_stackedWidget;
QVector<IDiffView *> m_views; QVector<IDiffView *> m_views;
QToolBar *m_toolBar; QToolBar *m_toolBar;

View File

@@ -35,6 +35,10 @@ const char DIFF_EDITOR_PLUGIN[] = "DiffEditorPlugin";
const char DIFF_EDITOR_ID[] = "Diff Editor"; const char DIFF_EDITOR_ID[] = "Diff Editor";
const char DIFF_EDITOR_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("DiffEditor", "Diff Editor"); const char DIFF_EDITOR_DISPLAY_NAME[] = QT_TRANSLATE_NOOP("DiffEditor", "Diff Editor");
const char DIFF_EDITOR_MIMETYPE[] = "text/x-patch"; 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 G_TOOLS_DIFF[] = "QtCreator.Group.Tools.Options";
const char EXPAND_BRANCHES[] = "Branches: <Expand>"; const char EXPAND_BRANCHES[] = "Branches: <Expand>";

View File

@@ -29,6 +29,8 @@
#include "diffeditorfactory.h" #include "diffeditorfactory.h"
#include "sidebysidediffeditorwidget.h" #include "sidebysidediffeditorwidget.h"
#include "texteditor/texteditoractionhandler.h"
#include <QCoreApplication> #include <QCoreApplication>
namespace DiffEditor { namespace DiffEditor {
@@ -40,6 +42,26 @@ DiffEditorFactory::DiffEditorFactory(QObject *parent)
setId(Constants::DIFF_EDITOR_ID); setId(Constants::DIFF_EDITOR_ID);
setDisplayName(QCoreApplication::translate("DiffEditorFactory", Constants::DIFF_EDITOR_DISPLAY_NAME)); setDisplayName(QCoreApplication::translate("DiffEditorFactory", Constants::DIFF_EDITOR_DISPLAY_NAME));
addMimeType(Constants::DIFF_EDITOR_MIMETYPE); 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<DiffEditor *>(e)->descriptionWidget();
});
auto unifiedHandler = new TextEditor::TextEditorActionHandler(
this, id(), Constants::UNIFIED_VIEW_ID);
unifiedHandler->setTextEditorWidgetResolver([](Core::IEditor *e) {
return static_cast<DiffEditor *>(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<DiffEditor *>(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<DiffEditor *>(e)->rightEditorWidget();
});
} }
Core::IEditor *DiffEditorFactory::createEditor() Core::IEditor *DiffEditorFactory::createEditor()

View File

@@ -25,6 +25,7 @@
#include "diffview.h" #include "diffview.h"
#include "diffeditorconstants.h"
#include "diffeditordocument.h" #include "diffeditordocument.h"
#include "diffeditoricons.h" #include "diffeditoricons.h"
#include "unifieddiffeditorwidget.h" #include "unifieddiffeditorwidget.h"
@@ -90,14 +91,19 @@ void IDiffView::setSyncToolTip(const QString &text)
m_syncToolTip = 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()); setIcon(Icons::UNIFIED_DIFF.icon());
setToolTip(QCoreApplication::translate("DiffEditor::UnifiedView", "Switch to Unified Diff Editor")); setToolTip(QCoreApplication::translate("DiffEditor::UnifiedView", "Switch to Unified Diff Editor"));
} }
QWidget *UnifiedView::widget() QWidget *UnifiedView::widget()
{
return textEditorWidget();
}
TextEditor::TextEditorWidget *UnifiedView::textEditorWidget()
{ {
if (!m_widget) { if (!m_widget) {
m_widget = new UnifiedDiffEditorWidget; m_widget = new UnifiedDiffEditorWidget;
@@ -152,7 +158,7 @@ void UnifiedView::setSync(bool sync)
SideBySideView::SideBySideView() : m_widget(0) SideBySideView::SideBySideView() : m_widget(0)
{ {
setId(SIDE_BY_SIDE_VIEW_ID); setId(Constants::SIDE_BY_SIDE_VIEW_ID);
setIcon(Icons::SIDEBYSIDE_DIFF.icon()); setIcon(Icons::SIDEBYSIDE_DIFF.icon());
setToolTip(QCoreApplication::translate("DiffEditor::SideBySideView", setToolTip(QCoreApplication::translate("DiffEditor::SideBySideView",
"Switch to Side By Side Diff Editor")); "Switch to Side By Side Diff Editor"));
@@ -170,6 +176,18 @@ QWidget *SideBySideView::widget()
return m_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) void SideBySideView::setDocument(DiffEditorDocument *document)
{ {
QTC_ASSERT(m_widget, return); QTC_ASSERT(m_widget, return);

View File

@@ -33,6 +33,8 @@
QT_FORWARD_DECLARE_CLASS(QWidget) QT_FORWARD_DECLARE_CLASS(QWidget)
namespace TextEditor { class TextEditorWidget; }
namespace DiffEditor { namespace DiffEditor {
class DiffEditorController; class DiffEditorController;
@@ -44,9 +46,6 @@ class DiffEditorDocument;
class SideBySideDiffEditorWidget; class SideBySideDiffEditorWidget;
class UnifiedDiffEditorWidget; class UnifiedDiffEditorWidget;
const char SIDE_BY_SIDE_VIEW_ID[] = "SideBySide";
const char UNIFIED_VIEW_ID[] = "Unified";
class IDiffView : public QObject class IDiffView : public QObject
{ {
Q_OBJECT Q_OBJECT
@@ -96,6 +95,8 @@ public:
UnifiedView(); UnifiedView();
QWidget *widget(); QWidget *widget();
TextEditor::TextEditorWidget *textEditorWidget();
void setDocument(DiffEditorDocument *document); void setDocument(DiffEditorDocument *document);
void beginOperation(); void beginOperation();
@@ -106,7 +107,7 @@ public:
void setSync(bool sync); void setSync(bool sync);
private: private:
UnifiedDiffEditorWidget *m_widget; UnifiedDiffEditorWidget *m_widget = nullptr;
}; };
class SideBySideView : public IDiffView class SideBySideView : public IDiffView
@@ -117,6 +118,9 @@ public:
SideBySideView(); SideBySideView();
QWidget *widget(); QWidget *widget();
TextEditor::TextEditorWidget *leftEditorWidget();
TextEditor::TextEditorWidget *rightEditorWidget();
void setDocument(DiffEditorDocument *document); void setDocument(DiffEditorDocument *document);
void beginOperation(); void beginOperation();

View File

@@ -25,6 +25,7 @@
#include "sidebysidediffeditorwidget.h" #include "sidebysidediffeditorwidget.h"
#include "selectabletexteditorwidget.h" #include "selectabletexteditorwidget.h"
#include "diffeditorconstants.h"
#include "diffeditordocument.h" #include "diffeditordocument.h"
#include "diffutils.h" #include "diffutils.h"
@@ -40,6 +41,7 @@
#include <texteditor/fontsettings.h> #include <texteditor/fontsettings.h>
#include <texteditor/displaysettings.h> #include <texteditor/displaysettings.h>
#include <coreplugin/icore.h>
#include <coreplugin/minisplitter.h> #include <coreplugin/minisplitter.h>
#include <utils/tooltip/tooltip.h> #include <utils/tooltip/tooltip.h>
@@ -556,6 +558,31 @@ SideBySideDiffEditorWidget::SideBySideDiffEditorWidget(QWidget *parent)
l->setMargin(0); l->setMargin(0);
l->addWidget(m_splitter); l->addWidget(m_splitter);
setFocusProxy(m_rightEditor); 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) void SideBySideDiffEditorWidget::setDocument(DiffEditorDocument *document)

View File

@@ -30,7 +30,12 @@
#include <QWidget> #include <QWidget>
#include <QTextCharFormat> #include <QTextCharFormat>
namespace TextEditor { class FontSettings; } namespace Core { class IContext; }
namespace TextEditor {
class FontSettings;
class TextEditorWidget;
}
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QMenu; class QMenu;
@@ -52,6 +57,10 @@ class SideBySideDiffEditorWidget : public QWidget
Q_OBJECT Q_OBJECT
public: public:
explicit SideBySideDiffEditorWidget(QWidget *parent = 0); explicit SideBySideDiffEditorWidget(QWidget *parent = 0);
~SideBySideDiffEditorWidget();
TextEditor::TextEditorWidget *leftEditorWidget() const;
TextEditor::TextEditorWidget *rightEditorWidget() const;
void setDocument(DiffEditorDocument *document); void setDocument(DiffEditorDocument *document);
DiffEditorDocument *diffDocument() const; DiffEditorDocument *diffDocument() const;
@@ -98,6 +107,8 @@ private:
bool m_horizontalSync = false; bool m_horizontalSync = false;
QTextCharFormat m_spanLineFormat; QTextCharFormat m_spanLineFormat;
Core::IContext *m_leftContext;
Core::IContext *m_rightContext;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -24,6 +24,8 @@
****************************************************************************/ ****************************************************************************/
#include "unifieddiffeditorwidget.h" #include "unifieddiffeditorwidget.h"
#include "diffeditorconstants.h"
#include "diffeditordocument.h" #include "diffeditordocument.h"
#include "diffutils.h" #include "diffutils.h"
@@ -32,6 +34,8 @@
#include <QScrollBar> #include <QScrollBar>
#include <QTextBlock> #include <QTextBlock>
#include <coreplugin/icore.h>
#include <texteditor/textdocument.h> #include <texteditor/textdocument.h>
#include <texteditor/textdocumentlayout.h> #include <texteditor/textdocumentlayout.h>
#include <texteditor/texteditorsettings.h> #include <texteditor/texteditorsettings.h>
@@ -73,6 +77,16 @@ UnifiedDiffEditorWidget::UnifiedDiffEditorWidget(QWidget *parent)
connect(this, &QPlainTextEdit::cursorPositionChanged, connect(this, &QPlainTextEdit::cursorPositionChanged,
this, &UnifiedDiffEditorWidget::slotCursorPositionChangedInEditor); 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) void UnifiedDiffEditorWidget::setDocument(DiffEditorDocument *document)

View File

@@ -28,6 +28,8 @@
#include "selectabletexteditorwidget.h" #include "selectabletexteditorwidget.h"
#include "diffeditorwidgetcontroller.h" #include "diffeditorwidgetcontroller.h"
namespace Core { class IContext; }
namespace TextEditor { namespace TextEditor {
class DisplaySettings; class DisplaySettings;
class FontSettings; class FontSettings;
@@ -52,6 +54,7 @@ class UnifiedDiffEditorWidget : public SelectableTextEditorWidget
Q_OBJECT Q_OBJECT
public: public:
UnifiedDiffEditorWidget(QWidget *parent = 0); UnifiedDiffEditorWidget(QWidget *parent = 0);
~UnifiedDiffEditorWidget();
void setDocument(DiffEditorDocument *document); void setDocument(DiffEditorDocument *document);
DiffEditorDocument *diffDocument() const; DiffEditorDocument *diffDocument() const;
@@ -114,6 +117,7 @@ private:
QMap<int, QPair<int, int> > m_chunkInfo; QMap<int, QPair<int, int> > m_chunkInfo;
QByteArray m_state; QByteArray m_state;
Core::IContext *m_context;
}; };
} // namespace Internal } // namespace Internal