]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/events/EventTypes.java
Sync git svn branch with SVN repository r33269.
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / g2d / events / EventTypes.java
1 /*******************************************************************************\r
2  * Copyright (c) 2007, 2011 Association for Decentralized Information Management in\r
3  * 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 package org.simantics.scenegraph.g2d.events;\r
13 \r
14 import java.util.concurrent.ConcurrentHashMap;\r
15 import java.util.concurrent.ConcurrentMap;\r
16 \r
17 import org.simantics.scenegraph.g2d.events.FocusEvent.FocusGainedEvent;\r
18 import org.simantics.scenegraph.g2d.events.FocusEvent.FocusLostEvent;\r
19 import org.simantics.scenegraph.g2d.events.KeyEvent.KeyPressedEvent;\r
20 import org.simantics.scenegraph.g2d.events.KeyEvent.KeyReleasedEvent;\r
21 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonPressedEvent;\r
22 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonReleasedEvent;\r
23 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseClickEvent;\r
24 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDoubleClickedEvent;\r
25 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseEnterEvent;\r
26 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseExitEvent;\r
27 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;\r
28 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseWheelMovedEvent;\r
29 import org.simantics.scenegraph.g2d.events.command.CommandEvent;\r
30 \r
31 /**\r
32  * Event type masks are used for specifying the kinds of events an\r
33  * {@link IEventHandler} wishes to receive.\r
34  * \r
35  * @author Tuukka Lehtonen\r
36  */\r
37 public final class EventTypes {\r
38 \r
39     /**\r
40      * @see CommandEvent\r
41      */\r
42     public static final int Command                 = 1;\r
43     public static final int CommandMask             = toMask(Command);\r
44 \r
45     /**\r
46      * @see FocusGainedEvent\r
47      */\r
48     public static final int FocusGained             = 2;\r
49     public static final int FocusGainedMask         = toMask(FocusGained);\r
50 \r
51     /**\r
52      * @see FocusLostEvent\r
53      */\r
54     public static final int FocusLost               = 3;\r
55     public static final int FocusLostMask           = toMask(FocusLost);\r
56 \r
57     /**\r
58      * One of: {@link #FocusGained}, {@link #FocusLost}.\r
59      */\r
60     public static final int FocusMask               = FocusGainedMask | FocusLostMask;\r
61 \r
62     /**\r
63      * @see KeyPressedEvent\r
64      */\r
65     public static final int KeyPressed              = 4;\r
66     public static final int KeyPressedMask          = toMask(KeyPressed);\r
67 \r
68     /**\r
69      * @see KeyReleasedEvent\r
70      */\r
71     public static final int KeyReleased             = 5;\r
72     public static final int KeyReleasedMask         = toMask(KeyReleased);\r
73 \r
74     /**\r
75      * One of: {@link #KeyPressed}, {@link #KeyReleased}\r
76      */\r
77     public static final int KeyMask                 = KeyPressedMask | KeyReleasedMask;\r
78 \r
79     /**\r
80      * @see MouseButtonPressedEvent\r
81      */\r
82     public static final int MouseButtonPressed      = 6;\r
83     public static final int MouseButtonPressedMask  = toMask(MouseButtonPressed);\r
84 \r
85     /**\r
86      * @see MouseButtonReleasedEvent\r
87      */\r
88     public static final int MouseButtonReleased     = 7;\r
89     public static final int MouseButtonReleasedMask = toMask(MouseButtonReleased);\r
90 \r
91     /**\r
92      * @see MouseClickEvent\r
93      */\r
94     public static final int MouseClick              = 8;\r
95     public static final int MouseClickMask          = toMask(MouseClick);\r
96 \r
97     /**\r
98      * @see MouseDoubleClickedEvent\r
99      */\r
100     public static final int MouseDoubleClick        = 9;\r
101     public static final int MouseDoubleClickMask    = toMask(MouseDoubleClick);\r
102 \r
103     /**\r
104      * @see org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin\r
105      */\r
106     public static final int MouseDragBegin          = 10;\r
107     public static final int MouseDragBeginMask      = toMask(MouseDragBegin);\r
108 \r
109     /**\r
110      * One of: {@link #MouseButtonPressed}, {@link #MouseButtonReleased},\r
111      * {@link #MouseClick}, {@link #MouseDoubleClick}, {@link #MouseDragBegin}\r
112      */\r
113     public static final int MouseButtonMask         = MouseButtonPressedMask | MouseButtonReleasedMask | MouseClickMask\r
114                                                       | MouseDoubleClickMask | MouseDragBeginMask;\r
115 \r
116     /**\r
117      * @see MouseEnterEvent\r
118      */\r
119     public static final int MouseEnter              = 11;\r
120     public static final int MouseEnterMask          = toMask(MouseEnter);\r
121 \r
122     /**\r
123      * @see MouseExitEvent\r
124      */\r
125     public static final int MouseExit               = 12;\r
126     public static final int MouseExitMask           = toMask(MouseExit);\r
127 \r
128     /**\r
129      * @see MouseMovedEvent\r
130      */\r
131     public static final int MouseMoved              = 13;\r
132     public static final int MouseMovedMask          = toMask(MouseMoved);\r
133 \r
134     public static final int MouseMoveMask           = MouseEnterMask | MouseExitMask | MouseMovedMask;\r
135 \r
136     /**\r
137      * @see MouseWheelMovedEvent\r
138      */\r
139     public static final int MouseWheel              = 14;\r
140     public static final int MouseWheelMask          = toMask(MouseWheel);\r
141 \r
142     /**\r
143      * One of: {@link #MouseButton}, {@link #MouseMove}, {@link #MouseWheel}\r
144      */\r
145     public static final int MouseMask               = MouseButtonMask | MouseMoveMask | MouseWheelMask;\r
146 \r
147     /**\r
148      * @see TimeEvent\r
149      */\r
150     public static final int Time                    = 15;\r
151     public static final int TimeMask                = toMask(Time);\r
152 \r
153     /**\r
154      * One of: {@link #Command}, {@link #Focus}, {@link #Key}, {@link #Mouse},\r
155      * {@link #Time}\r
156      */\r
157     public static final int AnyMask                 = CommandMask | FocusMask | KeyMask | MouseMask | TimeMask;\r
158 \r
159     /**\r
160      * For testing whether the specified event mask passes the specified event.\r
161      * \r
162      * @param eventMask\r
163      * @param event\r
164      * @return\r
165      */\r
166     public static boolean passes(IEventHandler handler, Event event) {\r
167         int mask = handler.getEventMask();\r
168         return passes(mask, event);\r
169     }\r
170 \r
171     /**\r
172      * For testing whether the specified event mask passes the specified event.\r
173      * \r
174      * @param mask\r
175      * @param event\r
176      * @return\r
177      */\r
178     public static boolean passes(int mask, Event event) {\r
179         int et = toTypeMask(event);\r
180         return (et & mask) != 0;\r
181     }\r
182 \r
183     /**\r
184      * For testing whether the specified event mask passes the specified event.\r
185      * \r
186      * @param eventMask\r
187      * @param event\r
188      * @return\r
189      */\r
190     public static boolean passes(IEventHandler handler, int eventTypeMask) {\r
191         return (eventTypeMask & handler.getEventMask()) != 0;\r
192     }\r
193 \r
194     /**\r
195      * For testing whether the specified event type passes the specified event mask.\r
196      * \r
197      * @param mask\r
198      * @param event\r
199      * @return\r
200      */\r
201     public static boolean passes(int mask, int eventTypeMask) {\r
202         return (eventTypeMask & mask) != 0;\r
203     }\r
204 \r
205     /**\r
206      * Converts the specified event instance to an event type mask representing the event.\r
207      * \r
208      * @param event\r
209      * @return\r
210      */\r
211     public static int toTypeMask(Event event) {\r
212         return event != null ? toTypeMask(event.getClass()) : 0;\r
213     }\r
214 \r
215     /**\r
216      * Converts the specified event instance to an integer describing the event.\r
217      * \r
218      * @param event\r
219      * @return\r
220      */\r
221     public static int toType(Event event) {\r
222         return event != null ? toType(event.getClass()) : 0;\r
223     }\r
224 \r
225     /**\r
226      * Converts the specified event class to an event type mask representing the event.\r
227      * \r
228      * @param event\r
229      * @return\r
230      */\r
231     public static int toTypeMask(Class<? extends Event> clazz) {\r
232         if (clazz == null)\r
233             return 0;\r
234         Integer type = maskCache.get(clazz);\r
235         if (type != null)\r
236             return type;\r
237         type = calculateTypeMask(clazz);\r
238         maskCache.putIfAbsent(clazz, type);\r
239         return type;\r
240     }\r
241 \r
242     /**\r
243      * Converts the specified event class to an integer representing that specific event type.\r
244      * \r
245      * @param event\r
246      * @return\r
247      */\r
248     public static int toType(Class<? extends Event> clazz) {\r
249         if (clazz == null)\r
250             return 0;\r
251         Integer type = typeCache.get(clazz);\r
252         if (type != null)\r
253             return type;\r
254         type = calculateType(clazz);\r
255         typeCache.putIfAbsent(clazz, type);\r
256         return type;\r
257     }\r
258 \r
259     /**\r
260      * Converts the specified event instance to an event type mask representing\r
261      * the event.\r
262      * \r
263      * @param clazz class of event to get type for\r
264      * @return event type mask\r
265      * @throws IllegalArgumentException if event class is not recognized\r
266      */\r
267     private static int calculateTypeMask(Class<? extends Event> clazz) {\r
268         if (Event.class.isAssignableFrom(clazz)) {\r
269             if (MouseEvent.class.isAssignableFrom(clazz)) {\r
270                 if (MouseMovedEvent.class.isAssignableFrom(clazz))\r
271                     return MouseMovedMask;\r
272                 if (MouseButtonPressedEvent.class.isAssignableFrom(clazz))\r
273                     return MouseButtonPressedMask;\r
274                 if (MouseButtonReleasedEvent.class.isAssignableFrom(clazz))\r
275                     return MouseButtonReleasedMask;\r
276                 if (MouseClickEvent.class.isAssignableFrom(clazz))\r
277                     return MouseClickMask;\r
278                 if (MouseWheelMovedEvent.class.isAssignableFrom(clazz))\r
279                     return MouseWheelMask;\r
280                 if (MouseDoubleClickedEvent.class.isAssignableFrom(clazz))\r
281                     return MouseDoubleClickMask;\r
282                 if (org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin.class.isAssignableFrom(clazz))\r
283                     return MouseDragBeginMask;\r
284                 if (MouseEnterEvent.class.isAssignableFrom(clazz))\r
285                     return MouseEnterMask;\r
286                 if (MouseExitEvent.class.isAssignableFrom(clazz))\r
287                     return MouseExitMask;\r
288                 return MouseMask;\r
289             }\r
290 \r
291             if (KeyEvent.class.isAssignableFrom(clazz)) {\r
292                 if (KeyPressedEvent.class.isAssignableFrom(clazz))\r
293                     return KeyPressedMask;\r
294                 if (KeyReleasedEvent.class.isAssignableFrom(clazz))\r
295                     return KeyReleasedMask;\r
296                 return KeyMask;\r
297             }\r
298 \r
299             if (FocusEvent.class.isAssignableFrom(clazz)) {\r
300                 if (FocusGainedEvent.class.isAssignableFrom(clazz))\r
301                     return FocusGainedMask;\r
302                 if (FocusLostEvent.class.isAssignableFrom(clazz))\r
303                     return FocusLostMask;\r
304                 return FocusMask;\r
305             }\r
306 \r
307             if (CommandEvent.class.isAssignableFrom(clazz))\r
308                 return CommandMask;\r
309 \r
310             if (TimeEvent.class.isAssignableFrom(clazz))\r
311                 return TimeMask;\r
312 \r
313             return AnyMask;\r
314         }\r
315         throw new IllegalArgumentException("unrecognized event class: " + clazz);\r
316     }\r
317 \r
318 \r
319     /**\r
320      * Converts the specified event instance to an event type mask representing\r
321      * the event.\r
322      * \r
323      * @param clazz class of event to get type for\r
324      * @return event type mask\r
325      * @throws IllegalArgumentException if event class is not recognized\r
326      */\r
327     private static int calculateType(Class<? extends Event> clazz) {\r
328         if (Event.class.isAssignableFrom(clazz)) {\r
329             if (MouseEvent.class.isAssignableFrom(clazz)) {\r
330                 if (MouseMovedEvent.class.isAssignableFrom(clazz))\r
331                     return MouseMoved;\r
332                 if (MouseButtonPressedEvent.class.isAssignableFrom(clazz))\r
333                     return MouseButtonPressed;\r
334                 if (MouseButtonReleasedEvent.class.isAssignableFrom(clazz))\r
335                     return MouseButtonReleased;\r
336                 if (MouseClickEvent.class.isAssignableFrom(clazz))\r
337                     return MouseClick;\r
338                 if (MouseWheelMovedEvent.class.isAssignableFrom(clazz))\r
339                     return MouseWheel;\r
340                 if (MouseDoubleClickedEvent.class.isAssignableFrom(clazz))\r
341                     return MouseDoubleClick;\r
342                 if (org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin.class.isAssignableFrom(clazz))\r
343                     return MouseDragBegin;\r
344                 if (MouseEnterEvent.class.isAssignableFrom(clazz))\r
345                     return MouseEnter;\r
346                 if (MouseExitEvent.class.isAssignableFrom(clazz))\r
347                     return MouseExit;\r
348             }\r
349 \r
350             if (KeyEvent.class.isAssignableFrom(clazz)) {\r
351                 if (KeyPressedEvent.class.isAssignableFrom(clazz))\r
352                     return KeyPressed;\r
353                 if (KeyReleasedEvent.class.isAssignableFrom(clazz))\r
354                     return KeyReleased;\r
355             }\r
356 \r
357             if (FocusEvent.class.isAssignableFrom(clazz)) {\r
358                 if (FocusGainedEvent.class.isAssignableFrom(clazz))\r
359                     return FocusGained;\r
360                 if (FocusLostEvent.class.isAssignableFrom(clazz))\r
361                     return FocusLost;\r
362             }\r
363 \r
364             if (CommandEvent.class.isAssignableFrom(clazz))\r
365                 return Command;\r
366 \r
367             if (TimeEvent.class.isAssignableFrom(clazz))\r
368                 return Time;\r
369         }\r
370         throw new IllegalArgumentException("unrecognized event class: " + clazz);\r
371     }\r
372 \r
373     private static ConcurrentMap<Class<?>, Integer> maskCache = new ConcurrentHashMap<Class<?>, Integer>();\r
374     private static ConcurrentMap<Class<?>, Integer> typeCache = new ConcurrentHashMap<Class<?>, Integer>();\r
375 \r
376     private static int toMask(int eventType) {\r
377         return (1 << eventType);\r
378     }\r
379 \r
380 }\r