blob: eb0034e402e00f664ec3e2c3621dd16f3dcd5a8b [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.PointList;
/**
* Repositions a {@link Figure} attached to a {@link Connection} when the
* Connection is moved. Provides for alignment at the start (source), middle, or
* end (target) of the Connection.
*/
public class ConnectionLocator extends AbstractLocator {
/** @deprecated Use {@link #SOURCE} */
public static final int START = 2;
/** The start (or source) of the Connection */
public static final int SOURCE = 2;
/** @deprecated Use {@link #TARGET} */
public static final int END = 3;
/** The end (or target) of the Connection */
public static final int TARGET = 3;
/**
* @deprecated Use {@link #MIDDLE} instead, since the location is not the
* midpoint of a line-segment, but the middle of a polyline.
*/
public static final int MIDPOINT = 4;
/** The middle of the Connection */
public static final int MIDDLE = 4;
private Connection connection;
private int alignment;
/**
* Constructs a ConnectionLocator with the passed connection and
* {@link #MIDDLE} alignment.
*
* @param connection
* The Connection
* @since 2.0
*/
public ConnectionLocator(Connection connection) {
this(connection, MIDDLE);
}
/**
* Constructs a ConnectionLocator with the passed Connection and alignment.
* Valid values for the alignment are integer constants {@link #SOURCE},
* {@link #MIDDLE}, and {@link #TARGET}.
*
* @param connection
* The Connection
* @param align
* The alignment
*
* @since 2.0
*/
public ConnectionLocator(Connection connection, int align) {
setConnection(connection);
setAlignment(align);
}
/**
* Returns the alignment of ConnectionLocator.
*
* @return The alignment
* @since 2.0
*/
public int getAlignment() {
return alignment;
}
/**
* Returns connection associated with ConnectionLocator.
*
* @return The Connection
* @since 2.0
*/
protected Connection getConnection() {
return connection;
}
/**
* Returns ConnectionLocator's reference point in absolute coordinates.
*
* @return The reference point
* @since 2.0
*/
protected Point getReferencePoint() {
Point p = getLocation(getConnection().getPoints());
getConnection().translateToAbsolute(p);
return p;
}
/**
* Returns a point from the passed PointList, dependent on
* ConnectionLocator's alignment. If the alignment is {@link #SOURCE}, it
* returns the first point in <i>points</i>. If {@link #TARGET}, it returns
* the last point in <i>points</i>. If {@link #MIDDLE}, it returns the
* middle of line represented by <i>points</i>.
*
* @param points
* The points in the Connection
* @return The location
* @since 2.0
*/
protected Point getLocation(PointList points) {
switch (getAlignment()) {
case SOURCE:
return points.getPoint(Point.SINGLETON, 0);
case TARGET:
return points.getPoint(Point.SINGLETON, points.size() - 1);
case MIDDLE:
if (points.size() % 2 == 0) {
int i = points.size() / 2;
int j = i - 1;
Point p1 = points.getPoint(j);
Point p2 = points.getPoint(i);
Dimension d = p2.getDifference(p1);
return Point.SINGLETON.setLocation(p1.x + d.width / 2, p1.y
+ d.height / 2);
}
int i = (points.size() - 1) / 2;
return points.getPoint(Point.SINGLETON, i);
default:
return new Point();
}
}
/**
* Sets the alignment. Possible values are {@link #SOURCE}, {@link #MIDDLE},
* and {@link #TARGET}.
*
* @param align
* The alignment
* @since 2.0
*/
protected void setAlignment(int align) {
alignment = align;
}
/**
* Sets the Connection to be associated with this ConnectionLocator.
*
* @param connection
* The Connection
* @since 2.0
*/
protected void setConnection(Connection connection) {
this.connection = connection;
}
}