package org.eclipse.xtext.example.fowlerdsl.diagram.features.add;
import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.IAddConnectionContext;
import org.eclipse.graphiti.features.context.IAddContext;
import org.eclipse.graphiti.features.impl.AbstractAddFeature;
import org.eclipse.graphiti.mm.algorithms.Polygon;
import org.eclipse.graphiti.mm.algorithms.Polyline;
import org.eclipse.graphiti.mm.pictograms.Connection;
import org.eclipse.graphiti.mm.pictograms.ConnectionDecorator;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.services.Graphiti;
import org.eclipse.graphiti.services.IGaService;
import org.eclipse.graphiti.services.IPeCreateService;
import org.eclipse.graphiti.util.IColorConstant;
import org.eclipse.xtext.example.fowlerdsl.diagram.builder.TextBuilder;
import org.eclipse.xtext.example.fowlerdsl.statemachine.Transition;
public class AddTransitionFeature extends AbstractAddFeature {
public AddTransitionFeature(IFeatureProvider fp) {
super(fp);
}
@Override
public boolean canAdd(IAddContext context) {
boolean canAdd = false;
if (context instanceof IAddConnectionContext
&& context.getNewObject() instanceof Transition) {
canAdd = true;
}
return canAdd;
}
@Override
public PictogramElement add(IAddContext context) {
IAddConnectionContext addConContext = (IAddConnectionContext) context;
Transition transition = (Transition) context.getNewObject();
IPeCreateService peCreateService = Graphiti.getPeCreateService();
Connection connection = peCreateService
.createFreeFormConnection(getDiagram());
connection.setStart(addConContext.getSourceAnchor());
connection.setEnd(addConContext.getTargetAnchor());
IGaService gaService = Graphiti.getGaService();
Polyline polyline = gaService.createPolyline(connection);
polyline.setLineWidth(1);
polyline.setForeground(manageColor(IColorConstant.BLACK));
addArrow(connection);
addLabel(connection, transition);
link(connection, transition);
return connection;
}
private void addLabel(Connection connection, Transition transition) {
IPeCreateService peCreateService = Graphiti.getPeCreateService();
ConnectionDecorator textDecorator = peCreateService
.createConnectionDecorator(connection, true, 0.5, true);
TextBuilder.init(getDiagram(), textDecorator)
.withText(transition.getEvent().getName())
.withForeground(IColorConstant.BLACK).withLocation(10, 0)
.build();
}
private Polygon addArrow(Connection connection) {
IPeCreateService peCreateService = Graphiti.getPeCreateService();
ConnectionDecorator cd = peCreateService.createConnectionDecorator(
connection, false, 1, true);
IGaService gaService = Graphiti.getGaService();
Polygon polygon = gaService.createPolygon(cd, new int[] { -10, 5, 0, 0,
-10, -5 });
polygon.setForeground(manageColor(IColorConstant.BLACK));
polygon.setBackground(manageColor(IColorConstant.BLACK));
polygon.setLineWidth(1);
return polygon;
}
}