/*********************************************************************
* Copyright (c) 2005, 2019 SAP SE
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
*    SAP SE - initial API, implementation and documentation
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
package org.eclipse.graphiti.testtool.sketch.features;

import java.util.Collection;

import org.eclipse.graphiti.features.IFeatureProvider;
import org.eclipse.graphiti.features.context.IMoveShapeContext;
import org.eclipse.graphiti.features.impl.DefaultMoveShapeFeature;
import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
import org.eclipse.graphiti.mm.algorithms.Polyline;
import org.eclipse.graphiti.mm.pictograms.Anchor;
import org.eclipse.graphiti.mm.pictograms.Connection;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.mm.pictograms.Shape;
import org.eclipse.graphiti.services.Graphiti;
import org.eclipse.graphiti.testtool.sketch.SketchUtil;

/**
 * The Class SketchMoveShapeFeature.
 */
public class SketchMoveShapeFeature extends DefaultMoveShapeFeature {

	/**
	 * Instantiates a new sketch move shape feature.
	 * 
	 * @param fp
	 *            the fp
	 */
	public SketchMoveShapeFeature(IFeatureProvider fp) {
		super(fp);
	}

	@Override
	public boolean canMoveShape(IMoveShapeContext context) {
		PictogramElement pe = context.getPictogramElement();
		Connection targetConnection = context.getTargetConnection();
		
		if (targetConnection!=null && !SketchUtil.isConnectionPoint(pe)) {
			if(targetConnection.getStart().getParent().equals(pe)){
				return false;
			}
			if(targetConnection.getEnd().getParent().equals(pe)){
				return false;
			}
		}
		return true;
	}

	@Override
	protected void internalMove(IMoveShapeContext context) {

		super.internalMove(context);

		Connection targetConnection = context.getTargetConnection();
		if (targetConnection != null) {
			if (context.getSourceContainer().equals(context.getTargetContainer())) {

				Shape shape = context.getShape();
				GraphicsAlgorithm ga = shape.getGraphicsAlgorithm();

				Graphiti.getGaService().setLocation(ga, context.getX() - (ga.getWidth() / 2), context.getY() - (ga.getHeight() / 2));

				Collection<Anchor> anchors = shape.getAnchors();
				if (anchors.size() > 0) {
					Anchor newAnchor = anchors.iterator().next();

					Anchor oldEndAnchor = targetConnection.getEnd();
					targetConnection.setEnd(newAnchor);

					Connection connection = Graphiti.getPeCreateService().createFreeFormConnection(getDiagram());
					Polyline p = Graphiti.getGaCreateService().createPolyline(connection);

					GraphicsAlgorithm targetConnectionGraphicsAlgorithm = targetConnection.getGraphicsAlgorithm();
					p.setLineWidth(targetConnectionGraphicsAlgorithm.getLineWidth());
					p.setForeground(targetConnectionGraphicsAlgorithm.getForeground());
					p.setLineStyle(targetConnectionGraphicsAlgorithm.getLineStyle());

					connection.setStart(newAnchor);
					connection.setEnd(oldEndAnchor);
				}
			}
		}
	}

}
