Skip to main content
summaryrefslogblamecommitdiffstats
blob: fffd73b51a267e26bb16969ef5250ca3654c66a6 (plain) (tree)


















































































































































































                                                                                                                                                                                                       
/*****************************************************************************
 * Copyright (c) 2010 CEA
 *
 *
 * 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:
 *   Soyatec - Initial API and implementation
 *
 *****************************************************************************/
package org.eclipse.papyrus.uml.diagram.sequence.edit.policies;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.draw2d.Connection;
import org.eclipse.draw2d.ConnectionLocator;
import org.eclipse.draw2d.Ellipse;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.DragTracker;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editpolicies.ConnectionEndpointEditPolicy;
import org.eclipse.gef.handles.ConnectionEndpointHandle;
import org.eclipse.gef.requests.ReconnectRequest;
import org.eclipse.gef.tools.ConnectionEndpointTracker;
import org.eclipse.papyrus.uml.diagram.sequence.edit.parts.AnnotatedLinkEditPart;
import org.eclipse.swt.SWT;

/**
 * An editpolicy for handling reconnections of an {@link AnnotatedLinkEditPart}.
 *
 * @see AnnotatedLinkStartEditPolicy
 * @see AnnotatedLinkEndEditPolicy
 *
 * @author Jin Liu (jin.liu@soyatec.com)
 */
public class AnnotatedLinkEndpointEditPolicy extends ConnectionEndpointEditPolicy {

	private IFigure anchorFeedback;

	@Override
	public void eraseSourceFeedback(Request request) {
		if (AnnotatedLinkStartEditPolicy.REQ_ANNOTATED_LINK_REORIENT_START.equals(request.getType()) || AnnotatedLinkEndEditPolicy.REQ_ANNOTATED_LINK_REORIENT_END.equals(request.getType())) {
			eraseConnectionMoveFeedback((ReconnectRequest) request);
		}
	}

	@Override
	public void showSourceFeedback(Request request) {
		if (AnnotatedLinkStartEditPolicy.REQ_ANNOTATED_LINK_REORIENT_START.equals(request.getType()) || AnnotatedLinkEndEditPolicy.REQ_ANNOTATED_LINK_REORIENT_END.equals(request.getType())) {
			showConnectionMoveFeedback((ReconnectRequest) request);
		}
	}

	@Override
	protected void showConnectionMoveFeedback(ReconnectRequest request) {
		super.showConnectionMoveFeedback(request);
		EditPart target = request.getTarget();
		boolean showFeedback = target != null;
		if (target != null) {
			Command command = target.getCommand(request);
			showFeedback = command != null && command.canExecute();
		}
		if (showFeedback) {
			Point location = null;
			Connection connection = getConnection();
			PointList points = connection.getPoints().getCopy();
			if (request.isMovingStartAnchor()) {
				location = points.getFirstPoint();
			} else {
				location = points.getLastPoint();
			}
			connection.translateToAbsolute(location);
			setFeedbackLocation(getAnchorFeedback(), location);
		} else {
			if (anchorFeedback != null && anchorFeedback.getParent() != null) {
				removeFeedback(anchorFeedback);
			}
			anchorFeedback = null;
		}
	}

	@Override
	protected void eraseConnectionMoveFeedback(ReconnectRequest request) {
		super.eraseConnectionMoveFeedback(request);
		if (anchorFeedback != null && anchorFeedback.getParent() != null) {
			removeFeedback(anchorFeedback);
		}
		anchorFeedback = null;
	}

	private void setFeedbackLocation(IFigure feedback, Point location) {
		if (feedback == null || location == null) {
			return;
		}
		Point p = location.getCopy();
		Dimension d = feedback.getSize();
		p.x = p.x - d.width / 2;
		p.y = p.y - d.height / 2;
		feedback.translateToRelative(p);
		feedback.setLocation(p);
	}

	private IFigure getAnchorFeedback() {
		if (anchorFeedback == null || anchorFeedback.getParent() == null) {
			Ellipse feedback = new Ellipse();
			feedback.setLineWidth(2);
			feedback.setAntialias(SWT.ON);
			feedback.setSize(10, 10);
			getFeedbackLayer().add(feedback);
			anchorFeedback = feedback;
		}
		return anchorFeedback;
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	@Override
	protected List createSelectionHandles() {
		List list = new ArrayList();
		list.add(new ConnectionEndpointHandle((ConnectionEditPart) getHost(), ConnectionLocator.SOURCE) {

			@Override
			protected DragTracker createDragTracker() {
				ConnectionEndpointTracker tracker = new ConnectionEndpointTracker((ConnectionEditPart) getOwner()) {

					@Override
					protected Request createTargetRequest() {
						ReconnectRequest request = new ReconnectRequest(getCommandName()) {

							@Override
							public boolean isMovingStartAnchor() {
								return true;
							}
						};
						request.setConnectionEditPart(getConnectionEditPart());
						return request;
					}
				};
				tracker.setCommandName(AnnotatedLinkStartEditPolicy.REQ_ANNOTATED_LINK_REORIENT_START);
				tracker.setDefaultCursor(getCursor());
				return tracker;
			}
		});
		list.add(new ConnectionEndpointHandle((ConnectionEditPart) getHost(), ConnectionLocator.TARGET) {

			@Override
			protected DragTracker createDragTracker() {
				ConnectionEndpointTracker tracker = new ConnectionEndpointTracker((ConnectionEditPart) getOwner()) {

					@Override
					protected Request createTargetRequest() {
						ReconnectRequest request = new ReconnectRequest(getCommandName()) {

							@Override
							public boolean isMovingStartAnchor() {
								return false;
							}
						};
						request.setConnectionEditPart(getConnectionEditPart());
						return request;
					}
				};
				tracker.setCommandName(AnnotatedLinkEndEditPolicy.REQ_ANNOTATED_LINK_REORIENT_END);
				tracker.setDefaultCursor(getCursor());
				return tracker;
			}
		});
		return list;
	}
}

Back to the top