forked from qt-creator/qt-creator
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:
@@ -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);
|
||||
|
||||
@@ -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<DiffEditorDocument> m_document;
|
||||
DescriptionEditorWidget *m_descriptionWidget;
|
||||
UnifiedView *m_unifiedView;
|
||||
SideBySideView *m_sideBySideView;
|
||||
QStackedWidget *m_stackedWidget;
|
||||
QVector<IDiffView *> m_views;
|
||||
QToolBar *m_toolBar;
|
||||
|
||||
@@ -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: <Expand>";
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
#include "diffeditorfactory.h"
|
||||
#include "sidebysidediffeditorwidget.h"
|
||||
|
||||
#include "texteditor/texteditoractionhandler.h"
|
||||
|
||||
#include <QCoreApplication>
|
||||
|
||||
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<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()
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
#include "sidebysidediffeditorwidget.h"
|
||||
#include "selectabletexteditorwidget.h"
|
||||
#include "diffeditorconstants.h"
|
||||
#include "diffeditordocument.h"
|
||||
#include "diffutils.h"
|
||||
|
||||
@@ -40,6 +41,7 @@
|
||||
#include <texteditor/fontsettings.h>
|
||||
#include <texteditor/displaysettings.h>
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
#include <coreplugin/minisplitter.h>
|
||||
|
||||
#include <utils/tooltip/tooltip.h>
|
||||
@@ -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)
|
||||
|
||||
@@ -30,7 +30,12 @@
|
||||
#include <QWidget>
|
||||
#include <QTextCharFormat>
|
||||
|
||||
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
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include "unifieddiffeditorwidget.h"
|
||||
|
||||
#include "diffeditorconstants.h"
|
||||
#include "diffeditordocument.h"
|
||||
#include "diffutils.h"
|
||||
|
||||
@@ -32,6 +34,8 @@
|
||||
#include <QScrollBar>
|
||||
#include <QTextBlock>
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
|
||||
#include <texteditor/textdocument.h>
|
||||
#include <texteditor/textdocumentlayout.h>
|
||||
#include <texteditor/texteditorsettings.h>
|
||||
@@ -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)
|
||||
|
||||
@@ -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<int, QPair<int, int> > m_chunkInfo;
|
||||
|
||||
QByteArray m_state;
|
||||
Core::IContext *m_context;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
Reference in New Issue
Block a user