diff options
author | Thomas Schindl | 2011-03-08 23:22:13 +0000 |
---|---|---|
committer | Thomas Schindl | 2011-03-08 23:22:13 +0000 |
commit | d19a5464bcdf0ff4564204f894d90a39bc2feb7b (patch) | |
tree | d6b711b9475d39a2d11d5f1dbcd6a57732c9ad87 | |
parent | 707a4f23b74b418ee201d48bed0b41c1c4082e2b (diff) | |
download | org.eclipse.e4.tools-d19a5464bcdf0ff4564204f894d90a39bc2feb7b.tar.gz org.eclipse.e4.tools-d19a5464bcdf0ff4564204f894d90a39bc2feb7b.tar.xz org.eclipse.e4.tools-d19a5464bcdf0ff4564204f894d90a39bc2feb7b.zip |
Bug 339299 - [ModelTooling] Add scripting support
11 files changed, 266 insertions, 6 deletions
diff --git a/bundles/org.eclipse.e4.tools.emf.liveeditor/META-INF/MANIFEST.MF b/bundles/org.eclipse.e4.tools.emf.liveeditor/META-INF/MANIFEST.MF index e4b46dae..c47a7ff2 100644 --- a/bundles/org.eclipse.e4.tools.emf.liveeditor/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.e4.tools.emf.liveeditor/META-INF/MANIFEST.MF @@ -17,7 +17,8 @@ Require-Bundle: javax.inject;bundle-version="1.0.0", org.eclipse.e4.core.contexts;bundle-version="0.9.0", org.eclipse.e4.core.di;bundle-version="0.9.0", org.eclipse.jface;bundle-version="3.6.0", - org.eclipse.equinox.registry;bundle-version="3.5.0" + org.eclipse.equinox.registry;bundle-version="3.5.0", + org.mozilla.javascript;bundle-version="1.7.2" Bundle-Vendor: %Bundle-Vendor Service-Component: OSGI-INF/extensionlookup.xml Bundle-ActivationPolicy: lazy diff --git a/bundles/org.eclipse.e4.tools.emf.liveeditor/plugin.xml b/bundles/org.eclipse.e4.tools.emf.liveeditor/plugin.xml index 5e6b541b..27419445 100644 --- a/bundles/org.eclipse.e4.tools.emf.liveeditor/plugin.xml +++ b/bundles/org.eclipse.e4.tools.emf.liveeditor/plugin.xml @@ -9,5 +9,12 @@ class="org.eclipse.e4.tools.emf.liveeditor.ModelProcessor"> </processor> </extension> + <extension + point="org.eclipse.e4.tools.emf.ui.scripting"> + <scripting + class="org.eclipse.e4.tools.emf.liveeditor.JavaScriptSupport" + label="JavaScript"> + </scripting> + </extension> </plugin> diff --git a/bundles/org.eclipse.e4.tools.emf.liveeditor/src/org/eclipse/e4/tools/emf/liveeditor/JavaScriptSupport.java b/bundles/org.eclipse.e4.tools.emf.liveeditor/src/org/eclipse/e4/tools/emf/liveeditor/JavaScriptSupport.java new file mode 100644 index 00000000..70c23d42 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.liveeditor/src/org/eclipse/e4/tools/emf/liveeditor/JavaScriptSupport.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2011 BestSolution.at and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation + ******************************************************************************/ +package org.eclipse.e4.tools.emf.liveeditor; + +import java.util.Map; + +import org.eclipse.e4.tools.emf.ui.common.IScriptingSupport; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.TitleAreaDialog; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.mozilla.javascript.Context; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.ScriptableObject; + +public class JavaScriptSupport implements IScriptingSupport { + private String script; + + public void openEditor(Shell shell, final Object mainElement, final Map<String, Object> additionalData) { + TitleAreaDialog dialog = new TitleAreaDialog(shell) { + private Text scriptField; + + @Override + protected Control createDialogArea(Composite parent) { + Composite container = (Composite) super.createDialogArea(parent); + getShell().setText("Execute JavaScript"); + setTitle("Execute JavaScript"); + setMessage("Enter some JavaScript and execute it"); + scriptField = new Text(container, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL); + scriptField.setLayoutData(new GridData(GridData.FILL_BOTH)); + return container; + } + + @Override + protected void okPressed() { + execute(mainElement, additionalData, scriptField.getText()); + } + + @Override + protected Button createButton(Composite parent, int id, + String label, boolean defaultButton) { + return super.createButton(parent, id, id == IDialogConstants.OK_ID ? "Execute" : label, defaultButton); + } + }; + + dialog.open(); + } + + private void execute(Object mainElement, Map<String, Object> additionalData, String script) { + Context cx = Context.enter(); + Scriptable sc = cx.initStandardObjects(); + + ScriptableObject.putProperty(sc, "mainObject", mainElement); + ScriptableObject.putProperty(sc, "additionalData", additionalData); + cx.evaluateString(sc, script, "<cmd>", 1, null); + } +} diff --git a/bundles/org.eclipse.e4.tools.emf.ui/build.properties b/bundles/org.eclipse.e4.tools.emf.ui/build.properties index b51da184..e0bc7106 100644 --- a/bundles/org.eclipse.e4.tools.emf.ui/build.properties +++ b/bundles/org.eclipse.e4.tools.emf.ui/build.properties @@ -5,8 +5,7 @@ bin.includes = .,\ about.html,\ plugin.xml,\ css/,\ - OSGI-INF/,\ - OSGI-INF/resourceprovider.xml + OSGI-INF/ output.. = bin/ jars.compile.order = . source.. = src/ diff --git a/bundles/org.eclipse.e4.tools.emf.ui/plugin.xml b/bundles/org.eclipse.e4.tools.emf.ui/plugin.xml index b532b6c1..e01f13b9 100644 --- a/bundles/org.eclipse.e4.tools.emf.ui/plugin.xml +++ b/bundles/org.eclipse.e4.tools.emf.ui/plugin.xml @@ -2,6 +2,7 @@ <?eclipse version="3.4"?> <plugin> <extension-point id="org.eclipse.e4.tools.emf.ui.editors" name="%extension-point.name" schema="schema/org.eclipse.e4.tools.emf.ui.editors.exsd"/> + <extension-point id="org.eclipse.e4.tools.emf.ui.scripting" name="Scripting" schema="schema/org.eclipse.e4.tools.emf.ui.scripting.exsd"/> <extension point="org.eclipse.e4.ui.css.swt.theme"> <stylesheet diff --git a/bundles/org.eclipse.e4.tools.emf.ui/schema/org.eclipse.e4.tools.emf.ui.scripting.exsd b/bundles/org.eclipse.e4.tools.emf.ui/schema/org.eclipse.e4.tools.emf.ui.scripting.exsd new file mode 100644 index 00000000..9d8b4e5a --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/schema/org.eclipse.e4.tools.emf.ui.scripting.exsd @@ -0,0 +1,112 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!-- Schema file written by PDE --> +<schema targetNamespace="org.eclipse.e4.tools.emf.ui" xmlns="http://www.w3.org/2001/XMLSchema"> +<annotation> + <appinfo> + <meta.schema plugin="org.eclipse.e4.tools.emf.ui" id="org.eclipse.e4.tools.emf.ui.scripting" name="Scripting"/> + </appinfo> + <documentation> + [Enter description of this extension point.] + </documentation> + </annotation> + + <element name="extension"> + <annotation> + <appinfo> + <meta.element /> + </appinfo> + </annotation> + <complexType> + <sequence> + <element ref="scripting" minOccurs="1" maxOccurs="unbounded"/> + </sequence> + <attribute name="point" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="id" type="string"> + <annotation> + <documentation> + + </documentation> + </annotation> + </attribute> + <attribute name="name" type="string"> + <annotation> + <documentation> + + </documentation> + <appinfo> + <meta.attribute translatable="true"/> + </appinfo> + </annotation> + </attribute> + </complexType> + </element> + + <element name="scripting"> + <complexType> + <attribute name="label" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + <appinfo> + <meta.attribute translatable="true"/> + </appinfo> + </annotation> + </attribute> + <attribute name="class" type="string" use="required"> + <annotation> + <documentation> + + </documentation> + <appinfo> + <meta.attribute kind="java" basedOn=":org.eclipse.e4.tools.emf.ui.common.IScriptingSupport"/> + </appinfo> + </annotation> + </attribute> + </complexType> + </element> + + <annotation> + <appinfo> + <meta.section type="since"/> + </appinfo> + <documentation> + [Enter the first release in which this extension point appears.] + </documentation> + </annotation> + + <annotation> + <appinfo> + <meta.section type="examples"/> + </appinfo> + <documentation> + [Enter extension point usage example here.] + </documentation> + </annotation> + + <annotation> + <appinfo> + <meta.section type="apiinfo"/> + </appinfo> + <documentation> + [Enter API information here.] + </documentation> + </annotation> + + <annotation> + <appinfo> + <meta.section type="implementation"/> + </appinfo> + <documentation> + [Enter information about supplied implementation of this extension point.] + </documentation> + </annotation> + + +</schema> diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/IScriptingSupport.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/IScriptingSupport.java new file mode 100644 index 00000000..ef2a0714 --- /dev/null +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/common/IScriptingSupport.java @@ -0,0 +1,8 @@ +package org.eclipse.e4.tools.emf.ui.common; + +import java.util.Map; +import org.eclipse.swt.widgets.Shell; + +public interface IScriptingSupport { + public void openEditor(Shell shell, Object scope, Map<String, Object> additionalData); +} diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.java index 7074aa2d..0dd425e4 100644 --- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.java +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.java @@ -599,5 +599,6 @@ public class Messages { public String ObjectViewer_Tooltip_Value; public String ObjectViewer_Tooltip_InjectionKey; + public String ObjectViewer_Script; }
\ No newline at end of file diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.properties b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.properties index cc70fd53..a26f112b 100644 --- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.properties +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.properties @@ -596,4 +596,5 @@ ExternalizeStringHandler_Dialog_DialogTitle=Externalize Strings ExternalizeStringHandler_Dialog_DialogMessage=Externalizing manifest files extracts translatable strings and stores them in a properties file for multi-language support. ObjectViewer_Tooltip_Value=Value -ObjectViewer_Tooltip_InjectionKey=Injection key
\ No newline at end of file +ObjectViewer_Tooltip_InjectionKey=Injection key +ObjectViewer_Script=Execute Script
\ No newline at end of file diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/objectdata/JavaAttribute.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/objectdata/JavaAttribute.java index 5a0c9a7e..b47d1e83 100644 --- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/objectdata/JavaAttribute.java +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/objectdata/JavaAttribute.java @@ -138,7 +138,7 @@ public class JavaAttribute { return ""; //$NON-NLS-1$ } - private Object getFieldValue() { + public Object getFieldValue() { try { return field.get(object.getInstance()); } catch (IllegalArgumentException e) { diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/objectdata/ObjectViewer.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/objectdata/ObjectViewer.java index 970021db..100b7a73 100644 --- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/objectdata/ObjectViewer.java +++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/objectdata/ObjectViewer.java @@ -2,9 +2,16 @@ package org.eclipse.e4.tools.emf.ui.internal.common.objectdata; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import org.eclipse.core.databinding.observable.value.IObservableValue; import org.eclipse.core.databinding.observable.value.IValueChangeListener; import org.eclipse.core.databinding.observable.value.ValueChangeEvent; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IConfigurationElement; +import org.eclipse.core.runtime.IExtensionPoint; +import org.eclipse.core.runtime.IExtensionRegistry; +import org.eclipse.core.runtime.RegistryFactory; +import org.eclipse.e4.tools.emf.ui.common.IScriptingSupport; import org.eclipse.e4.tools.emf.ui.internal.Messages; import org.eclipse.e4.tools.emf.ui.internal.ResourceProvider; import org.eclipse.e4.tools.emf.ui.internal.common.ModelEditor; @@ -12,8 +19,13 @@ import org.eclipse.e4.tools.services.IResourcePool; import org.eclipse.emf.databinding.EMFProperties; import org.eclipse.emf.databinding.IEMFValueProperty; import org.eclipse.emf.ecore.EStructuralFeature; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IMenuListener; +import org.eclipse.jface.action.IMenuManager; +import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ColumnViewer; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; +import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.StyledCellLabelProvider; import org.eclipse.jface.viewers.StyledString; @@ -30,7 +42,7 @@ import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; public class ObjectViewer { - public TreeViewer createViewer(Composite parent, EStructuralFeature feature, IObservableValue master, IResourcePool resourcePool, Messages messages) { + public TreeViewer createViewer(Composite parent, EStructuralFeature feature, IObservableValue master, IResourcePool resourcePool, final Messages messages) { final TreeViewer viewer = new TreeViewer(parent); viewer.setContentProvider(new ContentProviderImpl()); viewer.setLabelProvider(new LabelProviderImpl(resourcePool)); @@ -48,6 +60,54 @@ public class ObjectViewer { } } }); + + IExtensionRegistry registry = RegistryFactory.getRegistry(); + IExtensionPoint extPoint = registry.getExtensionPoint("org.eclipse.e4.tools.emf.ui.scripting"); //$NON-NLS-1$ + final IConfigurationElement[] elements = extPoint.getConfigurationElements(); + + if (elements.length > 0) { + final MenuManager mgr = new MenuManager(); + mgr.setRemoveAllWhenShown(true); + mgr.addMenuListener(new IMenuListener() { + + public void menuAboutToShow(IMenuManager manager) { + if (viewer.getSelection().isEmpty()) { + return; + } + + MenuManager scriptExecute = new MenuManager(messages.ObjectViewer_Script); + mgr.add(scriptExecute); + for (IConfigurationElement e : elements) { + final IConfigurationElement le = e; + scriptExecute.add(new Action(e.getAttribute("label")) { //$NON-NLS-1$ + @Override + public void run() { + try { + IScriptingSupport support = (IScriptingSupport) le.createExecutableExtension("class"); //$NON-NLS-1$ + Object o = ((IStructuredSelection) viewer.getSelection()).getFirstElement(); + Object mainObject = null; + if (o instanceof JavaObject) { + mainObject = ((JavaObject) o).getInstance(); + } else if (o instanceof JavaAttribute) { + mainObject = ((JavaAttribute) o).getFieldValue(); + } + + if (mainObject != null) { + support.openEditor(viewer.getControl().getShell(), mainObject, new HashMap<String, Object>()); + } + } catch (CoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + }); + } + } + }); + + viewer.getControl().setMenu(mgr.createContextMenu(viewer.getControl())); + } + new TooltipSupportImpl(viewer, ToolTip.NO_RECREATE, false, resourcePool, messages); return viewer; } |