Home | History | Annotate | Download | only in gle2
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Eclipse Public License, Version 1.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.eclipse.org/org/documents/epl-v10.php
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.ide.eclipse.adt.internal.editors.layout.gle2;
     17 
     18 import org.eclipse.swt.SWT;
     19 
     20 /**
     21  * A selection handle is a small rectangle on the border of a selected view which lets you
     22  * change the size of the view by dragging it.
     23  */
     24 public class SelectionHandle {
     25     /**
     26      * Size of the selection handle radius, in control coordinates. Note that this isn't
     27      * necessarily a <b>circular</b> radius; in the case of a rectangular handle, the
     28      * width and the height are both equal to this radius.
     29      * Note also that this radius is in <b>control</b> coordinates, whereas the rest
     30      * of the class operates in layout coordinates. This is because we do not want the
     31      * selection handles to grow or shrink along with the screen zoom; they are always
     32      * at the given pixel size in the control.
     33      */
     34     public final static int PIXEL_RADIUS = 3;
     35 
     36     /**
     37      * Extra number of pixels to look beyond the actual radius of the selection handle
     38      * when matching mouse positions to handles
     39      */
     40     public final static int PIXEL_MARGIN = 2;
     41 
     42     /** The position of the handle in the selection rectangle */
     43     enum Position {
     44         TOP_MIDDLE(SWT.CURSOR_SIZEN),
     45         TOP_RIGHT(SWT.CURSOR_SIZENE),
     46         RIGHT_MIDDLE(SWT.CURSOR_SIZEE),
     47         BOTTOM_RIGHT(SWT.CURSOR_SIZESE),
     48         BOTTOM_MIDDLE(SWT.CURSOR_SIZES),
     49         BOTTOM_LEFT(SWT.CURSOR_SIZESW),
     50         LEFT_MIDDLE(SWT.CURSOR_SIZEW),
     51         TOP_LEFT(SWT.CURSOR_SIZENW);
     52 
     53         /** Corresponding SWT cursor value */
     54         private int mSwtCursor;
     55 
     56         private Position(int swtCursor) {
     57             mSwtCursor = swtCursor;
     58         }
     59 
     60         private int getCursorType() {
     61             return mSwtCursor;
     62         }
     63 
     64         /** Is the {@link SelectionHandle} somewhere on the left edge? */
     65         boolean isLeft() {
     66             return this == TOP_LEFT || this == LEFT_MIDDLE || this == BOTTOM_LEFT;
     67         }
     68 
     69         /** Is the {@link SelectionHandle} somewhere on the right edge? */
     70         boolean isRight() {
     71             return this == TOP_RIGHT || this == RIGHT_MIDDLE || this == BOTTOM_RIGHT;
     72         }
     73 
     74         /** Is the {@link SelectionHandle} somewhere on the top edge? */
     75         boolean isTop() {
     76             return this == TOP_LEFT || this == TOP_MIDDLE || this == TOP_RIGHT;
     77         }
     78 
     79         /** Is the {@link SelectionHandle} somewhere on the bottom edge? */
     80         boolean isBottom() {
     81             return this == BOTTOM_LEFT || this == BOTTOM_MIDDLE || this == BOTTOM_RIGHT;
     82         }
     83     };
     84 
     85     /** The x coordinate of the center of the selection handle */
     86     public final int centerX;
     87     /** The y coordinate of the center of the selection handle */
     88     public final int centerY;
     89     /** The position of the handle in the selection rectangle */
     90     private final Position mPosition;
     91 
     92     /**
     93      * Constructs a new {@link SelectionHandle} at the given layout coordinate
     94      * corresponding to a handle at the given {@link Position}.
     95      *
     96      * @param centerX the x coordinate of the center of the selection handle
     97      * @param centerY y coordinate of the center of the selection handle
     98      * @param position the position of the handle in the selection rectangle
     99      */
    100     public SelectionHandle(int centerX, int centerY, Position position) {
    101         mPosition = position;
    102         this.centerX = centerX;
    103         this.centerY = centerY;
    104     }
    105 
    106     /**
    107      * Determines whether the given {@link LayoutPoint} is within the given distance in
    108      * layout coordinates. The distance should incorporate at least the equivalent
    109      * distance to the control coordinate space {@link #PIXEL_RADIUS}, but usually with a
    110      * few extra pixels added in to make the corners easier to target.
    111      *
    112      * @param point the mouse position in layout coordinates
    113      * @param distance the distance from the center of the handle to check whether the
    114      *            point fits within
    115      * @return true if the given point is within the given distance of this handle
    116      */
    117     public boolean contains(LayoutPoint point, int distance) {
    118         return (point.x >= centerX - distance
    119               && point.x <= centerX + distance
    120               && point.y >= centerY - distance
    121               && point.y <= centerY + distance);
    122     }
    123 
    124     /**
    125      * Returns the position of the handle in the selection rectangle
    126      *
    127      * @return the position of the handle in the selection rectangle
    128      */
    129     public Position getPosition() {
    130         return mPosition;
    131     }
    132 
    133     /**
    134      * Returns the SWT cursor type to use for this selection handle
    135      *
    136      * @return the position of the handle in the selection rectangle
    137      */
    138     public int getSwtCursorType() {
    139         return mPosition.getCursorType();
    140     }
    141 }
    142