/*******************************************************************************
 * Copyright 2005-2006, CHISEL Group, University of Victoria, Victoria, BC,
 * Canada. 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: The Chisel Group, University of Victoria
 *******************************************************************************/
package org.eclipse.zest.core.viewers;

/**
 * An extension to the IConnectinStyleProvider that allows styling specific to
 * bezier curves.
 * 
 * Bezier curves are defined by a set of four points: two point in the layout
 * (start and end), and two related control points (also start and end). The
 * control points are defined relative to their corresponding layout point.
 * This definition includes an angle between the layout point and the line
 * between the two layout points, as well as a ratio distance from the corresponding
 * layout point. The ratio distance is defined as a fraction between 0 and 1
 * of the distance between the two layout points. Using this definition
 * allows bezier curves to have a consistant look regardless of the actual
 * positions of the nodes in the layouts. 
 * @author Del Myers
 *
 */
//@tag bug(152530-Bezier(fix)) : users can style bezier curves.
public interface IConnectionStyleBezierExtension {

	/**
	 * Gets the angle between the start point, and the line between the start 
	 * and end, which will define the position of the start control point.
	 * If the start angle, and the end angle are the same sign, the two control
	 * points are guaranteed to be on the same side of the line.
	 * @param rel the relationship to base on.
	 * @return the start angle or <code>Double.NaN</code> for defaults.
	 */
	double getStartAngle(Object rel);

	/**
	 * Gets the angle between the end point, and the line between the start 
	 * and end, which will define the position of the end control point.
	 * If the start angle, and the end angle are the same sign, the two control
	 * points are guaranteed to be on the same side of the line.
	 * @param rel the relationship to base on.
	 * @return the end angle or <code>Double.NaN</code> for defaults.
	 */
	double getEndAngle(Object rel);

	/**
	 * Gets the distance between the start point and the start control point,
	 * as a fraction of the distance between the start point and end point.
	 * @param rel the relationship to base on.
	 * @return the start distance or <code>Double.NaN</code> for defaults.
	 */
	double getStartDistance(Object rel);

	/**
	 * Gets the distance between the end point and the end control point,
	 * as a fraction of the distance between the start point and end point.
	 * @param rel the relationship to base on.
	 * @return the end distance or <code>Double.NaN</code> for defaults.
	 */
	double getEndDistance(Object rel);
}
