]> gerrit.simantics Code Review - simantics/3d.git/blobdiff - org.simantics.g3d/src/org/simantics/proconf/g3d/input/SWTInputProvider.java
git-svn-id: https://www.simantics.org/svn/simantics/3d/trunk@22280 ac1ea38d-2e2b...
[simantics/3d.git] / org.simantics.g3d / src / org / simantics / proconf / g3d / input / SWTInputProvider.java
diff --git a/org.simantics.g3d/src/org/simantics/proconf/g3d/input/SWTInputProvider.java b/org.simantics.g3d/src/org/simantics/proconf/g3d/input/SWTInputProvider.java
new file mode 100644 (file)
index 0000000..345a9e8
--- /dev/null
@@ -0,0 +1,511 @@
+/*******************************************************************************\r
+ * Copyright (c) 2007- VTT Technical Research Centre of Finland.\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.proconf.g3d.input;\r
+\r
+import org.eclipse.swt.SWT;\r
+import org.eclipse.swt.events.FocusEvent;\r
+import org.eclipse.swt.events.FocusListener;\r
+import org.eclipse.swt.events.KeyEvent;\r
+import org.eclipse.swt.events.KeyListener;\r
+import org.eclipse.swt.events.MouseEvent;\r
+import org.eclipse.swt.events.MouseListener;\r
+import org.eclipse.swt.events.MouseMoveListener;\r
+import org.eclipse.swt.events.MouseTrackListener;\r
+\r
+public class SWTInputProvider implements KeyListener, MouseListener, MouseMoveListener, MouseTrackListener, InputProvider, FocusListener {\r
+    \r
+    private static final int PRESS_TIME = 200;\r
+    \r
+    private boolean keyPressed[] = new boolean[1024];\r
+    private boolean keyTemp[] = new boolean[1024];\r
+    private boolean keyDown[] = new boolean[1024];\r
+    private boolean keyUp[] = new boolean[1024];\r
+    \r
+    private int awtMouseX = 0;\r
+    private int awtMouseY = 0;\r
+    private boolean awtPressed = false;\r
+    private boolean awtDragged = false;\r
+    private boolean awtReleased = false;\r
+    private boolean awtMouseClicked = false;\r
+    private boolean awtMouseMoved = false;\r
+    \r
+    private boolean swtMouse1Down = false;\r
+    private boolean swtMouse2Down = false;\r
+    private boolean swtMouse3Down = false;\r
+    \r
+    long mouse1DownTime = 0;\r
+    long mouse2DownTime = 0;\r
+    long mouse3DownTime = 0;\r
+    \r
+    private int awtPressModifiers = 0;\r
+    private int awtDragModifiers = 0;\r
+    private int awtClickModifiers = 0;\r
+    private int awtMoveModifiers = 0;\r
+    private int awtClickButton = 0;\r
+     \r
+    private int mouseX = 0;\r
+    private int mouseY = 0;\r
+    \r
+    private int prevMouseX = 0;\r
+    private int prevMouseY = 0;\r
+    \r
+    private boolean mousePressed = false;\r
+    private boolean mouseDragged = false;\r
+    private boolean mouseReleased = false;\r
+    private boolean mouseClicked = false;\r
+    private boolean mouseMoved = false;\r
+    \r
+    private int pressModifiers = 0;\r
+    private int clickModifiers = 0;\r
+    private int dragModifiers = 0;\r
+    private int clickButton = 0;\r
+    private int moveModifiers = 0;\r
+    \r
+    public SWTInputProvider() {\r
+        reset();\r
+    }\r
+    \r
+    private void reset() {\r
+       for (int i = 0; i < keyDown.length; i++) {\r
+            keyDown[i] = false;\r
+            keyTemp[i] = false;\r
+            keyPressed[i] = false; \r
+            keyUp[i] = false;\r
+        }\r
+        mousePressed = false;\r
+        mouseDragged = false;\r
+        mouseReleased = false;\r
+        mouseClicked = false;\r
+        mouseMoved = false;\r
+        \r
+        pressModifiers = 0;\r
+        clickModifiers = 0;\r
+        dragModifiers = 0;\r
+        clickButton = 0;\r
+        moveModifiers = 0;\r
+    }\r
+    \r
+    public boolean keyPressed(int i) {\r
+        return keyPressed[i];\r
+    }\r
+    \r
+    public boolean keyDown(int i) {\r
+        return keyDown[i];\r
+    }\r
+    \r
+    public boolean keyUp(int i) {\r
+       return keyUp[i];\r
+    }\r
+    \r
+    public int mouseX() {\r
+        return mouseX;\r
+    }\r
+    \r
+    public int mouseY() {\r
+        return mouseY;\r
+    }\r
+    \r
+    public int prevMouseX() {\r
+        return prevMouseX;\r
+    }\r
+    \r
+    public int prevMouseY() {\r
+        return prevMouseY;\r
+    }\r
+    \r
+    public boolean mousePressed() {\r
+        return mousePressed;\r
+    }\r
+    \r
+    public boolean mouseMoved() {\r
+        return mouseMoved;\r
+    }\r
+    \r
+    public boolean mouseReleased() {\r
+        return mouseReleased;\r
+    }\r
+    \r
+    public boolean mouseClicked() {\r
+        return mouseClicked;\r
+    }\r
+    \r
+    public boolean mouseDragged() {\r
+        return mouseDragged;\r
+    }\r
+    \r
+    public int pressModifiers() {\r
+        return pressModifiers;\r
+    }\r
+    \r
+    public int clickModifiers() {\r
+        return clickModifiers;\r
+    }\r
+    \r
+    public int dragModifiers() {\r
+        return dragModifiers;\r
+    }\r
+    \r
+    public int moveModifiers() {\r
+        return moveModifiers;\r
+    }\r
+    \r
+    public int clickButton() {\r
+        return clickButton;\r
+    }\r
+    \r
+    \r
+    public void update() {\r
+        prevMouseX = mouseX;\r
+        prevMouseY = mouseY;\r
+        mouseX = awtMouseX;\r
+        mouseY = awtMouseY;\r
+        //System.out.println(mouseX + " " + mouseY);\r
+        mousePressed = awtPressed;\r
+        awtPressed = false;\r
+        mouseReleased = awtReleased;\r
+        awtReleased = false;\r
+        mouseMoved = awtMouseMoved;\r
+        awtMouseMoved = false;\r
+        mouseDragged = awtDragged;\r
+        awtDragged = false;\r
+        mouseClicked = awtMouseClicked;\r
+        awtMouseClicked = false;\r
+        pressModifiers = awtPressModifiers;\r
+       // awtPressModifiers = 0;\r
+        clickModifiers = awtClickModifiers;\r
+        //awtClickModifiers = 0;\r
+        dragModifiers = awtDragModifiers;\r
+       // awtDragModifiers = 0;\r
+        moveModifiers = awtMoveModifiers;\r
+        //awtMoveModifiers = 0;\r
+        clickButton = awtClickButton;\r
+        awtClickButton = 0;\r
+        for (int i = 0; i < keyDown.length; i++) {\r
+            if (keyDown[i] && !keyTemp[i]) {\r
+              keyTemp[i] = true;\r
+              keyPressed[i] = true;\r
+            }\r
+            else if (keyDown[i] && keyTemp[i]) {\r
+             keyPressed[i] = false;\r
+            }\r
+            else if (!keyDown[i] && keyTemp[i]) {\r
+               keyUp[i] = true;\r
+               keyTemp[i] = false;\r
+                keyPressed[i] = false;\r
+            }\r
+            else if (!keyDown[i]) {\r
+              keyTemp[i] = false;\r
+              keyPressed[i] = false;\r
+              keyUp[i] = false;\r
+            }\r
+          }\r
+    \r
+    }\r
+    \r
\r
+\r
+\r
+    private int getAWTKeyCode(int swtKeyCode) {\r
+        if(swtKeyCode > keyDown.length) {\r
+            int keyCode = 0;\r
+            switch (swtKeyCode) {\r
+            case SWT.CTRL:\r
+                keyCode = java.awt.event.KeyEvent.VK_CONTROL;\r
+                break;\r
+            case SWT.ALT:\r
+                keyCode = java.awt.event.KeyEvent.VK_ALT;\r
+                break;\r
+            \r
+            case SWT.SHIFT:\r
+                keyCode = java.awt.event.KeyEvent.VK_SHIFT;\r
+                break;\r
+            case SWT.ARROW_LEFT:\r
+                keyCode = java.awt.event.KeyEvent.VK_LEFT;\r
+                break;\r
+            case SWT.ARROW_RIGHT:\r
+                keyCode = java.awt.event.KeyEvent.VK_RIGHT;\r
+                break;\r
+            case SWT.ARROW_UP:\r
+                keyCode = java.awt.event.KeyEvent.VK_UP;\r
+                break;\r
+            case SWT.ARROW_DOWN:\r
+                keyCode = java.awt.event.KeyEvent.VK_DOWN;\r
+                break;\r
+            case SWT.KEYPAD_0:\r
+                keyCode = java.awt.event.KeyEvent.VK_NUMPAD0;\r
+                break;\r
+            case SWT.KEYPAD_1:\r
+                keyCode = java.awt.event.KeyEvent.VK_NUMPAD1;\r
+                break;\r
+            case SWT.KEYPAD_2:\r
+                keyCode = java.awt.event.KeyEvent.VK_NUMPAD2;\r
+                break;\r
+            case SWT.KEYPAD_3:\r
+                keyCode = java.awt.event.KeyEvent.VK_NUMPAD3;\r
+                break;\r
+            case SWT.KEYPAD_4:\r
+                keyCode = java.awt.event.KeyEvent.VK_NUMPAD4;\r
+                break;\r
+            case SWT.KEYPAD_5:\r
+                keyCode = java.awt.event.KeyEvent.VK_NUMPAD5;\r
+                break;\r
+            case SWT.KEYPAD_6:\r
+                keyCode = java.awt.event.KeyEvent.VK_NUMPAD6;\r
+                break;\r
+            case SWT.KEYPAD_7:\r
+                keyCode = java.awt.event.KeyEvent.VK_NUMPAD7;\r
+                break;\r
+            case SWT.KEYPAD_8:\r
+                keyCode = java.awt.event.KeyEvent.VK_NUMPAD8;\r
+                break;\r
+            case SWT.KEYPAD_9:\r
+                keyCode = java.awt.event.KeyEvent.VK_NUMPAD9;\r
+                break;\r
+            case SWT.KEYPAD_CR:\r
+                keyCode = java.awt.event.KeyEvent.VK_ENTER;\r
+                break;\r
+            case SWT.NUM_LOCK:\r
+                keyCode = java.awt.event.KeyEvent.VK_NUM_LOCK;\r
+                break;\r
+            case SWT.SCROLL_LOCK:\r
+                keyCode = java.awt.event.KeyEvent.VK_SCROLL_LOCK;\r
+                break;\r
+            case SWT.CAPS_LOCK:\r
+                keyCode = java.awt.event.KeyEvent.VK_CAPS_LOCK;\r
+                break;\r
+            case SWT.INSERT:\r
+                keyCode = java.awt.event.KeyEvent.VK_INSERT;\r
+                break;\r
+            case SWT.HOME:\r
+                keyCode = java.awt.event.KeyEvent.VK_HOME;\r
+                break;\r
+            case SWT.END:\r
+                keyCode = java.awt.event.KeyEvent.VK_END;\r
+                break;\r
+            case SWT.PAGE_UP:\r
+                keyCode = java.awt.event.KeyEvent.VK_PAGE_UP;\r
+                break;\r
+            case SWT.PAGE_DOWN:\r
+                keyCode = java.awt.event.KeyEvent.VK_PAGE_DOWN;\r
+                break;\r
+            case SWT.PAUSE:\r
+                keyCode = java.awt.event.KeyEvent.VK_PAUSE;   \r
+                break;\r
+            case SWT.BREAK:\r
+                keyCode = java.awt.event.KeyEvent.VK_PAUSE;   \r
+                break;\r
+            case SWT.PRINT_SCREEN:\r
+                keyCode = java.awt.event.KeyEvent.VK_PRINTSCREEN;   \r
+                break;   \r
+            case SWT.HELP:\r
+                keyCode = java.awt.event.KeyEvent.VK_HELP;\r
+                break;\r
+            default :\r
+                keyCode = 0;\r
+               break;\r
+            }\r
+            \r
+            return keyCode;\r
+        } else if (swtKeyCode == 8) {\r
+               return java.awt.event.KeyEvent.VK_BACK_SPACE;\r
+        }\r
+        else if (swtKeyCode >= 97 )\r
+               return swtKeyCode - 32;\r
+        else\r
+               return swtKeyCode;\r
+    }\r
+\r
+    \r
+    /* (non-Javadoc)\r
+     * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)\r
+     */\r
+    public void keyPressed(KeyEvent arg0) {\r
+       //System.out.println("KeyPressed " + arg0.character + " " + arg0.keyCode + " " + getAWTKeyCode(arg0.keyCode));\r
+           keyDown[getAWTKeyCode(arg0.keyCode)] = true;\r
+    }\r
+    \r
+    /* (non-Javadoc)\r
+     * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)\r
+     */\r
+    public void keyReleased(KeyEvent arg0) {\r
+       //System.out.println("KeyReleased " + arg0.character + " " + arg0.keyCode + " " + getAWTKeyCode(arg0.keyCode));\r
+        \r
+           keyDown[getAWTKeyCode(arg0.keyCode)] = false;\r
+    }\r
+\r
+    public void mouseMove(MouseEvent e) {\r
+        awtMouseX = e.x;\r
+        awtMouseY = e.y;      \r
+        if (swtMouse1Down || swtMouse2Down || swtMouse3Down) {\r
+               // comparing times so that drag event won't be send at the time when mouse button was pressed\r
+               long time = e.time & 0xFFFFFFFFL;\r
+               boolean drag = false;\r
+               if (swtMouse1Down) {\r
+                       drag = time > mouse1DownTime;\r
+               } else if (swtMouse2Down) {\r
+                       drag = time > mouse2DownTime;\r
+               } else {\r
+                       drag = time > mouse3DownTime;\r
+               }\r
+               if (drag)  {\r
+                       awtDragged = true;\r
+                       awtDragModifiers = createButtonMask(e);\r
+               }\r
+        } else {\r
+            awtMoveModifiers = createButtonMask(e);\r
+            awtMouseMoved = true;\r
+        }\r
+    }\r
+\r
+    public void mouseDoubleClick(MouseEvent e) {\r
+        /*\r
+        awtMouseClicked = true;\r
+        awtClickModifiers = createButtonMask(e);\r
+        switch (e.button) {\r
+            case 1:\r
+                awtClickButton = java.awt.event.MouseEvent.BUTTON1;\r
+                break;\r
+            case 2:\r
+                awtClickButton = java.awt.event.MouseEvent.BUTTON2;\r
+                break;\r
+            case 3:\r
+                awtClickButton = java.awt.event.MouseEvent.BUTTON3;\r
+                break;\r
+                \r
+        }\r
+        */\r
+    }\r
+    \r
+    private int createButtonMask(MouseEvent e) {\r
+        int mask = 0;\r
+        if (swtMouse1Down)\r
+            mask |= java.awt.event.MouseEvent.BUTTON1_DOWN_MASK | java.awt.event.MouseEvent.BUTTON1_MASK;\r
+        if (swtMouse2Down)\r
+            mask |= java.awt.event.MouseEvent.BUTTON2_DOWN_MASK | java.awt.event.MouseEvent.BUTTON2_MASK;\r
+        if (swtMouse3Down)\r
+            mask |= java.awt.event.MouseEvent.BUTTON3_DOWN_MASK | java.awt.event.MouseEvent.BUTTON3_MASK;\r
+        if ((e.stateMask & SWT.CTRL) > 0) \r
+              mask |= java.awt.event.MouseEvent.CTRL_DOWN_MASK | java.awt.event.MouseEvent.CTRL_MASK;\r
+        if ((e.stateMask & SWT.CTRL) > 0)  \r
+              mask |= java.awt.event.MouseEvent.ALT_DOWN_MASK | java.awt.event.MouseEvent.ALT_MASK;\r
+        \r
+        \r
+        return mask;\r
+    }\r
+\r
+    public void mouseDown(MouseEvent e) {\r
+        switch (e.button) {\r
+            case 1:\r
+                swtMouse1Down = true;\r
+                mouse1DownTime = e.time & 0xFFFFFFFFL;\r
+                break;\r
+            case 2:\r
+                swtMouse2Down = true;\r
+                mouse2DownTime = e.time & 0xFFFFFFFFL;\r
+                break;\r
+            case 3:\r
+                swtMouse3Down = true;\r
+                mouse3DownTime = e.time & 0xFFFFFFFFL;\r
+        };\r
+        \r
+        awtPressed = true;\r
+        awtPressModifiers = createButtonMask(e);\r
+    }\r
+\r
+    public void mouseUp(MouseEvent e) {\r
+        long mouseUpTime = e.time & 0xFFFFFFFFL;\r
+        long delta = 1000;\r
+        switch (e.button) {\r
+        case 1:\r
+            swtMouse1Down = false;\r
+            delta = mouseUpTime - mouse1DownTime;\r
+            break;\r
+        case 2:\r
+            swtMouse2Down = false;\r
+            delta = mouseUpTime - mouse2DownTime;\r
+            break;\r
+        case 3:\r
+            swtMouse3Down = false;\r
+            delta = mouseUpTime - mouse3DownTime;\r
+        };\r
+        awtReleased = true;\r
+        \r
+        if (delta < PRESS_TIME) {\r
+            awtMouseClicked = true;\r
+            awtClickModifiers = createButtonMask(e);\r
+            switch (e.button) {\r
+                case 1:\r
+                    awtClickButton = java.awt.event.MouseEvent.BUTTON1;\r
+                    break;\r
+                case 2:\r
+                    awtClickButton = java.awt.event.MouseEvent.BUTTON2;\r
+                    break;\r
+                case 3:\r
+                    awtClickButton = java.awt.event.MouseEvent.BUTTON3;\r
+                    break;\r
+                    \r
+            }\r
+        }\r
+    }\r
+    \r
+    \r
+    public void mouseEnter(MouseEvent e) {\r
+        \r
+    }\r
+    \r
+    public void mouseExit(MouseEvent e) {\r
+        awtReleased = false;\r
+        awtPressed = false;\r
+        swtMouse1Down = false;\r
+        swtMouse2Down = false;\r
+        swtMouse3Down = false;\r
+        \r
+        \r
+    }\r
+    \r
+    public void focusGained(FocusEvent e) {\r
+\r
+    }\r
+    \r
+    public void focusLost(FocusEvent e) {\r
+       reset();\r
+    }\r
+    \r
+    public void mouseHover(MouseEvent e) {\r
+\r
+    }\r
+    \r
+    public void setMouseMoved(boolean b) {\r
+       awtMouseMoved = b;\r
+    }\r
+    \r
+    public void setMouseX(int x) {\r
+       awtMouseX = x;\r
+    }\r
+    \r
+    public void setMouseY(int y) {\r
+       awtMouseY = y;\r
+    }\r
+\r
+    public String toString() {\r
+        String s = "";\r
+        s += "(" + mouseX + "," + mouseY + ")\n";\r
+        s += "Pressed " + mousePressed + "\n";\r
+        s += "Released " + mouseReleased + "\n";\r
+        s += "Moved " + mouseMoved + "\n";\r
+        s += "Dragged " + mouseDragged + "\n";\r
+        s += "Clicked " + mouseClicked + "\n";\r
+        s += "DragModifiers " + dragModifiers + "\n";\r
+        s += "ClickModifiers " + clickModifiers + "\n";\r
+        s += "PressModifiers " + pressModifiers + "\n";\r
+        return s;\r
+    }\r
+}
\ No newline at end of file