/******************************************************************************* * Copyright (c) 2012 Google, Inc. * 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: * Google, Inc. - initial API and implementation *******************************************************************************/ package com.windowtester.runtime.gef.internal.finder.position; import java.io.Serializable; import org.eclipse.draw2d.PositionConstants; import org.eclipse.draw2d.geometry.Point; import com.windowtester.runtime.gef.Position; public class PositionHelper { public static final PositionImpl TOP = new PositionImpl(PositionConstants.NORTH); public static final PositionImpl BOTTOM = new PositionImpl(PositionConstants.SOUTH); public static final PositionImpl LEFT = new PositionImpl(PositionConstants.WEST); public static final PositionImpl RIGHT = new PositionImpl(PositionConstants.EAST); public static final PositionImpl TOP_RIGHT = new PositionImpl(PositionConstants.NORTH_EAST); public static final PositionImpl TOP_LEFT = new PositionImpl(PositionConstants.NORTH_WEST); public static final PositionImpl BOTTOM_RIGHT = new PositionImpl(PositionConstants.SOUTH_EAST); public static final PositionImpl BOTTOM_LEFT = new PositionImpl(PositionConstants.SOUTH_WEST); public static final PositionImpl CENTER = new PositionImpl(PositionConstants.CENTER); public static final PositionImpl NONE = new PositionImpl(PositionConstants.NONE); public static final PositionImpl NORTH = TOP; public static final PositionImpl SOUTH = BOTTOM; public static final PositionImpl EAST = RIGHT; public static final PositionImpl WEST = LEFT; public static final PositionImpl NORTH_EAST = TOP_RIGHT; public static final PositionImpl NORTH_WEST = TOP_LEFT; public static final PositionImpl SOUTH_EAST = BOTTOM_RIGHT; public static final PositionImpl SOUTH_WEST = BOTTOM_LEFT; public static class PositionImpl implements Position, Serializable { private static final long serialVersionUID = 4537721238211331273L; private final int positionConstant; private PositionImpl(int positionConstant) { this.positionConstant = positionConstant; } public int getDirectionConstant() { return positionConstant; } public boolean describesPointRelativeTo(Point point, Point origin) { return isDirectionOf(point, getDirectionConstant(), origin); } /* (non-Javadoc) * @see java.lang.Object#toString() */ public String toString() { return getOrientationString(getDirectionConstant()); } } public static boolean isDirectionOf(Point point, int positionConstant, Point origin) { int position = getPositionRelativeTo(point, origin); //System.out.println(point + " is " + getOrientationString(position) + " of " + origin); return position == positionConstant; } public static int getPositionRelativeTo(Point point, Point origin) { int position = getLeftRightPositionRelativeTo(point, origin) | getUpDownPositionRelativeTo(point, origin); if (position == PositionConstants.NONE) return PositionConstants.CENTER; return position; } protected static int getUpDownPositionRelativeTo(Point point, Point origin) { int dy = point.y - origin.y; if (dy == 0) return PositionConstants.NONE; if (dy < 0) return PositionConstants.NORTH; return PositionConstants.SOUTH; } protected static int getLeftRightPositionRelativeTo(Point point, Point origin) { int dx = point.x - origin.x; if (dx == 0) return PositionConstants.NONE; if (dx < 0) return PositionConstants.WEST; return PositionConstants.EAST; } public static Position getPositionForConstant(int locationConstant) { switch(locationConstant) { case PositionConstants.NORTH : return TOP; case PositionConstants.SOUTH : return BOTTOM; case PositionConstants.EAST : return RIGHT; case PositionConstants.WEST : return LEFT; case PositionConstants.NORTH_EAST : return TOP_RIGHT; case PositionConstants.SOUTH_EAST : return BOTTOM_RIGHT; case PositionConstants.NORTH_WEST : return TOP_LEFT; case PositionConstants.SOUTH_WEST : return BOTTOM_LEFT; case PositionConstants.CENTER : return CENTER; case PositionConstants.NONE : return NONE; } return null; } public static String getOrientationString(int locationConstant) { switch(locationConstant) { case PositionConstants.NORTH : return "TOP"; case PositionConstants.SOUTH : return "BOTTOM"; case PositionConstants.EAST : return "RIGHT"; case PositionConstants.WEST : return "LEFT"; case PositionConstants.NORTH_EAST : return "TOP_RIGHT"; case PositionConstants.SOUTH_EAST : return "BOTTOM_RIGHT"; case PositionConstants.NORTH_WEST : return "TOP_LEFT"; case PositionConstants.SOUTH_WEST : return "BOTTOM_LEFT"; case PositionConstants.CENTER : return "CENTER"; case PositionConstants.NONE : return "NONE"; } return "<unrecognized>"; } public static int getPositionConstant(Position position) { Class cls = position.getClass(); Class positionClass = PositionImpl.class; if (cls != positionClass) { throw new IllegalArgumentException("Position type: " + position + " not recognized ---- only instances of " + positionClass + " allowed"); } return ((PositionImpl)position).getDirectionConstant(); } }