//------------------------------------------------------------------------------
// Copyright (c) 2005, 2007 IBM Corporation 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:
// IBM Corporation - initial implementation
//------------------------------------------------------------------------------
/**
 * 
 */
package org.eclipse.epf.diagramming.base.parts;

import org.eclipse.draw2d.ConnectionAnchor;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.epf.diagram.model.Link;
import org.eclipse.epf.diagramming.base.figures.DecisionNodeFigure;
import org.eclipse.epf.diagramming.base.figures.RelativeXYAnchor;
import org.eclipse.gef.ConnectionEditPart;
import org.eclipse.gef.Request;
import org.eclipse.gef.requests.CreateConnectionRequest;
import org.eclipse.gef.requests.LocationRequest;
import org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart;
import org.eclipse.gmf.runtime.gef.ui.figures.NodeFigure;
import org.eclipse.gmf.runtime.notation.View;

/**
 * @author Shashidhar Kannoori
 *
 */
public class DiamondNodeEditPart extends ShapeNodeEditPart {

	/**
	 * @param view
	 */
	public DiamondNodeEditPart(View view) {
		super(view);
		// TODO Auto-generated constructor stub
	}

	/* (non-Javadoc)
	 * @see org.eclipse.gmf.runtime.diagram.ui.editparts.ShapeNodeEditPart#createNodeFigure()
	 */
	protected NodeFigure createNodeFigure() {
		return null;
	}
	
	/*
	 * (non-Javadoc)
	 * @see org.eclipse.epf.authoring.gef.edit.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
	 * @custom
	 */
	public ConnectionAnchor getSourceConnectionAnchor(
			ConnectionEditPart connection) {
		boolean isRelative = false;
		Point sourceEndPoint;
		if (recentSourceEndPoint == null) {
			// get source end point from the model
			Link link = (Link) connection.getModel();
			sourceEndPoint = link.getSourceEndPoint();
			isRelative = true;
		} else {
			sourceEndPoint = recentSourceEndPoint;
		}
		if (sourceEndPoint != null) {
			return new RelativeXYAnchor(getFigure(), sourceEndPoint, isRelative);
		}
		return super.getSourceConnectionAnchor(connection);
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.epf.authoring.gef.edit.NodeEditPart#getSourceConnectionAnchor(org.eclipse.gef.Request)
	 * @custom
	 */
	public ConnectionAnchor getSourceConnectionAnchor(Request request) {
		Point p = null;
		if (request instanceof CreateConnectionRequest) {
			CreateConnectionRequest req = (CreateConnectionRequest) request;
			p = req.getLocation();
		} else if (request instanceof LocationRequest) {
			p = ((LocationRequest) request).getLocation();
		}
		if (p != null) {
			recentSourceEndPoint = getLocation(p);
			return new RelativeXYAnchor(getFigure(), recentSourceEndPoint, true);
		}
		return super.getSourceConnectionAnchor(request);
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.epf.authoring.gef.edit.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.ConnectionEditPart)
	 * @custom
	 */
	public ConnectionAnchor getTargetConnectionAnchor(
			ConnectionEditPart connection) {
		boolean isRelative = false;
		Point targetEndPoint;
		if (recentTargetEndPoint == null) {
			// get target end point from model
			Link link = (Link) connection.getModel();
			targetEndPoint = link.getTargetEndPoint();
			isRelative = true;
		} else {
			targetEndPoint = recentTargetEndPoint;
		}
		if (targetEndPoint != null) {
			return new RelativeXYAnchor(getFigure(), targetEndPoint, isRelative);
		}

		return super.getTargetConnectionAnchor(connection);
	}

	/*
	 * (non-Javadoc)
	 * @see org.eclipse.epf.authoring.gef.edit.NodeEditPart#getTargetConnectionAnchor(org.eclipse.gef.Request)
	 * @custom
	 */
	public ConnectionAnchor getTargetConnectionAnchor(Request request) {
		Point p = null;
		if (request instanceof CreateConnectionRequest) {
			CreateConnectionRequest req = (CreateConnectionRequest) request;
			p = req.getLocation();
		} else if (request instanceof LocationRequest) {
			p = ((LocationRequest) request).getLocation();
		}
		if (p != null) {
			recentTargetEndPoint = getLocation(p);
			return new RelativeXYAnchor(getFigure(), recentTargetEndPoint, true);
		}

		return super.getTargetConnectionAnchor(request);
	}

	/**
	 * @see org.eclipse.epf.authoring.gef.util.ConnectionAnchorLocator#getLocation(Point)
	 * @custom
	 * 
	 */
	public Point getLocation(Point reference) {
		DecisionNodeFigure f = ((DecisionNodeFigure) getFigure());

		// translate points to absolute
		Point[] points = new Point[f.getPoints().size()];
		for (int i = f.getPoints().size() - 1; i > -1; i--) {
			Point p = f.getPoints().getPoint(i);
			f.translateToAbsolute(p);
			points[i] = p;
		}

		Point p = org.eclipse.epf.diagramming.base.util.AnchorUtil.getClosestPoint(points, reference);
		if (p != null) {
			Rectangle r = f.getBounds().getCopy();
			f.translateToAbsolute(r);
			p.performTranslate(-r.x, -r.y);
		}
		return p;
	}
	
	/*
	 * @custom
	 */
	private Point recentSourceEndPoint;

	/*
	 * @custom
	 */
	private Point recentTargetEndPoint;

}
