package org.eclipse.papyrus.uml.diagram.sequence.apex.command; import java.util.Collection; import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.transaction.TransactionalEditingDomain; import org.eclipse.gef.EditPartViewer; import org.eclipse.gmf.runtime.common.core.command.CommandResult; import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil; import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.requests.CreateViewRequest.ViewDescriptor; import org.eclipse.gmf.runtime.notation.NotationPackage; import org.eclipse.gmf.runtime.notation.View; import org.eclipse.papyrus.uml.diagram.sequence.apex.interfaces.IApexCreateElementAndNodeCommand; import org.eclipse.papyrus.uml.diagram.sequence.apex.util.ApexSequenceDiagramConstants; import org.eclipse.papyrus.uml.diagram.sequence.apex.util.ApexSequenceUtil; import org.eclipse.uml2.uml.ExecutionSpecification; import org.eclipse.uml2.uml.InteractionFragment; import org.eclipse.uml2.uml.Message; /** * @author Jiho * */ public class ApexCreateAndMoveInteractionFragmentsCommand extends ApexMoveInteractionFragmentsCommand { private static final int MARGIN = ApexSequenceDiagramConstants.VERTICAL_MARGIN; private static final int PADDING = ApexSequenceDiagramConstants.EXECUTION_PADDING; private ViewDescriptor descriptor; // private CreateElementAndNodeCommand createElementAndNodeCommand; private IApexCreateElementAndNodeCommand createElementAndNodeCommand; public ApexCreateAndMoveInteractionFragmentsCommand(TransactionalEditingDomain domain, IApexCreateElementAndNodeCommand command, ViewDescriptor descriptor, EditPartViewer viewer, InteractionFragment fragment, Point location) { super(domain, viewer, fragment, location, null, MARGIN); this.descriptor = descriptor; this.createElementAndNodeCommand = command; } @Override protected CommandResult doExecuteWithResult(IProgressMonitor monitor, IAdaptable info) throws ExecutionException { if (descriptor != null) { View view = (View)descriptor.getAdapter(View.class); if (view != null) { EObject eObject = view.getElement(); if (eObject instanceof Message) { Message message = (Message)eObject; notToMoveEObject.add(message.getSendEvent()); notToMoveEObject.add(message.getReceiveEvent()); } } } if (createElementAndNodeCommand != null) { View view = createElementAndNodeCommand.getCreatedView(); if (view != null) { EObject eObject = view.getElement(); if (eObject instanceof ExecutionSpecification) { ExecutionSpecification execution = (ExecutionSpecification)eObject; notToMoveEObject.add(execution); notToMoveEObject.add(execution.getStart()); notToMoveEObject.add(execution.getFinish()); } } } return super.doExecuteWithResult(monitor, info); } @Override public Point getMoveDelta() { Point delta = super.getMoveDelta(); if (delta == null && createElementAndNodeCommand != null) { View createdView = createElementAndNodeCommand.getCreatedView(); if (createdView != null) { int height = (Integer)ViewUtil.getStructuralFeatureValue(createdView, NotationPackage.eINSTANCE.getSize_Height()); delta = new Point(0, height); setMoveDelta(delta); } } return delta; } @Override public Point getRealMoveDelta(Point moveDelta, Collection<InteractionFragment> fragments) { Point newDelta = moveDelta.getCopy(); for (InteractionFragment ift : fragments) { if (ift instanceof ExecutionSpecification) { ExecutionSpecification execution = (ExecutionSpecification)ift; IGraphicalEditPart editPart = getEditPart(execution); Rectangle bounds = ApexSequenceUtil.getAbsoluteBounds(editPart); if (bounds.y < getExtent().y && bounds.bottom() >= getExtent().y) { if (bounds.bottom() < getExtent().y + PADDING) { newDelta.y = Math.max(newDelta.y, moveDelta.y + getExtent().y + PADDING - bounds.bottom()); } } } } return newDelta; } }