/******************************************************************************* * 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.util.ArrayList; import java.util.Collection; import java.util.Iterator; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import com.windowtester.runtime.gef.internal.finder.position.PositionHelper.PositionImpl; public class PositionSpec { private static final Collection POSITIONS = new ArrayList(); public static class CenterRegion { private static final double RADIUS_FACTOR = 0.3; private final Rectangle rectangle; public CenterRegion(Rectangle rect) { this.rectangle = rect; } public static CenterRegion forRect(Rectangle rect) { return new CenterRegion(rect); } public boolean contains(Point pt) { Point center = rectangle.getCenter(); double maxDist = deriveRadiusForCenter(rectangle); return center.getDistance(pt) <= maxDist; } public static double deriveRadiusForCenter(Rectangle rect) { int minDimension = Math.min(rect.height, rect.width); return Math.floor(minDimension * RADIUS_FACTOR); } } public static final PositionSpec TOP = new PositionSpec(PositionHelper.TOP); public static final PositionSpec BOTTOM = new PositionSpec(PositionHelper.BOTTOM); public static final PositionSpec LEFT = new PositionSpec(PositionHelper.LEFT); public static final PositionSpec RIGHT = new PositionSpec(PositionHelper.RIGHT); public static final PositionSpec TOP_RIGHT = new PositionSpec(PositionHelper.TOP_RIGHT); public static final PositionSpec BOTTOM_RIGHT = new PositionSpec(PositionHelper.BOTTOM_RIGHT); public static final PositionSpec TOP_LEFT = new PositionSpec(PositionHelper.TOP_LEFT); public static final PositionSpec BOTTOM_LEFT = new PositionSpec(PositionHelper.BOTTOM_LEFT); public static final PositionSpec NONE = new PositionSpec(PositionHelper.NONE); public static final PositionSpec CENTER = new PositionSpec(PositionHelper.CENTER) { public boolean describesPointRelativeTo(Point point, Rectangle rect) { return inCenterRegion(point, rect); } }; private final PositionImpl position; public PositionSpec(PositionImpl position) { this.position = position; POSITIONS.add(this); } public PositionImpl getPosition() { return position; } public boolean describesPointRelativeTo(Point point, Rectangle rect) { return !inCenterRegion(point, rect) && position.describesPointRelativeTo(point, rect.getCenter()); } /* (non-Javadoc) * @see java.lang.Object#toString() */ public String toString() { return "PositionSpec("+ position.toString() +")"; } public static PositionSpec forPointRelativeTo(Point point, Rectangle rect) { for (Iterator iter = iterator(); iter.hasNext(); ) { PositionSpec spec = (PositionSpec)iter.next(); if (spec.describesPointRelativeTo(point, rect)) return spec; } return NONE; } public static boolean inCenterRegion(Point pt, Rectangle rect) { return CenterRegion.forRect(rect).contains(pt); } private static Iterator iterator() { return POSITIONS.iterator(); } }