• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 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 
17 package com.android.ide.eclipse.adt.internal.editors.layout.gle2;
18 
19 import org.eclipse.swt.dnd.DragSourceEvent;
20 import org.eclipse.swt.dnd.DragSourceListener;
21 import org.eclipse.swt.dnd.DropTargetEvent;
22 import org.eclipse.swt.events.MenuDetectEvent;
23 import org.eclipse.swt.events.MouseEvent;
24 import org.eclipse.swt.events.MouseListener;
25 import org.eclipse.swt.graphics.Point;
26 
27 /**
28  * A {@link ControlPoint} is a coordinate in the canvas control which corresponds
29  * exactly to (0,0) at the top left of the canvas. It is unaffected by canvas
30  * zooming.
31  */
32 public final class ControlPoint {
33     /** Containing canvas which the point is relative to. */
34     private final LayoutCanvas mCanvas;
35 
36     /** The X coordinate of the mouse coordinate. */
37     public final int x;
38 
39     /** The Y coordinate of the mouse coordinate. */
40     public final int y;
41 
42     /**
43      * Constructs a new {@link ControlPoint} from the given event. The event
44      * must be from a {@link MouseListener} associated with the
45      * {@link LayoutCanvas} such that the {@link MouseEvent#x} and
46      * {@link MouseEvent#y} fields are relative to the canvas.
47      *
48      * @param canvas The {@link LayoutCanvas} this point is within.
49      * @param event The mouse event to construct the {@link ControlPoint}
50      *            from.
51      * @return A {@link ControlPoint} which corresponds to the given
52      *         {@link MouseEvent}.
53      */
create(LayoutCanvas canvas, MouseEvent event)54     public static ControlPoint create(LayoutCanvas canvas, MouseEvent event) {
55         // The mouse event coordinates should already be relative to the canvas
56         // widget.
57         assert event.widget == canvas : event.widget;
58         return new ControlPoint(canvas, event.x, event.y);
59     }
60 
61     /**
62      * Constructs a new {@link ControlPoint} from the given menu detect event.
63      *
64      * @param canvas The {@link LayoutCanvas} this point is within.
65      * @param event The menu detect event to construct the {@link ControlPoint} from.
66      * @return A {@link ControlPoint} which corresponds to the given
67      *         {@link MenuDetectEvent}.
68      */
create(LayoutCanvas canvas, MenuDetectEvent event)69     public static ControlPoint create(LayoutCanvas canvas, MenuDetectEvent event) {
70         // The menu detect events are always display-relative.
71         org.eclipse.swt.graphics.Point p = canvas.toControl(event.x, event.y);
72         return new ControlPoint(canvas, p.x, p.y);
73     }
74 
75     /**
76      * Constructs a new {@link ControlPoint} from the given event. The event
77      * must be from a {@link DragSourceListener} associated with the
78      * {@link LayoutCanvas} such that the {@link DragSourceEvent#x} and
79      * {@link DragSourceEvent#y} fields are relative to the canvas.
80      *
81      * @param canvas The {@link LayoutCanvas} this point is within.
82      * @param event The mouse event to construct the {@link ControlPoint}
83      *            from.
84      * @return A {@link ControlPoint} which corresponds to the given
85      *         {@link DragSourceEvent}.
86      */
create(LayoutCanvas canvas, DragSourceEvent event)87     public static ControlPoint create(LayoutCanvas canvas, DragSourceEvent event) {
88         // The drag source event coordinates should already be relative to the
89         // canvas widget.
90         return new ControlPoint(canvas, event.x, event.y);
91     }
92 
93     /**
94      * Constructs a new {@link ControlPoint} from the given event.
95      *
96      * @param canvas The {@link LayoutCanvas} this point is within.
97      * @param event The mouse event to construct the {@link ControlPoint}
98      *            from.
99      * @return A {@link ControlPoint} which corresponds to the given
100      *         {@link DropTargetEvent}.
101      */
create(LayoutCanvas canvas, DropTargetEvent event)102     public static ControlPoint create(LayoutCanvas canvas, DropTargetEvent event) {
103         // The drop target events are always relative to the display, so we must
104         // first convert them to be canvas relative.
105         org.eclipse.swt.graphics.Point p = canvas.toControl(event.x, event.y);
106         return new ControlPoint(canvas, p.x, p.y);
107     }
108 
109     /**
110      * Constructs a new {@link ControlPoint} from the given x,y coordinates,
111      * which must be relative to the given {@link LayoutCanvas}.
112      *
113      * @param canvas The {@link LayoutCanvas} this point is within.
114      * @param x The mouse event x coordinate relative to the canvas
115      * @param y The mouse event x coordinate relative to the canvas
116      * @return A {@link ControlPoint} which corresponds to the given
117      *         coordinates.
118      */
create(LayoutCanvas canvas, int x, int y)119     public static ControlPoint create(LayoutCanvas canvas, int x, int y) {
120         return new ControlPoint(canvas, x, y);
121     }
122 
123     /**
124      * Constructs a new canvas control coordinate with the given X and Y
125      * coordinates. This is private; use one of the factory methods
126      * {@link #create(LayoutCanvas, MouseEvent)},
127      * {@link #create(LayoutCanvas, DragSourceEvent)} or
128      * {@link #create(LayoutCanvas, DropTargetEvent)} instead.
129      *
130      * @param canvas The canvas which contains this coordinate
131      * @param x The mouse x coordinate
132      * @param y The mouse y coordinate
133      */
ControlPoint(LayoutCanvas canvas, int x, int y)134     private ControlPoint(LayoutCanvas canvas, int x, int y) {
135         mCanvas = canvas;
136         this.x = x;
137         this.y = y;
138     }
139 
140     /**
141      * Returns the equivalent {@link LayoutPoint} to this
142      * {@link ControlPoint}.
143      *
144      * @return The equivalent {@link LayoutPoint} to this
145      *         {@link ControlPoint}.
146      */
toLayout()147     public LayoutPoint toLayout() {
148         int lx = mCanvas.getHorizontalTransform().inverseTranslate(x);
149         int ly = mCanvas.getVerticalTransform().inverseTranslate(y);
150 
151         return LayoutPoint.create(mCanvas, lx, ly);
152     }
153 
154     @Override
toString()155     public String toString() {
156         return "ControlPoint [x=" + x + ", y=" + y + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
157     }
158 
159     @Override
hashCode()160     public int hashCode() {
161         final int prime = 31;
162         int result = 1;
163         result = prime * result + x;
164         result = prime * result + y;
165         return result;
166     }
167 
168     @Override
equals(Object obj)169     public boolean equals(Object obj) {
170         if (this == obj)
171             return true;
172         if (obj == null)
173             return false;
174         if (getClass() != obj.getClass())
175             return false;
176         ControlPoint other = (ControlPoint) obj;
177         if (x != other.x)
178             return false;
179         if (y != other.y)
180             return false;
181         if (mCanvas != other.mCanvas) {
182             return false;
183         }
184         return true;
185     }
186 
187     /**
188      * Returns this point as an SWT point in the display coordinate system
189      *
190      * @return this point as an SWT point in the display coordinate system
191      */
toDisplayPoint()192     public Point toDisplayPoint() {
193         return mCanvas.toDisplay(x, y);
194     }
195 }
196