package org.eclipse.bpmn2.modeler.examples.customtask;
import org.eclipse.bpmn2.BaseElement;
import org.eclipse.bpmn2.BoundaryEvent;
import org.eclipse.bpmn2.FlowElementsContainer;
import org.eclipse.bpmn2.modeler.core.features.BaseElementConnectionFeatureContainer;
import org.eclipse.bpmn2.modeler.core.features.CustomConnectionFeatureContainer;
import org.eclipse.bpmn2.modeler.core.features.IFeatureContainer;
import org.eclipse.bpmn2.modeler.core.features.flow.AbstractAddFlowFeature;
import org.eclipse.bpmn2.modeler.core.features.flow.AbstractCreateFlowFeature;
import org.eclipse.bpmn2.modeler.core.utils.BusinessObjectUtil;
import org.eclipse.bpmn2.modeler.core.utils.StyleUtil;
import org.eclipse.bpmn2.modeler.examples.customtask.MyModel.MyModelFactory;
import org.eclipse.bpmn2.modeler.examples.customtask.MyModel.MyModelPackage;
import org.eclipse.bpmn2.modeler.examples.customtask.MyModel.TemporalDependency;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.graphiti.features.IAddFeature;
import org.eclipse.graphiti.features.ICreateConnectionFeature;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.ICreateConnectionContext;
import org.eclipse.graphiti.mm.algorithms.Polyline;
import org.eclipse.graphiti.mm.algorithms.styles.LineStyle;
import org.eclipse.graphiti.mm.pictograms.Connection;
import org.eclipse.graphiti.mm.pictograms.ConnectionDecorator;
import org.eclipse.graphiti.services.Graphiti;
import org.eclipse.graphiti.services.IGaService;
import org.eclipse.graphiti.services.IPeService;
public class CustomTemporalDependencyFeatureContainer extends CustomConnectionFeatureContainer {
public static String TEMPORAL_DEPENDENCY_ID = "org.eclipse.bpmn2.modeler.examples.customtask.temporalDependency";
public CustomTemporalDependencyFeatureContainer() {
setId(TEMPORAL_DEPENDENCY_ID);
}
@Override
public String getId(EObject object) {
if (object instanceof TemporalDependency) {
return TEMPORAL_DEPENDENCY_ID;
}
return null;
}
@Override
protected IFeatureContainer createFeatureContainer(IFeatureProvider fp) {
return new TemporalDependencyFeatureContainer();
}
public class TemporalDependencyFeatureContainer extends BaseElementConnectionFeatureContainer {
@Override
public ICreateConnectionFeature getCreateConnectionFeature(IFeatureProvider fp) {
return new CreateTemporalDependencyFeature(fp);
}
@Override
public IAddFeature getAddFeature(IFeatureProvider fp) {
return new AddTemporalDependencyFeature(fp);
}
}
public class CreateTemporalDependencyFeature extends AbstractCreateFlowFeature<TemporalDependency, BoundaryEvent, BoundaryEvent> {
public CreateTemporalDependencyFeature(IFeatureProvider fp) {
super(fp);
}
@Override
public TemporalDependency createBusinessObject(ICreateConnectionContext context) {
TemporalDependency businessObject = MyModelFactory.eINSTANCE.createTemporalDependency();
BoundaryEvent source = getSourceBo(context);
BoundaryEvent target = getTargetBo(context);
businessObject.setSourceRef(source);
businessObject.setTargetRef(target);
EObject container = source.eContainer();
while (container!=null) {
if (container instanceof FlowElementsContainer) {
((FlowElementsContainer)container).getFlowElements().add(businessObject);
break;
}
container = container.eContainer();
}
putBusinessObject(context, businessObject);
changesDone = true;
return businessObject;
}
@Override
public EClass getBusinessObjectClass() {
return MyModelPackage.eINSTANCE.getTemporalDependency();
}
@Override
protected String getStencilImageId() {
return null;
}
@Override
protected Class<BoundaryEvent> getSourceClass() {
return BoundaryEvent.class;
}
@Override
protected Class<BoundaryEvent> getTargetClass() {
return BoundaryEvent.class;
}
}
public class AddTemporalDependencyFeature extends AbstractAddFlowFeature<TemporalDependency> {
public AddTemporalDependencyFeature(IFeatureProvider fp) {
super(fp);
}
@Override
protected Polyline createConnectionLine(Connection connection) {
IPeService peService = Graphiti.getPeService();
IGaService gaService = Graphiti.getGaService();
BaseElement be = BusinessObjectUtil.getFirstBaseElement(connection);
Polyline connectionLine = super.createConnectionLine(connection);
connectionLine.setLineStyle(LineStyle.SOLID);
connectionLine.setLineWidth(2);
int w = 5;
int l = 15;
ConnectionDecorator decorator = peService.createConnectionDecorator(connection, false,
1.0, true);
Polyline arrowhead = gaService.createPolygon(decorator, new int[] { -l, w, 0, 0, -l, -w, -l, w });
StyleUtil.applyStyle(arrowhead, be);
return connectionLine;
}
/* (non-Javadoc)
* @see org.eclipse.bpmn2.modeler.core.features.AbstractBpmn2AddFeature#getBusinessObjectType()
*/
@Override
public Class<? extends BaseElement> getBusinessObjectType() {
return TemporalDependency.class;
}
}
}