diff options
author | Ansgar Radermacher | 2015-10-23 12:34:57 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2015-11-06 15:51:31 +0000 |
commit | df9e84a5455e1a7c750f6618dc6881d87a497390 (patch) | |
tree | 857bc9667134e0d14d52d4aa636b4c0299711087 /plugins | |
parent | efbbd8cca60713d73019744381df9d477a3f814f (diff) | |
download | org.eclipse.papyrus-df9e84a5455e1a7c750f6618dc6881d87a497390.tar.gz org.eclipse.papyrus-df9e84a5455e1a7c750f6618dc6881d87a497390.tar.xz org.eclipse.papyrus-df9e84a5455e1a7c750f6618dc6881d87a497390.zip |
480511 - [ServiceEdit] Enhance utility functions
Change-Id: I5edd3f05abc5402fc0a941402323a3af37f9a1a7
Diffstat (limited to 'plugins')
4 files changed, 131 insertions, 57 deletions
diff --git a/plugins/infra/org.eclipse.papyrus.infra.newchild/src/org/eclipse/papyrus/infra/newchild/CreationMenuFactory.java b/plugins/infra/org.eclipse.papyrus.infra.newchild/src/org/eclipse/papyrus/infra/newchild/CreationMenuFactory.java index be072a00c2b..7f61e14c5e0 100644 --- a/plugins/infra/org.eclipse.papyrus.infra.newchild/src/org/eclipse/papyrus/infra/newchild/CreationMenuFactory.java +++ b/plugins/infra/org.eclipse.papyrus.infra.newchild/src/org/eclipse/papyrus/infra/newchild/CreationMenuFactory.java @@ -16,12 +16,9 @@ package org.eclipse.papyrus.infra.newchild; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; import java.util.Map; -import org.eclipse.core.commands.ExecutionException; -import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.UnexecutableCommand; import org.eclipse.emf.common.util.EList; @@ -30,29 +27,22 @@ import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; -import org.eclipse.emf.transaction.RollbackException; -import org.eclipse.emf.transaction.Transaction; import org.eclipse.emf.transaction.TransactionalEditingDomain; -import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain; import org.eclipse.gmf.runtime.common.core.command.ICommand; import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry; import org.eclipse.gmf.runtime.emf.type.core.IElementType; import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest; import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest; -import org.eclipse.gmf.runtime.emf.type.core.requests.GetEditContextRequest; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ILabelProvider; -import org.eclipse.papyrus.infra.core.services.ServiceException; import org.eclipse.papyrus.infra.emf.utils.EMFHelper; import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject; import org.eclipse.papyrus.infra.filters.Filter; import org.eclipse.papyrus.infra.newchild.elementcreationmenumodel.CreateRelationshipMenu; import org.eclipse.papyrus.infra.newchild.elementcreationmenumodel.CreationMenu; import org.eclipse.papyrus.infra.newchild.elementcreationmenumodel.Folder; -import org.eclipse.papyrus.infra.services.edit.internal.context.TypeContext; import org.eclipse.papyrus.infra.services.edit.service.ElementEditServiceUtils; import org.eclipse.papyrus.infra.services.edit.service.IElementEditService; -import org.eclipse.papyrus.infra.services.edit.utils.IRequestCacheEntries; import org.eclipse.papyrus.infra.services.edit.utils.RequestCacheEntries; import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService; import org.eclipse.papyrus.infra.widgets.editors.TreeSelectorDialog; @@ -180,55 +170,12 @@ public class CreationMenuFactory { */ protected boolean constructMenu(EObject selectedObject, Menu menu, CreationMenu currentCreationMenu, Map<?, ?> adviceCache) { // find the destination owner - GetEditContextRequest editContextRequest = new GetEditContextRequest(editingDomain, buildRequest(null, selectedObject, currentCreationMenu, adviceCache), selectedObject); - - editContextRequest.setParameter(IRequestCacheEntries.Cache_Maps, adviceCache); - editContextRequest.setEditContext(selectedObject); - try { - editContextRequest.setClientContext(TypeContext.getContext()); - } catch (ServiceException e) { - Activator.log.error(e); + final EObject target = ElementEditServiceUtils.getTargetFromContext(editingDomain, selectedObject, + buildRequest(null, selectedObject, currentCreationMenu, adviceCache)); + if (target == null) { return false; } - IElementEditService provider = ElementEditServiceUtils.getCommandProvider(selectedObject); - if (provider == null) { - return false; - } - - EObject target = selectedObject; - Object result = null; - final ICommand getEditContextCommand = provider.getEditCommand(editContextRequest); - if (getEditContextCommand != null) { - IStatus status = null; - try { - // this command could run in an unprotected transaction, it is not supposed to modify the model - InternalTransactionalEditingDomain domain = (InternalTransactionalEditingDomain) editingDomain; - Map<String, Object> options = new HashMap<String, Object>(); - options.put(Transaction.OPTION_NO_NOTIFICATIONS, true); - options.put(Transaction.OPTION_NO_VALIDATION, true); - options.put(Transaction.OPTION_NO_TRIGGERS, true); - Transaction transaction = domain.startTransaction(false, options); - try { - status = getEditContextCommand.execute(null, null); - } finally { - transaction.commit(); - } - } catch (InterruptedException e) { - Activator.log.error(e); - } catch (ExecutionException e) { - Activator.log.error(e); - } catch (RollbackException e) { - Activator.log.error(e); - } - if (!(status == null || !status.isOK())) { - result = getEditContextCommand.getCommandResult().getReturnValue(); - } - if (result instanceof EObject) { - target = (EObject) result; - } - } - // find the feature between children and owner ArrayList<EStructuralFeature> possibleEFeatures = getEreferences(target, currentCreationMenu); @@ -273,7 +220,7 @@ public class CreationMenuFactory { } /** - * display an icon from a specified url or from Element type + * display an icon from a specified URL or from Element type * * @param currentCreationMenu * @param item diff --git a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/messages.properties b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/messages.properties index fed94c61004..61324862b68 100644 --- a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/messages.properties +++ b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/messages.properties @@ -9,3 +9,4 @@ ElementEditServiceProvider_NoIElementTypeFound=No IElementType bound to Papyrus ElementEditServiceUtils_UnableToFindElementType=Unable to get ElementType edit service for {0}. ElementEditServiceUtils_UnableToFindServiceProvider=Unable to get ElementType edit service provider. +ElementEditServiceUtils_CantGetEditingDomainProvider=Impossible to get the editing domain provider. diff --git a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/messages/Messages.java b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/messages/Messages.java index 19183497ab5..3cdbf69dcaa 100644 --- a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/messages/Messages.java +++ b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/messages/Messages.java @@ -31,6 +31,7 @@ public class Messages extends NLS { public static String ElementEditServiceUtils_UnableToFindElementType;
public static String ElementEditServiceUtils_UnableToFindServiceProvider;
+ public static String ElementEditServiceUtils_CantGetEditingDomainProvider;
static {
NLS.initializeMessages("messages", Messages.class); //$NON-NLS-1$
diff --git a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/service/ElementEditServiceUtils.java b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/service/ElementEditServiceUtils.java index 148b306ec7d..bd7fcfe4eb4 100644 --- a/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/service/ElementEditServiceUtils.java +++ b/plugins/infra/services/org.eclipse.papyrus.infra.services.edit/src/org/eclipse/papyrus/infra/services/edit/service/ElementEditServiceUtils.java @@ -14,13 +14,31 @@ *****************************************************************************/
package org.eclipse.papyrus.infra.services.edit.service;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.RollbackException;
+import org.eclipse.emf.transaction.Transaction;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.emf.transaction.impl.InternalTransactionalEditingDomain;
+import org.eclipse.emf.transaction.util.TransactionUtil;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
import org.eclipse.gmf.runtime.emf.type.core.ElementTypeRegistry;
+import org.eclipse.gmf.runtime.emf.type.core.IHintedType;
+import org.eclipse.gmf.runtime.emf.type.core.requests.CreateElementRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.GetEditContextRequest;
+import org.eclipse.gmf.runtime.emf.type.core.requests.IEditCommandRequest;
import org.eclipse.osgi.util.NLS;
import org.eclipse.papyrus.infra.core.services.ServiceException;
import org.eclipse.papyrus.infra.core.utils.ServiceUtils;
import org.eclipse.papyrus.infra.services.edit.Activator;
import org.eclipse.papyrus.infra.services.edit.internal.ElementEditServiceProvider;
+import org.eclipse.papyrus.infra.services.edit.internal.context.TypeContext;
import org.eclipse.papyrus.infra.services.edit.messages.Messages;
+import org.eclipse.papyrus.infra.services.edit.utils.IRequestCacheEntries;
/**
* <pre>
@@ -104,4 +122,111 @@ public class ElementEditServiceUtils { return ElementEditServiceProvider.getInstance();
}
+ /**
+ * Return a target after executing a passed context request
+ *
+ * @param editingDomain
+ * the editing domain
+ * @param owner
+ * the parent object in which we want to create an element
+ * @param hintedType
+ * The information which element to create.
+ * @return the resulting target object or null in case of a failure
+ */
+ public static EObject getTargetFromContext(TransactionalEditingDomain editingDomain, EObject owner, IEditCommandRequest editRequest) {
+ GetEditContextRequest editContextRequest = new GetEditContextRequest(editingDomain, editRequest, owner);
+
+ editContextRequest.setParameter(IRequestCacheEntries.Cache_Maps, new HashMap<Object, Object>());
+ editContextRequest.setEditContext(owner);
+ try {
+ editContextRequest.setClientContext(TypeContext.getContext());
+ } catch (ServiceException e) {
+ Activator.log.error(e);
+ return null;
+ }
+
+ IElementEditService provider = ElementEditServiceUtils.getCommandProvider(owner);
+ if (provider == null) {
+ Activator.log.debug(Messages.ElementEditServiceUtils_CantGetEditingDomainProvider);
+ return null;
+ }
+
+ EObject target = owner;
+ Object result = null;
+ final ICommand getEditContextCommand = provider.getEditCommand(editContextRequest);
+ if (getEditContextCommand != null) {
+ IStatus status = null;
+ try {
+ // this command could run in an unprotected transaction, it is not supposed to modify the model
+ InternalTransactionalEditingDomain domain = (InternalTransactionalEditingDomain) editingDomain;
+ Map<String, Object> options = new HashMap<String, Object>();
+ options.put(Transaction.OPTION_NO_NOTIFICATIONS, true);
+ options.put(Transaction.OPTION_NO_VALIDATION, true);
+ options.put(Transaction.OPTION_NO_TRIGGERS, true);
+ Transaction transaction = domain.startTransaction(false, options);
+ try {
+ status = getEditContextCommand.execute(null, null);
+ } finally {
+ transaction.commit();
+ }
+ } catch (InterruptedException e) {
+ Activator.log.error(e);
+ } catch (ExecutionException e) {
+ Activator.log.error(e);
+ } catch (RollbackException e) {
+ Activator.log.error(e);
+ }
+ if (status != null && status.isOK()) {
+ result = getEditContextCommand.getCommandResult().getReturnValue();
+ }
+ if (result instanceof EObject) {
+ target = (EObject) result;
+ }
+ }
+ return target;
+ }
+
+ /**
+ * Convenience function that determines editing domain automatically.
+ *
+ * @see {@link #getTargetFromContext(TransactionalEditingDomain, EObject, IEditCommandRequest)}
+ */
+ public static EObject getTargetFromContext(EObject owner, IEditCommandRequest editRequest) {
+ return getTargetFromContext(TransactionUtil.getEditingDomain(owner), owner, editRequest);
+
+ }
+
+ /**
+ * Support creation of a child within another object with a (default) context
+ *
+ * @param editingDomain
+ * the editing domain
+ * @param owner
+ * the parent object in which we want to create an element
+ * @param hintedType
+ * The information which element to create.
+ * @return a GMF command that will create child
+ */
+ public static ICommand getCreateChildCommandWithContext(TransactionalEditingDomain editingDomain, EObject owner, IHintedType hintedType) {
+ TransactionalEditingDomain transactionalEditingDomain = TransactionUtil.getEditingDomain(owner);
+ final EObject target = getTargetFromContext(transactionalEditingDomain, owner,
+ new CreateElementRequest(transactionalEditingDomain, owner, hintedType));
+
+ IElementEditService provider = ElementEditServiceUtils.getCommandProvider(target);
+ if (provider == null) {
+ return org.eclipse.gmf.runtime.common.core.command.UnexecutableCommand.INSTANCE;
+ }
+
+ ICommand createGMFCommand = provider.getEditCommand(new CreateElementRequest(transactionalEditingDomain, target, hintedType));
+ return createGMFCommand;
+ }
+
+ /**
+ * Convenience function that determines editing domain automatically
+ *
+ * @see {@link #getCreateChildCommandWithContext(TransactionalEditingDomain, EObject, IHintedType)}
+ */
+ public static ICommand getCreateChildCommandWithContext(EObject owner, IHintedType hintedType) {
+ return getCreateChildCommandWithContext(TransactionUtil.getEditingDomain(owner), owner, hintedType);
+ }
}
|