package org.eclipse.uml2.diagram.timing.edit.policies.links;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.commands.Command;
import org.eclipse.gmf.runtime.common.core.command.CommandResult;
import org.eclipse.gmf.runtime.emf.type.core.commands.CreateElementCommand;
import org.eclipse.gmf.runtime.emf.type.core.requests.ConfigureRequest;
import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
import org.eclipse.uml2.diagram.timing.edit.policies.TimingDBaseItemSemanticEditPolicy;
import org.eclipse.uml2.diagram.timing.model.timingd.DBlock;
import org.eclipse.uml2.diagram.timing.model.timingd.DSegment;
import org.eclipse.uml2.diagram.timing.model.timingd.DValueLine;
import org.eclipse.uml2.diagram.timing.model.timingd.TimingDPackage;
import org.eclipse.uml2.diagram.timing.providers.TimingDElementTypes;
public class SegmentCheckValueSwitchEditPolicy extends TimingDBaseItemSemanticEditPolicy {
public static final String ROLE = SegmentCheckValueSwitchEditPolicy.class.getName() + ":Role";
public SegmentCheckValueSwitchEditPolicy() {
super(TimingDElementTypes.DSegment_3003);
}
protected Command getCreateRelationshipCommand(CreateRelationshipRequest req) {
return (req.getTarget() == null) ? getStartCreateRelationshipCommand(req) : getCompleteCreateRelationshipCommand(req);
}
protected Command getCompleteCreateRelationshipCommand(CreateRelationshipRequest req) {
if (TimingDElementTypes.DStateSwitch_4001 == req.getElementType()) {
return getGEFWrapper(new CheckValueSwitchCommand(req, req.getSource(), req.getTarget()));
}
return null;
}
protected Command getStartCreateRelationshipCommand(CreateRelationshipRequest req) {
if (TimingDElementTypes.DStateSwitch_4001 == req.getElementType()) {
return getGEFWrapper(new CheckValueSwitchCommand(req, req.getSource(), req.getTarget()));
}
return null;
}
public static class CheckValueSwitchCommand extends CreateElementCommand {
private final EObject source;
private final EObject target;
private final DBlock container;
public CheckValueSwitchCommand(CreateRelationshipRequest request, EObject source, EObject target) {
super(request);
this.source = source;
this.target = target;
if (request.getContainmentFeature() == null) {
setContainmentFeature(TimingDPackage.eINSTANCE.getDBlock_Switches());
}
container = deduceContainer(source, target);
if (container != null) {
super.setElementToEdit(container);
}
}
public boolean canExecute() {
if (source == null && target == null) {
return false;
}
if (source != null && false == source instanceof DSegment) {
return false;
}
if (target != null && false == target instanceof DSegment && false == target instanceof DValueLine) {
return false;
}
if (getSource() == null) {
return true; // link creation is in progress; source is not defined yet
}
// target may be null here but it's possible to check constraint
if (getContainer() == null) {
return false;
}
//return TimingDBaseItemSemanticEditPolicy.LinkConstraints.canCreateDStateSwitch_4001(getContainer(), getSource(), getTarget());
return true;
}
protected EObject doDefaultElementCreation() {
//System.out.println("CheckValueSwitchCommand.doDefaultElementCreation()");
return null;
}
protected EClass getEClassToEdit() {
return TimingDPackage.eINSTANCE.getDBlock();
}
protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
if (!canExecute()) {
throw new ExecutionException("Invalid arguments in create link command"); //$NON-NLS-1$
}
return super.doExecuteWithResult(monitor, info);
}
protected ConfigureRequest createConfigureRequest() {
ConfigureRequest request = super.createConfigureRequest();
request.setParameter(CreateRelationshipRequest.SOURCE, getSource());
request.setParameter(CreateRelationshipRequest.TARGET, getTarget());
return request;
}
protected void setElementToEdit(EObject element) {
throw new UnsupportedOperationException();
}
protected DSegment getSource() {
return (DSegment) source;
}
protected EObject getTarget() {
return target;
}
public DBlock getContainer() {
return container;
}
private static DBlock deduceContainer(EObject source, EObject target) {
if (source instanceof DSegment){
DSegment srcSegment = (DSegment) source;
return srcSegment.getState().getBlock();
}
if (target instanceof DSegment){
DSegment destSegment = (DSegment) target;
return destSegment.getState().getBlock();
}
if (target instanceof DValueLine){
return ((DValueLine)target).getBlock();
}
return null;
}
}
}