diff --git a/src/plugins/qmljseditor/quicktoolbar.cpp b/src/plugins/qmljseditor/quicktoolbar.cpp index 94c9b29477ac1e8863bf58cc4997360cf2a01362..0d02edff365ac9545ab901301be216442acab41f 100644 --- a/src/plugins/qmljseditor/quicktoolbar.cpp +++ b/src/plugins/qmljseditor/quicktoolbar.cpp @@ -12,6 +12,7 @@ #include <qmljs/qmljsinterpreter.h> #include <qmljs/qmljsbind.h> #include <qmljs/qmljsscopebuilder.h> +#include <qmljs/qmljsevaluate.h> #include <texteditor/basetexteditor.h> #include <texteditor/tabsettings.h> #include <coreplugin/icore.h> @@ -31,6 +32,34 @@ static inline QString textAt(const Document* doc, return doc->source().mid(from.offset, to.end() - from.begin()); } +static inline const Interpreter::ObjectValue * getPropertyChangesTarget(Node *node, LookupContext::Ptr lookupContext) +{ + UiObjectInitializer *initializer = 0; + if (UiObjectDefinition *definition = cast<UiObjectDefinition *>(node)) + initializer = definition->initializer; + if (UiObjectBinding *binding = cast<UiObjectBinding *>(node)) + initializer = binding->initializer; + if (initializer) { + for (UiObjectMemberList *members = initializer->members; members; members = members->next) { + if (UiScriptBinding *scriptBinding = cast<UiScriptBinding *>(members->member)) { + if (scriptBinding->qualifiedId + && scriptBinding->qualifiedId->name->asString() == QLatin1String("target") + && ! scriptBinding->qualifiedId->next) { + if (ExpressionStatement *expressionStatement = cast<ExpressionStatement *>(scriptBinding->statement)) { + Evaluate evaluator(lookupContext->context()); + const Interpreter::Value *targetValue = evaluator(expressionStatement->expression); + if (const Interpreter::ObjectValue *targetObject = Interpreter::value_cast<const Interpreter::ObjectValue *>(targetValue)) { + return targetObject; + } else { + return 0; + } + } + } + } + } + } +} + QuickToolBar::QuickToolBar(QObject *parent) : ::QmlJS::IContextPane(parent), m_blockWriting(false) { m_node = 0; @@ -92,6 +121,15 @@ void QuickToolBar::apply(TextEditor::BaseTextEditorEditable *editor, Document::P scopeObject = scopeObject->prototype(lookupContext->context()); } + if (prototypes.contains("PropertyChanges")) { + const Interpreter::ObjectValue *targetObject = getPropertyChangesTarget(node, lookupContext); + prototypes.clear(); + while (targetObject) { + prototypes.append(targetObject->className()); + targetObject = targetObject->prototype(lookupContext->context()); + } + } + setEnabled(doc->isParsedCorrectly()); m_editor = editor; contextWidget()->setParent(editor->widget()->parentWidget()); @@ -190,6 +228,15 @@ bool QuickToolBar::isAvailable(TextEditor::BaseTextEditorEditable *, Document::P scopeObject = scopeObject->prototype(lookupContext->context()); } + if (prototypes.contains("PropertyChanges")) { + const Interpreter::ObjectValue *targetObject = getPropertyChangesTarget(node, lookupContext); + prototypes.clear(); + while (targetObject) { + prototypes.append(targetObject->className()); + targetObject = targetObject->prototype(lookupContext->context()); + } + } + if (prototypes.contains("Rectangle") || prototypes.contains("Image") || prototypes.contains("BorderImage") ||