Trying to make sense of expandable activities and flownodes
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/AbstractActivityFeatureContainer.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/AbstractActivityFeatureContainer.java
index a9e047c..0d29d82 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/AbstractActivityFeatureContainer.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/AbstractActivityFeatureContainer.java
@@ -1,96 +1,96 @@
-/*******************************************************************************
- * Copyright (c) 2011 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
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.features.activity;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.bpmn2.Activity;
-import org.eclipse.bpmn2.modeler.core.features.BaseElementFeatureContainer;
-import org.eclipse.bpmn2.modeler.core.features.DefaultResizeBPMNShapeFeature;
-import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
-import org.eclipse.bpmn2.modeler.core.features.activity.MoveActivityFeature;
-import org.eclipse.bpmn2.modeler.core.features.activity.UpdateActivityCompensateMarkerFeature;
-import org.eclipse.bpmn2.modeler.core.features.activity.UpdateActivityLoopAndMultiInstanceMarkerFeature;
-import org.eclipse.bpmn2.modeler.core.features.event.AbstractBoundaryEventOperation;
-import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
-import org.eclipse.bpmn2.modeler.ui.features.AbstractDefaultDeleteFeature;
-import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.CollapseSubProcessFeature;
-import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.ExpandSubProcessFeature;
-import org.eclipse.bpmn2.modeler.ui.features.event.AppendEventFeature;
-import org.eclipse.bpmn2.modeler.ui.features.gateway.AppendGatewayFeature;
-import org.eclipse.graphiti.features.IDeleteFeature;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.features.IMoveShapeFeature;
-import org.eclipse.graphiti.features.IResizeShapeFeature;
-import org.eclipse.graphiti.features.context.IDeleteContext;
-import org.eclipse.graphiti.features.context.impl.DeleteContext;
-import org.eclipse.graphiti.features.custom.ICustomFeature;
-import org.eclipse.graphiti.mm.pictograms.ContainerShape;
-
-public abstract class AbstractActivityFeatureContainer extends BaseElementFeatureContainer {
-
- @Override
- public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
- UpdateActivityCompensateMarkerFeature compensateMarkerUpdateFeature = new UpdateActivityCompensateMarkerFeature(
- fp);
- UpdateActivityLoopAndMultiInstanceMarkerFeature loopAndMultiInstanceUpdateFeature = new UpdateActivityLoopAndMultiInstanceMarkerFeature(
- fp);
- MultiUpdateFeature multiUpdate = new MultiUpdateFeature(fp);
- multiUpdate.addUpdateFeature(compensateMarkerUpdateFeature);
- multiUpdate.addUpdateFeature(loopAndMultiInstanceUpdateFeature);
- return multiUpdate;
- }
-
- @Override
- public IResizeShapeFeature getResizeFeature(IFeatureProvider fp) {
- return new DefaultResizeBPMNShapeFeature(fp);
- }
-
- @Override
- public IMoveShapeFeature getMoveFeature(IFeatureProvider fp) {
- return new MoveActivityFeature(fp);
- }
-
- @Override
- public IDeleteFeature getDeleteFeature(IFeatureProvider fp) {
- return new AbstractDefaultDeleteFeature(fp) {
- @Override
- public void delete(final IDeleteContext context) {
- Activity activity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),
- Activity.class);
- new AbstractBoundaryEventOperation() {
- @Override
- protected void doWorkInternal(ContainerShape container) {
- IDeleteContext delete = new DeleteContext(container);
- getFeatureProvider().getDeleteFeature(delete).delete(delete);
- }
- }.doWork(activity, getDiagram());
- super.delete(context);
- }
- };
- }
-
- @Override
- public ICustomFeature[] getCustomFeatures(IFeatureProvider fp) {
- ICustomFeature[] superFeatures = super.getCustomFeatures(fp);
- ICustomFeature[] thisFeatures = new ICustomFeature[3 + superFeatures.length];
- int i;
- for (i=0; i<superFeatures.length; ++i)
- thisFeatures[i] = superFeatures[i];
- thisFeatures[i++] = new AppendActivityFeature(fp);
- thisFeatures[i++] = new AppendGatewayFeature(fp);
- thisFeatures[i++] = new AppendEventFeature(fp);
- return thisFeatures;
- }
+/*******************************************************************************
+ * Copyright (c) 2011 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
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.bpmn2.Activity;
+import org.eclipse.bpmn2.modeler.core.features.BaseElementFeatureContainer;
+import org.eclipse.bpmn2.modeler.core.features.DefaultResizeBPMNShapeFeature;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.MoveActivityFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.UpdateActivityCompensateMarkerFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.UpdateActivityLoopAndMultiInstanceMarkerFeature;
+import org.eclipse.bpmn2.modeler.core.features.event.AbstractBoundaryEventOperation;
+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
+import org.eclipse.bpmn2.modeler.ui.features.AbstractDefaultDeleteFeature;
+import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.CollapseFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.ExpandFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.ui.features.event.AppendEventFeature;
+import org.eclipse.bpmn2.modeler.ui.features.gateway.AppendGatewayFeature;
+import org.eclipse.graphiti.features.IDeleteFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.IMoveShapeFeature;
+import org.eclipse.graphiti.features.IResizeShapeFeature;
+import org.eclipse.graphiti.features.context.IDeleteContext;
+import org.eclipse.graphiti.features.context.impl.DeleteContext;
+import org.eclipse.graphiti.features.custom.ICustomFeature;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+
+public abstract class AbstractActivityFeatureContainer extends BaseElementFeatureContainer {
+
+ @Override
+ public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+ UpdateActivityCompensateMarkerFeature compensateMarkerUpdateFeature = new UpdateActivityCompensateMarkerFeature(
+ fp);
+ UpdateActivityLoopAndMultiInstanceMarkerFeature loopAndMultiInstanceUpdateFeature = new UpdateActivityLoopAndMultiInstanceMarkerFeature(
+ fp);
+ MultiUpdateFeature multiUpdate = new MultiUpdateFeature(fp);
+ multiUpdate.addUpdateFeature(compensateMarkerUpdateFeature);
+ multiUpdate.addUpdateFeature(loopAndMultiInstanceUpdateFeature);
+ return multiUpdate;
+ }
+
+ @Override
+ public IResizeShapeFeature getResizeFeature(IFeatureProvider fp) {
+ return new DefaultResizeBPMNShapeFeature(fp);
+ }
+
+ @Override
+ public IMoveShapeFeature getMoveFeature(IFeatureProvider fp) {
+ return new MoveActivityFeature(fp);
+ }
+
+ @Override
+ public IDeleteFeature getDeleteFeature(IFeatureProvider fp) {
+ return new AbstractDefaultDeleteFeature(fp) {
+ @Override
+ public void delete(final IDeleteContext context) {
+ Activity activity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),
+ Activity.class);
+ new AbstractBoundaryEventOperation() {
+ @Override
+ protected void doWorkInternal(ContainerShape container) {
+ IDeleteContext delete = new DeleteContext(container);
+ getFeatureProvider().getDeleteFeature(delete).delete(delete);
+ }
+ }.doWork(activity, getDiagram());
+ super.delete(context);
+ }
+ };
+ }
+
+ @Override
+ public ICustomFeature[] getCustomFeatures(IFeatureProvider fp) {
+ ICustomFeature[] superFeatures = super.getCustomFeatures(fp);
+ ICustomFeature[] thisFeatures = new ICustomFeature[3 + superFeatures.length];
+ int i;
+ for (i=0; i<superFeatures.length; ++i)
+ thisFeatures[i] = superFeatures[i];
+ thisFeatures[i++] = new AppendActivityFeature(fp);
+ thisFeatures[i++] = new AppendGatewayFeature(fp);
+ thisFeatures[i++] = new AppendEventFeature(fp);
+ return thisFeatures;
+ }
}
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AbstractSubProcessFeatureContainer.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AbstractExpandableActivityFeatureContainer.java
similarity index 64%
rename from org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AbstractSubProcessFeatureContainer.java
rename to org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AbstractExpandableActivityFeatureContainer.java
index 073d9b1..9055bbe 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AbstractSubProcessFeatureContainer.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AbstractExpandableActivityFeatureContainer.java
@@ -1,55 +1,78 @@
-/*******************************************************************************
- * Copyright (c) 2011 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
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
-
-import org.eclipse.bpmn2.BaseElement;
-import org.eclipse.bpmn2.modeler.core.features.AbstractUpdateBaseElementFeature;
-import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
-import org.eclipse.bpmn2.modeler.ui.features.activity.AbstractActivityFeatureContainer;
-import org.eclipse.graphiti.features.IDirectEditingFeature;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.features.ILayoutFeature;
-import org.eclipse.graphiti.features.IResizeShapeFeature;
-import org.eclipse.graphiti.features.context.IUpdateContext;
-
-public abstract class AbstractSubProcessFeatureContainer extends AbstractActivityFeatureContainer {
-
- @Override
- public IDirectEditingFeature getDirectEditingFeature(IFeatureProvider fp) {
- return null;
- }
-
- @Override
- public ILayoutFeature getLayoutFeature(IFeatureProvider fp) {
- return new LayoutSubProcessFeature(fp);
- }
-
- @Override
- public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
- MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
- AbstractUpdateBaseElementFeature nameUpdateFeature = new AbstractUpdateBaseElementFeature(fp) {
- @Override
- public boolean canUpdate(IUpdateContext context) {
- Object bo = getBusinessObjectForPictogramElement(context.getPictogramElement());
- return bo != null && bo instanceof BaseElement && canApplyTo((BaseElement) bo);
- }
- };
- multiUpdate.addUpdateFeature(nameUpdateFeature);
- return multiUpdate;
- }
-
- @Override
- public IResizeShapeFeature getResizeFeature(IFeatureProvider fp) {
- return new ResizeSubProcessFeature(fp);
- }
+/*******************************************************************************
+ * Copyright (c) 2011 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
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.BaseElement;
+import org.eclipse.bpmn2.CallActivity;
+import org.eclipse.bpmn2.CallChoreography;
+import org.eclipse.bpmn2.SubChoreography;
+import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.bpmn2.modeler.core.features.AbstractUpdateBaseElementFeature;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.ui.features.activity.AbstractActivityFeatureContainer;
+import org.eclipse.graphiti.features.IDirectEditingFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.ILayoutFeature;
+import org.eclipse.graphiti.features.IResizeShapeFeature;
+import org.eclipse.graphiti.features.context.IUpdateContext;
+import org.eclipse.graphiti.features.custom.ICustomFeature;
+
+public abstract class AbstractExpandableActivityFeatureContainer extends AbstractActivityFeatureContainer {
+
+ @Override
+ public IDirectEditingFeature getDirectEditingFeature(IFeatureProvider fp) {
+ return null;
+ }
+
+ @Override
+ public ILayoutFeature getLayoutFeature(IFeatureProvider fp) {
+ return new LayoutExpandableActivityFeature(fp);
+ }
+
+ @Override
+ public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+ MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
+ AbstractUpdateBaseElementFeature nameUpdateFeature = new AbstractUpdateBaseElementFeature(fp) {
+ @Override
+ public boolean canUpdate(IUpdateContext context) {
+ Object bo = getBusinessObjectForPictogramElement(context.getPictogramElement());
+ return bo != null && bo instanceof BaseElement && canApplyTo((BaseElement) bo);
+ }
+ };
+ multiUpdate.addUpdateFeature(nameUpdateFeature);
+ return multiUpdate;
+ }
+
+ @Override
+ public IResizeShapeFeature getResizeFeature(IFeatureProvider fp) {
+ return new ResizeExpandableActivityFeature(fp);
+ }
+
+ @Override
+ public ICustomFeature[] getCustomFeatures(IFeatureProvider fp) {
+ ICustomFeature[] superFeatures = super.getCustomFeatures(fp);
+ ICustomFeature[] thisFeatures = new ICustomFeature[2 + superFeatures.length];
+ thisFeatures[0] = new ExpandFlowNodeFeature(fp);
+ thisFeatures[1] = new CollapseFlowNodeFeature(fp);
+ for (int i=0; i<superFeatures.length; ++i)
+ thisFeatures[2+i] = superFeatures[i];
+ return thisFeatures;
+ }
+
+ public static boolean isExpandableElement(Object be) {
+ return be instanceof SubProcess
+ || be instanceof CallActivity
+ || be instanceof SubChoreography
+ || be instanceof CallChoreography;
+ }
}
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AdHocSubProcessFeatureContainer.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AdHocSubProcessFeatureContainer.java
index 21693a5..7dd32c3 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AdHocSubProcessFeatureContainer.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AdHocSubProcessFeatureContainer.java
@@ -1,89 +1,98 @@
-/*******************************************************************************
- * Copyright (c) 2011 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
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
-
-import java.util.Iterator;
-
-import org.eclipse.bpmn2.Activity;
-import org.eclipse.bpmn2.AdHocSubProcess;
-import org.eclipse.bpmn2.Bpmn2Package;
-import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;
-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
-import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
-import org.eclipse.bpmn2.modeler.ui.ImageProvider;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.graphiti.features.IAddFeature;
-import org.eclipse.graphiti.features.ICreateFeature;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.features.context.IAddContext;
-import org.eclipse.graphiti.features.context.ICreateContext;
-import org.eclipse.graphiti.mm.algorithms.Polyline;
-import org.eclipse.graphiti.mm.pictograms.ContainerShape;
-import org.eclipse.graphiti.mm.pictograms.Shape;
-import org.eclipse.graphiti.services.Graphiti;
-import org.eclipse.graphiti.services.IPeService;
-
-public class AdHocSubProcessFeatureContainer extends AbstractSubProcessFeatureContainer {
-
- @Override
- public boolean canApplyTo(Object o) {
- return super.canApplyTo(o) && o instanceof AdHocSubProcess;
- }
-
- @Override
- public ICreateFeature getCreateFeature(IFeatureProvider fp) {
- return new CreateAdHocSubProcessFeature(fp);
- }
-
- @Override
- public IAddFeature getAddFeature(IFeatureProvider fp) {
- return new AddExpandedActivityFeature<AdHocSubProcess>(fp) {
- @Override
- protected void hook(AdHocSubProcess activity, ContainerShape container, IAddContext context, int width, int height) {
- super.hook(activity, container, context, width, height);
- IPeService peService = Graphiti.getPeService();
- Iterator<Shape> iterator = peService.getAllContainedShapes(container).iterator();
- while (iterator.hasNext()) {
- Shape shape = iterator.next();
- String property = peService.getPropertyValue(shape, GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
- if (property != null && new Boolean(property)) {
- Polyline tilde = GraphicsUtil.createActivityMarkerAdHoc((ContainerShape) shape);
- tilde.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
- }
- }
- }
- };
- }
-
- public static class CreateAdHocSubProcessFeature extends AbstractCreateExpandableFlowNodeFeature<AdHocSubProcess> {
-
- public CreateAdHocSubProcessFeature(IFeatureProvider fp) {
- super(fp, "Ad-Hoc Sub-Process",
- "A specialized description of Sub-Process that is a group of Activities that have no REQUIRED sequence relationships");
- }
-
- @Override
- protected String getStencilImageId() {
- return ImageProvider.IMG_16_AD_HOC_SUB_PROCESS;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()
- */
- @Override
- public EClass getBusinessObjectClass() {
- return Bpmn2Package.eINSTANCE.getAdHocSubProcess();
- }
- }
+/*******************************************************************************
+ * Copyright (c) 2011 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
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import java.util.Iterator;
+
+import org.eclipse.bpmn2.Activity;
+import org.eclipse.bpmn2.AdHocSubProcess;
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
+import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
+import org.eclipse.bpmn2.modeler.ui.ImageProvider;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.graphiti.features.IAddFeature;
+import org.eclipse.graphiti.features.ICreateFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.IAddContext;
+import org.eclipse.graphiti.features.context.ICreateContext;
+import org.eclipse.graphiti.mm.algorithms.Polyline;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.services.IPeService;
+
+public class AdHocSubProcessFeatureContainer extends AbstractExpandableActivityFeatureContainer {
+
+ @Override
+ public boolean canApplyTo(Object o) {
+ return super.canApplyTo(o) && o instanceof AdHocSubProcess;
+ }
+
+ @Override
+ public ICreateFeature getCreateFeature(IFeatureProvider fp) {
+ return new CreateAdHocSubProcessFeature(fp);
+ }
+
+ @Override
+ public IAddFeature getAddFeature(IFeatureProvider fp) {
+ return new AddExpandableActivityFeature<AdHocSubProcess>(fp) {
+ @Override
+ protected void hook(AdHocSubProcess activity, ContainerShape container, IAddContext context, int width, int height) {
+ super.hook(activity, container, context, width, height);
+ IPeService peService = Graphiti.getPeService();
+ Iterator<Shape> iterator = peService.getAllContainedShapes(container).iterator();
+ while (iterator.hasNext()) {
+ Shape shape = iterator.next();
+ String property = peService.getPropertyValue(shape, GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
+ if (property != null && new Boolean(property)) {
+ Polyline tilde = GraphicsUtil.createActivityMarkerAdHoc((ContainerShape) shape);
+ tilde.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+ }
+ }
+ }
+ };
+ }
+
+ @Override
+ public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+ MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
+ UpdateExpandableActivityFeature updateFeature = new UpdateExpandableActivityFeature(fp);
+ multiUpdate.addUpdateFeature(updateFeature);
+ return multiUpdate;
+ }
+
+ public static class CreateAdHocSubProcessFeature extends AbstractCreateExpandableFlowNodeFeature<AdHocSubProcess> {
+
+ public CreateAdHocSubProcessFeature(IFeatureProvider fp) {
+ super(fp, "Ad-Hoc Sub-Process",
+ "A specialized sub-process in which the Activities have no required sequence relationships");
+ }
+
+ @Override
+ protected String getStencilImageId() {
+ return ImageProvider.IMG_16_AD_HOC_SUB_PROCESS;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()
+ */
+ @Override
+ public EClass getBusinessObjectClass() {
+ return Bpmn2Package.eINSTANCE.getAdHocSubProcess();
+ }
+ }
}
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandedActivityFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandableActivityFeature.java
similarity index 97%
rename from org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandedActivityFeature.java
rename to org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandableActivityFeature.java
index 0f77939..eb1304d 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandedActivityFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/AddExpandableActivityFeature.java
@@ -1,103 +1,103 @@
-/*******************************************************************************
- * Copyright (c) 2011 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
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
-
-import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.IS_EXPANDED;
-import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.TRIGGERED_BY_EVENT;
-
-import java.io.IOException;
-
-import org.eclipse.bpmn2.Activity;
-import org.eclipse.bpmn2.SubProcess;
-import org.eclipse.bpmn2.di.BPMNShape;
-import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
-import org.eclipse.bpmn2.modeler.core.features.activity.AbstractAddActivityFeature;
-import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences;
-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.Expand;
-import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.features.context.IAddContext;
-import org.eclipse.graphiti.mm.algorithms.Text;
-import org.eclipse.graphiti.mm.algorithms.styles.Orientation;
-import org.eclipse.graphiti.mm.pictograms.ContainerShape;
-import org.eclipse.graphiti.mm.pictograms.Shape;
-import org.eclipse.graphiti.services.Graphiti;
-import org.eclipse.graphiti.services.IGaService;
-import org.eclipse.graphiti.services.IPeService;
-
-public class AddExpandedActivityFeature<T extends Activity>
- extends AbstractAddActivityFeature<T> {
-
- public AddExpandedActivityFeature(IFeatureProvider fp) {
- super(fp);
- }
-
- @Override
- protected void hook(T activity, ContainerShape container, IAddContext context, int width, int height) {
- super.hook(activity, container, context, width, height);
- IPeService peService = Graphiti.getPeService();
- IGaService gaService = Graphiti.getGaService();
-
- boolean isTriggeredByEvent = false;
- boolean isExpanded = true;
-
- if (activity instanceof SubProcess) {
- SubProcess subprocess = (SubProcess) activity;
- isTriggeredByEvent = subprocess.isTriggeredByEvent();
- try {
- BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(subprocess);
- if (bpmnShape != null) {
- isExpanded = bpmnShape.isIsExpanded();
- }
- } catch (IOException e) {
- throw new IllegalStateException("Could not get DI shape for subprocess:"+subprocess);
- }
- }
- peService.setPropertyValue(container, TRIGGERED_BY_EVENT, Boolean.toString(isTriggeredByEvent));
- peService.setPropertyValue(container, IS_EXPANDED, Boolean.toString(isExpanded));
-
- Shape textShape = peService.createShape(container, false);
- Text text = gaService.createDefaultText(getDiagram(), textShape, activity.getName());
- gaService.setLocationAndSize(text, 5, 5, width - 10, 15);
- StyleUtil.applyStyle(text, activity);
- text.setHorizontalAlignment(Orientation.ALIGNMENT_CENTER);
- text.setVerticalAlignment(Orientation.ALIGNMENT_CENTER);
-// text.setFont(gaService.manageFont(getDiagram(), GaServiceImpl.DEFAULT_FONT, 8, false, true));
- link(textShape, activity);
-
- ContainerShape markerContainer = (ContainerShape) GraphicsUtil.getShape(container,
- GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
-
- if (!isExpanded){
- Expand expand = GraphicsUtil.createActivityMarkerExpand(markerContainer);
- expand.rect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
- expand.horizontal.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
- expand.vertical.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
- }
- }
-
- @Override
- public int getWidth() {
- if (Bpmn2Preferences.getInstance().isExpandedDefault())
- return GraphicsUtil.SUB_PROCEESS_DEFAULT_WIDTH;
- return GraphicsUtil.TASK_DEFAULT_WIDTH;
- }
-
- @Override
- public int getHeight() {
- if (Bpmn2Preferences.getInstance().isExpandedDefault())
- return GraphicsUtil.SUB_PROCESS_DEFAULT_HEIGHT;
- return GraphicsUtil.TASK_DEFAULT_HEIGHT;
- }
+/*******************************************************************************
+ * Copyright (c) 2011 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
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.IS_EXPANDED;
+import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.TRIGGERED_BY_EVENT;
+
+import java.io.IOException;
+
+import org.eclipse.bpmn2.Activity;
+import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.bpmn2.di.BPMNShape;
+import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
+import org.eclipse.bpmn2.modeler.core.features.activity.AbstractAddActivityFeature;
+import org.eclipse.bpmn2.modeler.core.preferences.Bpmn2Preferences;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.Expand;
+import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.IAddContext;
+import org.eclipse.graphiti.mm.algorithms.Text;
+import org.eclipse.graphiti.mm.algorithms.styles.Orientation;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.services.IGaService;
+import org.eclipse.graphiti.services.IPeService;
+
+public class AddExpandableActivityFeature<T extends Activity>
+ extends AbstractAddActivityFeature<T> {
+
+ public AddExpandableActivityFeature(IFeatureProvider fp) {
+ super(fp);
+ }
+
+ @Override
+ protected void hook(T activity, ContainerShape container, IAddContext context, int width, int height) {
+ super.hook(activity, container, context, width, height);
+ IPeService peService = Graphiti.getPeService();
+ IGaService gaService = Graphiti.getGaService();
+
+ boolean isTriggeredByEvent = false;
+ boolean isExpanded = true;
+
+ if (activity instanceof SubProcess) {
+ SubProcess subprocess = (SubProcess) activity;
+ isTriggeredByEvent = subprocess.isTriggeredByEvent();
+ try {
+ BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(subprocess);
+ if (bpmnShape != null) {
+ isExpanded = bpmnShape.isIsExpanded();
+ }
+ } catch (IOException e) {
+ throw new IllegalStateException("Could not get DI shape for subprocess:"+subprocess);
+ }
+ }
+ peService.setPropertyValue(container, TRIGGERED_BY_EVENT, Boolean.toString(isTriggeredByEvent));
+ peService.setPropertyValue(container, IS_EXPANDED, Boolean.toString(isExpanded));
+
+ Shape textShape = peService.createShape(container, false);
+ Text text = gaService.createDefaultText(getDiagram(), textShape, activity.getName());
+ gaService.setLocationAndSize(text, 5, 5, width - 10, 15);
+ StyleUtil.applyStyle(text, activity);
+ text.setHorizontalAlignment(Orientation.ALIGNMENT_CENTER);
+ text.setVerticalAlignment(Orientation.ALIGNMENT_CENTER);
+// text.setFont(gaService.manageFont(getDiagram(), GaServiceImpl.DEFAULT_FONT, 8, false, true));
+ link(textShape, activity);
+
+ ContainerShape markerContainer = (ContainerShape) GraphicsUtil.getShape(container,
+ GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
+
+ if (!isExpanded){
+ Expand expand = GraphicsUtil.createActivityMarkerExpand(markerContainer);
+ expand.rect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+ expand.horizontal.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+ expand.vertical.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+ }
+ }
+
+ @Override
+ public int getWidth() {
+ if (Bpmn2Preferences.getInstance().isExpandedDefault())
+ return GraphicsUtil.SUB_PROCEESS_DEFAULT_WIDTH;
+ return GraphicsUtil.TASK_DEFAULT_WIDTH;
+ }
+
+ @Override
+ public int getHeight() {
+ if (Bpmn2Preferences.getInstance().isExpandedDefault())
+ return GraphicsUtil.SUB_PROCESS_DEFAULT_HEIGHT;
+ return GraphicsUtil.TASK_DEFAULT_HEIGHT;
+ }
}
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CallActivityFeatureContainer.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CallActivityFeatureContainer.java
index 7b8b10e..d8ee2c4 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CallActivityFeatureContainer.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CallActivityFeatureContainer.java
@@ -1,262 +1,262 @@
-/*******************************************************************************
- * Copyright (c) 2011 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
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
-
-import org.eclipse.bpmn2.Activity;
-import org.eclipse.bpmn2.Bpmn2Package;
-import org.eclipse.bpmn2.CallActivity;
-import org.eclipse.bpmn2.CallableElement;
-import org.eclipse.bpmn2.GlobalBusinessRuleTask;
-import org.eclipse.bpmn2.GlobalManualTask;
-import org.eclipse.bpmn2.GlobalScriptTask;
-import org.eclipse.bpmn2.GlobalTask;
-import org.eclipse.bpmn2.GlobalUserTask;
-import org.eclipse.bpmn2.Process;
-import org.eclipse.bpmn2.modeler.core.features.DefaultResizeBPMNShapeFeature;
-import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
-import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;
-import org.eclipse.bpmn2.modeler.core.features.activity.LayoutActivityFeature;
-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
-import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.Expand;
-import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
-import org.eclipse.bpmn2.modeler.ui.ImageProvider;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.graphiti.features.IAddFeature;
-import org.eclipse.graphiti.features.ICreateFeature;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.features.ILayoutFeature;
-import org.eclipse.graphiti.features.IReason;
-import org.eclipse.graphiti.features.IResizeShapeFeature;
-import org.eclipse.graphiti.features.context.IAddContext;
-import org.eclipse.graphiti.features.context.ICreateContext;
-import org.eclipse.graphiti.features.context.IUpdateContext;
-import org.eclipse.graphiti.features.impl.AbstractUpdateFeature;
-import org.eclipse.graphiti.features.impl.Reason;
-import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
-import org.eclipse.graphiti.mm.algorithms.Image;
-import org.eclipse.graphiti.mm.algorithms.RoundedRectangle;
-import org.eclipse.graphiti.mm.algorithms.Text;
-import org.eclipse.graphiti.mm.pictograms.ContainerShape;
-import org.eclipse.graphiti.mm.pictograms.PictogramElement;
-import org.eclipse.graphiti.mm.pictograms.Shape;
-import org.eclipse.graphiti.services.Graphiti;
-import org.eclipse.graphiti.services.IGaService;
-import org.eclipse.graphiti.services.IPeService;
-
-public class CallActivityFeatureContainer extends AbstractSubProcessFeatureContainer {
-
- private static final int MARKER_OFFSET = 4;
- private static final String CALL_ACTIVITY_REF_PROPERTY = "call.activity.ref";
- private static final String GLOBAL_TASK_SHAPE_PROPERTY = "global.task.shape";
-
- @Override
- public boolean canApplyTo(Object o) {
- return super.canApplyTo(o) && o instanceof CallActivity;
- }
-
- @Override
- public ICreateFeature getCreateFeature(IFeatureProvider fp) {
- return new CreateCallActivityFeature(fp);
- }
-
- @Override
- public IAddFeature getAddFeature(IFeatureProvider fp) {
- return new AddExpandedActivityFeature<CallActivity>(fp) {
- @Override
- protected void hook(CallActivity activity, ContainerShape container, IAddContext context, int width, int height) {
- super.hook(activity, container, context, width, height);
- Graphiti.getPeService().setPropertyValue(container, CALL_ACTIVITY_REF_PROPERTY,
- getCallableElementStringValue(activity.getCalledElementRef()));
- }
-
- @Override
- protected void decorateActivityRectangle(RoundedRectangle rect) {
- rect.setLineWidth(4);
- }
-
- @Override
- protected int getMarkerContainerOffset() {
- return MARKER_OFFSET;
- }
-
- @Override
- public int getWidth() {
- return GraphicsUtil.getActivitySize(getDiagram()).getWidth();
- }
-
- @Override
- public int getHeight() {
- return GraphicsUtil.getActivitySize(getDiagram()).getHeight();
- }
- };
- }
-
- @Override
- public ILayoutFeature getLayoutFeature(IFeatureProvider fp) {
- return new LayoutActivityFeature(fp) {
- protected int getMarkerContainerOffset() {
- return MARKER_OFFSET;
- }
-
- @Override
- protected boolean layoutHook(Shape shape, GraphicsAlgorithm ga, Object bo, int newWidth, int newHeight) {
- if (bo != null && bo instanceof Activity && ga instanceof Text) {
- Graphiti.getGaService().setLocationAndSize(ga, 5, 5, newWidth - 10, 15);
- return true;
- }
- return false;
- }
-
- };
- }
-
- @Override
- public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
- MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
- multiUpdate.addUpdateFeature(new UpdateCallActivityFeature(fp));
- return multiUpdate;
- }
-
- @Override
- public IResizeShapeFeature getResizeFeature(IFeatureProvider fp) {
- return new DefaultResizeBPMNShapeFeature(fp);
- }
-
- public static class CreateCallActivityFeature extends AbstractCreateExpandableFlowNodeFeature<CallActivity> {
-
- // NOTE: Even though the Call Activity is an expandable figure, the contents for its "innards"
- // are (usually) defined somewhere else, so it doesn't make much sense to be able to expand it in the
- // same sense that a SubProcess would be expanded and rendered. When the "expand" button is clicked
- // we should probably locate the process where this thing is defined (if possible) and open an
- // editor to display its contents.
-
- public CreateCallActivityFeature(IFeatureProvider fp) {
- super(fp, "Call Activity",
- "Identifies a point in the Process where a global Process or a Global Task is used");
- }
-
- @Override
- public String getStencilImageId() {
- return ImageProvider.IMG_16_CALL_ACTIVITY;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()
- */
- @Override
- public EClass getBusinessObjectClass() {
- return Bpmn2Package.eINSTANCE.getCallActivity();
- }
- }
-
- private class UpdateCallActivityFeature extends AbstractUpdateFeature {
-
- public UpdateCallActivityFeature(IFeatureProvider fp) {
- super(fp);
- }
-
- @Override
- public boolean canUpdate(IUpdateContext context) {
- CallActivity callActivity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),
- CallActivity.class);
- return callActivity != null && context.getPictogramElement() instanceof ContainerShape;
- }
-
- @Override
- public IReason updateNeeded(IUpdateContext context) {
- IPeService peService = Graphiti.getPeService();
- PictogramElement element = context.getPictogramElement();
- String property = peService.getPropertyValue(element, CALL_ACTIVITY_REF_PROPERTY);
- if (property == null) {
- return Reason.createFalseReason();
- }
- CallActivity callActivity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),
- CallActivity.class);
- String value = getCallableElementStringValue(callActivity.getCalledElementRef());
- boolean changed = !value.equals(property);
- return changed ? Reason.createTrueReason() : Reason.createFalseReason();
- }
-
- @Override
- public boolean update(IUpdateContext context) {
- IPeService peService = Graphiti.getPeService();
- IGaService gaService = Graphiti.getGaService();
-
- ContainerShape container = (ContainerShape) context.getPictogramElement();
- CallActivity callActivity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),
- CallActivity.class);
-
- ContainerShape markerContainer = (ContainerShape) GraphicsUtil.getShapeForProperty(container,
- GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
- Shape globalTaskShape = GraphicsUtil.getShapeForProperty(container, GLOBAL_TASK_SHAPE_PROPERTY);
-
- if (callActivity.getCalledElementRef() == null) {
- GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
- if (globalTaskShape != null) {
- peService.deletePictogramElement(globalTaskShape);
- }
- }
-
- else if (callActivity.getCalledElementRef() instanceof GlobalTask) {
- GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
- GlobalTask t = (GlobalTask) callActivity.getCalledElementRef();
- if (globalTaskShape == null) {
- globalTaskShape = peService.createShape(container, false);
- peService.setPropertyValue(globalTaskShape, GLOBAL_TASK_SHAPE_PROPERTY, Boolean.toString(true));
- }
- String imageId = getImageId(t);
- if (imageId != null) {
- Image image = gaService.createImage(globalTaskShape, imageId);
- gaService.setLocationAndSize(image, MARKER_OFFSET + 2, MARKER_OFFSET + 2, 16, 16);
- }
- }
-
- else if (callActivity.getCalledElementRef() instanceof Process) {
- if (globalTaskShape != null) {
- peService.deletePictogramElement(globalTaskShape);
- }
- Expand expand = GraphicsUtil.createActivityMarkerExpand(markerContainer);
- expand.rect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
- expand.horizontal.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
- expand.vertical.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
- }
-
- peService.setPropertyValue(container, CALL_ACTIVITY_REF_PROPERTY,
- getCallableElementStringValue(callActivity.getCalledElementRef()));
- return true;
- }
- }
-
- private String getCallableElementStringValue(CallableElement element) {
- if (element == null) {
- return "null";
- }
- return element.getClass().getSimpleName();
- }
-
- private String getImageId(GlobalTask task) {
- if (task instanceof GlobalBusinessRuleTask) {
- return ImageProvider.IMG_16_BUSINESS_RULE_TASK;
- } else if (task instanceof GlobalManualTask) {
- return ImageProvider.IMG_16_MANUAL_TASK;
- } else if (task instanceof GlobalScriptTask) {
- return ImageProvider.IMG_16_SCRIPT_TASK;
- } else if (task instanceof GlobalUserTask) {
- return ImageProvider.IMG_16_USER_TASK;
- } else {
- return null;
- }
- }
+/*******************************************************************************
+ * Copyright (c) 2011 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
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.Activity;
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.CallActivity;
+import org.eclipse.bpmn2.CallableElement;
+import org.eclipse.bpmn2.GlobalBusinessRuleTask;
+import org.eclipse.bpmn2.GlobalManualTask;
+import org.eclipse.bpmn2.GlobalScriptTask;
+import org.eclipse.bpmn2.GlobalTask;
+import org.eclipse.bpmn2.GlobalUserTask;
+import org.eclipse.bpmn2.Process;
+import org.eclipse.bpmn2.modeler.core.features.DefaultResizeBPMNShapeFeature;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.LayoutActivityFeature;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.Expand;
+import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
+import org.eclipse.bpmn2.modeler.ui.ImageProvider;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.graphiti.features.IAddFeature;
+import org.eclipse.graphiti.features.ICreateFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.ILayoutFeature;
+import org.eclipse.graphiti.features.IReason;
+import org.eclipse.graphiti.features.IResizeShapeFeature;
+import org.eclipse.graphiti.features.context.IAddContext;
+import org.eclipse.graphiti.features.context.ICreateContext;
+import org.eclipse.graphiti.features.context.IUpdateContext;
+import org.eclipse.graphiti.features.impl.AbstractUpdateFeature;
+import org.eclipse.graphiti.features.impl.Reason;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.algorithms.Image;
+import org.eclipse.graphiti.mm.algorithms.RoundedRectangle;
+import org.eclipse.graphiti.mm.algorithms.Text;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.services.IGaService;
+import org.eclipse.graphiti.services.IPeService;
+
+public class CallActivityFeatureContainer extends AbstractExpandableActivityFeatureContainer {
+
+ private static final int MARKER_OFFSET = 4;
+ private static final String CALL_ACTIVITY_REF_PROPERTY = "call.activity.ref";
+ private static final String GLOBAL_TASK_SHAPE_PROPERTY = "global.task.shape";
+
+ @Override
+ public boolean canApplyTo(Object o) {
+ return super.canApplyTo(o) && o instanceof CallActivity;
+ }
+
+ @Override
+ public ICreateFeature getCreateFeature(IFeatureProvider fp) {
+ return new CreateCallActivityFeature(fp);
+ }
+
+ @Override
+ public IAddFeature getAddFeature(IFeatureProvider fp) {
+ return new AddExpandableActivityFeature<CallActivity>(fp) {
+ @Override
+ protected void hook(CallActivity activity, ContainerShape container, IAddContext context, int width, int height) {
+ super.hook(activity, container, context, width, height);
+ Graphiti.getPeService().setPropertyValue(container, CALL_ACTIVITY_REF_PROPERTY,
+ getCallableElementStringValue(activity.getCalledElementRef()));
+ }
+
+ @Override
+ protected void decorateActivityRectangle(RoundedRectangle rect) {
+ rect.setLineWidth(4);
+ }
+
+ @Override
+ protected int getMarkerContainerOffset() {
+ return MARKER_OFFSET;
+ }
+
+ @Override
+ public int getWidth() {
+ return GraphicsUtil.getActivitySize(getDiagram()).getWidth();
+ }
+
+ @Override
+ public int getHeight() {
+ return GraphicsUtil.getActivitySize(getDiagram()).getHeight();
+ }
+ };
+ }
+
+ @Override
+ public ILayoutFeature getLayoutFeature(IFeatureProvider fp) {
+ return new LayoutExpandableActivityFeature(fp) {
+ protected int getMarkerContainerOffset() {
+ return MARKER_OFFSET;
+ }
+
+ @Override
+ protected boolean layoutHook(Shape shape, GraphicsAlgorithm ga, Object bo, int newWidth, int newHeight) {
+ if (bo != null && bo instanceof Activity && ga instanceof Text) {
+ Graphiti.getGaService().setLocationAndSize(ga, 5, 5, newWidth - 10, 15);
+ return true;
+ }
+ return false;
+ }
+
+ };
+ }
+
+ @Override
+ public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+ MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
+ multiUpdate.addUpdateFeature(new UpdateCallActivityFeature(fp));
+ return multiUpdate;
+ }
+
+ @Override
+ public IResizeShapeFeature getResizeFeature(IFeatureProvider fp) {
+ return new DefaultResizeBPMNShapeFeature(fp);
+ }
+
+ public static class CreateCallActivityFeature extends AbstractCreateExpandableFlowNodeFeature<CallActivity> {
+
+ // NOTE: Even though the Call Activity is an expandable figure, the contents for its "innards"
+ // are (usually) defined somewhere else, so it doesn't make much sense to be able to expand it in the
+ // same sense that a SubProcess would be expanded and rendered. When the "expand" button is clicked
+ // we should probably locate the process where this thing is defined (if possible) and open an
+ // editor to display its contents.
+
+ public CreateCallActivityFeature(IFeatureProvider fp) {
+ super(fp, "Call Activity",
+ "Identifies a point in the Process where a global Process or a Global Task is called");
+ }
+
+ @Override
+ public String getStencilImageId() {
+ return ImageProvider.IMG_16_CALL_ACTIVITY;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()
+ */
+ @Override
+ public EClass getBusinessObjectClass() {
+ return Bpmn2Package.eINSTANCE.getCallActivity();
+ }
+ }
+
+ private class UpdateCallActivityFeature extends AbstractUpdateFeature {
+
+ public UpdateCallActivityFeature(IFeatureProvider fp) {
+ super(fp);
+ }
+
+ @Override
+ public boolean canUpdate(IUpdateContext context) {
+ CallActivity callActivity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),
+ CallActivity.class);
+ return callActivity != null && context.getPictogramElement() instanceof ContainerShape;
+ }
+
+ @Override
+ public IReason updateNeeded(IUpdateContext context) {
+ IPeService peService = Graphiti.getPeService();
+ PictogramElement element = context.getPictogramElement();
+ String property = peService.getPropertyValue(element, CALL_ACTIVITY_REF_PROPERTY);
+ if (property == null) {
+ return Reason.createFalseReason();
+ }
+ CallActivity callActivity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),
+ CallActivity.class);
+ String value = getCallableElementStringValue(callActivity.getCalledElementRef());
+ boolean changed = !value.equals(property);
+ return changed ? Reason.createTrueReason() : Reason.createFalseReason();
+ }
+
+ @Override
+ public boolean update(IUpdateContext context) {
+ IPeService peService = Graphiti.getPeService();
+ IGaService gaService = Graphiti.getGaService();
+
+ ContainerShape container = (ContainerShape) context.getPictogramElement();
+ CallActivity callActivity = BusinessObjectUtil.getFirstElementOfType(context.getPictogramElement(),
+ CallActivity.class);
+
+ ContainerShape markerContainer = (ContainerShape) GraphicsUtil.getShapeForProperty(container,
+ GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
+ Shape globalTaskShape = GraphicsUtil.getShapeForProperty(container, GLOBAL_TASK_SHAPE_PROPERTY);
+
+ if (callActivity.getCalledElementRef() == null) {
+ GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
+ if (globalTaskShape != null) {
+ peService.deletePictogramElement(globalTaskShape);
+ }
+ }
+
+ else if (callActivity.getCalledElementRef() instanceof GlobalTask) {
+ GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
+ GlobalTask t = (GlobalTask) callActivity.getCalledElementRef();
+ if (globalTaskShape == null) {
+ globalTaskShape = peService.createShape(container, false);
+ peService.setPropertyValue(globalTaskShape, GLOBAL_TASK_SHAPE_PROPERTY, Boolean.toString(true));
+ }
+ String imageId = getImageId(t);
+ if (imageId != null) {
+ Image image = gaService.createImage(globalTaskShape, imageId);
+ gaService.setLocationAndSize(image, MARKER_OFFSET + 2, MARKER_OFFSET + 2, 16, 16);
+ }
+ }
+
+ else if (callActivity.getCalledElementRef() instanceof Process) {
+ if (globalTaskShape != null) {
+ peService.deletePictogramElement(globalTaskShape);
+ }
+ Expand expand = GraphicsUtil.createActivityMarkerExpand(markerContainer);
+ expand.rect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+ expand.horizontal.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+ expand.vertical.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+ }
+
+ peService.setPropertyValue(container, CALL_ACTIVITY_REF_PROPERTY,
+ getCallableElementStringValue(callActivity.getCalledElementRef()));
+ return true;
+ }
+ }
+
+ private String getCallableElementStringValue(CallableElement element) {
+ if (element == null) {
+ return "null";
+ }
+ return element.getClass().getSimpleName();
+ }
+
+ private String getImageId(GlobalTask task) {
+ if (task instanceof GlobalBusinessRuleTask) {
+ return ImageProvider.IMG_16_BUSINESS_RULE_TASK;
+ } else if (task instanceof GlobalManualTask) {
+ return ImageProvider.IMG_16_MANUAL_TASK;
+ } else if (task instanceof GlobalScriptTask) {
+ return ImageProvider.IMG_16_SCRIPT_TASK;
+ } else if (task instanceof GlobalUserTask) {
+ return ImageProvider.IMG_16_USER_TASK;
+ } else {
+ return null;
+ }
+ }
}
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CollapseSubProcessFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CollapseFlowNodeFeature.java
similarity index 85%
rename from org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CollapseSubProcessFeature.java
rename to org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CollapseFlowNodeFeature.java
index 1d6f9b1..ab51f2a 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CollapseSubProcessFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/CollapseFlowNodeFeature.java
@@ -1,118 +1,118 @@
-/*******************************************************************************
- * Copyright (c) 2011 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
- *
- * @author Bob Brodt
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
-
-import org.eclipse.bpmn2.SubProcess;
-import org.eclipse.bpmn2.di.BPMNShape;
-import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
-import org.eclipse.bpmn2.modeler.ui.ImageProvider;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.features.IResizeShapeFeature;
-import org.eclipse.graphiti.features.context.IContext;
-import org.eclipse.graphiti.features.context.ICustomContext;
-import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;
-import org.eclipse.graphiti.features.custom.AbstractCustomFeature;
-import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
-import org.eclipse.graphiti.mm.pictograms.ContainerShape;
-import org.eclipse.graphiti.mm.pictograms.PictogramElement;
-
-public class CollapseSubProcessFeature extends AbstractCustomFeature {
-
- public CollapseSubProcessFeature(IFeatureProvider fp) {
- super(fp);
- // TODO Auto-generated constructor stub
- }
-
- @Override
- public String getName() {
- return "Collapse"; //$NON-NLS-1$
- }
-
- @Override
- public String getDescription() {
-
- return "Collapse the Sub-Process and hide contents"; //$NON-NLS-1$
- }
-
- @Override
- public String getImageId() {
- return ImageProvider.IMG_16_COLLAPSE;
- }
-
- @Override
- public boolean isAvailable(IContext context) {
- return true;
- }
-
- @Override
- public boolean canExecute(ICustomContext context) {
- boolean ret = false;
- PictogramElement[] pes = context.getPictogramElements();
- if (pes != null && pes.length == 1) {
- Object bo = getBusinessObjectForPictogramElement(pes[0]);
- if (bo instanceof SubProcess) {
- try {
- BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement((SubProcess)bo);
- if (bpmnShape.isIsExpanded())
- ret = true;
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- return ret;
- }
-
- @Override
- public void execute(ICustomContext context) {
- PictogramElement[] pes = context.getPictogramElements();
- if (pes != null && pes.length == 1) {
- PictogramElement pe0 = pes[0];
- Object bo = getBusinessObjectForPictogramElement(pe0);
- if (pe0 instanceof ContainerShape && bo instanceof SubProcess) {
- ContainerShape containerShape = (ContainerShape)pe0;
- SubProcess subProcess = (SubProcess)bo;
- try {
- BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(subProcess);
- if (bpmnShape.isIsExpanded()) {
-
- // SubProcess is collapsed - resize to standard modelObject size
- // NOTE: children tasks will be set not-visible in LayoutSubProcessFeature
-
- bpmnShape.setIsExpanded(false);
-
- GraphicsAlgorithm ga = containerShape.getGraphicsAlgorithm();
- ResizeShapeContext resizeContext = new ResizeShapeContext(containerShape);
- IResizeShapeFeature resizeFeature = getFeatureProvider().getResizeShapeFeature(resizeContext);
- int oldWidth = ga.getWidth();
- int oldHeight = ga.getHeight();
- int newWidth = GraphicsUtil.getActivitySize(getDiagram()).getWidth();
- int newHeight = GraphicsUtil.getActivitySize(getDiagram()).getHeight();
- resizeContext.setX(ga.getX() + oldWidth/2 - newWidth/2);
- resizeContext.setY(ga.getY() + oldHeight/2 - newHeight/2);
- resizeContext.setWidth(newWidth);
- resizeContext.setHeight(newHeight);
- resizeFeature.resizeShape(resizeContext);
-
- getDiagramEditor().selectPictogramElements(new PictogramElement[] {});
- }
-
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2011 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
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.FlowNode;
+import org.eclipse.bpmn2.di.BPMNShape;
+import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
+import org.eclipse.bpmn2.modeler.ui.ImageProvider;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.IResizeShapeFeature;
+import org.eclipse.graphiti.features.context.IContext;
+import org.eclipse.graphiti.features.context.ICustomContext;
+import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;
+import org.eclipse.graphiti.features.custom.AbstractCustomFeature;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+
+public class CollapseFlowNodeFeature extends AbstractCustomFeature {
+
+ public CollapseFlowNodeFeature(IFeatureProvider fp) {
+ super(fp);
+ // TODO Auto-generated constructor stub
+ }
+
+ @Override
+ public String getName() {
+ return "Collapse"; //$NON-NLS-1$
+ }
+
+ @Override
+ public String getDescription() {
+
+ return "Collapse the Activity and hide contents"; //$NON-NLS-1$
+ }
+
+ @Override
+ public String getImageId() {
+ return ImageProvider.IMG_16_COLLAPSE;
+ }
+
+ @Override
+ public boolean isAvailable(IContext context) {
+ return true;
+ }
+
+ @Override
+ public boolean canExecute(ICustomContext context) {
+ boolean ret = false;
+ PictogramElement[] pes = context.getPictogramElements();
+ if (pes != null && pes.length == 1) {
+ Object bo = getBusinessObjectForPictogramElement(pes[0]);
+ if (AbstractExpandableActivityFeatureContainer.isExpandableElement(bo)) {
+ try {
+ BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement((FlowNode)bo);
+ if (bpmnShape.isIsExpanded())
+ ret = true;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return ret;
+ }
+
+ @Override
+ public void execute(ICustomContext context) {
+ PictogramElement[] pes = context.getPictogramElements();
+ if (pes != null && pes.length == 1) {
+ PictogramElement pe0 = pes[0];
+ Object bo = getBusinessObjectForPictogramElement(pe0);
+ if (pe0 instanceof ContainerShape && bo instanceof FlowNode) {
+ ContainerShape containerShape = (ContainerShape)pe0;
+ FlowNode flowNode = (FlowNode)bo;
+ try {
+ BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(flowNode);
+ if (bpmnShape.isIsExpanded()) {
+
+ // SubProcess is collapsed - resize to standard modelObject size
+ // NOTE: children tasks will be set not-visible in LayoutExpandableActivityFeature
+
+ bpmnShape.setIsExpanded(false);
+
+ GraphicsAlgorithm ga = containerShape.getGraphicsAlgorithm();
+ ResizeShapeContext resizeContext = new ResizeShapeContext(containerShape);
+ IResizeShapeFeature resizeFeature = getFeatureProvider().getResizeShapeFeature(resizeContext);
+ int oldWidth = ga.getWidth();
+ int oldHeight = ga.getHeight();
+ int newWidth = GraphicsUtil.getActivitySize(getDiagram()).getWidth();
+ int newHeight = GraphicsUtil.getActivitySize(getDiagram()).getHeight();
+ resizeContext.setX(ga.getX() + oldWidth/2 - newWidth/2);
+ resizeContext.setY(ga.getY() + oldHeight/2 - newHeight/2);
+ resizeContext.setWidth(newWidth);
+ resizeContext.setHeight(newHeight);
+ resizeFeature.resizeShape(resizeContext);
+
+ getDiagramEditor().selectPictogramElements(new PictogramElement[] {});
+ }
+
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ExpandSubProcessFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ExpandFlowNodeFeature.java
similarity index 82%
rename from org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ExpandSubProcessFeature.java
rename to org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ExpandFlowNodeFeature.java
index 761fcfa..8ef3af6 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ExpandSubProcessFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ExpandFlowNodeFeature.java
@@ -1,116 +1,116 @@
-/*******************************************************************************
- * Copyright (c) 2011 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
- *
- * @author Bob Brodt
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
-
-import org.eclipse.bpmn2.SubProcess;
-import org.eclipse.bpmn2.di.BPMNShape;
-import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
-import org.eclipse.bpmn2.modeler.ui.ImageProvider;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.features.IResizeShapeFeature;
-import org.eclipse.graphiti.features.context.IContext;
-import org.eclipse.graphiti.features.context.ICustomContext;
-import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;
-import org.eclipse.graphiti.features.custom.AbstractCustomFeature;
-import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
-import org.eclipse.graphiti.mm.pictograms.ContainerShape;
-import org.eclipse.graphiti.mm.pictograms.PictogramElement;
-
-// NOT USED YET
-public class ExpandSubProcessFeature extends AbstractCustomFeature {
-
- public ExpandSubProcessFeature(IFeatureProvider fp) {
- super(fp);
- }
-
- @Override
- public String getName() {
- return "Expand";
- }
-
- @Override
- public String getDescription() {
- return "Expand the Sub-Process and show contents";
- }
-
- @Override
- public String getImageId() {
- return ImageProvider.IMG_16_EXPAND;
- }
-
- @Override
- public boolean isAvailable(IContext context) {
- return true;
- }
-
- @Override
- public boolean canExecute(ICustomContext context) {
- boolean ret = false;
- PictogramElement[] pes = context.getPictogramElements();
- if (pes != null && pes.length == 1) {
- Object bo = getBusinessObjectForPictogramElement(pes[0]);
- if (bo instanceof SubProcess) {
- try {
- BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement((SubProcess)bo);
- if (!bpmnShape.isIsExpanded())
- ret = true;
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- return ret;
- }
-
- @Override
- public void execute(ICustomContext context) {
- PictogramElement[] pes = context.getPictogramElements();
- if (pes != null && pes.length == 1) {
- PictogramElement pe0 = pes[0];
- Object bo = getBusinessObjectForPictogramElement(pe0);
- if (pe0 instanceof ContainerShape && bo instanceof SubProcess) {
- ContainerShape containerShape = (ContainerShape)pe0;
- SubProcess subProcess = (SubProcess)bo;
- try {
- BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(subProcess);
- if (!bpmnShape.isIsExpanded()) {
-
- // SubProcess is collapsed - resize to minimum size such that all children are visible
- // NOTE: children tasks will be set visible in LayoutSubProcessFeature
-
- bpmnShape.setIsExpanded(true);
-
- GraphicsAlgorithm ga = containerShape.getGraphicsAlgorithm();
- ResizeShapeContext resizeContext = new ResizeShapeContext(containerShape);
- IResizeShapeFeature resizeFeature = getFeatureProvider().getResizeShapeFeature(resizeContext);
- int oldWidth = ga.getWidth();
- int oldHeight = ga.getHeight();
- ResizeSubProcessFeature.SizeCalculator newSize = new ResizeSubProcessFeature.SizeCalculator(containerShape);
- int newWidth = newSize.getWidth();
- int newHeight = newSize.getHeight();
- resizeContext.setX(ga.getX() + oldWidth/2 - newWidth/2);
- resizeContext.setY(ga.getY() + oldHeight/2 - newHeight/2);
- resizeContext.setWidth(newWidth);
- resizeContext.setHeight(newHeight);
- resizeFeature.resizeShape(resizeContext);
- }
-
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
+/*******************************************************************************
+ * Copyright (c) 2011 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
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.FlowNode;
+import org.eclipse.bpmn2.di.BPMNShape;
+import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
+import org.eclipse.bpmn2.modeler.ui.ImageProvider;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.IResizeShapeFeature;
+import org.eclipse.graphiti.features.context.IContext;
+import org.eclipse.graphiti.features.context.ICustomContext;
+import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;
+import org.eclipse.graphiti.features.custom.AbstractCustomFeature;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+
+// NOT USED YET
+public class ExpandFlowNodeFeature extends AbstractCustomFeature {
+
+ public ExpandFlowNodeFeature(IFeatureProvider fp) {
+ super(fp);
+ }
+
+ @Override
+ public String getName() {
+ return "Expand";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Expand the Activity and show contents";
+ }
+
+ @Override
+ public String getImageId() {
+ return ImageProvider.IMG_16_EXPAND;
+ }
+
+ @Override
+ public boolean isAvailable(IContext context) {
+ return true;
+ }
+
+ @Override
+ public boolean canExecute(ICustomContext context) {
+ boolean ret = false;
+ PictogramElement[] pes = context.getPictogramElements();
+ if (pes != null && pes.length == 1) {
+ Object bo = getBusinessObjectForPictogramElement(pes[0]);
+ if (AbstractExpandableActivityFeatureContainer.isExpandableElement(bo)) {
+ try {
+ BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement((FlowNode)bo);
+ if (!bpmnShape.isIsExpanded())
+ ret = true;
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+ return ret;
+ }
+
+ @Override
+ public void execute(ICustomContext context) {
+ PictogramElement[] pes = context.getPictogramElements();
+ if (pes != null && pes.length == 1) {
+ PictogramElement pe0 = pes[0];
+ Object bo = getBusinessObjectForPictogramElement(pe0);
+ if (pe0 instanceof ContainerShape && bo instanceof FlowNode) {
+ ContainerShape containerShape = (ContainerShape)pe0;
+ FlowNode flowNode = (FlowNode)bo;
+ try {
+ BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(flowNode);
+ if (!bpmnShape.isIsExpanded()) {
+
+ // SubProcess is collapsed - resize to minimum size such that all children are visible
+ // NOTE: children tasks will be set visible in LayoutExpandableActivityFeature
+
+ bpmnShape.setIsExpanded(true);
+
+ GraphicsAlgorithm ga = containerShape.getGraphicsAlgorithm();
+ ResizeShapeContext resizeContext = new ResizeShapeContext(containerShape);
+ IResizeShapeFeature resizeFeature = getFeatureProvider().getResizeShapeFeature(resizeContext);
+ int oldWidth = ga.getWidth();
+ int oldHeight = ga.getHeight();
+ ResizeExpandableActivityFeature.SizeCalculator newSize = new ResizeExpandableActivityFeature.SizeCalculator(containerShape);
+ int newWidth = newSize.getWidth();
+ int newHeight = newSize.getHeight();
+ resizeContext.setX(ga.getX() + oldWidth/2 - newWidth/2);
+ resizeContext.setY(ga.getY() + oldHeight/2 - newHeight/2);
+ resizeContext.setWidth(newWidth);
+ resizeContext.setHeight(newHeight);
+ resizeFeature.resizeShape(resizeContext);
+ }
+
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutSubProcessFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutExpandableActivityFeature.java
similarity index 95%
rename from org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutSubProcessFeature.java
rename to org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutExpandableActivityFeature.java
index fa67804..45688a0 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutSubProcessFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/LayoutExpandableActivityFeature.java
@@ -1,103 +1,103 @@
-/*******************************************************************************
- * Copyright (c) 2011 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
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
-
-import org.eclipse.bpmn2.SubProcess;
-import org.eclipse.bpmn2.di.BPMNShape;
-import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
-import org.eclipse.bpmn2.modeler.core.features.activity.LayoutActivityFeature;
-import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
-import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.features.IResizeShapeFeature;
-import org.eclipse.graphiti.features.context.ILayoutContext;
-import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;
-import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
-import org.eclipse.graphiti.mm.pictograms.ContainerShape;
-import org.eclipse.graphiti.mm.pictograms.PictogramElement;
-import org.eclipse.graphiti.mm.pictograms.Shape;
-
-public class LayoutSubProcessFeature extends LayoutActivityFeature {
-
- public LayoutSubProcessFeature(IFeatureProvider fp) {
- super(fp);
- }
-
- @Override
- protected boolean layoutHook(Shape shape, GraphicsAlgorithm ga, Object bo, int newWidth, int newHeight) {
-// FIXME whats that supposed to do? it will move label of children to positions where they are not visible
-// if (bo != null && bo instanceof Activity && ga instanceof Text) {
-// Graphiti.getGaService().setLocationAndSize(ga, 5, 5, newWidth - 10, 15);
-// return true;
-// }
- return true;
- }
-
- @Override
- public boolean layout(ILayoutContext context) {
- ContainerShape containerShape = (ContainerShape) context.getPictogramElement();
- SubProcess subProcess = BusinessObjectUtil.getFirstElementOfType(containerShape, SubProcess.class);
- try {
- BPMNShape shape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(subProcess);
-
- if (shape.isIsExpanded()) {
-
- // SubProcess is expanded
-
- boolean needResize = false;
- GraphicsAlgorithm parentGa = containerShape.getGraphicsAlgorithm();
-
- for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
- GraphicsAlgorithm ga = pe.getGraphicsAlgorithm();
- if (ga!=null) {
- if (ga.getX() < 0 || ga.getY() < 0) {
- needResize = true;
- break;
- }
- if (ga.getX() + ga.getWidth() > parentGa.getWidth()) {
- needResize = true;
- break;
- }
- if (ga.getY() + ga.getHeight() > parentGa.getHeight()) {
- needResize = true;
- break;
- }
- }
- }
- if (needResize) {
- ResizeShapeContext resizeContext = new ResizeShapeContext(containerShape);
- resizeContext.setX(parentGa.getX());
- resizeContext.setY(parentGa.getY());
- resizeContext.setWidth(parentGa.getWidth());
- resizeContext.setHeight(parentGa.getHeight());
- IResizeShapeFeature resizeFeature = getFeatureProvider().getResizeShapeFeature(resizeContext);
- resizeFeature.resizeShape(resizeContext);
- }
-
- FeatureSupport.setContainerChildrenVisible(containerShape, true);
- }
- else {
-
- // SubProcess is collapsed
-
- FeatureSupport.setContainerChildrenVisible(containerShape, false);
- }
-
- } catch (Exception e) {
- // It's OK, I've played a programmer before...
- // e.printStackTrace();
- }
-
- return super.layout(context);
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2011 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
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.bpmn2.di.BPMNShape;
+import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
+import org.eclipse.bpmn2.modeler.core.features.activity.LayoutActivityFeature;
+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
+import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.IResizeShapeFeature;
+import org.eclipse.graphiti.features.context.ILayoutContext;
+import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+
+public class LayoutExpandableActivityFeature extends LayoutActivityFeature {
+
+ public LayoutExpandableActivityFeature(IFeatureProvider fp) {
+ super(fp);
+ }
+
+ @Override
+ protected boolean layoutHook(Shape shape, GraphicsAlgorithm ga, Object bo, int newWidth, int newHeight) {
+// FIXME whats that supposed to do? it will move label of children to positions where they are not visible
+// if (bo != null && bo instanceof Activity && ga instanceof Text) {
+// Graphiti.getGaService().setLocationAndSize(ga, 5, 5, newWidth - 10, 15);
+// return true;
+// }
+ return true;
+ }
+
+ @Override
+ public boolean layout(ILayoutContext context) {
+ ContainerShape containerShape = (ContainerShape) context.getPictogramElement();
+ SubProcess subProcess = BusinessObjectUtil.getFirstElementOfType(containerShape, SubProcess.class);
+ try {
+ BPMNShape shape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(subProcess);
+
+ if (shape.isIsExpanded()) {
+
+ // SubProcess is expanded
+
+ boolean needResize = false;
+ GraphicsAlgorithm parentGa = containerShape.getGraphicsAlgorithm();
+
+ for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
+ GraphicsAlgorithm ga = pe.getGraphicsAlgorithm();
+ if (ga!=null) {
+ if (ga.getX() < 0 || ga.getY() < 0) {
+ needResize = true;
+ break;
+ }
+ if (ga.getX() + ga.getWidth() > parentGa.getWidth()) {
+ needResize = true;
+ break;
+ }
+ if (ga.getY() + ga.getHeight() > parentGa.getHeight()) {
+ needResize = true;
+ break;
+ }
+ }
+ }
+ if (needResize) {
+ ResizeShapeContext resizeContext = new ResizeShapeContext(containerShape);
+ resizeContext.setX(parentGa.getX());
+ resizeContext.setY(parentGa.getY());
+ resizeContext.setWidth(parentGa.getWidth());
+ resizeContext.setHeight(parentGa.getHeight());
+ IResizeShapeFeature resizeFeature = getFeatureProvider().getResizeShapeFeature(resizeContext);
+ resizeFeature.resizeShape(resizeContext);
+ }
+
+ FeatureSupport.setContainerChildrenVisible(containerShape, true);
+ }
+ else {
+
+ // SubProcess is collapsed
+
+ FeatureSupport.setContainerChildrenVisible(containerShape, false);
+ }
+
+ } catch (Exception e) {
+ // It's OK, I've played a programmer before...
+ // e.printStackTrace();
+ }
+
+ return super.layout(context);
+ }
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ResizeSubProcessFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ResizeExpandableActivityFeature.java
similarity index 97%
rename from org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ResizeSubProcessFeature.java
rename to org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ResizeExpandableActivityFeature.java
index ba9f6cb..334227b 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ResizeSubProcessFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/ResizeExpandableActivityFeature.java
@@ -1,229 +1,229 @@
-/*******************************************************************************
- * Copyright (c) 2011 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
- *
- * @author Bob Brodt
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
-
-import org.eclipse.bpmn2.Activity;
-import org.eclipse.bpmn2.di.BPMNShape;
-import org.eclipse.bpmn2.modeler.core.Activator;
-import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
-import org.eclipse.bpmn2.modeler.core.features.DefaultResizeBPMNShapeFeature;
-import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
-import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport;
-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.features.context.IResizeShapeContext;
-import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;
-import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
-import org.eclipse.graphiti.mm.pictograms.ContainerShape;
-import org.eclipse.graphiti.mm.pictograms.PictogramElement;
-import org.eclipse.graphiti.services.Graphiti;
-
-public class ResizeSubProcessFeature extends DefaultResizeBPMNShapeFeature {
- public final static int MARGIN = 20;
-
- public ResizeSubProcessFeature(IFeatureProvider fp) {
- super(fp);
- }
-
- @Override
- public void resizeShape(IResizeShapeContext context) {
-
- ResizeShapeContext resizeShapeContext = (ResizeShapeContext)context;
-
- ContainerShape containerShape = (ContainerShape) context.getPictogramElement();
- Activity activity = BusinessObjectUtil.getFirstElementOfType(containerShape, Activity.class);
- try {
- BPMNShape shape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(activity);
-
- if (shape.isIsExpanded()) {
-
- // SubProcess is expanded
-
- GraphicsAlgorithm parentGa = containerShape.getGraphicsAlgorithm();
- int newWidth = resizeShapeContext.getWidth();
- int newHeight = resizeShapeContext.getHeight();
- SizeCalculator sizeCalc = new SizeCalculator(containerShape);
- int shiftX = sizeCalc.shiftX;
- int shiftY = sizeCalc.shiftY;
- int minWidth = sizeCalc.minWidth;
- int minHeight = sizeCalc.minHeight;
-
- if (shiftX < 0) {
- for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
- GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();
- if (childGa!=null) {
- int x = childGa.getX() - shiftX + MARGIN;
- childGa.setX(x);
- }
- }
- resizeShapeContext.setX(resizeShapeContext.getX() + shiftX - MARGIN);
- shiftX = MARGIN;
- }
-
- if (shiftY < 0) {
- for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
- GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();
- if (childGa!=null) {
- int y = childGa.getY() - shiftY + MARGIN;
- childGa.setY(y);
- }
- }
- resizeShapeContext.setY(resizeShapeContext.getY() + shiftY - MARGIN);
- shiftX = MARGIN;
- }
-
- if (shiftX < MARGIN)
- shiftX = MARGIN;
- if (shiftY < MARGIN)
- shiftY = MARGIN;
- minWidth += 2 * MARGIN;
- minHeight += 2 * MARGIN;
-
- if (newWidth < minWidth) {
- parentGa.setWidth(minWidth);
- }
- if (newWidth < shiftX + minWidth) {
- int shift = shiftX + minWidth - newWidth;
- if (shift>shiftX-MARGIN) {
- shift = shiftX-MARGIN;
- }
- if (shift>0) {
- for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
- GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();
- if (childGa!=null) {
- int x = childGa.getX() - shift;
- childGa.setX(x);
- }
- }
- }
- }
- if (newHeight < minHeight) {
- parentGa.setHeight(minHeight);
- }
- if (newHeight < shiftY + minHeight) {
- int shift = shiftY + minHeight - newHeight;
- if (shift>shiftY-MARGIN) {
- shift = shiftY-MARGIN;
- }
- if (shift>0) {
- for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
- GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();
- if (childGa!=null) {
- int y = childGa.getY() - shift;
- childGa.setY(y);
- }
- }
- }
- }
-
- if (resizeShapeContext.getWidth() < minWidth)
- resizeShapeContext.setWidth(minWidth);
- if (resizeShapeContext.getHeight() < minHeight)
- resizeShapeContext.setHeight(minHeight);
- }
- else {
-
- // SubProcess is collapsed
-
- for (PictogramElement pe : FeatureSupport.getContainerDecorators(containerShape)) {
- GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();
- if (childGa!=null) {
- childGa.setWidth(GraphicsUtil.getActivitySize(getDiagram()).getWidth());
- childGa.setHeight(GraphicsUtil.getActivitySize(getDiagram()).getHeight());
- }
- }
-
- resizeShapeContext.setWidth(GraphicsUtil.getActivitySize(getDiagram()).getWidth());
- resizeShapeContext.setHeight(GraphicsUtil.getActivitySize(getDiagram()).getHeight());
- }
-
- } catch (Exception e) {
- Activator.logError(e);
- }
- Graphiti.getPeService().sendToBack(containerShape);
-
- super.resizeShape(context);
- }
-
- public static class SizeCalculator {
-
- int shiftX;
- int shiftY;
- int minWidth;
- int minHeight;
- ContainerShape containerShape;
-
- public SizeCalculator(ContainerShape containerShape) {
- setShape(containerShape);
- }
-
- public void setShape(ContainerShape containerShape) {
- this.containerShape = containerShape;
- calculate();
- }
-
- private void calculate() {
- int minX = Integer.MAX_VALUE;
- int minY = Integer.MAX_VALUE;
- minWidth = 0;
- minHeight = 0;
-
- for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
- GraphicsAlgorithm ga = pe.getGraphicsAlgorithm();
- if (ga!=null) {
- int x = ga.getX();
- int y = ga.getY();
- if (x < minX)
- minX = x;
- if (y < minY)
- minY = y;
- }
- }
-
- shiftX = minX;
- shiftY = minY;
-
- for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
- GraphicsAlgorithm ga = pe.getGraphicsAlgorithm();
- if (ga!=null) {
- int w = ga.getX() - minX + ga.getWidth();
- int h = ga.getY() - minY + ga.getHeight();
- if (w > minWidth)
- minWidth = w;
- if (h > minHeight)
- minHeight = h;
- }
- }
- if (minWidth<=0)
- minWidth = GraphicsUtil.TASK_DEFAULT_WIDTH;
- if (minHeight<=0)
- minHeight = GraphicsUtil.TASK_DEFAULT_HEIGHT;
- }
-
- public int getShiftX() {
- return shiftX;
- }
-
- public int getShiftY() {
- return shiftY;
- }
-
- public int getWidth() {
- return minWidth;
- }
-
- public int getHeight() {
- return minHeight;
- }
- }
-}
+/*******************************************************************************
+ * Copyright (c) 2011 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
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.Activity;
+import org.eclipse.bpmn2.di.BPMNShape;
+import org.eclipse.bpmn2.modeler.core.Activator;
+import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
+import org.eclipse.bpmn2.modeler.core.features.DefaultResizeBPMNShapeFeature;
+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
+import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.IResizeShapeContext;
+import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+
+public class ResizeExpandableActivityFeature extends DefaultResizeBPMNShapeFeature {
+ public final static int MARGIN = 20;
+
+ public ResizeExpandableActivityFeature(IFeatureProvider fp) {
+ super(fp);
+ }
+
+ @Override
+ public void resizeShape(IResizeShapeContext context) {
+
+ ResizeShapeContext resizeShapeContext = (ResizeShapeContext)context;
+
+ ContainerShape containerShape = (ContainerShape) context.getPictogramElement();
+ Activity activity = BusinessObjectUtil.getFirstElementOfType(containerShape, Activity.class);
+ try {
+ BPMNShape shape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(activity);
+
+ if (shape.isIsExpanded()) {
+
+ // SubProcess is expanded
+
+ GraphicsAlgorithm parentGa = containerShape.getGraphicsAlgorithm();
+ int newWidth = resizeShapeContext.getWidth();
+ int newHeight = resizeShapeContext.getHeight();
+ SizeCalculator sizeCalc = new SizeCalculator(containerShape);
+ int shiftX = sizeCalc.shiftX;
+ int shiftY = sizeCalc.shiftY;
+ int minWidth = sizeCalc.minWidth;
+ int minHeight = sizeCalc.minHeight;
+
+ if (shiftX < 0) {
+ for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
+ GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();
+ if (childGa!=null) {
+ int x = childGa.getX() - shiftX + MARGIN;
+ childGa.setX(x);
+ }
+ }
+ resizeShapeContext.setX(resizeShapeContext.getX() + shiftX - MARGIN);
+ shiftX = MARGIN;
+ }
+
+ if (shiftY < 0) {
+ for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
+ GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();
+ if (childGa!=null) {
+ int y = childGa.getY() - shiftY + MARGIN;
+ childGa.setY(y);
+ }
+ }
+ resizeShapeContext.setY(resizeShapeContext.getY() + shiftY - MARGIN);
+ shiftX = MARGIN;
+ }
+
+ if (shiftX < MARGIN)
+ shiftX = MARGIN;
+ if (shiftY < MARGIN)
+ shiftY = MARGIN;
+ minWidth += 2 * MARGIN;
+ minHeight += 2 * MARGIN;
+
+ if (newWidth < minWidth) {
+ parentGa.setWidth(minWidth);
+ }
+ if (newWidth < shiftX + minWidth) {
+ int shift = shiftX + minWidth - newWidth;
+ if (shift>shiftX-MARGIN) {
+ shift = shiftX-MARGIN;
+ }
+ if (shift>0) {
+ for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
+ GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();
+ if (childGa!=null) {
+ int x = childGa.getX() - shift;
+ childGa.setX(x);
+ }
+ }
+ }
+ }
+ if (newHeight < minHeight) {
+ parentGa.setHeight(minHeight);
+ }
+ if (newHeight < shiftY + minHeight) {
+ int shift = shiftY + minHeight - newHeight;
+ if (shift>shiftY-MARGIN) {
+ shift = shiftY-MARGIN;
+ }
+ if (shift>0) {
+ for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
+ GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();
+ if (childGa!=null) {
+ int y = childGa.getY() - shift;
+ childGa.setY(y);
+ }
+ }
+ }
+ }
+
+ if (resizeShapeContext.getWidth() < minWidth)
+ resizeShapeContext.setWidth(minWidth);
+ if (resizeShapeContext.getHeight() < minHeight)
+ resizeShapeContext.setHeight(minHeight);
+ }
+ else {
+
+ // SubProcess is collapsed
+
+ for (PictogramElement pe : FeatureSupport.getContainerDecorators(containerShape)) {
+ GraphicsAlgorithm childGa = pe.getGraphicsAlgorithm();
+ if (childGa!=null) {
+ childGa.setWidth(GraphicsUtil.getActivitySize(getDiagram()).getWidth());
+ childGa.setHeight(GraphicsUtil.getActivitySize(getDiagram()).getHeight());
+ }
+ }
+
+ resizeShapeContext.setWidth(GraphicsUtil.getActivitySize(getDiagram()).getWidth());
+ resizeShapeContext.setHeight(GraphicsUtil.getActivitySize(getDiagram()).getHeight());
+ }
+
+ } catch (Exception e) {
+ Activator.logError(e);
+ }
+ Graphiti.getPeService().sendToBack(containerShape);
+
+ super.resizeShape(context);
+ }
+
+ public static class SizeCalculator {
+
+ int shiftX;
+ int shiftY;
+ int minWidth;
+ int minHeight;
+ ContainerShape containerShape;
+
+ public SizeCalculator(ContainerShape containerShape) {
+ setShape(containerShape);
+ }
+
+ public void setShape(ContainerShape containerShape) {
+ this.containerShape = containerShape;
+ calculate();
+ }
+
+ private void calculate() {
+ int minX = Integer.MAX_VALUE;
+ int minY = Integer.MAX_VALUE;
+ minWidth = 0;
+ minHeight = 0;
+
+ for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
+ GraphicsAlgorithm ga = pe.getGraphicsAlgorithm();
+ if (ga!=null) {
+ int x = ga.getX();
+ int y = ga.getY();
+ if (x < minX)
+ minX = x;
+ if (y < minY)
+ minY = y;
+ }
+ }
+
+ shiftX = minX;
+ shiftY = minY;
+
+ for (PictogramElement pe : FeatureSupport.getContainerChildren(containerShape)) {
+ GraphicsAlgorithm ga = pe.getGraphicsAlgorithm();
+ if (ga!=null) {
+ int w = ga.getX() - minX + ga.getWidth();
+ int h = ga.getY() - minY + ga.getHeight();
+ if (w > minWidth)
+ minWidth = w;
+ if (h > minHeight)
+ minHeight = h;
+ }
+ }
+ if (minWidth<=0)
+ minWidth = GraphicsUtil.TASK_DEFAULT_WIDTH;
+ if (minHeight<=0)
+ minHeight = GraphicsUtil.TASK_DEFAULT_HEIGHT;
+ }
+
+ public int getShiftX() {
+ return shiftX;
+ }
+
+ public int getShiftY() {
+ return shiftY;
+ }
+
+ public int getWidth() {
+ return minWidth;
+ }
+
+ public int getHeight() {
+ return minHeight;
+ }
+ }
+}
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/SubProcessFeatureContainer.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/SubProcessFeatureContainer.java
index 4602c9a..0cc9133 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/SubProcessFeatureContainer.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/SubProcessFeatureContainer.java
@@ -1,90 +1,79 @@
-/*******************************************************************************
- * Copyright (c) 2011 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
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
-
-import org.eclipse.bpmn2.AdHocSubProcess;
-import org.eclipse.bpmn2.Bpmn2Package;
-import org.eclipse.bpmn2.SubChoreography;
-import org.eclipse.bpmn2.SubProcess;
-import org.eclipse.bpmn2.Transaction;
-import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
-import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;
-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
-import org.eclipse.bpmn2.modeler.ui.ImageProvider;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.graphiti.features.IAddFeature;
-import org.eclipse.graphiti.features.ICreateFeature;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.features.context.ICreateContext;
-import org.eclipse.graphiti.features.custom.ICustomFeature;
-
-public class SubProcessFeatureContainer extends AbstractSubProcessFeatureContainer {
-
- public static final String TRIGGERED_BY_EVENT = "triggered-by-event-key";
- public static final String IS_EXPANDED = "is-expanded-key";
-
- @Override
- public boolean canApplyTo(Object o) {
- return super.canApplyTo(o) && o instanceof SubProcess &&
- !(o instanceof AdHocSubProcess || o instanceof Transaction);
- }
-
- @Override
- public ICreateFeature getCreateFeature(IFeatureProvider fp) {
- return new CreateSubProcessFeature(fp);
- }
-
- @Override
- public IAddFeature getAddFeature(IFeatureProvider fp) {
- return new AddExpandedActivityFeature<SubProcess>(fp);
- }
-
- @Override
- public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
- MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
- UpdateSubProcessFeature updateSubProcessFeature = new UpdateSubProcessFeature(fp);
- multiUpdate.addUpdateFeature(updateSubProcessFeature);
- return multiUpdate;
- }
-
- @Override
- public ICustomFeature[] getCustomFeatures(IFeatureProvider fp) {
- ICustomFeature[] superFeatures = super.getCustomFeatures(fp);
- ICustomFeature[] thisFeatures = new ICustomFeature[2 + superFeatures.length];
- thisFeatures[0] = new ExpandSubProcessFeature(fp);
- thisFeatures[1] = new CollapseSubProcessFeature(fp);
- for (int i=0; i<superFeatures.length; ++i)
- thisFeatures[2+i] = superFeatures[i];
- return thisFeatures;
- }
-
- public static class CreateSubProcessFeature extends AbstractCreateExpandableFlowNodeFeature<SubProcess> {
-
- public CreateSubProcessFeature(IFeatureProvider fp) {
- super(fp, "Sub-Process", "Inner activity");
- }
-
- @Override
- protected String getStencilImageId() {
- return ImageProvider.IMG_16_SUB_PROCESS;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()
- */
- @Override
- public EClass getBusinessObjectClass() {
- return Bpmn2Package.eINSTANCE.getSubProcess();
- }
- }
+/*******************************************************************************
+ * Copyright (c) 2011 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
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.AdHocSubProcess;
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.SubChoreography;
+import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.bpmn2.Transaction;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
+import org.eclipse.bpmn2.modeler.ui.ImageProvider;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.graphiti.features.IAddFeature;
+import org.eclipse.graphiti.features.ICreateFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.ICreateContext;
+import org.eclipse.graphiti.features.custom.ICustomFeature;
+
+public class SubProcessFeatureContainer extends AbstractExpandableActivityFeatureContainer {
+
+ public static final String TRIGGERED_BY_EVENT = "triggered-by-event-key";
+ public static final String IS_EXPANDED = "is-expanded-key";
+
+ @Override
+ public boolean canApplyTo(Object o) {
+ return super.canApplyTo(o) && o instanceof SubProcess &&
+ !(o instanceof AdHocSubProcess || o instanceof Transaction);
+ }
+
+ @Override
+ public ICreateFeature getCreateFeature(IFeatureProvider fp) {
+ return new CreateSubProcessFeature(fp);
+ }
+
+ @Override
+ public IAddFeature getAddFeature(IFeatureProvider fp) {
+ return new AddExpandableActivityFeature<SubProcess>(fp);
+ }
+
+ @Override
+ public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+ MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
+ UpdateExpandableActivityFeature updateFeature = new UpdateExpandableActivityFeature(fp);
+ multiUpdate.addUpdateFeature(updateFeature);
+ return multiUpdate;
+ }
+
+ public static class CreateSubProcessFeature extends AbstractCreateExpandableFlowNodeFeature<SubProcess> {
+
+ public CreateSubProcessFeature(IFeatureProvider fp) {
+ super(fp, "Sub-Process", "Inner activity");
+ }
+
+ @Override
+ protected String getStencilImageId() {
+ return ImageProvider.IMG_16_SUB_PROCESS;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()
+ */
+ @Override
+ public EClass getBusinessObjectClass() {
+ return Bpmn2Package.eINSTANCE.getSubProcess();
+ }
+ }
}
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/TransactionFeatureContainer.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/TransactionFeatureContainer.java
index 0d7a338..c315fed 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/TransactionFeatureContainer.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/TransactionFeatureContainer.java
@@ -1,103 +1,112 @@
-/*******************************************************************************
- * Copyright (c) 2011 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
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
-
-import org.eclipse.bpmn2.Bpmn2Package;
-import org.eclipse.bpmn2.Transaction;
-import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;
-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
-import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
-import org.eclipse.bpmn2.modeler.ui.ImageProvider;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.graphiti.features.IAddFeature;
-import org.eclipse.graphiti.features.ICreateFeature;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.features.ILayoutFeature;
-import org.eclipse.graphiti.features.context.ICreateContext;
-import org.eclipse.graphiti.mm.algorithms.RoundedRectangle;
-import org.eclipse.graphiti.services.Graphiti;
-import org.eclipse.graphiti.services.IGaService;
-
-public class TransactionFeatureContainer extends AbstractSubProcessFeatureContainer {
-
- private static final int offset = 3;
-
- @Override
- public boolean canApplyTo(Object o) {
- return super.canApplyTo(o) && o instanceof Transaction;
- }
-
- @Override
- public ICreateFeature getCreateFeature(IFeatureProvider fp) {
- return new CreateTransactionFeature(fp);
- }
-
- @Override
- public IAddFeature getAddFeature(IFeatureProvider fp) {
- return new AddExpandedActivityFeature<Transaction>(fp) {
-
- @Override
- protected void decorateActivityRectangle(RoundedRectangle rect) {
- IGaService gaService = Graphiti.getGaService();
- RoundedRectangle innerRect = gaService.createRoundedRectangle(rect, 5, 5);
- innerRect.setFilled(false);
- innerRect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
- gaService.setLocationAndSize(innerRect, offset, offset, rect.getWidth() - (2 * offset),
- rect.getHeight() - (2 * offset));
- }
-
- @Override
- protected int getMarkerContainerOffset() {
- return offset;
- }
- };
- }
-
- @Override
- public ILayoutFeature getLayoutFeature(IFeatureProvider fp) {
- return new LayoutSubProcessFeature(fp) {
- @Override
- protected void layoutInRectangle(RoundedRectangle rect) {
- IGaService gaService = Graphiti.getGaService();
- RoundedRectangle innerRect = (RoundedRectangle) rect.getGraphicsAlgorithmChildren().get(0);
- gaService.setSize(innerRect, rect.getWidth() - 6, rect.getHeight() - 6);
- }
-
- @Override
- protected int getMarkerContainerOffset() {
- return offset;
- }
- };
- }
-
- public static class CreateTransactionFeature extends AbstractCreateExpandableFlowNodeFeature<Transaction> {
-
- public CreateTransactionFeature(IFeatureProvider fp) {
- super(fp, "Transaction",
- "Specialized description of sub-process that will have behavior controlled by transaction protocol");
- }
-
- @Override
- protected String getStencilImageId() {
- return ImageProvider.IMG_16_TRANSACTION;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()
- */
- @Override
- public EClass getBusinessObjectClass() {
- return Bpmn2Package.eINSTANCE.getTransaction();
- }
- }
+/*******************************************************************************
+ * Copyright (c) 2011 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
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.Transaction;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.core.features.activity.AbstractCreateExpandableFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
+import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
+import org.eclipse.bpmn2.modeler.ui.ImageProvider;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.graphiti.features.IAddFeature;
+import org.eclipse.graphiti.features.ICreateFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.ILayoutFeature;
+import org.eclipse.graphiti.features.context.ICreateContext;
+import org.eclipse.graphiti.mm.algorithms.RoundedRectangle;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.services.IGaService;
+
+public class TransactionFeatureContainer extends AbstractExpandableActivityFeatureContainer {
+
+ private static final int offset = 3;
+
+ @Override
+ public boolean canApplyTo(Object o) {
+ return super.canApplyTo(o) && o instanceof Transaction;
+ }
+
+ @Override
+ public ICreateFeature getCreateFeature(IFeatureProvider fp) {
+ return new CreateTransactionFeature(fp);
+ }
+
+ @Override
+ public IAddFeature getAddFeature(IFeatureProvider fp) {
+ return new AddExpandableActivityFeature<Transaction>(fp) {
+
+ @Override
+ protected void decorateActivityRectangle(RoundedRectangle rect) {
+ IGaService gaService = Graphiti.getGaService();
+ RoundedRectangle innerRect = gaService.createRoundedRectangle(rect, 5, 5);
+ innerRect.setFilled(false);
+ innerRect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+ gaService.setLocationAndSize(innerRect, offset, offset, rect.getWidth() - (2 * offset),
+ rect.getHeight() - (2 * offset));
+ }
+
+ @Override
+ protected int getMarkerContainerOffset() {
+ return offset;
+ }
+ };
+ }
+
+ @Override
+ public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+ MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
+ UpdateExpandableActivityFeature updateFeature = new UpdateExpandableActivityFeature(fp);
+ multiUpdate.addUpdateFeature(updateFeature);
+ return multiUpdate;
+ }
+
+ @Override
+ public ILayoutFeature getLayoutFeature(IFeatureProvider fp) {
+ return new LayoutExpandableActivityFeature(fp) {
+ @Override
+ protected void layoutInRectangle(RoundedRectangle rect) {
+ IGaService gaService = Graphiti.getGaService();
+ RoundedRectangle innerRect = (RoundedRectangle) rect.getGraphicsAlgorithmChildren().get(0);
+ gaService.setSize(innerRect, rect.getWidth() - 6, rect.getHeight() - 6);
+ }
+
+ @Override
+ protected int getMarkerContainerOffset() {
+ return offset;
+ }
+ };
+ }
+
+ public static class CreateTransactionFeature extends AbstractCreateExpandableFlowNodeFeature<Transaction> {
+
+ public CreateTransactionFeature(IFeatureProvider fp) {
+ super(fp, "Transaction",
+ "Specialized sub-process that will have behavior controlled by transaction protocol");
+ }
+
+ @Override
+ protected String getStencilImageId() {
+ return ImageProvider.IMG_16_TRANSACTION;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()
+ */
+ @Override
+ public EClass getBusinessObjectClass() {
+ return Bpmn2Package.eINSTANCE.getTransaction();
+ }
+ }
}
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateSubProcessFeature.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateExpandableActivityFeature.java
similarity index 95%
rename from org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateSubProcessFeature.java
rename to org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateExpandableActivityFeature.java
index 4c91aaf..38a741f 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateSubProcessFeature.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/activity/subprocess/UpdateExpandableActivityFeature.java
@@ -1,114 +1,114 @@
-/*******************************************************************************
- * Copyright (c) 2011 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
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
-
-import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.TRIGGERED_BY_EVENT;
-import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.IS_EXPANDED;
-
-import java.io.IOException;
-
-import org.eclipse.bpmn2.SubProcess;
-import org.eclipse.bpmn2.di.BPMNShape;
-import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
-import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport;
-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
-import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
-import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.Expand;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.features.IReason;
-import org.eclipse.graphiti.features.context.IUpdateContext;
-import org.eclipse.graphiti.features.impl.AbstractUpdateFeature;
-import org.eclipse.graphiti.features.impl.Reason;
-import org.eclipse.graphiti.mm.Property;
-import org.eclipse.graphiti.mm.algorithms.RoundedRectangle;
-import org.eclipse.graphiti.mm.algorithms.styles.LineStyle;
-import org.eclipse.graphiti.mm.pictograms.ContainerShape;
-import org.eclipse.graphiti.services.Graphiti;
-
-public class UpdateSubProcessFeature extends AbstractUpdateFeature {
-
- public UpdateSubProcessFeature(IFeatureProvider fp) {
- super(fp);
- }
-
- @Override
- public boolean canUpdate(IUpdateContext context) {
- Object bo = getBusinessObjectForPictogramElement(context.getPictogramElement());
- return bo != null && bo instanceof SubProcess;
- }
-
- @Override
- public IReason updateNeeded(IUpdateContext context) {
- Property triggerProperty = Graphiti.getPeService().getProperty(context.getPictogramElement(),
- TRIGGERED_BY_EVENT);
- Property expandedProperty = Graphiti.getPeService().getProperty(context.getPictogramElement(),
- IS_EXPANDED);
-
- SubProcess process = (SubProcess) getBusinessObjectForPictogramElement(context.getPictogramElement());
- try {
- BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(process);
- if (expandedProperty != null && Boolean.parseBoolean(expandedProperty.getValue()) != bpmnShape.isIsExpanded()) {
- return Reason.createTrueReason("Expanded property changed");
- }
-
- } catch (Exception e) {
- throw new IllegalStateException("Could not get DI shape for subprocess:"+process);
- }
-
- if (triggerProperty != null && Boolean.parseBoolean(triggerProperty.getValue()) != process.isTriggeredByEvent()) {
- return Reason.createTrueReason("Trigger property changed");
- }
-
- return Reason.createFalseReason();
- }
-
- @Override
- public boolean update(IUpdateContext context) {
- SubProcess process = (SubProcess) getBusinessObjectForPictogramElement(context.getPictogramElement());
- ContainerShape container = (ContainerShape) context.getPictogramElement();
- ContainerShape markerContainer = (ContainerShape) GraphicsUtil.getShape(container,
- GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
- boolean isExpanded = false;
-
- try {
- BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(process);
- isExpanded =bpmnShape.isIsExpanded();
- } catch (IOException e) {
- throw new IllegalStateException("Could not get DI shape for subprocess:"+process);
- }
- Graphiti.getPeService().setPropertyValue(context.getPictogramElement(), TRIGGERED_BY_EVENT,
- Boolean.toString(process.isTriggeredByEvent()));
- Graphiti.getPeService().setPropertyValue(context.getPictogramElement(), IS_EXPANDED,
- Boolean.toString(isExpanded));
-
- RoundedRectangle rectangle = (RoundedRectangle) Graphiti.getPeService()
- .getAllContainedPictogramElements(context.getPictogramElement()).iterator().next()
- .getGraphicsAlgorithm();
- LineStyle lineStyle = process.isTriggeredByEvent() ? LineStyle.DOT : LineStyle.SOLID;
- rectangle.setLineStyle(lineStyle);
-
- if(!isExpanded){
- FeatureSupport.setContainerChildrenVisible(container, false);
-
- Expand expand = GraphicsUtil.createActivityMarkerExpand(markerContainer);
- expand.rect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
- expand.horizontal.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
- expand.vertical.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
- }else{
- GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
- FeatureSupport.setContainerChildrenVisible(container, true);
- }
-
- return true;
- }
+/*******************************************************************************
+ * Copyright (c) 2011 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
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.activity.subprocess;
+
+import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.TRIGGERED_BY_EVENT;
+import static org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.SubProcessFeatureContainer.IS_EXPANDED;
+
+import java.io.IOException;
+
+import org.eclipse.bpmn2.SubProcess;
+import org.eclipse.bpmn2.di.BPMNShape;
+import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
+import org.eclipse.bpmn2.modeler.core.utils.FeatureSupport;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil;
+import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
+import org.eclipse.bpmn2.modeler.core.utils.GraphicsUtil.Expand;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.IReason;
+import org.eclipse.graphiti.features.context.IUpdateContext;
+import org.eclipse.graphiti.features.impl.AbstractUpdateFeature;
+import org.eclipse.graphiti.features.impl.Reason;
+import org.eclipse.graphiti.mm.Property;
+import org.eclipse.graphiti.mm.algorithms.RoundedRectangle;
+import org.eclipse.graphiti.mm.algorithms.styles.LineStyle;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.services.Graphiti;
+
+public class UpdateExpandableActivityFeature extends AbstractUpdateFeature {
+
+ public UpdateExpandableActivityFeature(IFeatureProvider fp) {
+ super(fp);
+ }
+
+ @Override
+ public boolean canUpdate(IUpdateContext context) {
+ Object bo = getBusinessObjectForPictogramElement(context.getPictogramElement());
+ return AbstractExpandableActivityFeatureContainer.isExpandableElement(bo);
+ }
+
+ @Override
+ public IReason updateNeeded(IUpdateContext context) {
+ Property triggerProperty = Graphiti.getPeService().getProperty(context.getPictogramElement(),
+ TRIGGERED_BY_EVENT);
+ Property expandedProperty = Graphiti.getPeService().getProperty(context.getPictogramElement(),
+ IS_EXPANDED);
+
+ SubProcess process = (SubProcess) getBusinessObjectForPictogramElement(context.getPictogramElement());
+ try {
+ BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(process);
+ if (expandedProperty != null && Boolean.parseBoolean(expandedProperty.getValue()) != bpmnShape.isIsExpanded()) {
+ return Reason.createTrueReason("Expanded property changed");
+ }
+
+ } catch (Exception e) {
+ throw new IllegalStateException("Could not get DI shape for subprocess:"+process);
+ }
+
+ if (triggerProperty != null && Boolean.parseBoolean(triggerProperty.getValue()) != process.isTriggeredByEvent()) {
+ return Reason.createTrueReason("Trigger property changed");
+ }
+
+ return Reason.createFalseReason();
+ }
+
+ @Override
+ public boolean update(IUpdateContext context) {
+ SubProcess process = (SubProcess) getBusinessObjectForPictogramElement(context.getPictogramElement());
+ ContainerShape container = (ContainerShape) context.getPictogramElement();
+ ContainerShape markerContainer = (ContainerShape) GraphicsUtil.getShape(container,
+ GraphicsUtil.ACTIVITY_MARKER_CONTAINER);
+ boolean isExpanded = false;
+
+ try {
+ BPMNShape bpmnShape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(process);
+ isExpanded =bpmnShape.isIsExpanded();
+ } catch (IOException e) {
+ throw new IllegalStateException("Could not get DI shape for subprocess:"+process);
+ }
+ Graphiti.getPeService().setPropertyValue(context.getPictogramElement(), TRIGGERED_BY_EVENT,
+ Boolean.toString(process.isTriggeredByEvent()));
+ Graphiti.getPeService().setPropertyValue(context.getPictogramElement(), IS_EXPANDED,
+ Boolean.toString(isExpanded));
+
+ RoundedRectangle rectangle = (RoundedRectangle) Graphiti.getPeService()
+ .getAllContainedPictogramElements(context.getPictogramElement()).iterator().next()
+ .getGraphicsAlgorithm();
+ LineStyle lineStyle = process.isTriggeredByEvent() ? LineStyle.DOT : LineStyle.SOLID;
+ rectangle.setLineStyle(lineStyle);
+
+ if(!isExpanded){
+ FeatureSupport.setContainerChildrenVisible(container, false);
+
+ Expand expand = GraphicsUtil.createActivityMarkerExpand(markerContainer);
+ expand.rect.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+ expand.horizontal.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+ expand.vertical.setForeground(manageColor(StyleUtil.CLASS_FOREGROUND));
+ }else{
+ GraphicsUtil.clearActivityMarker(markerContainer, GraphicsUtil.ACTIVITY_MARKER_EXPAND);
+ FeatureSupport.setContainerChildrenVisible(container, true);
+ }
+
+ return true;
+ }
}
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/ChoreographyTaskFeatureContainer.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/ChoreographyTaskFeatureContainer.java
index 9f5e754..d6260c5 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/ChoreographyTaskFeatureContainer.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/features/choreography/ChoreographyTaskFeatureContainer.java
@@ -1,163 +1,163 @@
-/*******************************************************************************
- * Copyright (c) 2011 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
- *
- * @author Innar Made
- ******************************************************************************/
-package org.eclipse.bpmn2.modeler.ui.features.choreography;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.bpmn2.BaseElement;
-import org.eclipse.bpmn2.Bpmn2Package;
-import org.eclipse.bpmn2.ChoreographyLoopType;
-import org.eclipse.bpmn2.ChoreographyTask;
-import org.eclipse.bpmn2.MessageFlow;
-import org.eclipse.bpmn2.Participant;
-import org.eclipse.bpmn2.di.BPMNShape;
-import org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature;
-import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
-import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
-import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
-import org.eclipse.bpmn2.modeler.ui.ImageProvider;
-import org.eclipse.bpmn2.modeler.ui.features.AbstractDefaultDeleteFeature;
-import org.eclipse.bpmn2.modeler.ui.features.activity.AppendActivityFeature;
-import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.CollapseSubProcessFeature;
-import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.ExpandSubProcessFeature;
-import org.eclipse.bpmn2.modeler.ui.features.event.AppendEventFeature;
-import org.eclipse.bpmn2.modeler.ui.features.gateway.AppendGatewayFeature;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.graphiti.features.IAddFeature;
-import org.eclipse.graphiti.features.ICreateFeature;
-import org.eclipse.graphiti.features.IDeleteFeature;
-import org.eclipse.graphiti.features.IFeatureProvider;
-import org.eclipse.graphiti.features.context.ICreateContext;
-import org.eclipse.graphiti.features.context.IDeleteContext;
-import org.eclipse.graphiti.features.context.IPictogramElementContext;
-import org.eclipse.graphiti.features.context.impl.DeleteContext;
-import org.eclipse.graphiti.features.custom.ICustomFeature;
-import org.eclipse.graphiti.mm.pictograms.Anchor;
-import org.eclipse.graphiti.mm.pictograms.Connection;
-import org.eclipse.graphiti.mm.pictograms.ContainerShape;
-import org.eclipse.graphiti.mm.pictograms.PictogramElement;
-import org.eclipse.graphiti.services.Graphiti;
-
-public class ChoreographyTaskFeatureContainer extends AbstractChoreographyFeatureContainer {
-
- @Override
- public boolean canApplyTo(Object o) {
- return super.canApplyTo(o) && o instanceof ChoreographyTask;
- }
-
- @Override
- public ICreateFeature getCreateFeature(IFeatureProvider fp) {
- return new CreateChoreographyTaskFeature(fp);
- }
-
- @Override
- public IAddFeature getAddFeature(IFeatureProvider fp) {
- return new AddChoreographyTaskFeature(fp);
- }
-
- @Override
- public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
- MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
- multiUpdate.addUpdateFeature(new UpdateChoreographyMessageFlowFeature(fp));
- return multiUpdate;
- }
-
- @Override
- public IDeleteFeature getDeleteFeature(IFeatureProvider fp) {
- return new AbstractDefaultDeleteFeature(fp) {
-
- @Override
- protected void deletePeEnvironment(PictogramElement pictogramElement){
- if (pictogramElement instanceof ContainerShape) {
- ContainerShape cShape = (ContainerShape) pictogramElement;
- EList<Anchor> anchors = cShape.getAnchors();
- for (Anchor anchor : anchors) {
- deleteConnections(getFeatureProvider(), anchor.getIncomingConnections());
- deleteConnections(getFeatureProvider(), anchor.getOutgoingConnections());
- }
- deleteContainer(getFeatureProvider(), cShape);
- }
- }
-
- @Override
- protected void deleteConnections(IFeatureProvider fp, EList<Connection> connections) {
- List<Connection> con = new ArrayList<Connection>();
- con.addAll(connections);
- for (Connection connection : con) {
- // if this is a messageflow, delete the message figure as well
- BaseElement be = BusinessObjectUtil.getFirstElementOfType(connection, BaseElement.class);
- if (be instanceof MessageFlow) {
- EObject msg = connection.getEnd().eContainer();
- if (msg instanceof PictogramElement) {
- Graphiti.getPeService().deletePictogramElement((PictogramElement)msg);
- }
- }
- IDeleteContext conDelete = new DeleteContext(connection);
- IDeleteFeature df = fp.getDeleteFeature(conDelete);
- df.delete(conDelete);
- }
- }
-
- @Override
- protected void deleteContainer(IFeatureProvider fp, ContainerShape cShape) {
- Object[] children = cShape.getChildren().toArray();
- for (Object shape : children) {
- if (shape instanceof ContainerShape) {
- ContainerShape cs = (ContainerShape)shape;
- BaseElement be = BusinessObjectUtil.getFirstElementOfType(cs, BaseElement.class);
- if (be instanceof Participant) {
- BPMNShape bs = BusinessObjectUtil.getFirstElementOfType(cs, BPMNShape.class);
- Graphiti.getPeService().deletePictogramElement(cs);
- if (bs!=null)
- deleteBusinessObject(bs);
- }
- }
- }
- }
- };
- }
-
- @Override
- public ICustomFeature[] getCustomFeatures(IFeatureProvider fp) {
- ICustomFeature[] superFeatures = super.getCustomFeatures(fp);
- ICustomFeature[] thisFeatures = new ICustomFeature[1 + superFeatures.length];
- int i;
- for (i=0; i<superFeatures.length; ++i)
- thisFeatures[i] = superFeatures[i];
- thisFeatures[i++] = new AddChoreographyParticipantFeature(fp);
- return thisFeatures;
- }
-
- public static class CreateChoreographyTaskFeature extends AbstractCreateFlowElementFeature<ChoreographyTask> {
-
- public CreateChoreographyTaskFeature(IFeatureProvider fp) {
- super(fp, "Choreography Task", "Represents interactions between two participants");
- }
-
- @Override
- public String getStencilImageId() {
- return ImageProvider.IMG_16_CHOREOGRAPHY_TASK;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()
- */
- @Override
- public EClass getBusinessObjectClass() {
- return Bpmn2Package.eINSTANCE.getChoreographyTask();
- }
- }
+/*******************************************************************************
+ * Copyright (c) 2011 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
+ *
+ * @author Innar Made
+ ******************************************************************************/
+package org.eclipse.bpmn2.modeler.ui.features.choreography;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.bpmn2.BaseElement;
+import org.eclipse.bpmn2.Bpmn2Package;
+import org.eclipse.bpmn2.ChoreographyLoopType;
+import org.eclipse.bpmn2.ChoreographyTask;
+import org.eclipse.bpmn2.MessageFlow;
+import org.eclipse.bpmn2.Participant;
+import org.eclipse.bpmn2.di.BPMNShape;
+import org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature;
+import org.eclipse.bpmn2.modeler.core.features.MultiUpdateFeature;
+import org.eclipse.bpmn2.modeler.core.model.Bpmn2ModelerFactory;
+import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
+import org.eclipse.bpmn2.modeler.ui.ImageProvider;
+import org.eclipse.bpmn2.modeler.ui.features.AbstractDefaultDeleteFeature;
+import org.eclipse.bpmn2.modeler.ui.features.activity.AppendActivityFeature;
+import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.CollapseFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.ui.features.activity.subprocess.ExpandFlowNodeFeature;
+import org.eclipse.bpmn2.modeler.ui.features.event.AppendEventFeature;
+import org.eclipse.bpmn2.modeler.ui.features.gateway.AppendGatewayFeature;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.features.IAddFeature;
+import org.eclipse.graphiti.features.ICreateFeature;
+import org.eclipse.graphiti.features.IDeleteFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.ICreateContext;
+import org.eclipse.graphiti.features.context.IDeleteContext;
+import org.eclipse.graphiti.features.context.IPictogramElementContext;
+import org.eclipse.graphiti.features.context.impl.DeleteContext;
+import org.eclipse.graphiti.features.custom.ICustomFeature;
+import org.eclipse.graphiti.mm.pictograms.Anchor;
+import org.eclipse.graphiti.mm.pictograms.Connection;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+
+public class ChoreographyTaskFeatureContainer extends AbstractChoreographyFeatureContainer {
+
+ @Override
+ public boolean canApplyTo(Object o) {
+ return super.canApplyTo(o) && o instanceof ChoreographyTask;
+ }
+
+ @Override
+ public ICreateFeature getCreateFeature(IFeatureProvider fp) {
+ return new CreateChoreographyTaskFeature(fp);
+ }
+
+ @Override
+ public IAddFeature getAddFeature(IFeatureProvider fp) {
+ return new AddChoreographyTaskFeature(fp);
+ }
+
+ @Override
+ public MultiUpdateFeature getUpdateFeature(IFeatureProvider fp) {
+ MultiUpdateFeature multiUpdate = super.getUpdateFeature(fp);
+ multiUpdate.addUpdateFeature(new UpdateChoreographyMessageFlowFeature(fp));
+ return multiUpdate;
+ }
+
+ @Override
+ public IDeleteFeature getDeleteFeature(IFeatureProvider fp) {
+ return new AbstractDefaultDeleteFeature(fp) {
+
+ @Override
+ protected void deletePeEnvironment(PictogramElement pictogramElement){
+ if (pictogramElement instanceof ContainerShape) {
+ ContainerShape cShape = (ContainerShape) pictogramElement;
+ EList<Anchor> anchors = cShape.getAnchors();
+ for (Anchor anchor : anchors) {
+ deleteConnections(getFeatureProvider(), anchor.getIncomingConnections());
+ deleteConnections(getFeatureProvider(), anchor.getOutgoingConnections());
+ }
+ deleteContainer(getFeatureProvider(), cShape);
+ }
+ }
+
+ @Override
+ protected void deleteConnections(IFeatureProvider fp, EList<Connection> connections) {
+ List<Connection> con = new ArrayList<Connection>();
+ con.addAll(connections);
+ for (Connection connection : con) {
+ // if this is a messageflow, delete the message figure as well
+ BaseElement be = BusinessObjectUtil.getFirstElementOfType(connection, BaseElement.class);
+ if (be instanceof MessageFlow) {
+ EObject msg = connection.getEnd().eContainer();
+ if (msg instanceof PictogramElement) {
+ Graphiti.getPeService().deletePictogramElement((PictogramElement)msg);
+ }
+ }
+ IDeleteContext conDelete = new DeleteContext(connection);
+ IDeleteFeature df = fp.getDeleteFeature(conDelete);
+ df.delete(conDelete);
+ }
+ }
+
+ @Override
+ protected void deleteContainer(IFeatureProvider fp, ContainerShape cShape) {
+ Object[] children = cShape.getChildren().toArray();
+ for (Object shape : children) {
+ if (shape instanceof ContainerShape) {
+ ContainerShape cs = (ContainerShape)shape;
+ BaseElement be = BusinessObjectUtil.getFirstElementOfType(cs, BaseElement.class);
+ if (be instanceof Participant) {
+ BPMNShape bs = BusinessObjectUtil.getFirstElementOfType(cs, BPMNShape.class);
+ Graphiti.getPeService().deletePictogramElement(cs);
+ if (bs!=null)
+ deleteBusinessObject(bs);
+ }
+ }
+ }
+ }
+ };
+ }
+
+ @Override
+ public ICustomFeature[] getCustomFeatures(IFeatureProvider fp) {
+ ICustomFeature[] superFeatures = super.getCustomFeatures(fp);
+ ICustomFeature[] thisFeatures = new ICustomFeature[1 + superFeatures.length];
+ int i;
+ for (i=0; i<superFeatures.length; ++i)
+ thisFeatures[i] = superFeatures[i];
+ thisFeatures[i++] = new AddChoreographyParticipantFeature(fp);
+ return thisFeatures;
+ }
+
+ public static class CreateChoreographyTaskFeature extends AbstractCreateFlowElementFeature<ChoreographyTask> {
+
+ public CreateChoreographyTaskFeature(IFeatureProvider fp) {
+ super(fp, "Choreography Task", "Represents interactions between two participants");
+ }
+
+ @Override
+ public String getStencilImageId() {
+ return ImageProvider.IMG_16_CHOREOGRAPHY_TASK;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.bpmn2.modeler.core.features.AbstractCreateFlowElementFeature#getFlowElementClass()
+ */
+ @Override
+ public EClass getBusinessObjectClass() {
+ return Bpmn2Package.eINSTANCE.getChoreographyTask();
+ }
+ }
}
\ No newline at end of file
diff --git a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/SubProcessDetailComposite.java b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/SubProcessDetailComposite.java
index 418b775..ba643a2 100644
--- a/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/SubProcessDetailComposite.java
+++ b/org.eclipse.bpmn2.modeler.ui/src/org/eclipse/bpmn2/modeler/ui/property/tasks/SubProcessDetailComposite.java
@@ -1,52 +1,63 @@
-/*******************************************************************************
- * Copyright (c) 2011 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
- *
- * @author Bob Brodt
- ******************************************************************************/
-
-
-package org.eclipse.bpmn2.modeler.ui.property.tasks;
-
-import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractBpmn2PropertySection;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.swt.widgets.Composite;
-
-public class SubProcessDetailComposite extends ActivityDetailComposite {
-
- public SubProcessDetailComposite(Composite parent, int style) {
- super(parent, style);
- }
-
- /**
- * @param section
- */
- public SubProcessDetailComposite(AbstractBpmn2PropertySection section) {
- super(section);
- }
-
- @Override
- public AbstractPropertiesProvider getPropertiesProvider(EObject object) {
- if (propertiesProvider==null) {
- propertiesProvider = new AbstractPropertiesProvider(object) {
- String[] properties = new String[] {
- "triggeredByEvent",
- "loopCharacteristics",
- "properties",
- };
-
- @Override
- public String[] getProperties() {
- return properties;
- }
- };
- }
- return propertiesProvider;
- }
+/*******************************************************************************
+ * Copyright (c) 2011 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
+ *
+ * @author Bob Brodt
+ ******************************************************************************/
+
+
+package org.eclipse.bpmn2.modeler.ui.property.tasks;
+
+import org.eclipse.bpmn2.modeler.core.merrimac.clad.AbstractBpmn2PropertySection;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.swt.widgets.Composite;
+
+public class SubProcessDetailComposite extends ActivityDetailComposite {
+
+ public SubProcessDetailComposite(Composite parent, int style) {
+ super(parent, style);
+ }
+
+ /**
+ * @param section
+ */
+ public SubProcessDetailComposite(AbstractBpmn2PropertySection section) {
+ super(section);
+ }
+
+ @Override
+ public AbstractPropertiesProvider getPropertiesProvider(EObject object) {
+ if (propertiesProvider==null) {
+ propertiesProvider = new AbstractPropertiesProvider(object) {
+ String[] properties = new String[] {
+ "anyAttribute",
+ "calledElementRef", // only used in CallActivity
+ "startQuantity",
+ "completionQuantity",
+ "completionCondition",
+ "isForCompensation",
+ "triggeredByEvent",
+ "cancelRemainingInstances",
+ "loopCharacteristics",
+ "boundaryEventDefs",
+ "method",
+ "ordering",
+ "protocol",
+ "properties",
+ };
+
+ @Override
+ public String[] getProperties() {
+ return properties;
+ }
+ };
+ }
+ return propertiesProvider;
+ }
}
\ No newline at end of file