2022-08-19 15:59:36 +02:00
|
|
|
// Copyright (C) 2019 The Qt Company Ltd.
|
|
|
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
2019-11-13 12:09:01 +01:00
|
|
|
|
|
|
|
|
#include "bindingeditorwidget.h"
|
|
|
|
|
|
|
|
|
|
#include <coreplugin/icore.h>
|
|
|
|
|
#include <coreplugin/actionmanager/actionmanager.h>
|
|
|
|
|
#include <qmljseditor/qmljseditor.h>
|
|
|
|
|
#include <qmljseditor/qmljscompletionassist.h>
|
|
|
|
|
#include <qmljseditor/qmljshighlighter.h>
|
|
|
|
|
#include <qmljseditor/qmljshoverhandler.h>
|
|
|
|
|
#include <qmljseditor/qmljsautocompleter.h>
|
|
|
|
|
#include <qmljseditor/qmljseditordocument.h>
|
|
|
|
|
#include <qmljseditor/qmljssemantichighlighter.h>
|
|
|
|
|
#include <qmljstools/qmljsindenter.h>
|
2021-09-10 18:06:26 +02:00
|
|
|
#include <qmljstools/qmljstoolsconstants.h>
|
|
|
|
|
|
|
|
|
|
#include <projectexplorer/projectexplorerconstants.h>
|
|
|
|
|
#include <utils/fancylineedit.h>
|
2019-11-13 12:09:01 +01:00
|
|
|
|
|
|
|
|
#include <QAction>
|
|
|
|
|
|
|
|
|
|
namespace QmlDesigner {
|
|
|
|
|
|
|
|
|
|
BindingEditorWidget::BindingEditorWidget()
|
2020-05-26 16:07:10 +02:00
|
|
|
: m_context(new Core::IContext(this))
|
2019-11-13 12:09:01 +01:00
|
|
|
{
|
2021-09-10 18:06:26 +02:00
|
|
|
Core::Context context(BINDINGEDITOR_CONTEXT_ID,
|
|
|
|
|
ProjectExplorer::Constants::QMLJS_LANGUAGE_ID);
|
|
|
|
|
|
2020-05-26 16:07:10 +02:00
|
|
|
m_context->setWidget(this);
|
2021-09-10 18:06:26 +02:00
|
|
|
m_context->setContext(context);
|
2019-11-13 12:09:01 +01:00
|
|
|
Core::ICore::addContextObject(m_context);
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* We have to register our own active auto completion shortcut, because the original short cut will
|
|
|
|
|
* use the cursor position of the original editor in the editor manager.
|
|
|
|
|
*/
|
|
|
|
|
m_completionAction = new QAction(tr("Trigger Completion"), this);
|
2021-09-10 18:06:26 +02:00
|
|
|
|
2019-11-13 12:09:01 +01:00
|
|
|
Core::Command *command = Core::ActionManager::registerAction(
|
|
|
|
|
m_completionAction, TextEditor::Constants::COMPLETE_THIS, context);
|
|
|
|
|
command->setDefaultKeySequence(QKeySequence(
|
|
|
|
|
Core::useMacShortcuts
|
|
|
|
|
? tr("Meta+Space")
|
|
|
|
|
: tr("Ctrl+Space")));
|
|
|
|
|
|
|
|
|
|
connect(m_completionAction, &QAction::triggered, [this]() {
|
|
|
|
|
invokeAssist(TextEditor::Completion);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BindingEditorWidget::~BindingEditorWidget()
|
|
|
|
|
{
|
|
|
|
|
unregisterAutoCompletion();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BindingEditorWidget::unregisterAutoCompletion()
|
|
|
|
|
{
|
|
|
|
|
if (m_completionAction) {
|
|
|
|
|
Core::ActionManager::unregisterAction(m_completionAction, TextEditor::Constants::COMPLETE_THIS);
|
|
|
|
|
delete m_completionAction;
|
|
|
|
|
m_completionAction = nullptr;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool BindingEditorWidget::event(QEvent *event)
|
|
|
|
|
{
|
|
|
|
|
if (event->type() == QEvent::KeyPress) {
|
|
|
|
|
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
|
2021-09-10 18:06:26 +02:00
|
|
|
if ((keyEvent->key() == Qt::Key_Return || keyEvent->key() == Qt::Key_Enter) && !keyEvent->modifiers()) {
|
2019-11-13 12:09:01 +01:00
|
|
|
emit returnKeyClicked();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return QmlJSEditor::QmlJSEditorWidget::event(event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TextEditor::AssistInterface *BindingEditorWidget::createAssistInterface(
|
2022-07-07 18:04:18 +02:00
|
|
|
[[maybe_unused]] TextEditor::AssistKind assistKind, TextEditor::AssistReason assistReason) const
|
2019-11-13 12:09:01 +01:00
|
|
|
{
|
|
|
|
|
return new QmlJSEditor::QmlJSCompletionAssistInterface(
|
2022-05-13 10:05:45 +02:00
|
|
|
textCursor(), Utils::FilePath(),
|
2019-11-13 12:09:01 +01:00
|
|
|
assistReason, qmljsdocument->semanticInfo());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BindingDocument::BindingDocument()
|
|
|
|
|
: QmlJSEditor::QmlJSEditorDocument(BINDINGEDITOR_CONTEXT_ID)
|
|
|
|
|
, m_semanticHighlighter(new QmlJSEditor::SemanticHighlighter(this))
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BindingDocument::~BindingDocument()
|
|
|
|
|
{
|
|
|
|
|
delete m_semanticHighlighter;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BindingDocument::applyFontSettings()
|
|
|
|
|
{
|
|
|
|
|
TextDocument::applyFontSettings();
|
|
|
|
|
m_semanticHighlighter->updateFontSettings(fontSettings());
|
|
|
|
|
if (!isSemanticInfoOutdated())
|
|
|
|
|
m_semanticHighlighter->rerun(semanticInfo());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BindingDocument::triggerPendingUpdates()
|
|
|
|
|
{
|
|
|
|
|
TextDocument::triggerPendingUpdates(); // calls applyFontSettings if necessary
|
|
|
|
|
if (!isSemanticInfoOutdated())
|
|
|
|
|
m_semanticHighlighter->rerun(semanticInfo());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BindingEditorFactory::BindingEditorFactory()
|
|
|
|
|
{
|
|
|
|
|
setId(BINDINGEDITOR_CONTEXT_ID);
|
2021-09-10 18:06:26 +02:00
|
|
|
setDisplayName(QCoreApplication::translate("OpenWith::Editors", BINDINGEDITOR_CONTEXT_ID));
|
2020-06-22 11:45:14 +02:00
|
|
|
setEditorActionHandlers(0);
|
2021-09-10 18:06:26 +02:00
|
|
|
addMimeType(BINDINGEDITOR_CONTEXT_ID);
|
|
|
|
|
addMimeType(QmlJSTools::Constants::QML_MIMETYPE);
|
|
|
|
|
addMimeType(QmlJSTools::Constants::QMLTYPES_MIMETYPE);
|
|
|
|
|
addMimeType(QmlJSTools::Constants::JS_MIMETYPE);
|
2019-11-13 12:09:01 +01:00
|
|
|
|
|
|
|
|
setDocumentCreator([]() { return new BindingDocument; });
|
|
|
|
|
setEditorWidgetCreator([]() { return new BindingEditorWidget; });
|
|
|
|
|
setEditorCreator([]() { return new QmlJSEditor::QmlJSEditor; });
|
|
|
|
|
setAutoCompleterCreator([]() { return new QmlJSEditor::AutoCompleter; });
|
|
|
|
|
setCommentDefinition(Utils::CommentDefinition::CppStyle);
|
|
|
|
|
setParenthesesMatchingEnabled(true);
|
|
|
|
|
setCodeFoldingSupported(true);
|
|
|
|
|
|
|
|
|
|
addHoverHandler(new QmlJSEditor::QmlJSHoverHandler);
|
|
|
|
|
setCompletionAssistProvider(new QmlJSEditor::QmlJSCompletionAssistProvider);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void BindingEditorFactory::decorateEditor(TextEditor::TextEditorWidget *editor)
|
|
|
|
|
{
|
|
|
|
|
editor->textDocument()->setSyntaxHighlighter(new QmlJSEditor::QmlJSHighlighter);
|
|
|
|
|
editor->textDocument()->setIndenter(new QmlJSEditor::Internal::Indenter(
|
|
|
|
|
editor->textDocument()->document()));
|
|
|
|
|
editor->setAutoCompleter(new QmlJSEditor::AutoCompleter);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // QmlDesigner namespace
|