diff options
| author | Pierre-Charles David | 2016-12-09 10:21:51 +0000 |
|---|---|---|
| committer | Pierre-Charles David | 2016-12-13 14:29:41 +0000 |
| commit | c1ea05fc2a00427bc131caee60afaf9a8c5aeee5 (patch) | |
| tree | 8232c62d2967b4817c26bb40dcf39451635dc2f8 | |
| parent | 1c03813ad2920abf425991eee338706b679482fd (diff) | |
| download | org.eclipse.sirius-c1ea05fc2a00427bc131caee60afaf9a8c5aeee5.tar.gz org.eclipse.sirius-c1ea05fc2a00427bc131caee60afaf9a8c5aeee5.tar.xz org.eclipse.sirius-c1ea05fc2a00427bc131caee60afaf9a8c5aeee5.zip | |
[508968] Support custom EditingContextAdapter implementations
Bug: 508968
Change-Id: I15d7550d7de368f9019dbc7162fcc061afe7e11d
Signed-off-by: Pierre-Charles David <pierre-charles.david@obeo.fr>
6 files changed, 217 insertions, 2 deletions
diff --git a/plugins/org.eclipse.sirius.ui.properties/plugin.properties b/plugins/org.eclipse.sirius.ui.properties/plugin.properties index 6207c6066a..ca39cba877 100644 --- a/plugins/org.eclipse.sirius.ui.properties/plugin.properties +++ b/plugins/org.eclipse.sirius.ui.properties/plugin.properties @@ -14,6 +14,7 @@ providerName = Eclipse Modeling Project descriptionConverterExtensionPoint.Name=Description Converter descriptionLinkResolverExtensionPoint.Name=Description Link Resolver +contextAdapterProviderExtensionPoint.Name=Editing Context Adapter Provider siriusTabDescriptorProvider.Label=Sirius EEF Tab Descriptor Provider siriusTabDescriptorProvider.Description=Provides EEF tab descriptors according to what is defined in the view properties extension diff --git a/plugins/org.eclipse.sirius.ui.properties/plugin.xml b/plugins/org.eclipse.sirius.ui.properties/plugin.xml index eae1f1f7fd..6883cc1621 100644 --- a/plugins/org.eclipse.sirius.ui.properties/plugin.xml +++ b/plugins/org.eclipse.sirius.ui.properties/plugin.xml @@ -14,6 +14,7 @@ <plugin> <extension-point id="descriptionConverter" name="%descriptionConverterExtensionPoint.Name" schema="schema/descriptionConverter.exsd"/> <extension-point id="descriptionLinkResolver" name="%descriptionLinkResolverExtensionPoint.Name" schema="schema/descriptionLinkResolver.exsd"/> + <extension-point id="contextAdapterProvider" name="%contextAdapterProviderExtensionPoint.Name" schema="schema/contextAdapterProvider.exsd"/> <extension point="org.eclipse.core.runtime.adapters"> <factory adaptableType="org.eclipse.gef.GraphicalEditPart" class="org.eclipse.sirius.ui.properties.internal.SiriusInputAdapter"> diff --git a/plugins/org.eclipse.sirius.ui.properties/schema/contextAdapterProvider.exsd b/plugins/org.eclipse.sirius.ui.properties/schema/contextAdapterProvider.exsd new file mode 100644 index 0000000000..cf2067351c --- /dev/null +++ b/plugins/org.eclipse.sirius.ui.properties/schema/contextAdapterProvider.exsd @@ -0,0 +1,130 @@ +<?xml version='1.0' encoding='UTF-8'?> +<!-- Schema file written by PDE --> +<schema targetNamespace="org.eclipse.sirius.ui.properties" xmlns="http://www.w3.org/2001/XMLSchema"> +<annotation> + <appinfo> + <meta.schema plugin="org.eclipse.sirius.ui.properties" id="contextAdapterProvider" name="contextAdapterProvider"/> + </appinfo> + <documentation> + This extension points allows to provide a custom implementation of the <code>org.eclipse.eef.core.api.EditingContextAdapter</code> to use for runtime coordination between the EEF runtime which manages the properties views and the Sirius session. + </documentation> + </annotation> + + <element name="extension"> + <annotation> + <appinfo> + <meta.element /> + </appinfo> + </annotation> + <complexType> + <sequence> + <element ref="descriptor"/> + </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> + </annotation> + </attribute> + </complexType> + </element> + + <element name="descriptor"> + <complexType> + <attribute name="id" type="string"> + <annotation> + <documentation> + The identifier of the contribution. + </documentation> + </annotation> + </attribute> + <attribute name="label" type="string"> + <annotation> + <documentation> + The label of the provider, this information may be used in the user interface and as such it may be visible by the end user. It should be internationalized if possible. + </documentation> + <appinfo> + <meta.attribute translatable="true"/> + </appinfo> + </annotation> + </attribute> + <attribute name="description" type="string"> + <annotation> + <documentation> + The description of the provider, this information may be used in the user interface and as such it may be visible by the end user. It should be internationalized if possible. + </documentation> + <appinfo> + <meta.attribute translatable="true"/> + </appinfo> + </annotation> + </attribute> + <attribute name="class" type="string"> + <annotation> + <documentation> + The implementation of the IEditingContextAdapterProvider. + </documentation> + <appinfo> + <meta.attribute kind="java" basedOn=":org.eclipse.sirius.ui.properties.api.IEditingContextAdapterProvider"/> + </appinfo> + </annotation> + </attribute> + </complexType> + </element> + + <annotation> + <appinfo> + <meta.section type="since"/> + </appinfo> + <documentation> + 4.1.3 + </documentation> + </annotation> + + + <annotation> + <appinfo> + <meta.section type="apiinfo"/> + </appinfo> + <documentation> + See <code>org.eclipse.sirius.ui.properties.api.IEditingContextAdapterProvider</code>. + </documentation> + </annotation> + + <annotation> + <appinfo> + <meta.section type="implementation"/> + </appinfo> + <documentation> + None. + </documentation> + </annotation> + + <annotation> + <appinfo> + <meta.section type="copyright"/> + </appinfo> + <documentation> + Copyright (c) 2016 Obeo<br/> +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 +<a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a> + </documentation> + </annotation> + +</schema> diff --git a/plugins/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/api/IEditingContextAdapterProvider.java b/plugins/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/api/IEditingContextAdapterProvider.java new file mode 100644 index 0000000000..83752a4ab5 --- /dev/null +++ b/plugins/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/api/IEditingContextAdapterProvider.java @@ -0,0 +1,33 @@ +/******************************************************************************* + * Copyright (c) 2016 Obeo. + * 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: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.sirius.ui.properties.api; + +import org.eclipse.eef.core.api.EditingContextAdapter; +import org.eclipse.sirius.business.api.session.Session; + +/** + * Delegate the creation of the concrete {@link EditingContextAdapter} to use + * for a given Sirius session. + * + * @author pcdavid + */ +public interface IEditingContextAdapterProvider { + /** + * Creates and return the {@link EditingContextAdapter} to use for the + * specified session. + * + * @param session + * a Sirius session + * @return the {@link EditingContextAdapter}, on <code>null</code> if this + * provider does not handle the given session. + */ + EditingContextAdapter createEditingContextAdapter(Session session); +} diff --git a/plugins/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/SiriusUIPropertiesPlugin.java b/plugins/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/SiriusUIPropertiesPlugin.java index 18d2c643a2..5fd2e863f1 100644 --- a/plugins/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/SiriusUIPropertiesPlugin.java +++ b/plugins/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/SiriusUIPropertiesPlugin.java @@ -18,6 +18,7 @@ import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.eef.EefPackage; import org.eclipse.eef.common.api.AbstractEEFEclipsePlugin; +import org.eclipse.eef.core.api.EditingContextAdapter; import org.eclipse.eef.ide.api.extensions.AbstractRegistryEventListener; import org.eclipse.eef.ide.api.extensions.IItemDescriptor; import org.eclipse.eef.ide.api.extensions.IItemRegistry; @@ -29,10 +30,12 @@ import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; +import org.eclipse.sirius.business.api.session.Session; import org.eclipse.sirius.ui.properties.api.DefaultDescriptionConverter; import org.eclipse.sirius.ui.properties.api.DefaultDescriptionWithInitialOperationConverter; import org.eclipse.sirius.ui.properties.api.IDescriptionConverter; import org.eclipse.sirius.ui.properties.api.IDescriptionLinkResolver; +import org.eclipse.sirius.ui.properties.api.IEditingContextAdapterProvider; import org.eclipse.sirius.ui.properties.internal.tabprovider.PropertiesDescriptionConverterSwitch; import org.eclipse.sirius.ui.properties.internal.tabprovider.PropertyValidationRuleLinkResolver; import org.eclipse.sirius.ui.properties.internal.tabprovider.SemanticValidationRuleDescriptionConverter; @@ -104,6 +107,12 @@ public class SiriusUIPropertiesPlugin extends EMFPlugin { private static final String DESCRIPTION_LINK_RESOLVER_EXTENSION_POINT = "descriptionLinkResolver"; //$NON-NLS-1$ /** + * The name of the extension point for the + * {@link IEditingContextAdapterProvider}. + */ + private static final String CONTEXT_ADAPTER_PROVIDER_EXTENSION_POINT = "contextAdapterProvider"; //$NON-NLS-1$ + + /** * The {@link IItemRegistry} used to retrieve the * {@link IDescriptionConverter}. */ @@ -116,6 +125,12 @@ public class SiriusUIPropertiesPlugin extends EMFPlugin { private IItemRegistry<IDescriptionLinkResolver> descriptionLinkResolverRegistry; /** + * The {@link IItemRegistry} used to retrieve the + * {@link IEditingContextAdapterProvider}. + */ + private IItemRegistry<IEditingContextAdapterProvider> contextAdapterProviderRegistry; + + /** * The extension registry listener for the {@link IDescriptionConverter} * . */ @@ -128,6 +143,12 @@ public class SiriusUIPropertiesPlugin extends EMFPlugin { private AbstractRegistryEventListener descriptionLinkResolverListener; /** + * The extension registry listener for the + * {@link IEditingContextAdapterProvider}. + */ + private AbstractRegistryEventListener contextAdapterProviderListener; + + /** * Storage for preferences. */ private ScopedPreferenceStore preferenceStore; @@ -160,6 +181,11 @@ public class SiriusUIPropertiesPlugin extends EMFPlugin { this.descriptionLinkResolverListener = new DescriptorRegistryEventListener<>(PLUGIN_ID, DESCRIPTION_LINK_RESOLVER_EXTENSION_POINT, this.descriptionLinkResolverRegistry); registry.addListener(this.descriptionLinkResolverListener, PLUGIN_ID + '.' + DESCRIPTION_LINK_RESOLVER_EXTENSION_POINT); this.descriptionLinkResolverListener.readRegistry(registry); + + this.contextAdapterProviderRegistry = new ItemRegistry<>(); + this.contextAdapterProviderListener = new DescriptorRegistryEventListener<>(PLUGIN_ID, CONTEXT_ADAPTER_PROVIDER_EXTENSION_POINT, this.contextAdapterProviderRegistry); + registry.addListener(this.contextAdapterProviderListener, PLUGIN_ID + '.' + CONTEXT_ADAPTER_PROVIDER_EXTENSION_POINT); + this.contextAdapterProviderListener.readRegistry(registry); } @Override @@ -167,11 +193,14 @@ public class SiriusUIPropertiesPlugin extends EMFPlugin { IExtensionRegistry registry = Platform.getExtensionRegistry(); registry.removeListener(this.descriptionConverterListener); registry.removeListener(this.descriptionLinkResolverListener); + registry.removeListener(this.contextAdapterProviderListener); this.descriptionConverterListener = null; this.descriptionConverterRegistry = null; this.descriptionLinkResolverListener = null; this.descriptionLinkResolverRegistry = null; + this.contextAdapterProviderListener = null; + this.contextAdapterProviderRegistry = null; stopPropertiesPreferencesManagement(); @@ -179,6 +208,27 @@ public class SiriusUIPropertiesPlugin extends EMFPlugin { } /** + * Returns the appropriate {@link EditingContextAdapter} to use for the + * specified session, taking registered providers into account. + * + * @param session + * the Sirius session. + * @return the {@link EditingContextAdapter} to use for this session. + */ + public EditingContextAdapter getEditingContextAdapter(Session session) { + for (IItemDescriptor<IEditingContextAdapterProvider> itemDescriptor : this.contextAdapterProviderRegistry.getItemDescriptors()) { + IEditingContextAdapterProvider provider = itemDescriptor.getItem(); + if (provider != null) { + EditingContextAdapter provided = provider.createEditingContextAdapter(session); + if (provided != null) { + return provided; + } + } + } + return new TransactionalEditingDomainContextAdapter(session.getTransactionalEditingDomain()); + } + + /** * Returns the description converter used to create the EEF description * EObject from the given Sirius one. * diff --git a/plugins/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/tabprovider/SiriusTabDescriptorProvider.java b/plugins/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/tabprovider/SiriusTabDescriptorProvider.java index 99150d3e06..9885bc8713 100644 --- a/plugins/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/tabprovider/SiriusTabDescriptorProvider.java +++ b/plugins/org.eclipse.sirius.ui.properties/src/org/eclipse/sirius/ui/properties/internal/tabprovider/SiriusTabDescriptorProvider.java @@ -21,6 +21,7 @@ import org.eclipse.eef.core.api.EEFExpressionUtils; import org.eclipse.eef.core.api.EEFPage; import org.eclipse.eef.core.api.EEFView; import org.eclipse.eef.core.api.EEFViewFactory; +import org.eclipse.eef.core.api.EditingContextAdapter; import org.eclipse.eef.core.api.IEEFDomainClassTester; import org.eclipse.eef.ide.ui.properties.api.EEFTabDescriptor; import org.eclipse.eef.properties.ui.api.IEEFTabDescriptor; @@ -44,7 +45,6 @@ import org.eclipse.sirius.ui.properties.internal.Messages; import org.eclipse.sirius.ui.properties.internal.SiriusInputDescriptor; import org.eclipse.sirius.ui.properties.internal.SiriusInterpreter; import org.eclipse.sirius.ui.properties.internal.SiriusUIPropertiesPlugin; -import org.eclipse.sirius.ui.properties.internal.TransactionalEditingDomainContextAdapter; import org.eclipse.sirius.viewpoint.description.DescriptionPackage; import org.eclipse.sirius.viewpoint.description.Group; import org.eclipse.sirius.viewpoint.description.Viewpoint; @@ -136,7 +136,7 @@ public class SiriusTabDescriptorProvider implements IEEFTabDescriptorProvider { IVariableManager variableManager = new VariableManagerFactory().createVariableManager(); variableManager.put(EEFExpressionUtils.SELF, input.getSemanticElement()); variableManager.put(EEFExpressionUtils.INPUT, input); - TransactionalEditingDomainContextAdapter eca = new TransactionalEditingDomainContextAdapter(session.getTransactionalEditingDomain()); + EditingContextAdapter eca = SiriusUIPropertiesPlugin.getPlugin().getEditingContextAdapter(session); EEFView eefView = new EEFViewFactory().createEEFView(viewDescription, variableManager, new SiriusInterpreter(session), eca, new IEEFDomainClassTester() { @Override public boolean eInstanceOf(EObject eObject, String domainClass) { |
