blob: f8847ecb4a8e557278d48b36c3827adf5d927853 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 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;
}
}