/*******************************************************************************
* Copyright (c) 2011 Red Hat, Inc.
* All rights reserved.
* This program is made available under the terms of the
* Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.eclipse.bpmn2.modeler.core.features;
import java.io.IOException;
import java.util.List;
import org.eclipse.bpmn2.Activity;
import org.eclipse.bpmn2.Association;
import org.eclipse.bpmn2.BaseElement;
import org.eclipse.bpmn2.MessageFlow;
import org.eclipse.bpmn2.SequenceFlow;
import org.eclipse.bpmn2.di.BPMNDiagram;
import org.eclipse.bpmn2.di.BPMNEdge;
import org.eclipse.bpmn2.di.BPMNShape;
import org.eclipse.bpmn2.di.BpmnDiFactory;
import org.eclipse.bpmn2.modeler.core.Activator;
import org.eclipse.bpmn2.modeler.core.ModelHandler;
import org.eclipse.bpmn2.modeler.core.ModelHandlerLocator;
import org.eclipse.bpmn2.modeler.core.utils.ModelUtil;
import org.eclipse.dd.dc.Bounds;
import org.eclipse.dd.dc.DcFactory;
import org.eclipse.dd.dc.Point;
import org.eclipse.dd.di.DiagramElement;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.graphiti.datatypes.ILocation;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.impl.AbstractAddShapeFeature;
import org.eclipse.graphiti.mm.pictograms.Connection;
import org.eclipse.graphiti.mm.pictograms.Shape;
import org.eclipse.graphiti.services.Graphiti;
public abstract class AbstractBpmnAddFeature extends AbstractAddShapeFeature {
public AbstractBpmnAddFeature(IFeatureProvider fp) {
super(fp);
}
protected void createDIShape(Shape gShape, BaseElement elem) {
try {
BPMNShape shape = (BPMNShape) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(
getDiagram(), elem);
createDIShape(gShape, elem, shape);
} catch (IOException e) {
Activator.logError(e);
}
}
protected void createDIShape(Shape gShape, BaseElement elem, BPMNShape shape) {
ILocation loc = Graphiti.getLayoutService().getLocationRelativeToDiagram(gShape);
if (shape == null) {
EList<EObject> businessObjects = Graphiti.getLinkService().getLinkForPictogramElement(getDiagram())
.getBusinessObjects();
for (EObject eObject : businessObjects) {
if (eObject instanceof BPMNDiagram) {
BPMNDiagram bpmnDiagram = (BPMNDiagram) eObject;
shape = BpmnDiFactory.eINSTANCE.createBPMNShape();
// shape.setId(EcoreUtil.generateUUID());
shape.setBpmnElement(elem);
Bounds bounds = DcFactory.eINSTANCE.createBounds();
if (elem instanceof Activity) {
bounds.setHeight(gShape.getGraphicsAlgorithm().getHeight());
} else {
bounds.setHeight(gShape.getGraphicsAlgorithm().getHeight());
}
bounds.setWidth(gShape.getGraphicsAlgorithm().getWidth());
bounds.setX(loc.getX());
bounds.setY(loc.getY());
shape.setBounds(bounds);
addShape(shape, bpmnDiagram);
ModelUtil.setID(shape);
}
}
}
link(gShape, new Object[] { elem, shape });
}
private void addShape(DiagramElement elem, BPMNDiagram bpmnDiagram) {
List<DiagramElement> elements = bpmnDiagram.getPlane().getPlaneElement();
elements.add(elem);
}
protected void createDIEdge(Connection connection, BaseElement conElement) {
try {
BPMNEdge edge = (BPMNEdge) ModelHandlerLocator.getModelHandler(getDiagram().eResource()).findDIElement(
getDiagram(), conElement);
createDIEdge(connection, conElement, edge);
} catch (IOException e) {
Activator.logError(e);
}
}
protected void createDIEdge(Connection connection, BaseElement conElement, BPMNEdge edge) throws IOException {
ModelHandler modelHandler = ModelHandlerLocator.getModelHandler(getDiagram().eResource());
if (edge == null) {
EList<EObject> businessObjects = Graphiti.getLinkService().getLinkForPictogramElement(getDiagram())
.getBusinessObjects();
for (EObject eObject : businessObjects) {
if (eObject instanceof BPMNDiagram) {
BPMNDiagram bpmnDiagram = (BPMNDiagram) eObject;
edge = BpmnDiFactory.eINSTANCE.createBPMNEdge();
// edge.setId(EcoreUtil.generateUUID());
edge.setBpmnElement(conElement);
if (conElement instanceof Association) {
edge.setSourceElement(modelHandler.findDIElement(getDiagram(),
((Association) conElement).getSourceRef()));
edge.setTargetElement(modelHandler.findDIElement(getDiagram(),
((Association) conElement).getTargetRef()));
} else if (conElement instanceof MessageFlow) {
edge.setSourceElement(modelHandler.findDIElement(getDiagram(),
(BaseElement) ((MessageFlow) conElement).getSourceRef()));
edge.setTargetElement(modelHandler.findDIElement(getDiagram(),
(BaseElement) ((MessageFlow) conElement).getTargetRef()));
} else if (conElement instanceof SequenceFlow) {
edge.setSourceElement(modelHandler.findDIElement(getDiagram(),
((SequenceFlow) conElement).getSourceRef()));
edge.setTargetElement(modelHandler.findDIElement(getDiagram(),
((SequenceFlow) conElement).getTargetRef()));
}
ILocation sourceLoc = Graphiti.getPeService().getLocationRelativeToDiagram(connection.getStart());
ILocation targetLoc = Graphiti.getPeService().getLocationRelativeToDiagram(connection.getEnd());
Point point = DcFactory.eINSTANCE.createPoint();
point.setX(sourceLoc.getX());
point.setY(sourceLoc.getY());
edge.getWaypoint().add(point);
point = DcFactory.eINSTANCE.createPoint();
point.setX(targetLoc.getX());
point.setY(targetLoc.getY());
edge.getWaypoint().add(point);
addShape(edge, bpmnDiagram);
ModelUtil.setID(edge);
}
}
}
link(connection, new Object[] { conElement, edge });
}
}