package org.eclipse.xtext.example.fowlerdsl.diagram.features.create; import org.eclipse.graphiti.features.IFeatureProvider; import org.eclipse.graphiti.features.context.ICreateConnectionContext; import org.eclipse.graphiti.features.context.impl.AddConnectionContext; import org.eclipse.graphiti.features.impl.AbstractCreateConnectionFeature; import org.eclipse.graphiti.mm.pictograms.Anchor; import org.eclipse.graphiti.mm.pictograms.Connection; import org.eclipse.xtext.example.fowlerdsl.diagram.helper.DialogHelper; import org.eclipse.xtext.example.fowlerdsl.statemachine.Event; import org.eclipse.xtext.example.fowlerdsl.statemachine.State; import org.eclipse.xtext.example.fowlerdsl.statemachine.Statemachine; import org.eclipse.xtext.example.fowlerdsl.statemachine.StatemachineFactory; import org.eclipse.xtext.example.fowlerdsl.statemachine.Transition; public class CreateTransitionFeature extends AbstractCreateConnectionFeature { public CreateTransitionFeature(IFeatureProvider fp) { this(fp, "Transition", "A transition"); } public CreateTransitionFeature(IFeatureProvider fp, String name, String description) { super(fp, name, description); } @Override public boolean canStartConnection(ICreateConnectionContext context) { boolean canStart = false; if (getState(context.getSourceAnchor()) != null) { canStart = true; } return canStart; } @Override public boolean canCreate(ICreateConnectionContext context) { State source = getState(context.getSourceAnchor()); State target = getState(context.getTargetAnchor()); if (source != null && target != null && source != target) { return true; } return false; } private State getState(Anchor anchor) { State state = null; if (anchor != null) { Object object = getBusinessObjectForPictogramElement(anchor .getParent()); if (object instanceof State) { state = (State) object; } } return state; } @Override public Connection create(ICreateConnectionContext context) { Connection newConnection = null; State source = getState(context.getSourceAnchor()); State target = getState(context.getTargetAnchor()); if (source != null && target != null) { Transition transition = createTransition(source, target); AddConnectionContext addContext = new AddConnectionContext( context.getSourceAnchor(), context.getTargetAnchor()); addContext.setNewObject(transition); newConnection = (Connection) getFeatureProvider().addIfPossible( addContext); } return newConnection; } private Transition createTransition(State source, State target) { String eventName = DialogHelper.askString("Event", "Event name", source.getName() + "->" + target.getName()); Event event = null; for (Event existingEvent : ((Statemachine) source.eContainer()) .getEvents()) { if (existingEvent.getName().equals(eventName)) { event = existingEvent; break; } } Transition transition = null; if (event != null) { transition = foundExistingTransition(source, event); } else { event = StatemachineFactory.eINSTANCE.createEvent(); event.setName(eventName); ((Statemachine) source.eContainer()).getEvents().add(event); } if (transition == null) { transition = StatemachineFactory.eINSTANCE.createTransition(); transition.setState(target); transition.setEvent(event); source.getTransitions().add(transition); } return transition; } private Transition foundExistingTransition(State source, Event event) { Transition transition = null; for (Transition existingTransition : source.getTransitions()) { if (existingTransition.getEvent().getName().equals(event.getName()) && existingTransition.getState().getName() .equals(source.getName())) { transition = existingTransition; break; } } return transition; } }