/**
*
*/
package org.activiti.designer.features;
import java.util.List;
import org.activiti.designer.util.features.AbstractCreateBPMNFeature;
import org.eclipse.bpmn2.BaseElement;
import org.eclipse.bpmn2.CallActivity;
import org.eclipse.bpmn2.Event;
import org.eclipse.bpmn2.FlowElement;
import org.eclipse.bpmn2.FlowNode;
import org.eclipse.bpmn2.Gateway;
import org.eclipse.bpmn2.SequenceFlow;
import org.eclipse.bpmn2.Task;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.ICreateContext;
import org.eclipse.graphiti.features.context.impl.CreateConnectionContext;
import org.eclipse.graphiti.features.context.impl.CreateContext;
import org.eclipse.graphiti.mm.pictograms.Anchor;
import org.eclipse.graphiti.mm.pictograms.AnchorContainer;
import org.eclipse.graphiti.mm.pictograms.ChopboxAnchor;
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.mm.pictograms.Shape;
import org.eclipse.graphiti.services.Graphiti;
public abstract class AbstractCreateFastBPMNFeature extends AbstractCreateBPMNFeature {
private static final String CONNECTION_ATTRIBUTE = "org.activiti.designer.connectionContext";
public AbstractCreateFastBPMNFeature(IFeatureProvider fp, String name, String description) {
super(fp, name, description);
}
@SuppressWarnings("unchecked")
protected void addGraphicalContent(BaseElement targetElement, ICreateContext context) {
setLocation(targetElement, (CreateContext) context);
PictogramElement element = addGraphicalRepresentation(context, targetElement);
createConnectionIfNeeded(element, context);
if(context.getProperty("org.activiti.designer.changetype.sourceflows") != null) {
List<SequenceFlow> sourceFlows = (List<SequenceFlow>) context.getProperty("org.activiti.designer.changetype.sourceflows");
for (SequenceFlow sourceFlow : sourceFlows) {
sourceFlow.setSourceRef((FlowNode) targetElement);
}
List<SequenceFlow> targetFlows = (List<SequenceFlow>) context.getProperty("org.activiti.designer.changetype.targetflows");
for (SequenceFlow targetFlow : targetFlows) {
targetFlow.setTargetRef((FlowNode) targetElement);
}
Anchor elementAnchor = null;
for (Shape shape : context.getTargetContainer().getChildren()) {
FlowNode flowNode = (FlowNode) getBusinessObjectForPictogramElement(shape.getGraphicsAlgorithm().getPictogramElement());
if(flowNode == null || flowNode.getId() == null) continue;
if(flowNode.getId().equals(targetElement.getId())) {
EList<Anchor> anchorList = ((ContainerShape) shape).getAnchors();
for (Anchor anchor : anchorList) {
if(anchor instanceof ChopboxAnchor) {
elementAnchor = anchor;
break;
}
}
}
}
List<Connection> sourceConnections = (List<Connection>) context.getProperty("org.activiti.designer.changetype.sourceconnections");
for (Connection connection : sourceConnections) {
connection.setStart(elementAnchor);
elementAnchor.getOutgoingConnections().add(connection);
}
List<Connection> targetConnections = (List<Connection>) context.getProperty("org.activiti.designer.changetype.targetconnections");
for (Connection connection : targetConnections) {
connection.setEnd(elementAnchor);
elementAnchor.getIncomingConnections().add(connection);
}
}
}
protected void setName(String defaultName, FlowElement targetElement, ICreateContext context) {
if(context.getProperty("org.activiti.designer.changetype.name") != null) {
targetElement.setName(context.getProperty("org.activiti.designer.changetype.name").toString());
} else {
targetElement.setName(defaultName);
}
}
private void setLocation(BaseElement targetElement, CreateContext context) {
if(context.getProperty(CONNECTION_ATTRIBUTE) != null) {
CreateConnectionContext connectionContext = (CreateConnectionContext)
context.getProperty(CONNECTION_ATTRIBUTE);
PictogramElement sourceElement = connectionContext.getSourcePictogramElement();
EObject sourceObject = sourceElement.getLink().getBusinessObjects().get(0);
if(sourceObject instanceof Event && (targetElement instanceof Task || targetElement instanceof CallActivity)) {
context.setLocation(sourceElement.getGraphicsAlgorithm().getX() + 80,
sourceElement.getGraphicsAlgorithm().getY() - 10);
} else if(sourceObject instanceof Event && targetElement instanceof Gateway) {
context.setLocation(sourceElement.getGraphicsAlgorithm().getX() + 80,
sourceElement.getGraphicsAlgorithm().getY() - 3);
} else if(sourceObject instanceof Gateway && targetElement instanceof Event) {
context.setLocation(sourceElement.getGraphicsAlgorithm().getX() + 85,
sourceElement.getGraphicsAlgorithm().getY() + 3);
} else if(sourceObject instanceof Gateway && (targetElement instanceof Task || targetElement instanceof CallActivity)) {
context.setLocation(sourceElement.getGraphicsAlgorithm().getX() + 85,
sourceElement.getGraphicsAlgorithm().getY() - 7);
} else if((sourceObject instanceof Task || sourceObject instanceof CallActivity) && targetElement instanceof Gateway) {
context.setLocation(sourceElement.getGraphicsAlgorithm().getX() + 160,
sourceElement.getGraphicsAlgorithm().getY() + 7);
} else if((sourceObject instanceof Task || sourceObject instanceof CallActivity) && targetElement instanceof Event) {
context.setLocation(sourceElement.getGraphicsAlgorithm().getX() + 160,
sourceElement.getGraphicsAlgorithm().getY() + 10);
} else if((sourceObject instanceof Task || sourceObject instanceof CallActivity) && (targetElement instanceof Task || targetElement instanceof CallActivity)) {
context.setLocation(sourceElement.getGraphicsAlgorithm().getX() + 160,
sourceElement.getGraphicsAlgorithm().getY());
}
}
}
private void createConnectionIfNeeded(PictogramElement element, ICreateContext context) {
if(context.getProperty(CONNECTION_ATTRIBUTE) != null) {
CreateConnectionContext connectionContext = (CreateConnectionContext)
context.getProperty(CONNECTION_ATTRIBUTE);
connectionContext.setTargetPictogramElement(element);
connectionContext.setTargetAnchor(Graphiti.getPeService().getChopboxAnchor((AnchorContainer) element));
CreateSequenceFlowFeature sequenceFeature = new CreateSequenceFlowFeature(getFeatureProvider());
sequenceFeature.create(connectionContext);
}
}
}