package org.activiti.designer.features;
import java.util.List;
import org.eclipse.bpmn2.BaseElement;
import org.eclipse.bpmn2.BoundaryEvent;
import org.eclipse.bpmn2.FlowElement;
import org.eclipse.bpmn2.SubProcess;
import org.eclipse.emf.ecore.EObject;
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.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.Diagram;
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.ILinkService;
public class MoveBoundaryEventFeature extends DefaultMoveShapeFeature {
public MoveBoundaryEventFeature(IFeatureProvider fp) {
super(fp);
}
@Override
public boolean canMoveShape(IMoveShapeContext context) {
ContainerShape source = context.getSourceContainer();
ContainerShape target = context.getTargetContainer();
Shape shape = context.getShape();
BoundaryEvent event = (BoundaryEvent) getBusinessObjectForPictogramElement(shape);
ILinkService linkService = Graphiti.getLinkService();
List<PictogramElement> pictoList = linkService.getPictogramElements(getDiagram(), event.getAttachedToRef());
SubProcess parentInSubProcess = null;
ContainerShape parent = null;
if(pictoList != null && pictoList.size() > 0) {
parent = (ContainerShape) pictoList.get(0);
BaseElement element = (BaseElement) getBusinessObjectForPictogramElement(parent);
parentInSubProcess = inSubProcess(element.getId());
}
if(parentInSubProcess == null && source instanceof Diagram && source.getClass() != target.getClass()) {
return false;
}
if(parentInSubProcess != null && target.equals(parent) == false) {
return false;
}
int x = shape.getGraphicsAlgorithm().getX();
int y = shape.getGraphicsAlgorithm().getY();
x += context.getDeltaX();
y += context.getDeltaY();
if(parent != null) {
if(parentInSubProcess != null) {
int parentWidth = parent.getGraphicsAlgorithm().getWidth();
int parentHeight = parent.getGraphicsAlgorithm().getHeight();
if((x + 28) > 0 && x < (parentWidth - 2) &&
(y + 28) > 0 && y < (parentHeight - 2)) {
return true;
} else {
return false;
}
}
int parentX = parent.getGraphicsAlgorithm().getX();
int parentY = parent.getGraphicsAlgorithm().getY();
int parentWidth = parent.getGraphicsAlgorithm().getWidth();
int parentHeight = parent.getGraphicsAlgorithm().getHeight();
if((x + 28) > parentX && x < (parentX + parentWidth - 2) &&
(y + 28) > parentY && y < (parentY + parentHeight - 2)) {
return true;
}
}
return false;
}
private SubProcess inSubProcess(String id) {
for(EObject object : getDiagram().eResource().getContents()) {
if(object instanceof BaseElement) {
BaseElement element = (BaseElement) object;
if(element instanceof SubProcess) {
SubProcess subProcess = (SubProcess) element;
for(FlowElement subElement : subProcess.getFlowElements()) {
if(subElement.getId().equals(id)) {
return subProcess;
}
}
}
if(element.getId().equals(id)) {
return null;
}
}
}
return null;
}
}