//------------------------------------------------------------------------------ // Copyright (c) 2005, 2006 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 implementation //------------------------------------------------------------------------------ package org.eclipse.epf.authoring.gef.edit; import org.eclipse.draw2d.AbstractConnectionAnchor; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.PositionConstants; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.epf.authoring.gef.util.AnchorUtil; /** * Provides support to find the closest location in figure * for anchor. * * @author Phong Nguyen Le * @since 1.0 */ public class ClosestAnchor extends AbstractConnectionAnchor { public ClosestAnchor(IFigure figure) { super(figure); } /** * @see org.eclipse.draw2d.ConnectionAnchor#getLocation(Point) */ public Point getLocation(Point reference) { return getLocation(getOwner(), reference); } /** * Finds the location in the closest location in figure, based on * figure bounds and the reference point. * * @param figure {@link IFigure} Figure to which connection is establishing. * @param reference {@link Point} */ public static Point getLocation(IFigure figure, Point reference) { Rectangle r = figure.getBounds().getCopy(); figure.translateToAbsolute(r); Rectangle absoluteBounds = r.getCopy(); Point p = null; switch (r.getPosition(reference)) { case PositionConstants.NORTH: p = r.getTopLeft().translate(reference.x - r.x, 0); break; case PositionConstants.NORTH_EAST: p = r.getTopRight(); break; case PositionConstants.EAST: p = r.getTopRight().translate(0, reference.y - r.y); break; case PositionConstants.SOUTH_EAST: p = r.getBottomRight(); break; case PositionConstants.SOUTH: p = r.getBottomLeft().translate(reference.x - r.x, 0); break; case PositionConstants.SOUTH_WEST: p = r.getBottomLeft(); break; case PositionConstants.WEST: p = r.getTopLeft().translate(0, reference.y - r.y); break; case PositionConstants.NORTH_WEST: p = r.getTopLeft(); break; default: int topDistance = reference.y - r.y; int rightDistance = r.right() - reference.x; int bottomDistance = r.bottom() - reference.y; int leftDistance = reference.x - r.x; int[] distances = { topDistance, rightDistance, bottomDistance, leftDistance }; int id = AnchorUtil.min(distances); switch (id) { case 0: p = r.getTopLeft().translate(leftDistance, 0); break; case 1: p = r.getTopRight().translate(0, topDistance); break; case 2: p = r.getBottomLeft().translate(leftDistance, 0); break; case 4: p = r.getTopLeft().translate(topDistance, 0); break; } } if (p != null) { p.performTranslate(-absoluteBounds.x, -absoluteBounds.y); } return p; } }