]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/events/MouseEvent.java
Sync git svn branch with SVN repository r33269.
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / g2d / events / MouseEvent.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2010 Association for Decentralized Information Management\r
3  * in Industry THTH ry.\r
4  * All rights reserved. This program and the accompanying materials\r
5  * are made available under the terms of the Eclipse Public License v1.0\r
6  * which accompanies this distribution, and is available at\r
7  * http://www.eclipse.org/legal/epl-v10.html\r
8  *\r
9  * Contributors:\r
10  *     VTT Technical Research Centre of Finland - initial API and implementation\r
11  *******************************************************************************/\r
12 /*\r
13  *\r
14  * @author Toni Kalajainen\r
15  */\r
16 package org.simantics.scenegraph.g2d.events;\r
17 \r
18 import java.awt.datatransfer.Transferable;\r
19 import java.awt.event.InputEvent;\r
20 import java.awt.geom.Point2D;\r
21 \r
22 /**\r
23  * TODO Remove hold time\r
24  * @see Event\r
25  * @see MouseClickEvent\r
26  * @see MouseDragBegin\r
27  * \r
28  * @author Toni Kalajainen\r
29  */\r
30 public abstract class MouseEvent extends Event {\r
31 \r
32     private static final long serialVersionUID = -2090477028406944454L;\r
33 \r
34     public static final int   LEFT_BUTTON        = 1;\r
35     public static final int   RIGHT_BUTTON       = 2;\r
36     public static final int   MIDDLE_BUTTON      = 3;\r
37 \r
38     /** Time for mouse press + mouse release to be interpreted as mouse click */\r
39     public static final long  CLICK_TIME         = 250;\r
40 \r
41     public static final int   LEFT_MASK          = 1 << (LEFT_BUTTON - 1);\r
42     public static final int   RIGHT_MASK         = 1 << (RIGHT_BUTTON - 1);\r
43     public static final int   MIDDLE_MASK        = 1 << (MIDDLE_BUTTON - 1);\r
44     public static final int   ALL_BUTTONS_MASK   = LEFT_MASK | RIGHT_MASK | MIDDLE_MASK;\r
45 \r
46     public static final int   CTRL_MASK          = InputEvent.CTRL_DOWN_MASK;\r
47     public static final int   ALT_MASK           = InputEvent.ALT_DOWN_MASK;\r
48     public static final int   ALT_GRAPH_MASK     = InputEvent.ALT_GRAPH_DOWN_MASK;\r
49     public static final int   SHIFT_MASK         = InputEvent.SHIFT_DOWN_MASK;\r
50     public static final int   ALL_MODIFIERS_MASK = CTRL_MASK | ALT_MASK | ALT_GRAPH_MASK | SHIFT_MASK;\r
51 \r
52     /**\r
53      * The identifier of the mouse of this event.\r
54      * 0 = the main mouse.\r
55      */\r
56     public final int mouseId;\r
57 \r
58     /** Position in the coordinate system of the UI component */\r
59     public final Point2D controlPosition;\r
60 \r
61     /** Position in the coordinate system of the screen */\r
62     public final Point2D screenPosition;\r
63 \r
64     /**\r
65      * The status of mouse buttons\r
66      * @see #LEFT_MASK\r
67      * @see #MIDDLE_MASK\r
68      * @see #RIGHT_MASK\r
69      */\r
70     public final int buttons;\r
71 \r
72     /**\r
73      * The state of the keyboard modifier keys at the time the event was\r
74      * generated.\r
75      * \r
76      * @see #ALT_MASK\r
77      * @see #ALT_GRAPH_MASK\r
78      * @see #CTRL_MASK\r
79      * @see #SHIFT_MASK\r
80      */\r
81     public int stateMask;\r
82 \r
83     private MouseEvent(Object context, long time, int mouseId, int buttons, int stateMask,\r
84             Point2D controlPosition, Point2D screenPosition) {\r
85         super(context, time);\r
86         this.mouseId = mouseId;\r
87         this.buttons = buttons;\r
88         this.controlPosition = controlPosition;\r
89         this.screenPosition = screenPosition;\r
90         this.stateMask = stateMask;\r
91     }\r
92 \r
93     public boolean hasAnyButton(int mask) {\r
94         return (buttons & mask) != 0;\r
95     }\r
96 \r
97     public boolean hasAllButtons(int mask) {\r
98         return (buttons & mask) == mask;\r
99     }\r
100 \r
101     public boolean hasAnyModifier(int mask) {\r
102         return (stateMask & mask) != 0;\r
103     }\r
104 \r
105     public boolean hasAllModifiers(int mask) {\r
106         return (stateMask & mask) == mask;\r
107     }\r
108 \r
109     /**\r
110      * Returns whether or not the Shift modifier is down on this event.\r
111      */\r
112     public boolean isShiftDown() {\r
113         return (stateMask & MouseEvent.SHIFT_MASK) != 0;\r
114     }\r
115 \r
116     /**\r
117      * Returns whether or not the Control modifier is down on this event.\r
118      */\r
119     public boolean isControlDown() {\r
120         return (stateMask & MouseEvent.CTRL_MASK) != 0;\r
121     }\r
122 \r
123     /**\r
124      * Returns whether or not the Alt modifier is down on this event.\r
125      */\r
126     public boolean isAltDown() {\r
127         return (stateMask & MouseEvent.ALT_MASK) != 0;\r
128     }\r
129 \r
130     /**\r
131      * Returns whether or not the Alt Graph modifier is down on this event.\r
132      */\r
133     public boolean isAltGraphDown() {\r
134         return (stateMask & MouseEvent.ALT_GRAPH_MASK) != 0;\r
135     }\r
136 \r
137     public abstract static class MouseButtonEvent extends MouseEvent {\r
138 \r
139         private static final long serialVersionUID = 3540032494506535841L;\r
140 \r
141         /**\r
142          * button of this event\r
143          */\r
144         public final int button;\r
145 \r
146         public MouseButtonEvent(Object context, long time, int mouseId, int buttons, int stateMask,\r
147                 int button, Point2D controlPosition, Point2D screenPosition) {\r
148             super(context, time, mouseId, buttons, stateMask, controlPosition,screenPosition);\r
149             this.button  = button;\r
150         }\r
151     }\r
152 \r
153     public static class MouseWheelMovedEvent extends MouseEvent {\r
154 \r
155         private static final long serialVersionUID = -7896477913481842708L;\r
156 \r
157         /**\r
158          * Constant representing scrolling by "units" (like scrolling with the\r
159          * arrow keys)\r
160          * \r
161          * @see #getScrollType\r
162          */\r
163         public static final int WHEEL_UNIT_SCROLL = 0;\r
164 \r
165         /**\r
166          * Constant representing scrolling by a "block" (like scrolling\r
167          * with page-up, page-down keys)\r
168          *\r
169          * @see #getScrollType\r
170          */\r
171         public static final int WHEEL_BLOCK_SCROLL = 1;\r
172 \r
173         /**\r
174          * Indicates what sort of scrolling should take place in response to this\r
175          * event, based on platform settings.  Legal values are:\r
176          * <ul>\r
177          * <li> WHEEL_UNIT_SCROLL\r
178          * <li> WHEEL_BLOCK_SCROLL\r
179          * </ul>\r
180          * \r
181          * @see #getScrollType\r
182          */\r
183         public final int scrollType;\r
184 \r
185         /**\r
186          * Only valid for scrollType WHEEL_UNIT_SCROLL.\r
187          * Indicates number of units that should be scrolled per\r
188          * click of mouse wheel rotation, based on platform settings.\r
189          *\r
190          * @see #getScrollAmount\r
191          * @see #getScrollType\r
192          */\r
193         public final int scrollAmount;\r
194 \r
195         /**\r
196          * Indicates how far the mouse wheel was rotated.\r
197          *\r
198          * @see #getWheelRotation\r
199          */\r
200         public final int wheelRotation;\r
201 \r
202         public MouseWheelMovedEvent(Object context, long time, int mouseId, int buttons, int stateMask,\r
203                 Point2D controlPosition, Point2D screenPosition, int scrollType, int scrollAmount,\r
204                 int wheelRotation) {\r
205             super(context, time, mouseId, buttons, stateMask, controlPosition,screenPosition);\r
206             this.scrollType = scrollType;\r
207             this.scrollAmount = scrollAmount;\r
208             this.wheelRotation = wheelRotation;\r
209         }\r
210 \r
211     }\r
212 \r
213     public static class MouseButtonPressedEvent extends MouseButtonEvent {\r
214 \r
215         private static final long serialVersionUID = -4687294674299429690L;\r
216 \r
217         public MouseButtonPressedEvent(Object context, long time, int mouseId, int buttons, int stateMask,\r
218                 int button, Point2D controlPosition, Point2D screenPosition) {\r
219             super(context, time, mouseId, buttons, stateMask, button, controlPosition,screenPosition);\r
220         }\r
221 \r
222     }\r
223 \r
224     public static class MouseButtonReleasedEvent extends MouseButtonEvent {\r
225 \r
226         private static final long serialVersionUID = -2303672225339491858L;\r
227 \r
228         /** Time in milliseconds how long the button was held down */\r
229         public final long holdTime;\r
230 \r
231         public MouseButtonReleasedEvent(Object context, long time,\r
232                 int mouseId, int buttons, int stateMask, int button, long holdTime,\r
233                 Point2D controlPosition, Point2D screenPosition) {\r
234             super(context, time, mouseId, buttons, stateMask, button, controlPosition, screenPosition);\r
235             this.holdTime = holdTime;\r
236         }\r
237     }\r
238 \r
239     public static class MouseMovedEvent extends MouseEvent {\r
240         private static final long serialVersionUID = 1463958776335678155L;\r
241 \r
242         public MouseMovedEvent(Object context, long time, int mouseId, int buttons, int stateMask,\r
243                 Point2D controlPosition, Point2D screenPosition) {\r
244             super(context, time, mouseId, buttons, stateMask, controlPosition, screenPosition);\r
245         }\r
246     }\r
247 \r
248     public static class MouseEnterEvent extends MouseEvent {\r
249         private static final long serialVersionUID = 6074648747865556588L;\r
250 \r
251         public MouseEnterEvent(Object context, long time, int mouseId, int buttons, int stateMask,\r
252                 Point2D controlPosition, Point2D screenPosition) {\r
253             super(context, time, mouseId, buttons, stateMask, controlPosition, screenPosition);\r
254         }\r
255     }\r
256 \r
257     public static class MouseExitEvent extends MouseEvent {\r
258         private static final long serialVersionUID = 8596801599996844789L;\r
259 \r
260         public MouseExitEvent(Object context, long time, int mouseId, int buttons, int stateMask,\r
261                 Point2D controlPosition, Point2D screenPosition) {\r
262             super(context, time, mouseId, buttons, stateMask, controlPosition, screenPosition);\r
263         }\r
264     }\r
265 \r
266     public static class MouseDoubleClickedEvent extends MouseButtonEvent {\r
267         private static final long serialVersionUID = -8046967155607105912L;\r
268 \r
269         public MouseDoubleClickedEvent(Object context, long time, int mouseId, int buttons, int stateMask,\r
270                 int button, Point2D controlPosition, Point2D screenPosition) {\r
271             super(context, time, mouseId, buttons, stateMask, button, controlPosition, screenPosition);\r
272         }\r
273     }\r
274 \r
275     public static class MouseClickEvent extends MouseButtonEvent {\r
276         private static final long serialVersionUID = -1737712792090986607L;\r
277         /**\r
278          * Indicates the number of quick consecutive clicks of\r
279          * a mouse button.\r
280          */\r
281         public final int clickCount;\r
282     \r
283         public MouseClickEvent(Object context, long time, int mouseId, int buttons, int stateMask,\r
284                 int button, int clickCount, Point2D controlPosition, Point2D screenPosition) {\r
285             super(context, time, mouseId, buttons, stateMask, button, controlPosition, screenPosition);\r
286             this.clickCount = clickCount;\r
287         }\r
288     }\r
289 \r
290     public static class MouseDragBegin extends MouseButtonEvent {\r
291         private static final long serialVersionUID = 3882552912240236450L;\r
292         public final Point2D startCanvasPos;\r
293         public final Point2D startControlPos;\r
294         public Transferable transferable = null;\r
295         public MouseDragBegin(Object context, long time, int mouseId, int buttons, int stateMask,\r
296                 int button, Point2D startCanvasPos, Point2D startControlPos, Point2D controlPosition, Point2D screenPosition) {\r
297             super(context, time, mouseId, buttons, stateMask, button, controlPosition, screenPosition);\r
298             this.startCanvasPos = startCanvasPos;\r
299             this.startControlPos = startControlPos;\r
300         }\r
301     }\r
302 \r
303     /**\r
304      * Spans button bit mask into individual button ids (starting from 1)\r
305      * @param buttons\r
306      * @return\r
307      */\r
308     public static int[] getButtonIds(int buttons)\r
309     {\r
310         // calculate 1 bits\r
311         int size = 0;\r
312         for (int i=0; i<32; i++)\r
313             if ((buttons & (1<<i))!=0)\r
314                 size++;\r
315         int result[] = new int[size];\r
316         int j=0;\r
317         for (int i=0; i<32; i++)\r
318             if ((buttons & (1<<i))!=0)\r
319                 result[j++] = i+1;\r
320         return result;\r
321     }\r
322 \r
323     @Override\r
324     public String toString() {\r
325         return super.toString() + "[mouse#=" + mouseId + ", control pos=" + controlPosition + ", screen pos="\r
326                 + screenPosition + ", buttons=" + Integer.toBinaryString(buttons) + ", stateMask=0x"\r
327                 + Integer.toHexString(stateMask) + "]";\r
328     }\r
329 \r
330 }\r