]> gerrit.simantics Code Review - simantics/3d.git/blob - org.simantics.proconf.g3d/src/org/simantics/proconf/g3d/input/SWTInputProvider.java
a21d3b79d035719ba18bf7732b237046ffb2fbdc
[simantics/3d.git] / org.simantics.proconf.g3d / src / org / simantics / proconf / g3d / input / SWTInputProvider.java
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
7  *\r
8  * Contributors:\r
9  *     VTT Technical Research Centre of Finland - initial API and implementation\r
10  *******************************************************************************/\r
11 package org.simantics.proconf.g3d.input;\r
12 \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
22 \r
23 public class SWTInputProvider implements KeyListener, MouseListener, MouseMoveListener, MouseTrackListener, InputProvider, FocusListener {\r
24     \r
25     private static final int PRESS_TIME = 200;\r
26     \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
31     \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
39     \r
40     private boolean swtMouse1Down = false;\r
41     private boolean swtMouse2Down = false;\r
42     private boolean swtMouse3Down = false;\r
43     \r
44     long mouse1DownTime = 0;\r
45     long mouse2DownTime = 0;\r
46     long mouse3DownTime = 0;\r
47     \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
53      \r
54     private int mouseX = 0;\r
55     private int mouseY = 0;\r
56     \r
57     private int prevMouseX = 0;\r
58     private int prevMouseY = 0;\r
59     \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
65     \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
71     \r
72     public SWTInputProvider() {\r
73         reset();\r
74     }\r
75     \r
76     private void reset() {\r
77         for (int i = 0; i < keyDown.length; i++) {\r
78             keyDown[i] = false;\r
79             keyTemp[i] = false;\r
80             keyPressed[i] = false; \r
81             keyUp[i] = false;\r
82         }\r
83         mousePressed = false;\r
84         mouseDragged = false;\r
85         mouseReleased = false;\r
86         mouseClicked = false;\r
87         mouseMoved = false;\r
88         \r
89         pressModifiers = 0;\r
90         clickModifiers = 0;\r
91         dragModifiers = 0;\r
92         clickButton = 0;\r
93         moveModifiers = 0;\r
94     }\r
95     \r
96     public boolean keyPressed(int i) {\r
97         return keyPressed[i];\r
98     }\r
99     \r
100     public boolean keyDown(int i) {\r
101         return keyDown[i];\r
102     }\r
103     \r
104     public boolean keyUp(int i) {\r
105         return keyUp[i];\r
106     }\r
107     \r
108     public int mouseX() {\r
109         return mouseX;\r
110     }\r
111     \r
112     public int mouseY() {\r
113         return mouseY;\r
114     }\r
115     \r
116     public int prevMouseX() {\r
117         return prevMouseX;\r
118     }\r
119     \r
120     public int prevMouseY() {\r
121         return prevMouseY;\r
122     }\r
123     \r
124     public boolean mousePressed() {\r
125         return mousePressed;\r
126     }\r
127     \r
128     public boolean mouseMoved() {\r
129         return mouseMoved;\r
130     }\r
131     \r
132     public boolean mouseReleased() {\r
133         return mouseReleased;\r
134     }\r
135     \r
136     public boolean mouseClicked() {\r
137         return mouseClicked;\r
138     }\r
139     \r
140     public boolean mouseDragged() {\r
141         return mouseDragged;\r
142     }\r
143     \r
144     public int pressModifiers() {\r
145         return pressModifiers;\r
146     }\r
147     \r
148     public int clickModifiers() {\r
149         return clickModifiers;\r
150     }\r
151     \r
152     public int dragModifiers() {\r
153         return dragModifiers;\r
154     }\r
155     \r
156     public int moveModifiers() {\r
157         return moveModifiers;\r
158     }\r
159     \r
160     public int clickButton() {\r
161         return clickButton;\r
162     }\r
163     \r
164     \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
193               keyTemp[i] = true;\r
194               keyPressed[i] = true;\r
195             }\r
196             else if (keyDown[i] && keyTemp[i]) {\r
197              keyPressed[i] = false;\r
198             }\r
199             else if (!keyDown[i] && keyTemp[i]) {\r
200                 keyUp[i] = true;\r
201                 keyTemp[i] = false;\r
202                 keyPressed[i] = false;\r
203             }\r
204             else if (!keyDown[i]) {\r
205               keyTemp[i] = false;\r
206               keyPressed[i] = false;\r
207               keyUp[i] = false;\r
208             }\r
209           }\r
210     \r
211     }\r
212     \r
213  \r
214 \r
215 \r
216     private int getAWTKeyCode(int swtKeyCode) {\r
217         if(swtKeyCode > keyDown.length) {\r
218             int keyCode = 0;\r
219             switch (swtKeyCode) {\r
220             case SWT.CTRL:\r
221                 keyCode = java.awt.event.KeyEvent.VK_CONTROL;\r
222                 break;\r
223             case SWT.ALT:\r
224                 keyCode = java.awt.event.KeyEvent.VK_ALT;\r
225                 break;\r
226             \r
227             case SWT.SHIFT:\r
228                 keyCode = java.awt.event.KeyEvent.VK_SHIFT;\r
229                 break;\r
230             case SWT.ARROW_LEFT:\r
231                 keyCode = java.awt.event.KeyEvent.VK_LEFT;\r
232                 break;\r
233             case SWT.ARROW_RIGHT:\r
234                 keyCode = java.awt.event.KeyEvent.VK_RIGHT;\r
235                 break;\r
236             case SWT.ARROW_UP:\r
237                 keyCode = java.awt.event.KeyEvent.VK_UP;\r
238                 break;\r
239             case SWT.ARROW_DOWN:\r
240                 keyCode = java.awt.event.KeyEvent.VK_DOWN;\r
241                 break;\r
242             case SWT.KEYPAD_0:\r
243                 keyCode = java.awt.event.KeyEvent.VK_NUMPAD0;\r
244                 break;\r
245             case SWT.KEYPAD_1:\r
246                 keyCode = java.awt.event.KeyEvent.VK_NUMPAD1;\r
247                 break;\r
248             case SWT.KEYPAD_2:\r
249                 keyCode = java.awt.event.KeyEvent.VK_NUMPAD2;\r
250                 break;\r
251             case SWT.KEYPAD_3:\r
252                 keyCode = java.awt.event.KeyEvent.VK_NUMPAD3;\r
253                 break;\r
254             case SWT.KEYPAD_4:\r
255                 keyCode = java.awt.event.KeyEvent.VK_NUMPAD4;\r
256                 break;\r
257             case SWT.KEYPAD_5:\r
258                 keyCode = java.awt.event.KeyEvent.VK_NUMPAD5;\r
259                 break;\r
260             case SWT.KEYPAD_6:\r
261                 keyCode = java.awt.event.KeyEvent.VK_NUMPAD6;\r
262                 break;\r
263             case SWT.KEYPAD_7:\r
264                 keyCode = java.awt.event.KeyEvent.VK_NUMPAD7;\r
265                 break;\r
266             case SWT.KEYPAD_8:\r
267                 keyCode = java.awt.event.KeyEvent.VK_NUMPAD8;\r
268                 break;\r
269             case SWT.KEYPAD_9:\r
270                 keyCode = java.awt.event.KeyEvent.VK_NUMPAD9;\r
271                 break;\r
272             case SWT.KEYPAD_CR:\r
273                 keyCode = java.awt.event.KeyEvent.VK_ENTER;\r
274                 break;\r
275             case SWT.NUM_LOCK:\r
276                 keyCode = java.awt.event.KeyEvent.VK_NUM_LOCK;\r
277                 break;\r
278             case SWT.SCROLL_LOCK:\r
279                 keyCode = java.awt.event.KeyEvent.VK_SCROLL_LOCK;\r
280                 break;\r
281             case SWT.CAPS_LOCK:\r
282                 keyCode = java.awt.event.KeyEvent.VK_CAPS_LOCK;\r
283                 break;\r
284             case SWT.INSERT:\r
285                 keyCode = java.awt.event.KeyEvent.VK_INSERT;\r
286                 break;\r
287             case SWT.HOME:\r
288                 keyCode = java.awt.event.KeyEvent.VK_HOME;\r
289                 break;\r
290             case SWT.END:\r
291                 keyCode = java.awt.event.KeyEvent.VK_END;\r
292                 break;\r
293             case SWT.PAGE_UP:\r
294                 keyCode = java.awt.event.KeyEvent.VK_PAGE_UP;\r
295                 break;\r
296             case SWT.PAGE_DOWN:\r
297                 keyCode = java.awt.event.KeyEvent.VK_PAGE_DOWN;\r
298                 break;\r
299             case SWT.PAUSE:\r
300                 keyCode = java.awt.event.KeyEvent.VK_PAUSE;   \r
301                 break;\r
302             case SWT.BREAK:\r
303                 keyCode = java.awt.event.KeyEvent.VK_PAUSE;   \r
304                 break;\r
305             case SWT.PRINT_SCREEN:\r
306                 keyCode = java.awt.event.KeyEvent.VK_PRINTSCREEN;   \r
307                 break;   \r
308             case SWT.HELP:\r
309                 keyCode = java.awt.event.KeyEvent.VK_HELP;\r
310                 break;\r
311             default :\r
312                 keyCode = 0;\r
313                 break;\r
314             }\r
315             \r
316             return keyCode;\r
317         } else if (swtKeyCode == 8) {\r
318                 return java.awt.event.KeyEvent.VK_BACK_SPACE;\r
319         }\r
320         else if (swtKeyCode >= 97 )\r
321                 return swtKeyCode - 32;\r
322         else\r
323                 return swtKeyCode;\r
324     }\r
325 \r
326     \r
327     /* (non-Javadoc)\r
328      * @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)\r
329      */\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
333     }\r
334     \r
335     /* (non-Javadoc)\r
336      * @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)\r
337      */\r
338     public void keyReleased(KeyEvent arg0) {\r
339         //System.out.println("KeyReleased " + arg0.character + " " + arg0.keyCode + " " + getAWTKeyCode(arg0.keyCode));\r
340         \r
341            keyDown[getAWTKeyCode(arg0.keyCode)] = false;\r
342     }\r
343 \r
344     public void mouseMove(MouseEvent e) {\r
345         awtMouseX = e.x;\r
346         awtMouseY = e.y;      \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
355                 } else {\r
356                         drag = time > mouse3DownTime;\r
357                 }\r
358                 if (drag)  {\r
359                         awtDragged = true;\r
360                         awtDragModifiers = createButtonMask(e);\r
361                 }\r
362         } else {\r
363             awtMoveModifiers = createButtonMask(e);\r
364             awtMouseMoved = true;\r
365         }\r
366     }\r
367 \r
368     public void mouseDoubleClick(MouseEvent e) {\r
369         /*\r
370         awtMouseClicked = true;\r
371         awtClickModifiers = createButtonMask(e);\r
372         switch (e.button) {\r
373             case 1:\r
374                 awtClickButton = java.awt.event.MouseEvent.BUTTON1;\r
375                 break;\r
376             case 2:\r
377                 awtClickButton = java.awt.event.MouseEvent.BUTTON2;\r
378                 break;\r
379             case 3:\r
380                 awtClickButton = java.awt.event.MouseEvent.BUTTON3;\r
381                 break;\r
382                 \r
383         }\r
384         */\r
385     }\r
386     \r
387     private int createButtonMask(MouseEvent e) {\r
388         int mask = 0;\r
389         if (swtMouse1Down)\r
390             mask |= java.awt.event.MouseEvent.BUTTON1_DOWN_MASK | java.awt.event.MouseEvent.BUTTON1_MASK;\r
391         if (swtMouse2Down)\r
392             mask |= java.awt.event.MouseEvent.BUTTON2_DOWN_MASK | java.awt.event.MouseEvent.BUTTON2_MASK;\r
393         if (swtMouse3Down)\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
399         \r
400         \r
401         return mask;\r
402     }\r
403 \r
404     public void mouseDown(MouseEvent e) {\r
405         switch (e.button) {\r
406             case 1:\r
407                 swtMouse1Down = true;\r
408                 mouse1DownTime = e.time & 0xFFFFFFFFL;\r
409                 break;\r
410             case 2:\r
411                 swtMouse2Down = true;\r
412                 mouse2DownTime = e.time & 0xFFFFFFFFL;\r
413                 break;\r
414             case 3:\r
415                 swtMouse3Down = true;\r
416                 mouse3DownTime = e.time & 0xFFFFFFFFL;\r
417         };\r
418         \r
419         awtPressed = true;\r
420         awtPressModifiers = createButtonMask(e);\r
421     }\r
422 \r
423     public void mouseUp(MouseEvent e) {\r
424         long mouseUpTime = e.time & 0xFFFFFFFFL;\r
425         long delta = 1000;\r
426         switch (e.button) {\r
427         case 1:\r
428             swtMouse1Down = false;\r
429             delta = mouseUpTime - mouse1DownTime;\r
430             break;\r
431         case 2:\r
432             swtMouse2Down = false;\r
433             delta = mouseUpTime - mouse2DownTime;\r
434             break;\r
435         case 3:\r
436             swtMouse3Down = false;\r
437             delta = mouseUpTime - mouse3DownTime;\r
438         };\r
439         awtReleased = true;\r
440         \r
441         if (delta < PRESS_TIME) {\r
442             awtMouseClicked = true;\r
443             awtClickModifiers = createButtonMask(e);\r
444             switch (e.button) {\r
445                 case 1:\r
446                     awtClickButton = java.awt.event.MouseEvent.BUTTON1;\r
447                     break;\r
448                 case 2:\r
449                     awtClickButton = java.awt.event.MouseEvent.BUTTON2;\r
450                     break;\r
451                 case 3:\r
452                     awtClickButton = java.awt.event.MouseEvent.BUTTON3;\r
453                     break;\r
454                     \r
455             }\r
456         }\r
457     }\r
458     \r
459     \r
460     public void mouseEnter(MouseEvent e) {\r
461         \r
462     }\r
463     \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
470         \r
471         \r
472     }\r
473     \r
474     public void focusGained(FocusEvent e) {\r
475 \r
476     }\r
477     \r
478     public void focusLost(FocusEvent e) {\r
479         reset();\r
480     }\r
481     \r
482     public void mouseHover(MouseEvent e) {\r
483 \r
484     }\r
485     \r
486     public void setMouseMoved(boolean b) {\r
487         awtMouseMoved = b;\r
488     }\r
489     \r
490     public void setMouseX(int x) {\r
491         awtMouseX = x;\r
492     }\r
493     \r
494     public void setMouseY(int y) {\r
495         awtMouseY = y;\r
496     }\r
497 \r
498     public String toString() {\r
499         String s = "";\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
509         return s;\r
510     }\r
511 }