package org.eclipse.xtext.example.fowlerdsl.diagram.features.create; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.graphiti.features.IFeatureProvider; import org.eclipse.graphiti.features.context.ICreateContext; import org.eclipse.graphiti.features.impl.AbstractCreateFeature; import org.eclipse.graphiti.mm.pictograms.Diagram; import org.eclipse.xtext.example.fowlerdsl.diagram.helper.DialogHelper; import org.eclipse.xtext.example.fowlerdsl.statemachine.State; import org.eclipse.xtext.example.fowlerdsl.statemachine.Statemachine; import org.eclipse.xtext.example.fowlerdsl.statemachine.StatemachineFactory; public class CreateStateFeature extends AbstractCreateFeature { public CreateStateFeature(IFeatureProvider fp) { this(fp, "State", "A state"); } public CreateStateFeature(IFeatureProvider fp, String name, String description) { super(fp, name, description); } @Override public boolean canCreate(ICreateContext context) { return context.getTargetContainer() instanceof Diagram; } @Override public Object[] create(ICreateContext context) { String stateName = DialogHelper.askString("State", "state name", ""); if (stateName == null || stateName.trim().length() == 0) { return EMPTY; } Resource diagramRes = getDiagram().eResource(); String diagUriStr = diagramRes.getURI().toPlatformString(true); String modelUriStr = diagUriStr.replace(".diagram", ".statemachine"); URI modelURI = URI.createPlatformResourceURI(modelUriStr, true); Resource modelResource = null; modelResource = diagramRes.getResourceSet().getResource(modelURI, true); if(modelResource == null) { modelResource = diagramRes.getResourceSet().createResource(modelURI); } Statemachine stm = null; for(EObject root : modelResource.getContents()) { if(root instanceof Statemachine) { stm = (Statemachine) root; break; } } if(stm == null) { stm = StatemachineFactory.eINSTANCE.createStatemachine(); modelResource.getContents().add(stm); } State state = null; for(State existingState : stm.getStates()) { if(existingState.getName().equals(stateName)) { state = existingState; break; } } if(state == null) { state = StatemachineFactory.eINSTANCE.createState(); state.setName(stateName); stm.getStates().add(state); } addGraphicalRepresentation(context, state); return new Object[] { state }; } }