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