| /******************************************************************************* |
| * 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; |
| } |
| |
| } |