/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Eclipse Public License, Version 1.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.eclipse.org/org/documents/epl-v10.php * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.ide.eclipse.adt.internal.editors.layout.gle2; import org.eclipse.swt.SWT; /** * A selection handle is a small rectangle on the border of a selected view which lets you * change the size of the view by dragging it. */ public class SelectionHandle { /** * Size of the selection handle radius, in control coordinates. Note that this isn't * necessarily a <b>circular</b> radius; in the case of a rectangular handle, the * width and the height are both equal to this radius. * Note also that this radius is in <b>control</b> coordinates, whereas the rest * of the class operates in layout coordinates. This is because we do not want the * selection handles to grow or shrink along with the screen zoom; they are always * at the given pixel size in the control. */ public final static int PIXEL_RADIUS = 3; /** * Extra number of pixels to look beyond the actual radius of the selection handle * when matching mouse positions to handles */ public final static int PIXEL_MARGIN = 2; /** The position of the handle in the selection rectangle */ enum Position { TOP_MIDDLE(SWT.CURSOR_SIZEN), TOP_RIGHT(SWT.CURSOR_SIZENE), RIGHT_MIDDLE(SWT.CURSOR_SIZEE), BOTTOM_RIGHT(SWT.CURSOR_SIZESE), BOTTOM_MIDDLE(SWT.CURSOR_SIZES), BOTTOM_LEFT(SWT.CURSOR_SIZESW), LEFT_MIDDLE(SWT.CURSOR_SIZEW), TOP_LEFT(SWT.CURSOR_SIZENW); /** Corresponding SWT cursor value */ private int mSwtCursor; private Position(int swtCursor) { mSwtCursor = swtCursor; } private int getCursorType() { return mSwtCursor; } /** Is the {@link SelectionHandle} somewhere on the left edge? */ boolean isLeft() { return this == TOP_LEFT || this == LEFT_MIDDLE || this == BOTTOM_LEFT; } /** Is the {@link SelectionHandle} somewhere on the right edge? */ boolean isRight() { return this == TOP_RIGHT || this == RIGHT_MIDDLE || this == BOTTOM_RIGHT; } /** Is the {@link SelectionHandle} somewhere on the top edge? */ boolean isTop() { return this == TOP_LEFT || this == TOP_MIDDLE || this == TOP_RIGHT; } /** Is the {@link SelectionHandle} somewhere on the bottom edge? */ boolean isBottom() { return this == BOTTOM_LEFT || this == BOTTOM_MIDDLE || this == BOTTOM_RIGHT; } }; /** The x coordinate of the center of the selection handle */ public final int centerX; /** The y coordinate of the center of the selection handle */ public final int centerY; /** The position of the handle in the selection rectangle */ private final Position mPosition; /** * Constructs a new {@link SelectionHandle} at the given layout coordinate * corresponding to a handle at the given {@link Position}. * * @param centerX the x coordinate of the center of the selection handle * @param centerY y coordinate of the center of the selection handle * @param position the position of the handle in the selection rectangle */ public SelectionHandle(int centerX, int centerY, Position position) { mPosition = position; this.centerX = centerX; this.centerY = centerY; } /** * Determines whether the given {@link LayoutPoint} is within the given distance in * layout coordinates. The distance should incorporate at least the equivalent * distance to the control coordinate space {@link #PIXEL_RADIUS}, but usually with a * few extra pixels added in to make the corners easier to target. * * @param point the mouse position in layout coordinates * @param distance the distance from the center of the handle to check whether the * point fits within * @return true if the given point is within the given distance of this handle */ public boolean contains(LayoutPoint point, int distance) { return (point.x >= centerX - distance && point.x <= centerX + distance && point.y >= centerY - distance && point.y <= centerY + distance); } /** * Returns the position of the handle in the selection rectangle * * @return the position of the handle in the selection rectangle */ public Position getPosition() { return mPosition; } /** * Returns the SWT cursor type to use for this selection handle * * @return the position of the handle in the selection rectangle */ public int getSwtCursorType() { return mPosition.getCursorType(); } }