package org.activiti.designer.features;
import java.util.List;
import org.activiti.bpmn.model.Lane;
import org.activiti.bpmn.model.Pool;
import org.activiti.bpmn.model.Process;
import org.activiti.designer.PluginImage;
import org.activiti.designer.util.editor.Bpmn2MemoryModel;
import org.activiti.designer.util.editor.ModelHandler;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.ICreateContext;
import org.eclipse.graphiti.features.context.impl.AddContext;
import org.eclipse.graphiti.features.context.impl.ResizeShapeContext;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.Diagram;
public class CreateLaneFeature extends AbstractCreateBPMNFeature {
public static final String FEATURE_ID_KEY = "lane";
public CreateLaneFeature(IFeatureProvider fp) {
super(fp, "Lane", "Add lane");
}
@Override
public boolean canCreate(ICreateContext context) {
if (context.getTargetContainer() instanceof Diagram)
return false;
Object parentBo = getFeatureProvider().getBusinessObjectForPictogramElement(context.getTargetContainer());
if (parentBo instanceof Pool || parentBo instanceof Lane) {
return true;
}
return false;
}
@Override
public Object[] create(ICreateContext context) {
Bpmn2MemoryModel model = ModelHandler.getModel(EcoreUtil.getURI(getDiagram()));
Object parentBo = getFeatureProvider().getBusinessObjectForPictogramElement(context.getTargetContainer());
Pool parentPool = null;
if (parentBo instanceof Pool) {
parentPool = (Pool) parentBo;
} else {
Lane lane = (Lane) parentBo;
for (Pool pool : model.getBpmnModel().getPools()) {
if (pool.getProcessRef().equals(lane.getParentProcess().getId())) {
parentPool = pool;
break;
}
}
}
if (parentPool == null)
return null;
ContainerShape poolShape = (ContainerShape) getFeatureProvider().getPictogramElementForBusinessObject(parentPool);
Process poolProcess = model.getBpmnModel().getProcess(parentPool.getId());
if (poolProcess == null)
return null;
List<Lane> lanes = poolProcess.getLanes();
int x = 0;
int y = 0;
int width = 0;
int height = 0;
if (lanes.size() == 0) {
x = 20;
y = 0;
width = poolShape.getGraphicsAlgorithm().getWidth() - 20;
height = poolShape.getGraphicsAlgorithm().getHeight();
} else {
ContainerShape lastLaneShape = (ContainerShape) getFeatureProvider().getPictogramElementForBusinessObject(lanes.get(lanes.size() - 1));
x = lastLaneShape.getGraphicsAlgorithm().getX();
y = lastLaneShape.getGraphicsAlgorithm().getY() + lastLaneShape.getGraphicsAlgorithm().getHeight();
width = lastLaneShape.getGraphicsAlgorithm().getWidth();
height = lastLaneShape.getGraphicsAlgorithm().getHeight();
}
Lane newLane = new Lane();
newLane.setId(getNextId(newLane));
newLane.setName("New lane");
newLane.setParentProcess(poolProcess);
poolProcess.getLanes().add(newLane);
ResizeShapeContext resizeContext = new ResizeShapeContext(poolShape);
resizeContext.setSize(poolShape.getGraphicsAlgorithm().getWidth(), poolShape.getGraphicsAlgorithm().getHeight() + height);
resizeContext.setLocation(poolShape.getGraphicsAlgorithm().getX(), poolShape.getGraphicsAlgorithm().getY());
resizeContext.setDirection(ResizeShapeContext.DIRECTION_SOUTH);
resizeContext.putProperty("org.activiti.designer.lane.create", true);
getFeatureProvider().getResizeShapeFeature(resizeContext).execute(resizeContext);
context.putProperty("org.activiti.designer.lane.x", x);
context.putProperty("org.activiti.designer.lane.y", y);
context.putProperty("org.activiti.designer.lane.width", width);
context.putProperty("org.activiti.designer.lane.height", height);
AddContext addContext = new AddContext();
addContext.setNewObject(newLane);
addContext.setLocation(x, y);
addContext.setSize(width, height);
addContext.setTargetContainer(poolShape);
getFeatureProvider().addIfPossible(addContext);
// return newly created business object(s)
return new Object[] { newLane };
}
@Override
public String getCreateImageId() {
return PluginImage.IMG_LANE.getImageKey();
}
@Override
protected String getFeatureIdKey() {
return FEATURE_ID_KEY;
}
}