1 /*******************************************************************************
\r
2 * Copyright (c) 2007, 2011 Association for Decentralized Information Management in
\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
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.scenegraph.g2d.events;
\r
14 import java.util.concurrent.ConcurrentHashMap;
\r
15 import java.util.concurrent.ConcurrentMap;
\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
32 * Event type masks are used for specifying the kinds of events an
\r
33 * {@link IEventHandler} wishes to receive.
\r
35 * @author Tuukka Lehtonen
\r
37 public final class EventTypes {
\r
42 public static final int Command = 1;
\r
43 public static final int CommandMask = toMask(Command);
\r
46 * @see FocusGainedEvent
\r
48 public static final int FocusGained = 2;
\r
49 public static final int FocusGainedMask = toMask(FocusGained);
\r
52 * @see FocusLostEvent
\r
54 public static final int FocusLost = 3;
\r
55 public static final int FocusLostMask = toMask(FocusLost);
\r
58 * One of: {@link #FocusGained}, {@link #FocusLost}.
\r
60 public static final int FocusMask = FocusGainedMask | FocusLostMask;
\r
63 * @see KeyPressedEvent
\r
65 public static final int KeyPressed = 4;
\r
66 public static final int KeyPressedMask = toMask(KeyPressed);
\r
69 * @see KeyReleasedEvent
\r
71 public static final int KeyReleased = 5;
\r
72 public static final int KeyReleasedMask = toMask(KeyReleased);
\r
75 * One of: {@link #KeyPressed}, {@link #KeyReleased}
\r
77 public static final int KeyMask = KeyPressedMask | KeyReleasedMask;
\r
80 * @see MouseButtonPressedEvent
\r
82 public static final int MouseButtonPressed = 6;
\r
83 public static final int MouseButtonPressedMask = toMask(MouseButtonPressed);
\r
86 * @see MouseButtonReleasedEvent
\r
88 public static final int MouseButtonReleased = 7;
\r
89 public static final int MouseButtonReleasedMask = toMask(MouseButtonReleased);
\r
92 * @see MouseClickEvent
\r
94 public static final int MouseClick = 8;
\r
95 public static final int MouseClickMask = toMask(MouseClick);
\r
98 * @see MouseDoubleClickedEvent
\r
100 public static final int MouseDoubleClick = 9;
\r
101 public static final int MouseDoubleClickMask = toMask(MouseDoubleClick);
\r
104 * @see org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin
\r
106 public static final int MouseDragBegin = 10;
\r
107 public static final int MouseDragBeginMask = toMask(MouseDragBegin);
\r
110 * One of: {@link #MouseButtonPressed}, {@link #MouseButtonReleased},
\r
111 * {@link #MouseClick}, {@link #MouseDoubleClick}, {@link #MouseDragBegin}
\r
113 public static final int MouseButtonMask = MouseButtonPressedMask | MouseButtonReleasedMask | MouseClickMask
\r
114 | MouseDoubleClickMask | MouseDragBeginMask;
\r
117 * @see MouseEnterEvent
\r
119 public static final int MouseEnter = 11;
\r
120 public static final int MouseEnterMask = toMask(MouseEnter);
\r
123 * @see MouseExitEvent
\r
125 public static final int MouseExit = 12;
\r
126 public static final int MouseExitMask = toMask(MouseExit);
\r
129 * @see MouseMovedEvent
\r
131 public static final int MouseMoved = 13;
\r
132 public static final int MouseMovedMask = toMask(MouseMoved);
\r
134 public static final int MouseMoveMask = MouseEnterMask | MouseExitMask | MouseMovedMask;
\r
137 * @see MouseWheelMovedEvent
\r
139 public static final int MouseWheel = 14;
\r
140 public static final int MouseWheelMask = toMask(MouseWheel);
\r
143 * One of: {@link #MouseButton}, {@link #MouseMove}, {@link #MouseWheel}
\r
145 public static final int MouseMask = MouseButtonMask | MouseMoveMask | MouseWheelMask;
\r
150 public static final int Time = 15;
\r
151 public static final int TimeMask = toMask(Time);
\r
154 * One of: {@link #Command}, {@link #Focus}, {@link #Key}, {@link #Mouse},
\r
157 public static final int AnyMask = CommandMask | FocusMask | KeyMask | MouseMask | TimeMask;
\r
160 * For testing whether the specified event mask passes the specified event.
\r
166 public static boolean passes(IEventHandler handler, Event event) {
\r
167 int mask = handler.getEventMask();
\r
168 return passes(mask, event);
\r
172 * For testing whether the specified event mask passes the specified event.
\r
178 public static boolean passes(int mask, Event event) {
\r
179 int et = toTypeMask(event);
\r
180 return (et & mask) != 0;
\r
184 * For testing whether the specified event mask passes the specified event.
\r
190 public static boolean passes(IEventHandler handler, int eventTypeMask) {
\r
191 return (eventTypeMask & handler.getEventMask()) != 0;
\r
195 * For testing whether the specified event type passes the specified event mask.
\r
201 public static boolean passes(int mask, int eventTypeMask) {
\r
202 return (eventTypeMask & mask) != 0;
\r
206 * Converts the specified event instance to an event type mask representing the event.
\r
211 public static int toTypeMask(Event event) {
\r
212 return event != null ? toTypeMask(event.getClass()) : 0;
\r
216 * Converts the specified event instance to an integer describing the event.
\r
221 public static int toType(Event event) {
\r
222 return event != null ? toType(event.getClass()) : 0;
\r
226 * Converts the specified event class to an event type mask representing the event.
\r
231 public static int toTypeMask(Class<? extends Event> clazz) {
\r
234 Integer type = maskCache.get(clazz);
\r
237 type = calculateTypeMask(clazz);
\r
238 maskCache.putIfAbsent(clazz, type);
\r
243 * Converts the specified event class to an integer representing that specific event type.
\r
248 public static int toType(Class<? extends Event> clazz) {
\r
251 Integer type = typeCache.get(clazz);
\r
254 type = calculateType(clazz);
\r
255 typeCache.putIfAbsent(clazz, type);
\r
260 * Converts the specified event instance to an event type mask representing
\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
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
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
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
307 if (CommandEvent.class.isAssignableFrom(clazz))
\r
308 return CommandMask;
\r
310 if (TimeEvent.class.isAssignableFrom(clazz))
\r
315 throw new IllegalArgumentException("unrecognized event class: " + clazz);
\r
320 * Converts the specified event instance to an event type mask representing
\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
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
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
338 if (MouseWheelMovedEvent.class.isAssignableFrom(clazz))
\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
346 if (MouseExitEvent.class.isAssignableFrom(clazz))
\r
350 if (KeyEvent.class.isAssignableFrom(clazz)) {
\r
351 if (KeyPressedEvent.class.isAssignableFrom(clazz))
\r
353 if (KeyReleasedEvent.class.isAssignableFrom(clazz))
\r
354 return KeyReleased;
\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
364 if (CommandEvent.class.isAssignableFrom(clazz))
\r
367 if (TimeEvent.class.isAssignableFrom(clazz))
\r
370 throw new IllegalArgumentException("unrecognized event class: " + clazz);
\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
376 private static int toMask(int eventType) {
\r
377 return (1 << eventType);
\r