package org.eclipse.uml2.diagram.timing.edit.policies.create;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
import org.eclipse.gmf.runtime.diagram.core.services.ViewService;
import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
import org.eclipse.gmf.runtime.emf.type.core.IElementType;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.uml2.diagram.timing.edit.parts.DStateSwitchEditPart;
import org.eclipse.uml2.diagram.timing.model.timingd.DSegmentEnd;
import org.eclipse.uml2.diagram.timing.model.timingd.DSegmentStart;
import org.eclipse.uml2.diagram.timing.model.timingd.DStateSwitch;
import org.eclipse.uml2.diagram.timing.part.TimingDVisualIDRegistry;
import org.eclipse.uml2.diagram.timing.providers.TimingDElementTypes;
public class CreateSwitchHelper {
private final PreferencesHint myPreferencesHint;
public CreateSwitchHelper(PreferencesHint preferencesHint){
myPreferencesHint = preferencesHint;
}
public Edge createSwitchEdge(View fromView, DSegmentEnd from, View toView, DSegmentStart to){
View srcSegmentView = (View) fromView.eContainer();
View destSegmentView = (View) toView.eContainer();
if (srcSegmentView == null || destSegmentView == null){
throw new IllegalStateException("Segment end is not inside segment");
}
DStateSwitch newSwitch = SemanticHelper.createSemanticSwitch(from, to);
Edge edge = createEdgeWithService(newSwitch, fromView, toView, DStateSwitchEditPart.VISUAL_ID);
return edge;
}
private Edge createEdgeWithService(EObject semanticElement, View from, View to, int linkVisualId){
IElementType elementType = TimingDElementTypes.getElementType(linkVisualId);
IAdaptable semanticAdapter = new ElementTypeAwareAdapter(semanticElement, elementType);
Diagram diagram = from.getDiagram();
String type = TimingDVisualIDRegistry.getType(linkVisualId);
Edge edge = ViewService.getInstance().createEdge(semanticAdapter, diagram, type, ViewUtil.APPEND, true, myPreferencesHint);
if (edge != null && edge.getSource() == null){
edge.setSource(from);
}
if (edge != null && edge.getTarget() == null){
edge.setTarget(to);
}
return edge;
}
private static class ElementTypeAwareAdapter extends EObjectAdapter {
private final IElementType myElementType;
public ElementTypeAwareAdapter(EObject subject, IElementType elementType){
super(subject);
myElementType = elementType;
}
@SuppressWarnings("unchecked")
@Override
public Object getAdapter(Class adapter) {
if (adapter.isInstance(myElementType)) {
return myElementType;
}
return super.getAdapter(adapter);
}
}
}