/*****************************************************************************
 * Copyright (c) 2014 Montages AG and others
 *
 *    
 * 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:
 *  Anatoly Tishenko (ticher777@gmail.com) - Initial API and implementation
 */
package org.eclipse.gmf.tooling.runtime.linklf.editpolicies;

import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PointList;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.requests.ChangeBoundsRequest;
import org.eclipse.gmf.runtime.common.core.command.ICommand;
import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
import org.eclipse.gmf.runtime.diagram.ui.editparts.ConnectionEditPart;
import org.eclipse.gmf.runtime.emf.core.util.EObjectAdapter;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.RelativeBendpoints;
import org.eclipse.gmf.tooling.runtime.linklf.AbsoluteBendpointsConvention;

/**
 * This edit policy adjusts bendpoints for links between the nodes moved at the same time.
 * Only absolute bendpoints (also possibly stored as relative, see {@link AbsoluteBendpointsConvention}) require adjustment.
 */
public class AdjustImplicitlyMovedLinksEditPolicy extends AdjustAbsoluteBendpointsEditPolicyBase {

	/**
	 * Default role for registering this edit policy.
	 * <p/>
	 * The value is prefixed by class FQN in order to avoid conflicts, but the literal should NOT be used anywhere.
	 */
	public static final String ROLE = AdjustImplicitlyMovedLinksEditPolicy.class.getName() + ":Role";

	@Override
	protected Command getAdjustLinksCommand(ChangeBoundsRequest req) {
		return getAdjustImplicitlyMovedLinksCommand(req);
	}

	/**
	 * Link is implicitly moved when its source and target are both moved (directly or indirectly).
	 * In this case, {@link RelativeBendpoints} should not be adjusted.
	 * But when the link has effectively absolute bendpoints (see {@link AbsoluteBendpointsConvention})
	 * all of them must be also moved to the same {@link ChangeBoundsRequest#getMoveDelta()}
	 * <p/>
	 * Default implementation of this method will only affect the <strong>outgoing</strong> links from the host edit part to one of the edit parts
	 * being moved. This way all affected links will be modified only once.
	 */
	protected Command getAdjustImplicitlyMovedLinksCommand(ChangeBoundsRequest req) {
		final Point moveDelta = req.getMoveDelta();
		if(moveDelta.x == 0 && moveDelta.y == 0) {
			return null;
		}

		CachedEditPartsSet allMoved = getMovedEditPartsSet(req);
		ICommand result = null;
		for(Object next : getHost().getSourceConnections()) {
			if(next instanceof ConnectionEditPart) {
				ConnectionEditPart nextLinkEP = (ConnectionEditPart)next;
				EditPart target = nextLinkEP.getTarget();
				MovedNodeKind move = allMoved.isMoved(target);
				if(move == MovedNodeKind.DIRECTLY || move == MovedNodeKind.INDIRECTLY) {
					ICommand nextAdjustment = getAdjustOneLinkCommand(nextLinkEP, req);
					result = compose(result, nextAdjustment);
				}
			}
		}
		return result == null ? null : new ICommandProxy(result.reduce());
	}

	private ICommand getAdjustOneLinkCommand(ConnectionEditPart linkEP, ChangeBoundsRequest req) {
		SetAbsoluteBendpointsCommand result = null;
		Edge edge = (Edge)linkEP.getNotationView();
		if(AbsoluteBendpointsConvention.getInstance().hasAbsoluteStoredAsRelativeBendpoints(edge)) {
			PointList newPoints = AbsoluteBendpointsConvention.getInstance().getPointList(edge, linkEP.getConnectionFigure().getRoutingConstraint());
			newPoints.translate(req.getMoveDelta());

			result = new SetAbsoluteBendpointsCommand(getDomain());
			result.setEdgeAdapter(new EObjectAdapter(edge));
			result.setNewPointList(newPoints);
		}

		return result;
	}

}
