/***************************************************************************** * Copyright (c) 2008 CEA LIST. * * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation * *****************************************************************************/ package org.eclipse.papyrus.uml.diagram.clazz.custom.policies; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.gef.Request; import org.eclipse.gef.commands.Command; import org.eclipse.gef.requests.ReconnectRequest; import org.eclipse.gmf.runtime.diagram.core.edithelpers.CreateElementRequestAdapter; import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.editpolicies.GraphicalNodeEditPolicy; import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewAndElementRequest; import org.eclipse.gmf.runtime.diagram.ui.requests.CreateConnectionViewRequest; import org.eclipse.gmf.runtime.diagram.ui.requests.CreateUnspecifiedTypeConnectionRequest; import org.eclipse.gmf.runtime.emf.type.core.IHintedType; import org.eclipse.gmf.runtime.emf.type.core.requests.CreateRelationshipRequest; import org.eclipse.papyrus.uml.diagram.clazz.custom.helper.AssociationClassHelper; import org.eclipse.papyrus.uml.diagram.clazz.custom.helper.ContainmentHelper; import org.eclipse.papyrus.uml.diagram.clazz.custom.helper.GeneralizationSetHelper; import org.eclipse.papyrus.uml.diagram.clazz.custom.helper.MultiAssociationHelper; import org.eclipse.papyrus.uml.diagram.clazz.custom.helper.MultiDependencyHelper; import org.eclipse.papyrus.uml.diagram.clazz.edit.parts.GeneralizationSetEditPart; import org.eclipse.papyrus.uml.diagram.clazz.providers.UMLElementTypes; /** * This class is used to launch command to create associationClass * * @author Patrick Tessier */ public class CustomGraphicalNodeEditPolicy extends GraphicalNodeEditPolicy { /** * * {@inheritDoc} */ public Command getCommand(Request request) { // we have to distinguish the case where this is an association class if(REQ_CONNECTION_END.equals(request.getType())) { if(request instanceof CreateConnectionViewAndElementRequest) { // default behavior Command c = getConnectionAndRelationshipCompleteCommand((CreateConnectionViewAndElementRequest)request); // case of associationClass CreateElementRequestAdapter requestAdapter = ((CreateConnectionViewAndElementRequest)request).getConnectionViewAndElementDescriptor().getCreateElementRequestAdapter(); CreateRelationshipRequest createElementRequest = (CreateRelationshipRequest)requestAdapter.getAdapter(CreateRelationshipRequest.class); if(UMLElementTypes.AssociationClass_4017.equals(createElementRequest.getElementType())) { AssociationClassHelper associationClassHelper = new AssociationClassHelper(getEditingDomain()); return associationClassHelper.getAssociationClassElementCommand(((CreateConnectionViewAndElementRequest)request), c); } else if(UMLElementTypes.Dependency_4018.equals(createElementRequest.getElementType())) { MultiDependencyHelper multiDependencyHelper = new MultiDependencyHelper(getEditingDomain()); return multiDependencyHelper.getCommand(((CreateConnectionViewAndElementRequest)request), c); } else if(UMLElementTypes.Association_4019.equals(createElementRequest.getElementType())) { MultiAssociationHelper multiAssociationHelper = new MultiAssociationHelper(getEditingDomain()); return multiAssociationHelper.getCommand(((CreateConnectionViewAndElementRequest)request), c); } else { return c; } } else if(request instanceof CreateConnectionViewRequest) { Command c = getConnectionCompleteCommand((CreateConnectionViewRequest)request); String semanticHint = ((CreateConnectionViewRequest)request).getConnectionViewDescriptor().getSemanticHint(); if(semanticHint != null && (semanticHint.equals(((IHintedType)UMLElementTypes.Link_4023).getSemanticHint()))) { ContainmentHelper containmentHelper = new ContainmentHelper(getEditingDomain()); return containmentHelper.getCreateContainmentCommand((CreateConnectionViewRequest)request, c); } } else if(request instanceof CreateUnspecifiedTypeConnectionRequest) { return getUnspecifiedConnectionCompleteCommand((CreateUnspecifiedTypeConnectionRequest)request); } } return super.getCommand(request); } /** * used to obtain the transactional edit domain * * @return the current transactional edit domain */ private TransactionalEditingDomain getEditingDomain() { return ((IGraphicalEditPart)getHost()).getEditingDomain(); } protected Command getReconnectSourceCommand(ReconnectRequest request) { if(request.getConnectionEditPart() instanceof GeneralizationSetEditPart) { GeneralizationSetHelper generalizationSetHelper = new GeneralizationSetHelper(getEditingDomain()); return generalizationSetHelper.getReconnectSourceCommand(request, super.getConnectableEditPart()); } return super.getReconnectSourceCommand(request); } protected Command getReconnectTargetCommand(ReconnectRequest request) { Command command = super.getReconnectTargetCommand(request); if(request.getConnectionEditPart() instanceof GeneralizationSetEditPart) { GeneralizationSetHelper generalizationSetHelper = new GeneralizationSetHelper(getEditingDomain()); return generalizationSetHelper.getMoveTarget(request, command, super.getConnectableEditPart(), super.getConnectionTargetAnchor(request)); } return command; } }