/*******************************************************************************
* Copyright (c) 2000, 2008 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 API and implementation
*******************************************************************************/
package org.eclipse.draw2d;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.draw2d.geometry.PrecisionPoint;
/**
* RelativeBendpoint is a Bendpoint that calculates its location based on its distance
* from the start and end points of the {@link Connection}, as well as its weight. See
* {@link #setWeight(float)} for a description of what behavior different weights will
* provide.
*/
public class RelativeBendpoint
implements Bendpoint
{
private Connection connection;
private float weight = 0.5f;
private Dimension d1, d2;
/**
* Constructs a new RelativeBendpoint.
*
* @since 2.0
*/
public RelativeBendpoint() { }
/**
* Constructs a new RelativeBendpoint and associates it with the given Connection.
* @param conn The Connection this Bendpoint is associated with
* @since 2.0
*/
public RelativeBendpoint(Connection conn) {
setConnection(conn);
}
/**
* Returns the Connection this Bendpoint is associated with.
* @return The Connection this Bendpoint is associated with
* @since 2.0
*/
protected Connection getConnection() {
return connection;
}
/**
* Calculates and returns this Bendpoint's new location.
* @return This Bendpoint's new location
* @since 2.0
*/
public Point getLocation() {
PrecisionPoint a1 = new PrecisionPoint(getConnection().getSourceAnchor().getReferencePoint());
PrecisionPoint a2 = new PrecisionPoint(getConnection().getTargetAnchor().getReferencePoint());
getConnection().translateToRelative(a1);
getConnection().translateToRelative(a2);
return new PrecisionPoint(
(a1.preciseX() + d1.preciseWidth()) * (1.0 - weight) + weight
* (a2.preciseX() + d2.preciseWidth()),
(a1.preciseY() + d1.preciseHeight()) * (1.0 - weight) + weight
* (a2.preciseY() + d2.preciseHeight()));
}
/**
* Sets the Connection this bendpoint should be associated with.
* @param conn The Connection this bendpoint should be associated with
* @since 2.0
*/
public void setConnection(Connection conn) {
connection = conn;
}
/**
* Sets the Dimensions representing the X and Y distances this Bendpoint is from the start
* and end points of the Connection. These Dimensions are generally set once and are used
* in calculating the Bendpoint's location.
* @param dim1 The X and Y distances this Bendpoint is from the start of the Connection
* @param dim2 The X and Y distances this Bendpoint is from the end of the Connection
* @since 2.0
*/
public void setRelativeDimensions(Dimension dim1, Dimension dim2) {
d1 = dim1;
d2 = dim2;
}
/**
* Sets the weight this Bendpoint should use to calculate its location. The weight should
* be between 0.0 and 1.0. A weight of 0.0 will cause the Bendpoint to follow the start
* point, while a weight of 1.0 will cause the Bendpoint to follow the end point. A weight
* of 0.5 (the default) will cause the Bendpoint to maintain its original aspect ratio
* between the start and end points.
* @param w The weight
* @since 2.0
*/
public void setWeight(float w) {
weight = w;
}
}