package org.eclipse.uml2.diagram.clazz.edit.commands;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.RequestConstants;
import org.eclipse.gef.commands.Command;
import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest;
import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest.ConnectionViewDescriptor;
import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest;
import org.eclipse.uml2.diagram.clazz.edit.parts.AssociationEditPart;
import org.eclipse.uml2.uml.Type;
public class CreateAssociationViewCommand extends Command {
private EditPart mySourceEditPart;
private EditPart myTargetEditPart;
private IAdaptable mySemanticAdapter;
private PreferencesHint myPreferencesHint;
public CreateAssociationViewCommand(GraphicalEditPart propertyEditPart, Type associationSource, Type associationTarget, CreateRelationshipRequest semanticRequest, PreferencesHint preferencesHint) {
EditPart root = propertyEditPart.getRoot().getContents();
mySourceEditPart = propertyEditPart.findEditPart(root, associationSource);
myTargetEditPart = propertyEditPart.findEditPart(root, associationTarget);
mySemanticAdapter = new CreatedEObjectAdapter(semanticRequest);
myPreferencesHint = preferencesHint;
}
@Override
public void execute() {
ConnectionViewDescriptor viewDescriptor = new ConnectionViewDescriptor(mySemanticAdapter, String.valueOf(AssociationEditPart.VISUAL_ID), ViewUtil.APPEND, false, myPreferencesHint);
CreateConnectionViewRequest createViewRequest = new CreateConnectionViewRequest(viewDescriptor);
createViewRequest.setType(RequestConstants.REQ_CONNECTION_START);
createViewRequest.setTargetEditPart(mySourceEditPart);
mySourceEditPart.getCommand(createViewRequest);
createViewRequest.setType(RequestConstants.REQ_CONNECTION_END);
createViewRequest.setSourceEditPart(mySourceEditPart);
createViewRequest.setTargetEditPart(myTargetEditPart);
Command createViewCommand = myTargetEditPart.getCommand(createViewRequest);
if (createViewCommand.canExecute()) {
createViewCommand.execute();
}
}
@Override
public boolean canExecute() {
if (mySourceEditPart == null || myTargetEditPart == null) {
// TODO probably handle this situation and create association in
// semantic model only
return false;
}
// NOTE: When command is beeing constructured association element is not
// yet created
return true;
}
private static class CreatedEObjectAdapter implements IAdaptable {
private final CreateRelationshipRequest myRequest;
CreatedEObjectAdapter(CreateRelationshipRequest request) {
myRequest = request;
}
public Object getAdapter(Class adapter) {
if (adapter.isInstance(getCreatedObject())) {
return getCreatedObject();
}
return null;
}
public Object getCreatedObject() {
return myRequest.getNewElement();
}
}
}