Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/CustomElementFeatureContainer.java')
-rw-r--r--plugins/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/CustomElementFeatureContainer.java410
1 files changed, 410 insertions, 0 deletions
diff --git a/plugins/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/CustomElementFeatureContainer.java b/plugins/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/CustomElementFeatureContainer.java
new file mode 100644
index 00000000..b58fc659
--- /dev/null
+++ b/plugins/org.eclipse.bpmn2.modeler.core/src/org/eclipse/bpmn2/modeler/core/features/CustomElementFeatureContainer.java
@@ -0,0 +1,410 @@
+/*******************************************************************************
+ * Copyright (c) 2011, 2012 Red Hat, Inc.
+ * All rights reserved.
+ * This program is 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:
+ * Red Hat, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.bpmn2.modeler.core.features;
+
+import org.eclipse.bpmn2.BaseElement;
+import org.eclipse.bpmn2.modeler.core.model.ModelDecorator;
+import org.eclipse.bpmn2.modeler.core.runtime.CustomTaskDescriptor;
+import org.eclipse.bpmn2.modeler.core.runtime.CustomTaskImageProvider;
+import org.eclipse.bpmn2.modeler.core.runtime.TargetRuntime;
+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
+import org.eclipse.bpmn2.modeler.core.features.Messages;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.IExecutionInfo;
+import org.eclipse.graphiti.features.IAddFeature;
+import org.eclipse.graphiti.features.IDeleteFeature;
+import org.eclipse.graphiti.features.IDirectEditingFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.ILayoutFeature;
+import org.eclipse.graphiti.features.IRemoveFeature;
+import org.eclipse.graphiti.features.IUpdateFeature;
+import org.eclipse.graphiti.features.context.IAddContext;
+import org.eclipse.graphiti.features.context.IContext;
+import org.eclipse.graphiti.features.context.ICustomContext;
+import org.eclipse.graphiti.features.context.IPictogramElementContext;
+import org.eclipse.graphiti.features.custom.ICustomFeature;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.algorithms.Image;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+
+/**
+ * The base class for custom shape and connection Feature Containers.
+ */
+public class CustomElementFeatureContainer implements ICustomElementFeatureContainer {
+
+ /** The custom element id. */
+ protected String id;
+
+ /** The custom task descriptor contributed by the extension plug-in. */
+ protected CustomTaskDescriptor customTaskDescriptor;
+
+ /** The feature container delegate. */
+ protected IFeatureContainer featureContainerDelegate = null;
+
+ /** The Feature Provider. */
+ protected IBpmn2FeatureProvider fp;
+
+ /**
+ * Instantiates a new custom element feature container.
+ */
+ public CustomElementFeatureContainer() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.ICustomElementFeatureContainer#getDescription()
+ */
+ public String getDescription() {
+ if (customTaskDescriptor!=null)
+ return customTaskDescriptor.getName();
+ return Messages.CustomElementFeatureContainer_Description;
+ }
+
+ /**
+ * Creates the feature container.
+ *
+ * @param fp the Feature Provider
+ * @return the i feature container
+ */
+ protected IFeatureContainer createFeatureContainer(IFeatureProvider fp) {
+ EClass eClass = (EClass) ModelDecorator.findEClassifier(
+ customTaskDescriptor.getRuntime().getModelDescriptor().getEPackage(), customTaskDescriptor.getType());
+ return ((IBpmn2FeatureProvider)fp).getFeatureContainer(eClass.getInstanceClass());
+ }
+
+ /**
+ * Gets the feature container.
+ *
+ * @param fp the Feature Provider
+ * @return the feature container
+ */
+ protected IFeatureContainer getFeatureContainer(IFeatureProvider fp) {
+ if (featureContainerDelegate==null) {
+ featureContainerDelegate = createFeatureContainer(fp);
+ }
+ return featureContainerDelegate;
+ }
+
+ /* (non-Javadoc)
+ * Determine if the context applies to this modelObject and return the Task object. Return null otherwise.
+ * @param context - the Graphiti context.
+ *
+ * @see org.eclipse.bpmn2.modeler.core.features.BaseElementFeatureContainer#getApplyObject(org.eclipse.graphiti.features.context.IContext)
+ */
+ @Override
+ public Object getApplyObject(IContext context) {
+ Object id = getId(context);
+ if (id==null || !this.id.equals(id)) {
+ return null;
+ }
+
+ if (context instanceof IPictogramElementContext) {
+ PictogramElement pe = ((IPictogramElementContext)context).getPictogramElement();
+ return BusinessObjectUtil.getBusinessObjectForPictogramElement(pe);
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.IFeatureContainer#canApplyTo(java.lang.Object)
+ */
+ @Override
+ public boolean canApplyTo(Object o) {
+ boolean b1 = o instanceof BaseElement;
+ boolean b2 = o.getClass().isAssignableFrom(BaseElement.class);
+ return b1 || b2;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.IFeatureContainer#isAvailable(org.eclipse.graphiti.features.IFeatureProvider)
+ */
+ @Override
+ public boolean isAvailable(IFeatureProvider fp) {
+ return true;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.activity.task.ICustomTaskFeatureContainer#setId(java.lang.String)
+ */
+ @Override
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ /**
+ * Set this modelObject's ID in the given Graphiti context.
+ *
+ * @param context - if this is a IPictogramElementContext, set the property
+ * in the contained PictogramElement's list of properties;
+ * otherwise set the Context's property
+ * @param id - ID of this Custom Task
+ */
+ public static void setId(IContext context, String id) {
+
+ if (context instanceof IPictogramElementContext) {
+ PictogramElement pe = ((IPictogramElementContext)context).getPictogramElement();
+ Graphiti.getPeService().setPropertyValue(pe,GraphitiConstants.CUSTOM_ELEMENT_ID,id);
+ }
+ else {
+ context.putProperty(GraphitiConstants.CUSTOM_ELEMENT_ID, id);
+ }
+ }
+
+ /**
+ * Returns the modelObject ID string from the given Graphiti context.
+ *
+ * @param context the context
+ * @return - ID string for this modelObject.
+ */
+ public static String getId(IContext context) {
+ Object id = null;
+
+ // IAddContext can also mean that a file is dragged, therefore we have
+ // to check if we are really dragging a customTask
+ if (context instanceof IAddContext &&
+ ((IAddContext)context).getNewObject() instanceof EObject ) {
+ EObject object = (EObject) ((IAddContext)context).getNewObject();
+ TargetRuntime rt = TargetRuntime.getCurrentRuntime();
+ for (CustomTaskDescriptor ctd : rt.getCustomTaskDescriptors()) {
+ id = ctd.getFeatureContainer().getId(object);
+ if (ctd.getId().equals(id)) {
+ context.putProperty(GraphitiConstants.CUSTOM_ELEMENT_ID, id);
+ return (String)id;
+ }
+ }
+ }
+
+ if (context instanceof IPictogramElementContext) {
+ PictogramElement pe = ((IPictogramElementContext)context).getPictogramElement();
+ id = Graphiti.getPeService().getPropertyValue(pe,GraphitiConstants.CUSTOM_ELEMENT_ID);
+ }
+ else if (context instanceof ICustomContext) {
+ for (PictogramElement pe : ((ICustomContext)context).getPictogramElements()) {
+ id = Graphiti.getPeService().getPropertyValue(pe,GraphitiConstants.CUSTOM_ELEMENT_ID);
+ if (id!=null)
+ break;
+ }
+ }
+ else {
+ id = context.getProperty(GraphitiConstants.CUSTOM_ELEMENT_ID);
+ }
+ return (String)id;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.ICustomElementFeatureContainer#getId(org.eclipse.emf.ecore.EObject)
+ */
+ public String getId(EObject object) {
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.ui.features.activity.task.ICustomTaskFeatureContainer#getId()
+ */
+ @Override
+ public String getId() {
+ return id;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.ui.features.activity.task.ICustomTaskFeatureContainer#setCustomTaskDescriptor(org.eclipse.bpmn2.modeler.core.preferences.TargetRuntime.CustomTaskDescriptor)
+ */
+ @Override
+ public void setCustomTaskDescriptor(CustomTaskDescriptor customTaskDescriptor) {
+ this.customTaskDescriptor = customTaskDescriptor;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.IFeatureContainer#getAddFeature(org.eclipse.graphiti.features.IFeatureProvider)
+ */
+ @Override
+ public IAddFeature getAddFeature(IFeatureProvider fp) {
+ return new AddCustomElementFeature(fp);
+ }
+
+ /**
+ * The Class AddCustomElementFeature.
+ */
+ public class AddCustomElementFeature extends AbstractBpmn2AddFeature<BaseElement> {
+
+ /** The add feature delegate. */
+ protected AbstractBpmn2AddFeature<BaseElement> addFeatureDelegate;
+
+ /**
+ * Instantiates a new {@code AddFeature} for custom elements.
+ *
+ * @param fp the Feature Provider
+ */
+ public AddCustomElementFeature(IFeatureProvider fp) {
+ super(fp);
+ addFeatureDelegate = (AbstractBpmn2AddFeature)getFeatureContainer(fp).getAddFeature(fp);
+ Assert.isNotNull(addFeatureDelegate);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.graphiti.func.IAdd#add(org.eclipse.graphiti.features.context.IAddContext)
+ */
+ @Override
+ public PictogramElement add(IAddContext context) {
+ PictogramElement pe = addFeatureDelegate.add(context);
+ // make sure everyone knows that this PE is a custom task
+ if (pe!=null)
+ peService.setPropertyValue(pe,GraphitiConstants.CUSTOM_ELEMENT_ID,getId());
+
+ // add an icon to the top-left corner if applicable, and if the implementing
+ // addFeatureDelegate hasn't already done so.
+ String icon = customTaskDescriptor.getIcon();
+ if (icon!=null && pe instanceof ContainerShape) {
+ boolean addImage = true;
+ ContainerShape containerShape = (ContainerShape)pe;
+ GraphicsAlgorithm ga = (GraphicsAlgorithm)AbstractBpmn2AddFeature.getGraphicsAlgorithm(containerShape);
+ for (PictogramElement child : containerShape.getChildren()) {
+ if (child.getGraphicsAlgorithm() instanceof Image) {
+ addImage = false;
+ break;
+ }
+ }
+ if (ga!=null) {
+ for (GraphicsAlgorithm g : ga.getGraphicsAlgorithmChildren()) {
+ if (g instanceof Image) {
+ addImage = false;
+ break;
+ }
+ }
+ }
+ else
+ addImage = false;
+
+ if (addImage) {
+ Image img = CustomTaskImageProvider.createImage(customTaskDescriptor, ga, icon, 24, 24);
+ Graphiti.getGaService().setLocationAndSize(img, 2, 2, 24, 24);
+ }
+ }
+ return pe;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.IBpmn2AddFeature#getBusinessObject(org.eclipse.graphiti.features.context.IAddContext)
+ */
+ @Override
+ public BaseElement getBusinessObject(IAddContext context) {
+ return addFeatureDelegate.getBusinessObject(context);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.IBpmn2AddFeature#putBusinessObject(org.eclipse.graphiti.features.context.IAddContext, org.eclipse.emf.ecore.EObject)
+ */
+ @Override
+ public void putBusinessObject(IAddContext context, BaseElement businessObject) {
+ addFeatureDelegate.putBusinessObject(context, businessObject);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.IBpmn2AddFeature#postExecute(org.eclipse.graphiti.IExecutionInfo)
+ */
+ @Override
+ public void postExecute(IExecutionInfo executionInfo) {
+ addFeatureDelegate.postExecute(executionInfo);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.graphiti.func.IAdd#canAdd(org.eclipse.graphiti.features.context.IAddContext)
+ */
+ @Override
+ public boolean canAdd(IAddContext context) {
+ return addFeatureDelegate.canAdd(context);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.AbstractBpmn2AddFeature#getAddLabelFeature(org.eclipse.graphiti.features.IFeatureProvider)
+ */
+ @Override
+ public IAddFeature getAddLabelFeature(IFeatureProvider fp) {
+ return addFeatureDelegate.getAddLabelFeature(fp);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.AbstractBpmn2AddFeature#getHeight()
+ */
+ @Override
+ public int getHeight(IAddContext context) {
+ return addFeatureDelegate.getHeight(context);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.AbstractBpmn2AddFeature#getWidth()
+ */
+ @Override
+ public int getWidth(IAddContext context) {
+ return addFeatureDelegate.getWidth(context);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.AbstractBpmn2AddFeature#getBusinessObjectType()
+ */
+ @Override
+ public Class getBusinessObjectType() {
+ return addFeatureDelegate.getBusinessObjectType();
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.IFeatureContainer#getUpdateFeature(org.eclipse.graphiti.features.IFeatureProvider)
+ */
+ @Override
+ public IUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+ return getFeatureContainer(fp).getUpdateFeature(fp);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.IFeatureContainer#getDirectEditingFeature(org.eclipse.graphiti.features.IFeatureProvider)
+ */
+ @Override
+ public IDirectEditingFeature getDirectEditingFeature(IFeatureProvider fp) {
+ return getFeatureContainer(fp).getDirectEditingFeature(fp);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.IFeatureContainer#getLayoutFeature(org.eclipse.graphiti.features.IFeatureProvider)
+ */
+ @Override
+ public ILayoutFeature getLayoutFeature(IFeatureProvider fp) {
+ return getFeatureContainer(fp).getLayoutFeature(fp);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.IFeatureContainer#getRemoveFeature(org.eclipse.graphiti.features.IFeatureProvider)
+ */
+ @Override
+ public IRemoveFeature getRemoveFeature(IFeatureProvider fp) {
+ return getFeatureContainer(fp).getRemoveFeature(fp);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.IFeatureContainer#getDeleteFeature(org.eclipse.graphiti.features.IFeatureProvider)
+ */
+ @Override
+ public IDeleteFeature getDeleteFeature(IFeatureProvider fp) {
+ return getFeatureContainer(fp).getDeleteFeature(fp);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.ICustomElementFeatureContainer#getCustomFeatures(org.eclipse.graphiti.features.IFeatureProvider)
+ */
+ @Override
+ public ICustomFeature[] getCustomFeatures(IFeatureProvider fp) {
+ return getFeatureContainer(fp).getCustomFeatures(fp);
+ }
+
+}

Back to the top