--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2007, 2011 Association for Decentralized Information Management in\r
+ * Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.scenegraph.g2d.events;\r
+\r
+import java.util.concurrent.ConcurrentHashMap;\r
+import java.util.concurrent.ConcurrentMap;\r
+\r
+import org.simantics.scenegraph.g2d.events.FocusEvent.FocusGainedEvent;\r
+import org.simantics.scenegraph.g2d.events.FocusEvent.FocusLostEvent;\r
+import org.simantics.scenegraph.g2d.events.KeyEvent.KeyPressedEvent;\r
+import org.simantics.scenegraph.g2d.events.KeyEvent.KeyReleasedEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonPressedEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseButtonReleasedEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseClickEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseDoubleClickedEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseEnterEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseExitEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseMovedEvent;\r
+import org.simantics.scenegraph.g2d.events.MouseEvent.MouseWheelMovedEvent;\r
+import org.simantics.scenegraph.g2d.events.command.CommandEvent;\r
+\r
+/**\r
+ * Event type masks are used for specifying the kinds of events an\r
+ * {@link IEventHandler} wishes to receive.\r
+ * \r
+ * @author Tuukka Lehtonen\r
+ */\r
+public final class EventTypes {\r
+\r
+ /**\r
+ * @see CommandEvent\r
+ */\r
+ public static final int Command = 1;\r
+ public static final int CommandMask = toMask(Command);\r
+\r
+ /**\r
+ * @see FocusGainedEvent\r
+ */\r
+ public static final int FocusGained = 2;\r
+ public static final int FocusGainedMask = toMask(FocusGained);\r
+\r
+ /**\r
+ * @see FocusLostEvent\r
+ */\r
+ public static final int FocusLost = 3;\r
+ public static final int FocusLostMask = toMask(FocusLost);\r
+\r
+ /**\r
+ * One of: {@link #FocusGained}, {@link #FocusLost}.\r
+ */\r
+ public static final int FocusMask = FocusGainedMask | FocusLostMask;\r
+\r
+ /**\r
+ * @see KeyPressedEvent\r
+ */\r
+ public static final int KeyPressed = 4;\r
+ public static final int KeyPressedMask = toMask(KeyPressed);\r
+\r
+ /**\r
+ * @see KeyReleasedEvent\r
+ */\r
+ public static final int KeyReleased = 5;\r
+ public static final int KeyReleasedMask = toMask(KeyReleased);\r
+\r
+ /**\r
+ * One of: {@link #KeyPressed}, {@link #KeyReleased}\r
+ */\r
+ public static final int KeyMask = KeyPressedMask | KeyReleasedMask;\r
+\r
+ /**\r
+ * @see MouseButtonPressedEvent\r
+ */\r
+ public static final int MouseButtonPressed = 6;\r
+ public static final int MouseButtonPressedMask = toMask(MouseButtonPressed);\r
+\r
+ /**\r
+ * @see MouseButtonReleasedEvent\r
+ */\r
+ public static final int MouseButtonReleased = 7;\r
+ public static final int MouseButtonReleasedMask = toMask(MouseButtonReleased);\r
+\r
+ /**\r
+ * @see MouseClickEvent\r
+ */\r
+ public static final int MouseClick = 8;\r
+ public static final int MouseClickMask = toMask(MouseClick);\r
+\r
+ /**\r
+ * @see MouseDoubleClickedEvent\r
+ */\r
+ public static final int MouseDoubleClick = 9;\r
+ public static final int MouseDoubleClickMask = toMask(MouseDoubleClick);\r
+\r
+ /**\r
+ * @see org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin\r
+ */\r
+ public static final int MouseDragBegin = 10;\r
+ public static final int MouseDragBeginMask = toMask(MouseDragBegin);\r
+\r
+ /**\r
+ * One of: {@link #MouseButtonPressed}, {@link #MouseButtonReleased},\r
+ * {@link #MouseClick}, {@link #MouseDoubleClick}, {@link #MouseDragBegin}\r
+ */\r
+ public static final int MouseButtonMask = MouseButtonPressedMask | MouseButtonReleasedMask | MouseClickMask\r
+ | MouseDoubleClickMask | MouseDragBeginMask;\r
+\r
+ /**\r
+ * @see MouseEnterEvent\r
+ */\r
+ public static final int MouseEnter = 11;\r
+ public static final int MouseEnterMask = toMask(MouseEnter);\r
+\r
+ /**\r
+ * @see MouseExitEvent\r
+ */\r
+ public static final int MouseExit = 12;\r
+ public static final int MouseExitMask = toMask(MouseExit);\r
+\r
+ /**\r
+ * @see MouseMovedEvent\r
+ */\r
+ public static final int MouseMoved = 13;\r
+ public static final int MouseMovedMask = toMask(MouseMoved);\r
+\r
+ public static final int MouseMoveMask = MouseEnterMask | MouseExitMask | MouseMovedMask;\r
+\r
+ /**\r
+ * @see MouseWheelMovedEvent\r
+ */\r
+ public static final int MouseWheel = 14;\r
+ public static final int MouseWheelMask = toMask(MouseWheel);\r
+\r
+ /**\r
+ * One of: {@link #MouseButton}, {@link #MouseMove}, {@link #MouseWheel}\r
+ */\r
+ public static final int MouseMask = MouseButtonMask | MouseMoveMask | MouseWheelMask;\r
+\r
+ /**\r
+ * @see TimeEvent\r
+ */\r
+ public static final int Time = 15;\r
+ public static final int TimeMask = toMask(Time);\r
+\r
+ /**\r
+ * One of: {@link #Command}, {@link #Focus}, {@link #Key}, {@link #Mouse},\r
+ * {@link #Time}\r
+ */\r
+ public static final int AnyMask = CommandMask | FocusMask | KeyMask | MouseMask | TimeMask;\r
+\r
+ /**\r
+ * For testing whether the specified event mask passes the specified event.\r
+ * \r
+ * @param eventMask\r
+ * @param event\r
+ * @return\r
+ */\r
+ public static boolean passes(IEventHandler handler, Event event) {\r
+ int mask = handler.getEventMask();\r
+ return passes(mask, event);\r
+ }\r
+\r
+ /**\r
+ * For testing whether the specified event mask passes the specified event.\r
+ * \r
+ * @param mask\r
+ * @param event\r
+ * @return\r
+ */\r
+ public static boolean passes(int mask, Event event) {\r
+ int et = toTypeMask(event);\r
+ return (et & mask) != 0;\r
+ }\r
+\r
+ /**\r
+ * For testing whether the specified event mask passes the specified event.\r
+ * \r
+ * @param eventMask\r
+ * @param event\r
+ * @return\r
+ */\r
+ public static boolean passes(IEventHandler handler, int eventTypeMask) {\r
+ return (eventTypeMask & handler.getEventMask()) != 0;\r
+ }\r
+\r
+ /**\r
+ * For testing whether the specified event type passes the specified event mask.\r
+ * \r
+ * @param mask\r
+ * @param event\r
+ * @return\r
+ */\r
+ public static boolean passes(int mask, int eventTypeMask) {\r
+ return (eventTypeMask & mask) != 0;\r
+ }\r
+\r
+ /**\r
+ * Converts the specified event instance to an event type mask representing the event.\r
+ * \r
+ * @param event\r
+ * @return\r
+ */\r
+ public static int toTypeMask(Event event) {\r
+ return event != null ? toTypeMask(event.getClass()) : 0;\r
+ }\r
+\r
+ /**\r
+ * Converts the specified event instance to an integer describing the event.\r
+ * \r
+ * @param event\r
+ * @return\r
+ */\r
+ public static int toType(Event event) {\r
+ return event != null ? toType(event.getClass()) : 0;\r
+ }\r
+\r
+ /**\r
+ * Converts the specified event class to an event type mask representing the event.\r
+ * \r
+ * @param event\r
+ * @return\r
+ */\r
+ public static int toTypeMask(Class<? extends Event> clazz) {\r
+ if (clazz == null)\r
+ return 0;\r
+ Integer type = maskCache.get(clazz);\r
+ if (type != null)\r
+ return type;\r
+ type = calculateTypeMask(clazz);\r
+ maskCache.putIfAbsent(clazz, type);\r
+ return type;\r
+ }\r
+\r
+ /**\r
+ * Converts the specified event class to an integer representing that specific event type.\r
+ * \r
+ * @param event\r
+ * @return\r
+ */\r
+ public static int toType(Class<? extends Event> clazz) {\r
+ if (clazz == null)\r
+ return 0;\r
+ Integer type = typeCache.get(clazz);\r
+ if (type != null)\r
+ return type;\r
+ type = calculateType(clazz);\r
+ typeCache.putIfAbsent(clazz, type);\r
+ return type;\r
+ }\r
+\r
+ /**\r
+ * Converts the specified event instance to an event type mask representing\r
+ * the event.\r
+ * \r
+ * @param clazz class of event to get type for\r
+ * @return event type mask\r
+ * @throws IllegalArgumentException if event class is not recognized\r
+ */\r
+ private static int calculateTypeMask(Class<? extends Event> clazz) {\r
+ if (Event.class.isAssignableFrom(clazz)) {\r
+ if (MouseEvent.class.isAssignableFrom(clazz)) {\r
+ if (MouseMovedEvent.class.isAssignableFrom(clazz))\r
+ return MouseMovedMask;\r
+ if (MouseButtonPressedEvent.class.isAssignableFrom(clazz))\r
+ return MouseButtonPressedMask;\r
+ if (MouseButtonReleasedEvent.class.isAssignableFrom(clazz))\r
+ return MouseButtonReleasedMask;\r
+ if (MouseClickEvent.class.isAssignableFrom(clazz))\r
+ return MouseClickMask;\r
+ if (MouseWheelMovedEvent.class.isAssignableFrom(clazz))\r
+ return MouseWheelMask;\r
+ if (MouseDoubleClickedEvent.class.isAssignableFrom(clazz))\r
+ return MouseDoubleClickMask;\r
+ if (org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin.class.isAssignableFrom(clazz))\r
+ return MouseDragBeginMask;\r
+ if (MouseEnterEvent.class.isAssignableFrom(clazz))\r
+ return MouseEnterMask;\r
+ if (MouseExitEvent.class.isAssignableFrom(clazz))\r
+ return MouseExitMask;\r
+ return MouseMask;\r
+ }\r
+\r
+ if (KeyEvent.class.isAssignableFrom(clazz)) {\r
+ if (KeyPressedEvent.class.isAssignableFrom(clazz))\r
+ return KeyPressedMask;\r
+ if (KeyReleasedEvent.class.isAssignableFrom(clazz))\r
+ return KeyReleasedMask;\r
+ return KeyMask;\r
+ }\r
+\r
+ if (FocusEvent.class.isAssignableFrom(clazz)) {\r
+ if (FocusGainedEvent.class.isAssignableFrom(clazz))\r
+ return FocusGainedMask;\r
+ if (FocusLostEvent.class.isAssignableFrom(clazz))\r
+ return FocusLostMask;\r
+ return FocusMask;\r
+ }\r
+\r
+ if (CommandEvent.class.isAssignableFrom(clazz))\r
+ return CommandMask;\r
+\r
+ if (TimeEvent.class.isAssignableFrom(clazz))\r
+ return TimeMask;\r
+\r
+ return AnyMask;\r
+ }\r
+ throw new IllegalArgumentException("unrecognized event class: " + clazz);\r
+ }\r
+\r
+\r
+ /**\r
+ * Converts the specified event instance to an event type mask representing\r
+ * the event.\r
+ * \r
+ * @param clazz class of event to get type for\r
+ * @return event type mask\r
+ * @throws IllegalArgumentException if event class is not recognized\r
+ */\r
+ private static int calculateType(Class<? extends Event> clazz) {\r
+ if (Event.class.isAssignableFrom(clazz)) {\r
+ if (MouseEvent.class.isAssignableFrom(clazz)) {\r
+ if (MouseMovedEvent.class.isAssignableFrom(clazz))\r
+ return MouseMoved;\r
+ if (MouseButtonPressedEvent.class.isAssignableFrom(clazz))\r
+ return MouseButtonPressed;\r
+ if (MouseButtonReleasedEvent.class.isAssignableFrom(clazz))\r
+ return MouseButtonReleased;\r
+ if (MouseClickEvent.class.isAssignableFrom(clazz))\r
+ return MouseClick;\r
+ if (MouseWheelMovedEvent.class.isAssignableFrom(clazz))\r
+ return MouseWheel;\r
+ if (MouseDoubleClickedEvent.class.isAssignableFrom(clazz))\r
+ return MouseDoubleClick;\r
+ if (org.simantics.scenegraph.g2d.events.MouseEvent.MouseDragBegin.class.isAssignableFrom(clazz))\r
+ return MouseDragBegin;\r
+ if (MouseEnterEvent.class.isAssignableFrom(clazz))\r
+ return MouseEnter;\r
+ if (MouseExitEvent.class.isAssignableFrom(clazz))\r
+ return MouseExit;\r
+ }\r
+\r
+ if (KeyEvent.class.isAssignableFrom(clazz)) {\r
+ if (KeyPressedEvent.class.isAssignableFrom(clazz))\r
+ return KeyPressed;\r
+ if (KeyReleasedEvent.class.isAssignableFrom(clazz))\r
+ return KeyReleased;\r
+ }\r
+\r
+ if (FocusEvent.class.isAssignableFrom(clazz)) {\r
+ if (FocusGainedEvent.class.isAssignableFrom(clazz))\r
+ return FocusGained;\r
+ if (FocusLostEvent.class.isAssignableFrom(clazz))\r
+ return FocusLost;\r
+ }\r
+\r
+ if (CommandEvent.class.isAssignableFrom(clazz))\r
+ return Command;\r
+\r
+ if (TimeEvent.class.isAssignableFrom(clazz))\r
+ return Time;\r
+ }\r
+ throw new IllegalArgumentException("unrecognized event class: " + clazz);\r
+ }\r
+\r
+ private static ConcurrentMap<Class<?>, Integer> maskCache = new ConcurrentHashMap<Class<?>, Integer>();\r
+ private static ConcurrentMap<Class<?>, Integer> typeCache = new ConcurrentHashMap<Class<?>, Integer>();\r
+\r
+ private static int toMask(int eventType) {\r
+ return (1 << eventType);\r
+ }\r
+\r
+}\r