package org.activiti.designer.features; 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.IAddFeature; 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.AreaContext; import org.eclipse.graphiti.mm.pictograms.ContainerShape; import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.graphiti.mm.pictograms.PictogramElement; public class CreatePoolFeature extends AbstractCreateBPMNFeature { public static final String FEATURE_ID_KEY = "pool"; public CreatePoolFeature(IFeatureProvider fp) { super(fp, "Pool", "Add pool"); } @Override public boolean canCreate(ICreateContext context) { if (context.getTargetContainer() instanceof Diagram) return true; return false; } @Override public Object[] create(ICreateContext context) { Pool newPool = new Pool(); newPool.setId(getNextId(newPool)); newPool.setName("Pool"); Process newProcess = new Process(); newProcess.setId("process_" + newPool.getId()); newProcess.setName(newProcess.getId()); newPool.setProcessRef(newProcess.getId()); Bpmn2MemoryModel model = ModelHandler.getModel(EcoreUtil.getURI(getDiagram())); model.getBpmnModel().getPools().add(newPool); model.getBpmnModel().addProcess(newProcess); PictogramElement poolElement = addGraphicalRepresentation(context, newPool); Lane lane = new Lane(); lane.setId(getNextId(lane, "lane")); lane.setParentProcess(newProcess); newProcess.getLanes().add(lane); AddContext laneContext = new AddContext(new AreaContext(), lane); IAddFeature addFeature = getFeatureProvider().getAddFeature(laneContext); laneContext.setNewObject(lane); laneContext.setSize(poolElement.getGraphicsAlgorithm().getWidth() - 20, poolElement.getGraphicsAlgorithm().getHeight()); laneContext.setTargetContainer((ContainerShape) poolElement); laneContext.setLocation(20, 0); if (addFeature.canAdd(laneContext)) { PictogramElement laneContainer = addFeature.add(laneContext); getFeatureProvider().link(laneContainer, new Object[] { lane }); } // return newly created business object(s) return new Object[] { newPool }; } @Override public String getCreateImageId() { return PluginImage.IMG_POOL.getImageKey(); } @Override protected String getFeatureIdKey() { return FEATURE_ID_KEY; } }