--- /dev/null
+/*******************************************************************************\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