]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/events/EventTypes.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / g2d / events / EventTypes.java
diff --git a/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/events/EventTypes.java b/bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/g2d/events/EventTypes.java
new file mode 100644 (file)
index 0000000..adb8489
--- /dev/null
@@ -0,0 +1,380 @@
+/*******************************************************************************\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