1 /*******************************************************************************
2 * Copyright (c) 2007, 2011 Association for Decentralized Information Management in
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 *******************************************************************************/
12 package org.simantics.scenegraph.g2d.events;
14 import java.util.concurrent.ConcurrentHashMap;
15 import java.util.concurrent.ConcurrentMap;
17 import org.simantics.scenegraph.g2d.events.FocusEvent.FocusGainedEvent;
18 import org.simantics.scenegraph.g2d.events.FocusEvent.FocusLostEvent;
19 import org.simantics.scenegraph.g2d.events.KeyEvent.KeyPressedEvent;
20 import org.simantics.scenegraph.g2d.events.KeyEvent.KeyReleasedEvent;
21 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonPressedEvent;
22 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonReleasedEvent;
23 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseClickEvent;
24 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDoubleClickedEvent;
25 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseEnterEvent;
26 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseExitEvent;
27 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;
28 import org.simantics.scenegraph.g2d.events.MouseEvent.MouseWheelMovedEvent;
29 import org.simantics.scenegraph.g2d.events.command.CommandEvent;
32 * Event type masks are used for specifying the kinds of events an
33 * {@link IEventHandler} wishes to receive.
35 * @author Tuukka Lehtonen
37 public final class EventTypes {
42 public static final int Command = 1;
43 public static final int CommandMask = toMask(Command);
46 * @see FocusGainedEvent
48 public static final int FocusGained = 2;
49 public static final int FocusGainedMask = toMask(FocusGained);
54 public static final int FocusLost = 3;
55 public static final int FocusLostMask = toMask(FocusLost);
58 * One of: {@link #FocusGained}, {@link #FocusLost}.
60 public static final int FocusMask = FocusGainedMask | FocusLostMask;
63 * @see KeyPressedEvent
65 public static final int KeyPressed = 4;
66 public static final int KeyPressedMask = toMask(KeyPressed);
69 * @see KeyReleasedEvent
71 public static final int KeyReleased = 5;
72 public static final int KeyReleasedMask = toMask(KeyReleased);
75 * One of: {@link #KeyPressed}, {@link #KeyReleased}
77 public static final int KeyMask = KeyPressedMask | KeyReleasedMask;
80 * @see MouseButtonPressedEvent
82 public static final int MouseButtonPressed = 6;
83 public static final int MouseButtonPressedMask = toMask(MouseButtonPressed);
86 * @see MouseButtonReleasedEvent
88 public static final int MouseButtonReleased = 7;
89 public static final int MouseButtonReleasedMask = toMask(MouseButtonReleased);
92 * @see MouseClickEvent
94 public static final int MouseClick = 8;
95 public static final int MouseClickMask = toMask(MouseClick);
98 * @see MouseDoubleClickedEvent
100 public static final int MouseDoubleClick = 9;
101 public static final int MouseDoubleClickMask = toMask(MouseDoubleClick);
104 * @see org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin
106 public static final int MouseDragBegin = 10;
107 public static final int MouseDragBeginMask = toMask(MouseDragBegin);
110 * One of: {@link #MouseButtonPressed}, {@link #MouseButtonReleased},
111 * {@link #MouseClick}, {@link #MouseDoubleClick}, {@link #MouseDragBegin}
113 public static final int MouseButtonMask = MouseButtonPressedMask | MouseButtonReleasedMask | MouseClickMask
114 | MouseDoubleClickMask | MouseDragBeginMask;
117 * @see MouseEnterEvent
119 public static final int MouseEnter = 11;
120 public static final int MouseEnterMask = toMask(MouseEnter);
123 * @see MouseExitEvent
125 public static final int MouseExit = 12;
126 public static final int MouseExitMask = toMask(MouseExit);
129 * @see MouseMovedEvent
131 public static final int MouseMoved = 13;
132 public static final int MouseMovedMask = toMask(MouseMoved);
134 public static final int MouseMoveMask = MouseEnterMask | MouseExitMask | MouseMovedMask;
137 * @see MouseWheelMovedEvent
139 public static final int MouseWheel = 14;
140 public static final int MouseWheelMask = toMask(MouseWheel);
143 * One of: {@link #MouseButton}, {@link #MouseMove}, {@link #MouseWheel}
145 public static final int MouseMask = MouseButtonMask | MouseMoveMask | MouseWheelMask;
150 public static final int Time = 15;
151 public static final int TimeMask = toMask(Time);
154 * One of: {@link #Command}, {@link #Focus}, {@link #Key}, {@link #Mouse},
157 public static final int AnyMask = CommandMask | FocusMask | KeyMask | MouseMask | TimeMask;
160 * For testing whether the specified event mask passes the specified event.
166 public static boolean passes(IEventHandler handler, Event event) {
167 int mask = handler.getEventMask();
168 return passes(mask, event);
172 * For testing whether the specified event mask passes the specified event.
178 public static boolean passes(int mask, Event event) {
179 int et = toTypeMask(event);
180 return (et & mask) != 0;
184 * For testing whether the specified event mask passes the specified event.
190 public static boolean passes(IEventHandler handler, int eventTypeMask) {
191 return (eventTypeMask & handler.getEventMask()) != 0;
195 * For testing whether the specified event type passes the specified event mask.
201 public static boolean passes(int mask, int eventTypeMask) {
202 return (eventTypeMask & mask) != 0;
206 * Converts the specified event instance to an event type mask representing the event.
211 public static int toTypeMask(Event event) {
212 return event != null ? toTypeMask(event.getClass()) : 0;
216 * Converts the specified event instance to an integer describing the event.
221 public static int toType(Event event) {
222 return event != null ? toType(event.getClass()) : 0;
226 * Converts the specified event class to an event type mask representing the event.
231 public static int toTypeMask(Class<? extends Event> clazz) {
234 Integer type = maskCache.get(clazz);
237 type = calculateTypeMask(clazz);
238 maskCache.putIfAbsent(clazz, type);
243 * Converts the specified event class to an integer representing that specific event type.
248 public static int toType(Class<? extends Event> clazz) {
251 Integer type = typeCache.get(clazz);
254 type = calculateType(clazz);
255 typeCache.putIfAbsent(clazz, type);
260 * Converts the specified event instance to an event type mask representing
263 * @param clazz class of event to get type for
264 * @return event type mask
265 * @throws IllegalArgumentException if event class is not recognized
267 private static int calculateTypeMask(Class<? extends Event> clazz) {
268 if (Event.class.isAssignableFrom(clazz)) {
269 if (MouseEvent.class.isAssignableFrom(clazz)) {
270 if (MouseMovedEvent.class.isAssignableFrom(clazz))
271 return MouseMovedMask;
272 if (MouseButtonPressedEvent.class.isAssignableFrom(clazz))
273 return MouseButtonPressedMask;
274 if (MouseButtonReleasedEvent.class.isAssignableFrom(clazz))
275 return MouseButtonReleasedMask;
276 if (MouseClickEvent.class.isAssignableFrom(clazz))
277 return MouseClickMask;
278 if (MouseWheelMovedEvent.class.isAssignableFrom(clazz))
279 return MouseWheelMask;
280 if (MouseDoubleClickedEvent.class.isAssignableFrom(clazz))
281 return MouseDoubleClickMask;
282 if (org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin.class.isAssignableFrom(clazz))
283 return MouseDragBeginMask;
284 if (MouseEnterEvent.class.isAssignableFrom(clazz))
285 return MouseEnterMask;
286 if (MouseExitEvent.class.isAssignableFrom(clazz))
287 return MouseExitMask;
291 if (KeyEvent.class.isAssignableFrom(clazz)) {
292 if (KeyPressedEvent.class.isAssignableFrom(clazz))
293 return KeyPressedMask;
294 if (KeyReleasedEvent.class.isAssignableFrom(clazz))
295 return KeyReleasedMask;
299 if (FocusEvent.class.isAssignableFrom(clazz)) {
300 if (FocusGainedEvent.class.isAssignableFrom(clazz))
301 return FocusGainedMask;
302 if (FocusLostEvent.class.isAssignableFrom(clazz))
303 return FocusLostMask;
307 if (CommandEvent.class.isAssignableFrom(clazz))
310 if (TimeEvent.class.isAssignableFrom(clazz))
315 throw new IllegalArgumentException("unrecognized event class: " + clazz);
320 * Converts the specified event instance to an event type mask representing
323 * @param clazz class of event to get type for
324 * @return event type mask
325 * @throws IllegalArgumentException if event class is not recognized
327 private static int calculateType(Class<? extends Event> clazz) {
328 if (Event.class.isAssignableFrom(clazz)) {
329 if (MouseEvent.class.isAssignableFrom(clazz)) {
330 if (MouseMovedEvent.class.isAssignableFrom(clazz))
332 if (MouseButtonPressedEvent.class.isAssignableFrom(clazz))
333 return MouseButtonPressed;
334 if (MouseButtonReleasedEvent.class.isAssignableFrom(clazz))
335 return MouseButtonReleased;
336 if (MouseClickEvent.class.isAssignableFrom(clazz))
338 if (MouseWheelMovedEvent.class.isAssignableFrom(clazz))
340 if (MouseDoubleClickedEvent.class.isAssignableFrom(clazz))
341 return MouseDoubleClick;
342 if (org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin.class.isAssignableFrom(clazz))
343 return MouseDragBegin;
344 if (MouseEnterEvent.class.isAssignableFrom(clazz))
346 if (MouseExitEvent.class.isAssignableFrom(clazz))
350 if (KeyEvent.class.isAssignableFrom(clazz)) {
351 if (KeyPressedEvent.class.isAssignableFrom(clazz))
353 if (KeyReleasedEvent.class.isAssignableFrom(clazz))
357 if (FocusEvent.class.isAssignableFrom(clazz)) {
358 if (FocusGainedEvent.class.isAssignableFrom(clazz))
360 if (FocusLostEvent.class.isAssignableFrom(clazz))
364 if (CommandEvent.class.isAssignableFrom(clazz))
367 if (TimeEvent.class.isAssignableFrom(clazz))
370 throw new IllegalArgumentException("unrecognized event class: " + clazz);
373 private static ConcurrentMap<Class<?>, Integer> maskCache = new ConcurrentHashMap<Class<?>, Integer>();
374 private static ConcurrentMap<Class<?>, Integer> typeCache = new ConcurrentHashMap<Class<?>, Integer>();
376 private static int toMask(int eventType) {
377 return (1 << eventType);