X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.g3d%2Fsrc%2Forg%2Fsimantics%2Fproconf%2Fg3d%2Finput%2FSWTInputProvider.java;fp=org.simantics.g3d%2Fsrc%2Forg%2Fsimantics%2Fproconf%2Fg3d%2Finput%2FSWTInputProvider.java;h=345a9e83d58fd9f74fc823c43dce58ea2d8d4cb8;hb=10f144a2bb2d7bec98b812b83acecb333fd098ea;hp=0000000000000000000000000000000000000000;hpb=3055b543aa5afc0cca4bb3b341704e7c5103fa6a;p=simantics%2F3d.git 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 index 00000000..345a9e83 --- /dev/null +++ b/org.simantics.g3d/src/org/simantics/proconf/g3d/input/SWTInputProvider.java @@ -0,0 +1,511 @@ +/******************************************************************************* + * 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; + } +} \ No newline at end of file