1 /*******************************************************************************
\r
2 * Copyright (c) 2007 VTT Technical Research Centre of Finland and others.
\r
3 * All rights reserved. This program and the accompanying materials
\r
4 * are made available under the terms of the Eclipse Public License v1.0
\r
5 * which accompanies this distribution, and is available at
\r
6 * http://www.eclipse.org/legal/epl-v10.html
\r
9 * VTT Technical Research Centre of Finland - initial API and implementation
\r
10 *******************************************************************************/
\r
11 package org.simantics.proconf.g3d.input;
\r
13 import org.eclipse.swt.SWT;
\r
14 import org.eclipse.swt.events.FocusEvent;
\r
15 import org.eclipse.swt.events.FocusListener;
\r
16 import org.eclipse.swt.events.KeyEvent;
\r
17 import org.eclipse.swt.events.KeyListener;
\r
18 import org.eclipse.swt.events.MouseEvent;
\r
19 import org.eclipse.swt.events.MouseListener;
\r
20 import org.eclipse.swt.events.MouseMoveListener;
\r
21 import org.eclipse.swt.events.MouseTrackListener;
\r
23 public class SWTInputProvider implements KeyListener, MouseListener, MouseMoveListener, MouseTrackListener, InputProvider, FocusListener {
\r
25 private static final int PRESS_TIME = 200;
\r
27 private boolean keyPressed[] = new boolean[1024];
\r
28 private boolean keyTemp[] = new boolean[1024];
\r
29 private boolean keyDown[] = new boolean[1024];
\r
30 private boolean keyUp[] = new boolean[1024];
\r
32 private int awtMouseX = 0;
\r
33 private int awtMouseY = 0;
\r
34 private boolean awtPressed = false;
\r
35 private boolean awtDragged = false;
\r
36 private boolean awtReleased = false;
\r
37 private boolean awtMouseClicked = false;
\r
38 private boolean awtMouseMoved = false;
\r
40 private boolean swtMouse1Down = false;
\r
41 private boolean swtMouse2Down = false;
\r
42 private boolean swtMouse3Down = false;
\r
44 long mouse1DownTime = 0;
\r
45 long mouse2DownTime = 0;
\r
46 long mouse3DownTime = 0;
\r
48 private int awtPressModifiers = 0;
\r
49 private int awtDragModifiers = 0;
\r
50 private int awtClickModifiers = 0;
\r
51 private int awtMoveModifiers = 0;
\r
52 private int awtClickButton = 0;
\r
54 private int mouseX = 0;
\r
55 private int mouseY = 0;
\r
57 private int prevMouseX = 0;
\r
58 private int prevMouseY = 0;
\r
60 private boolean mousePressed = false;
\r
61 private boolean mouseDragged = false;
\r
62 private boolean mouseReleased = false;
\r
63 private boolean mouseClicked = false;
\r
64 private boolean mouseMoved = false;
\r
66 private int pressModifiers = 0;
\r
67 private int clickModifiers = 0;
\r
68 private int dragModifiers = 0;
\r
69 private int clickButton = 0;
\r
70 private int moveModifiers = 0;
\r
72 public SWTInputProvider() {
\r
76 private void reset() {
\r
77 for (int i = 0; i < keyDown.length; i++) {
\r
80 keyPressed[i] = false;
\r
83 mousePressed = false;
\r
84 mouseDragged = false;
\r
85 mouseReleased = false;
\r
86 mouseClicked = false;
\r
96 public boolean keyPressed(int i) {
\r
97 return keyPressed[i];
\r
100 public boolean keyDown(int i) {
\r
104 public boolean keyUp(int i) {
\r
108 public int mouseX() {
\r
112 public int mouseY() {
\r
116 public int prevMouseX() {
\r
120 public int prevMouseY() {
\r
124 public boolean mousePressed() {
\r
125 return mousePressed;
\r
128 public boolean mouseMoved() {
\r
132 public boolean mouseReleased() {
\r
133 return mouseReleased;
\r
136 public boolean mouseClicked() {
\r
137 return mouseClicked;
\r
140 public boolean mouseDragged() {
\r
141 return mouseDragged;
\r
144 public int pressModifiers() {
\r
145 return pressModifiers;
\r
148 public int clickModifiers() {
\r
149 return clickModifiers;
\r
152 public int dragModifiers() {
\r
153 return dragModifiers;
\r
156 public int moveModifiers() {
\r
157 return moveModifiers;
\r
160 public int clickButton() {
\r
161 return clickButton;
\r
165 public void update() {
\r
166 prevMouseX = mouseX;
\r
167 prevMouseY = mouseY;
\r
168 mouseX = awtMouseX;
\r
169 mouseY = awtMouseY;
\r
170 //System.out.println(mouseX + " " + mouseY);
\r
171 mousePressed = awtPressed;
\r
172 awtPressed = false;
\r
173 mouseReleased = awtReleased;
\r
174 awtReleased = false;
\r
175 mouseMoved = awtMouseMoved;
\r
176 awtMouseMoved = false;
\r
177 mouseDragged = awtDragged;
\r
178 awtDragged = false;
\r
179 mouseClicked = awtMouseClicked;
\r
180 awtMouseClicked = false;
\r
181 pressModifiers = awtPressModifiers;
\r
182 // awtPressModifiers = 0;
\r
183 clickModifiers = awtClickModifiers;
\r
184 //awtClickModifiers = 0;
\r
185 dragModifiers = awtDragModifiers;
\r
186 // awtDragModifiers = 0;
\r
187 moveModifiers = awtMoveModifiers;
\r
188 //awtMoveModifiers = 0;
\r
189 clickButton = awtClickButton;
\r
190 awtClickButton = 0;
\r
191 for (int i = 0; i < keyDown.length; i++) {
\r
192 if (keyDown[i] && !keyTemp[i]) {
\r
194 keyPressed[i] = true;
\r
196 else if (keyDown[i] && keyTemp[i]) {
\r
197 keyPressed[i] = false;
\r
199 else if (!keyDown[i] && keyTemp[i]) {
\r
201 keyTemp[i] = false;
\r
202 keyPressed[i] = false;
\r
204 else if (!keyDown[i]) {
\r
205 keyTemp[i] = false;
\r
206 keyPressed[i] = false;
\r
216 private int getAWTKeyCode(int swtKeyCode) {
\r
217 if(swtKeyCode > keyDown.length) {
\r
219 switch (swtKeyCode) {
\r
221 keyCode = java.awt.event.KeyEvent.VK_CONTROL;
\r
224 keyCode = java.awt.event.KeyEvent.VK_ALT;
\r
228 keyCode = java.awt.event.KeyEvent.VK_SHIFT;
\r
230 case SWT.ARROW_LEFT:
\r
231 keyCode = java.awt.event.KeyEvent.VK_LEFT;
\r
233 case SWT.ARROW_RIGHT:
\r
234 keyCode = java.awt.event.KeyEvent.VK_RIGHT;
\r
237 keyCode = java.awt.event.KeyEvent.VK_UP;
\r
239 case SWT.ARROW_DOWN:
\r
240 keyCode = java.awt.event.KeyEvent.VK_DOWN;
\r
243 keyCode = java.awt.event.KeyEvent.VK_NUMPAD0;
\r
246 keyCode = java.awt.event.KeyEvent.VK_NUMPAD1;
\r
249 keyCode = java.awt.event.KeyEvent.VK_NUMPAD2;
\r
252 keyCode = java.awt.event.KeyEvent.VK_NUMPAD3;
\r
255 keyCode = java.awt.event.KeyEvent.VK_NUMPAD4;
\r
258 keyCode = java.awt.event.KeyEvent.VK_NUMPAD5;
\r
261 keyCode = java.awt.event.KeyEvent.VK_NUMPAD6;
\r
264 keyCode = java.awt.event.KeyEvent.VK_NUMPAD7;
\r
267 keyCode = java.awt.event.KeyEvent.VK_NUMPAD8;
\r
270 keyCode = java.awt.event.KeyEvent.VK_NUMPAD9;
\r
272 case SWT.KEYPAD_CR:
\r
273 keyCode = java.awt.event.KeyEvent.VK_ENTER;
\r
276 keyCode = java.awt.event.KeyEvent.VK_NUM_LOCK;
\r
278 case SWT.SCROLL_LOCK:
\r
279 keyCode = java.awt.event.KeyEvent.VK_SCROLL_LOCK;
\r
281 case SWT.CAPS_LOCK:
\r
282 keyCode = java.awt.event.KeyEvent.VK_CAPS_LOCK;
\r
285 keyCode = java.awt.event.KeyEvent.VK_INSERT;
\r
288 keyCode = java.awt.event.KeyEvent.VK_HOME;
\r
291 keyCode = java.awt.event.KeyEvent.VK_END;
\r
294 keyCode = java.awt.event.KeyEvent.VK_PAGE_UP;
\r
296 case SWT.PAGE_DOWN:
\r
297 keyCode = java.awt.event.KeyEvent.VK_PAGE_DOWN;
\r
300 keyCode = java.awt.event.KeyEvent.VK_PAUSE;
\r
303 keyCode = java.awt.event.KeyEvent.VK_PAUSE;
\r
305 case SWT.PRINT_SCREEN:
\r
306 keyCode = java.awt.event.KeyEvent.VK_PRINTSCREEN;
\r
309 keyCode = java.awt.event.KeyEvent.VK_HELP;
\r
317 } else if (swtKeyCode == 8) {
\r
318 return java.awt.event.KeyEvent.VK_BACK_SPACE;
\r
320 else if (swtKeyCode >= 97 )
\r
321 return swtKeyCode - 32;
\r
328 * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
\r
330 public void keyPressed(KeyEvent arg0) {
\r
331 //System.out.println("KeyPressed " + arg0.character + " " + arg0.keyCode + " " + getAWTKeyCode(arg0.keyCode));
\r
332 keyDown[getAWTKeyCode(arg0.keyCode)] = true;
\r
336 * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
\r
338 public void keyReleased(KeyEvent arg0) {
\r
339 //System.out.println("KeyReleased " + arg0.character + " " + arg0.keyCode + " " + getAWTKeyCode(arg0.keyCode));
\r
341 keyDown[getAWTKeyCode(arg0.keyCode)] = false;
\r
344 public void mouseMove(MouseEvent e) {
\r
347 if (swtMouse1Down || swtMouse2Down || swtMouse3Down) {
\r
348 // comparing times so that drag event won't be send at the time when mouse button was pressed
\r
349 long time = e.time & 0xFFFFFFFFL;
\r
350 boolean drag = false;
\r
351 if (swtMouse1Down) {
\r
352 drag = time > mouse1DownTime;
\r
353 } else if (swtMouse2Down) {
\r
354 drag = time > mouse2DownTime;
\r
356 drag = time > mouse3DownTime;
\r
360 awtDragModifiers = createButtonMask(e);
\r
363 awtMoveModifiers = createButtonMask(e);
\r
364 awtMouseMoved = true;
\r
368 public void mouseDoubleClick(MouseEvent e) {
\r
370 awtMouseClicked = true;
\r
371 awtClickModifiers = createButtonMask(e);
\r
372 switch (e.button) {
\r
374 awtClickButton = java.awt.event.MouseEvent.BUTTON1;
\r
377 awtClickButton = java.awt.event.MouseEvent.BUTTON2;
\r
380 awtClickButton = java.awt.event.MouseEvent.BUTTON3;
\r
387 private int createButtonMask(MouseEvent e) {
\r
390 mask |= java.awt.event.MouseEvent.BUTTON1_DOWN_MASK | java.awt.event.MouseEvent.BUTTON1_MASK;
\r
392 mask |= java.awt.event.MouseEvent.BUTTON2_DOWN_MASK | java.awt.event.MouseEvent.BUTTON2_MASK;
\r
394 mask |= java.awt.event.MouseEvent.BUTTON3_DOWN_MASK | java.awt.event.MouseEvent.BUTTON3_MASK;
\r
395 if ((e.stateMask & SWT.CTRL) > 0)
\r
396 mask |= java.awt.event.MouseEvent.CTRL_DOWN_MASK | java.awt.event.MouseEvent.CTRL_MASK;
\r
397 if ((e.stateMask & SWT.CTRL) > 0)
\r
398 mask |= java.awt.event.MouseEvent.ALT_DOWN_MASK | java.awt.event.MouseEvent.ALT_MASK;
\r
404 public void mouseDown(MouseEvent e) {
\r
405 switch (e.button) {
\r
407 swtMouse1Down = true;
\r
408 mouse1DownTime = e.time & 0xFFFFFFFFL;
\r
411 swtMouse2Down = true;
\r
412 mouse2DownTime = e.time & 0xFFFFFFFFL;
\r
415 swtMouse3Down = true;
\r
416 mouse3DownTime = e.time & 0xFFFFFFFFL;
\r
420 awtPressModifiers = createButtonMask(e);
\r
423 public void mouseUp(MouseEvent e) {
\r
424 long mouseUpTime = e.time & 0xFFFFFFFFL;
\r
426 switch (e.button) {
\r
428 swtMouse1Down = false;
\r
429 delta = mouseUpTime - mouse1DownTime;
\r
432 swtMouse2Down = false;
\r
433 delta = mouseUpTime - mouse2DownTime;
\r
436 swtMouse3Down = false;
\r
437 delta = mouseUpTime - mouse3DownTime;
\r
439 awtReleased = true;
\r
441 if (delta < PRESS_TIME) {
\r
442 awtMouseClicked = true;
\r
443 awtClickModifiers = createButtonMask(e);
\r
444 switch (e.button) {
\r
446 awtClickButton = java.awt.event.MouseEvent.BUTTON1;
\r
449 awtClickButton = java.awt.event.MouseEvent.BUTTON2;
\r
452 awtClickButton = java.awt.event.MouseEvent.BUTTON3;
\r
460 public void mouseEnter(MouseEvent e) {
\r
464 public void mouseExit(MouseEvent e) {
\r
465 awtReleased = false;
\r
466 awtPressed = false;
\r
467 swtMouse1Down = false;
\r
468 swtMouse2Down = false;
\r
469 swtMouse3Down = false;
\r
474 public void focusGained(FocusEvent e) {
\r
478 public void focusLost(FocusEvent e) {
\r
482 public void mouseHover(MouseEvent e) {
\r
486 public void setMouseMoved(boolean b) {
\r
490 public void setMouseX(int x) {
\r
494 public void setMouseY(int y) {
\r
498 public String toString() {
\r
500 s += "(" + mouseX + "," + mouseY + ")\n";
\r
501 s += "Pressed " + mousePressed + "\n";
\r
502 s += "Released " + mouseReleased + "\n";
\r
503 s += "Moved " + mouseMoved + "\n";
\r
504 s += "Dragged " + mouseDragged + "\n";
\r
505 s += "Clicked " + mouseClicked + "\n";
\r
506 s += "DragModifiers " + dragModifiers + "\n";
\r
507 s += "ClickModifiers " + clickModifiers + "\n";
\r
508 s += "PressModifiers " + pressModifiers + "\n";
\r