package org.activiti.designer.features; import org.activiti.bpmn.model.Gateway; import org.activiti.bpmn.model.Lane; import org.activiti.bpmn.model.SequenceFlow; import org.activiti.bpmn.model.SubProcess; 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.IMoveShapeContext; import org.eclipse.graphiti.features.impl.DefaultMoveShapeFeature; import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.graphiti.mm.pictograms.Shape; public class MoveGatewayFeature extends DefaultMoveShapeFeature { public MoveGatewayFeature(IFeatureProvider fp) { super(fp); } @Override public boolean canMoveShape(IMoveShapeContext context) { return true; } @Override protected void postMoveShape(IMoveShapeContext context) { final Shape shape = context.getShape(); // get the gateway itself to determine its boundary events final Gateway gateway = (Gateway) getBusinessObjectForPictogramElement(shape); Bpmn2MemoryModel model = ModelHandler.getModel(EcoreUtil.getURI(getDiagram())); if (context.getSourceContainer() != context.getTargetContainer()) { if (context.getSourceContainer() instanceof Diagram == false) { Object containerBo = getFeatureProvider().getBusinessObjectForPictogramElement(context.getSourceContainer()); if (containerBo instanceof SubProcess) { SubProcess subProcess = (SubProcess) containerBo; subProcess.removeFlowElement(gateway.getId()); for (SequenceFlow flow : gateway.getOutgoingFlows()) { subProcess.removeFlowElement(flow.getId()); } } else if (containerBo instanceof Lane) { Lane lane = (Lane) containerBo; lane.getFlowReferences().remove(gateway.getId()); lane.getParentProcess().removeFlowElement(gateway.getId()); for (SequenceFlow flow : gateway.getOutgoingFlows()) { lane.getParentProcess().removeFlowElement(flow.getId()); } } } else { model.getBpmnModel().getMainProcess().removeFlowElement(gateway.getId()); for (SequenceFlow flow : gateway.getOutgoingFlows()) { model.getBpmnModel().getMainProcess().removeFlowElement(flow.getId()); } } if (context.getTargetContainer() instanceof Diagram == false) { Object containerBo = getFeatureProvider().getBusinessObjectForPictogramElement(context.getTargetContainer()); if (containerBo instanceof SubProcess) { SubProcess subProcess = (SubProcess) containerBo; subProcess.addFlowElement(gateway); for (SequenceFlow flow : gateway.getOutgoingFlows()) { subProcess.addFlowElement(flow); } } else if (containerBo instanceof Lane) { Lane lane = (Lane) containerBo; lane.getFlowReferences().add(gateway.getId()); lane.getParentProcess().addFlowElement(gateway); for (SequenceFlow flow : gateway.getOutgoingFlows()) { lane.getParentProcess().addFlowElement(flow); } } } else { model.getBpmnModel().getMainProcess().addFlowElement(gateway); for (SequenceFlow flow : gateway.getOutgoingFlows()) { model.getBpmnModel().getMainProcess().addFlowElement(flow); } } } } }