1 /*******************************************************************************
\r
2 * Copyright (c) 2012, 2013 Association for Decentralized Information Management in
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.g3d.jme.system;
\r
16 import java.util.ArrayList;
\r
17 import java.util.List;
\r
18 import java.util.logging.Level;
\r
19 import java.util.logging.Logger;
\r
21 import org.eclipse.swt.SWT;
\r
22 import org.eclipse.swt.events.KeyEvent;
\r
23 import org.eclipse.swt.events.KeyListener;
\r
24 import org.eclipse.swt.events.MouseEvent;
\r
25 import org.eclipse.swt.events.MouseListener;
\r
26 import org.eclipse.swt.events.MouseMoveListener;
\r
27 import org.eclipse.swt.events.MouseTrackListener;
\r
28 import org.eclipse.swt.events.MouseWheelListener;
\r
29 import org.eclipse.swt.events.PaintEvent;
\r
30 import org.eclipse.swt.events.PaintListener;
\r
31 import org.eclipse.swt.graphics.Point;
\r
32 import org.eclipse.swt.layout.FillLayout;
\r
33 import org.eclipse.swt.opengl.GLCanvas;
\r
34 import org.eclipse.swt.opengl.GLData;
\r
35 import org.eclipse.swt.widgets.Composite;
\r
36 import org.lwjgl.LWJGLException;
\r
37 import org.lwjgl.Sys;
\r
38 import org.lwjgl.input.Keyboard;
\r
39 import org.lwjgl.input.Mouse;
\r
40 import org.lwjgl.opengl.GLContext;
\r
41 import org.lwjgl.opengl.Pbuffer;
\r
42 import org.lwjgl.opengl.PixelFormat;
\r
44 import com.jme3.cursors.plugins.JmeCursor;
\r
45 import com.jme3.input.JoyInput;
\r
46 import com.jme3.input.KeyInput;
\r
47 import com.jme3.input.MouseInput;
\r
48 import com.jme3.input.RawInputListener;
\r
49 import com.jme3.input.event.InputEvent;
\r
50 import com.jme3.input.event.KeyInputEvent;
\r
51 import com.jme3.input.event.MouseButtonEvent;
\r
52 import com.jme3.input.event.MouseMotionEvent;
\r
53 import com.jme3.system.AppSettings;
\r
54 import com.jme3.system.JmeSystem;
\r
55 import com.jme3.system.Platform;
\r
56 import com.jme3.system.lwjgl.LwjglAbstractDisplay;
\r
57 import com.jme3.system.lwjgl.LwjglDisplay;
\r
58 import com.jme3.system.lwjgl.LwjglTimer;
\r
61 * SWT OpenGL canvas for jME
\r
63 * Note: this class is experimental, and contains questionable code.
\r
66 * @author Marko Luukkainen <marko.luukkainen@vtt.fi>
\r
69 public class SWTCanvas extends LwjglAbstractDisplay {
\r
71 protected static final boolean USE_SHARED_CONTEXT = false;
\r
74 private static final Logger logger = Logger.getLogger(LwjglDisplay.class.getName());
\r
81 private boolean runningFirstTime = true;
\r
82 private boolean mouseWasGrabbed = false;
\r
84 private boolean mouseWasCreated = false;
\r
85 private boolean keyboardWasCreated = false;
\r
87 private Pbuffer pbuffer;
\r
88 private PixelFormat pbufferFormat;
\r
89 private PixelFormat canvasFormat;
\r
91 private boolean disposed = false;
\r
93 public SWTCanvas(Composite parent) {
\r
94 parent.setLayout(new FillLayout());
\r
96 GLData data = new GLData();
\r
97 data.doubleBuffer = true;
\r
100 data.greenSize = 8;
\r
101 data.depthSize = 32;
\r
102 data.alphaSize = 8;
\r
103 data.stencilSize = 8;
\r
104 data.stereo = false;
\r
105 data.accumAlphaSize = 0;
\r
106 data.accumBlueSize = 0;
\r
107 data.accumGreenSize = 0;
\r
108 data.accumRedSize = 0;
\r
109 canvas = new GLCanvas(parent, SWT.EMBEDDED|SWT.NO_REDRAW_RESIZE, data);
\r
110 //canvas = new GLCanvas(parent, SWT.NONE, data);
\r
115 public void dispose() {
\r
126 public boolean isDisposed() {
\r
131 public Type getType() {
\r
132 return Type.Canvas; // TODO : is Canvas Correct?
\r
136 public void setTitle(String title) {
\r
141 public void restart() {
\r
142 frameRate = settings.getFrameRate();
\r
146 private boolean c = false;
\r
148 public void create(boolean waitFor){
\r
155 renderable.set(true);
\r
158 // canvas.addPaintListener(new PaintListener() {
\r
161 // public void paintControl(PaintEvent arg0) {
\r
166 org.eclipse.swt.widgets.Display.getCurrent().asyncExec(new Runnable() {
\r
169 public void run() {
\r
170 if (canvas.isDisposed())
\r
173 org.eclipse.swt.widgets.Display.getCurrent().asyncExec(this);
\r
181 protected void runLoop() {
\r
183 if (renderable.get()){
\r
184 Point size = canvas.getSize();
\r
185 //System.out.println("Render " + size);
\r
186 int newWidth = Math.max(size.x, 1);
\r
187 int newHeight = Math.max(size.y, 1);
\r
188 if (width != newWidth || height != newHeight){
\r
189 System.out.println("Render resize " + size);
\r
191 height = newHeight;
\r
192 if (listener != null){
\r
193 listener.reshape(width, height);
\r
197 if (!created.get())
\r
198 throw new IllegalStateException();
\r
200 if (renderable.get()){
\r
201 assert checkGLError();
\r
203 // calls swap buffers, etc.
\r
205 canvas.swapBuffers();
\r
206 // Display.processMessages();
\r
208 // Display.update(false);
\r
210 // Display.processMessages();
\r
211 // Thread.sleep(50);
\r
212 // // add a small wait
\r
213 // // to reduce CPU usage
\r
215 } catch (Throwable ex){
\r
216 listener.handleError("Error while swapping buffers", ex);
\r
219 // if (frameRate > 0)
\r
220 // Display.sync(frameRate);
\r
222 // if (renderable.get()){
\r
224 // // check input after we synchronize with framerate.
\r
225 // // this reduces input lag.
\r
226 // Display.processMessages();
\r
231 public void repaint() {
\r
233 // if (renderable.get()){
\r
234 // if (Display.isCloseRequested())
\r
235 // listener.requestClose(false);
\r
237 // if (wasActive != Display.isActive()) {
\r
238 // if (!wasActive) {
\r
239 // listener.gainFocus();
\r
241 // wasActive = true;
\r
243 // listener.loseFocus();
\r
244 // wasActive = false;
\r
253 public void run() {
\r
259 protected void destroyContext() {
\r
261 // invalidate the state so renderer can resume operation
\r
262 if (!USE_SHARED_CONTEXT){
\r
263 renderer.cleanup();
\r
266 //if (Display.isCreated()){
\r
267 if (!canvas.isDisposed()) {
\r
269 * org.lwjgl.LWJGLException: X Error
\r
270 * BadWindow (invalid Window parameter) request_code: 2 minor_code: 0
\r
272 * Destroying keyboard early prevents the error above, triggered
\r
273 * by destroying keyboard in by Display.destroy() or Display.setParent(null).
\r
274 * Therefore Keyboard.destroy() should precede any of these calls.
\r
276 if (Keyboard.isCreated()){
\r
277 // Should only happen if called in
\r
278 // LwjglAbstractDisplay.deinitInThread().
\r
279 Keyboard.destroy();
\r
283 // NOTE: On Windows XP, not calling setParent(null)
\r
284 // freezes the application.
\r
285 // On Mac it freezes the application.
\r
286 // On Linux it fixes a crash with X Window System.
\r
287 if (JmeSystem.getPlatform() == Platform.Windows32
\r
288 || JmeSystem.getPlatform() == Platform.Windows64){
\r
289 //Display.setParent(null);
\r
291 //} catch (LWJGLException ex) {
\r
292 // logger.log(Level.SEVERE, "Encountered exception when setting parent to null", ex);
\r
295 // Display.destroy();
\r
298 // The canvas is no longer visible,
\r
299 // but the context thread is still running.
\r
300 if (!needClose.get()){
\r
301 // MUST make sure there's still a context current here ..
\r
302 // Display is dead, make pbuffer available to the system
\r
303 makePbufferAvailable();
\r
305 renderer.invalidateState();
\r
307 // The context thread is no longer running.
\r
308 // Destroy pbuffer.
\r
311 } catch (LWJGLException ex) {
\r
312 listener.handleError("Failed make pbuffer available", ex);
\r
319 public void setFocus() {
\r
320 canvas.setFocus();
\r
323 public void setCurrent(GLCanvas canvas) {
\r
324 // delegate to the GLContext
\r
325 canvas.setCurrent();
\r
327 GLContext.useContext(canvas);
\r
328 } catch (LWJGLException e) {
\r
329 e.printStackTrace();
\r
333 public void setCurrent() {
\r
334 setCurrent(canvas);
\r
339 private void pauseCanvas(){
\r
340 if (Mouse.isCreated()){
\r
341 if (Mouse.isGrabbed()){
\r
342 Mouse.setGrabbed(false);
\r
343 mouseWasGrabbed = true;
\r
345 mouseWasCreated = true;
\r
348 if (Keyboard.isCreated()){
\r
349 keyboardWasCreated = true;
\r
350 Keyboard.destroy();
\r
353 renderable.set(false);
\r
358 * Called to restore the canvas.
\r
360 private void restoreCanvas(){
\r
362 logger.log(Level.INFO, "OGL: Waiting for canvas to become displayable..");
\r
363 while (!canvas.getVisible()){
\r
366 } catch (InterruptedException ex) {
\r
367 logger.log(Level.SEVERE, "OGL: Interrupted! ", ex);
\r
371 logger.log(Level.INFO, "OGL: Creating display context ..");
\r
373 // Set renderable to true, since canvas is now displayable.
\r
374 renderable.set(true);
\r
375 createContext(settings);
\r
377 logger.log(Level.INFO, "OGL: Display is active!");
\r
380 if (mouseWasCreated){
\r
382 if (mouseWasGrabbed){
\r
383 Mouse.setGrabbed(true);
\r
384 mouseWasGrabbed = false;
\r
387 if (keyboardWasCreated){
\r
389 keyboardWasCreated = false;
\r
391 } catch (LWJGLException ex){
\r
392 logger.log(Level.SEVERE, "Encountered exception when restoring input", ex);
\r
398 * It seems it is best to use one pixel format for all shared contexts.
\r
399 * @see <a href="http://developer.apple.com/library/mac/#qa/qa1248/_index.html">http://developer.apple.com/library/mac/#qa/qa1248/_index.html</a>
\r
401 protected PixelFormat acquirePixelFormat(boolean forPbuffer){
\r
403 // Use 0 samples for pbuffer format, prevents
\r
404 // crashes on bad drivers
\r
405 if (pbufferFormat == null){
\r
406 pbufferFormat = new PixelFormat(settings.getBitsPerPixel(),
\r
408 settings.getDepthBits(),
\r
409 settings.getStencilBits(),
\r
412 return pbufferFormat;
\r
414 if (canvasFormat == null){
\r
415 int samples = getNumSamplesToUse();
\r
416 canvasFormat = new PixelFormat(settings.getBitsPerPixel(),
\r
418 settings.getDepthBits(),
\r
419 settings.getStencilBits(),
\r
422 return canvasFormat;
\r
427 * Makes sure the pbuffer is available and ready for use
\r
429 protected void makePbufferAvailable() throws LWJGLException{
\r
430 if (pbuffer != null && pbuffer.isBufferLost()){
\r
431 logger.log(Level.WARNING, "PBuffer was lost!");
\r
436 if (pbuffer == null) {
\r
437 pbuffer = new Pbuffer(1, 1, acquirePixelFormat(true), null);
\r
438 pbuffer.makeCurrent();
\r
439 logger.log(Level.INFO, "OGL: Pbuffer has been created");
\r
441 // Any created objects are no longer valid
\r
442 if (!runningFirstTime){
\r
443 renderer.resetGLObjects();
\r
447 pbuffer.makeCurrent();
\r
448 if (!pbuffer.isCurrent()){
\r
449 throw new LWJGLException("Pbuffer cannot be made current");
\r
453 protected void destroyPbuffer(){
\r
454 if (pbuffer != null){
\r
455 if (!pbuffer.isBufferLost()){
\r
463 protected void createContext(AppSettings settings) {
\r
466 // In case canvas is not visible, we still take framerate
\r
467 // from settings to prevent "100% CPU usage"
\r
468 frameRate = settings.getFrameRate();
\r
471 if (renderable.get()){
\r
472 if (!runningFirstTime){
\r
473 // because the display is a different opengl context
\r
474 // must reset the context state.
\r
475 if (!USE_SHARED_CONTEXT){
\r
476 renderer.cleanup();
\r
480 // if the pbuffer is currently active,
\r
481 // make sure to deactivate it
\r
484 if (Keyboard.isCreated()){
\r
485 Keyboard.destroy();
\r
489 Thread.sleep(1000);
\r
490 } catch (InterruptedException ex) {
\r
493 // Display.setVSyncEnabled(settings.isVSync());
\r
494 //Display.setParent(canvas);
\r
496 // if (USE_SHARED_CONTEXT){
\r
497 // Display.create(acquirePixelFormat(false), pbuffer);
\r
499 // Display.create(acquirePixelFormat(false));
\r
502 renderer.invalidateState();
\r
504 // First create the pbuffer, if it is needed.
\r
505 makePbufferAvailable();
\r
508 // At this point, the OpenGL context is active.
\r
509 if (runningFirstTime){
\r
510 // THIS is the part that creates the renderer.
\r
511 // It must always be called, now that we have the pbuffer workaround.
\r
512 initContextFirstTime();
\r
513 runningFirstTime = false;
\r
515 } catch (LWJGLException ex) {
\r
516 listener.handleError("Failed to initialize OpenGL context", ex);
\r
517 // TODO: Fix deadlock that happens after the error (throw runtime exception?)
\r
522 public JoyInput getJoyInput() {
\r
527 SWTMouseInput mouseInput;
\r
529 public MouseInput getMouseInput() {
\r
530 if (mouseInput == null){
\r
531 mouseInput = new SWTMouseInput(this);
\r
537 SWTKeyInput keyInput;
\r
539 public KeyInput getKeyInput() {
\r
540 if (keyInput == null){
\r
541 keyInput = new SWTKeyInput(this);
\r
548 public class SWTMouseInput implements MouseInput, MouseListener, MouseMoveListener, MouseWheelListener, MouseTrackListener {
\r
550 boolean init = false;
\r
551 RawInputListener listener;
\r
553 public SWTMouseInput(SWTCanvas canvas) {
\r
554 this.canvas = canvas;
\r
559 public void destroy() {
\r
560 this.canvas.canvas.removeMouseListener(this);
\r
561 this.canvas.canvas.removeMouseMoveListener(this);
\r
562 this.canvas.canvas.removeMouseWheelListener(this);
\r
563 this.canvas.canvas.removeMouseTrackListener(this);
\r
567 public void initialize() {
\r
568 this.canvas.canvas.addMouseListener(this);
\r
569 this.canvas.canvas.addMouseMoveListener(this);
\r
570 this.canvas.canvas.addMouseWheelListener(this);
\r
571 this.canvas.canvas.addMouseTrackListener(this);
\r
576 public int getButtonCount() {
\r
581 public boolean isInitialized() {
\r
586 public void setInputListener(RawInputListener listener) {
\r
587 this.listener = listener;
\r
591 public long getInputTimeNanos() {
\r
592 return Sys.getTime() * LwjglTimer.LWJGL_TIME_TO_NANOS;
\r
596 public void setCursorVisible(boolean visible) {
\r
601 public void setNativeCursor(JmeCursor cursor) {
\r
606 public void update() {
\r
607 if (listener == null || events.size() == 0)
\r
609 listener.beginInput();
\r
610 for (InputEvent e : events) {
\r
611 if (e instanceof MouseButtonEvent)
\r
612 listener.onMouseButtonEvent((MouseButtonEvent)e);
\r
614 listener.onMouseMotionEvent((MouseMotionEvent)e);
\r
617 listener.endInput();
\r
620 private List<InputEvent> events = new ArrayList<InputEvent>();
\r
623 public void mouseDoubleClick(MouseEvent e) {
\r
624 //events.add(new MouseButtonEvent(e.button,true, e.x, e.y));
\r
629 public void mouseDown(MouseEvent e) {
\r
630 events.add(new MouseButtonEvent(e.button,true, e.x, e.y));
\r
635 public void mouseUp(MouseEvent e) {
\r
636 events.add(new MouseButtonEvent(e.button,false, e.x, e.y));
\r
644 public void mouseMove(MouseEvent e) {
\r
645 events.add(new MouseMotionEvent(e.x, e.y, e.x - px, e.y - py, 0, 0));
\r
652 public void mouseScrolled(MouseEvent e) {
\r
653 events.add(new MouseMotionEvent(e.x, e.y, 0, 0, e.button, e.count));
\r
657 public void mouseEnter(MouseEvent e) {
\r
663 public void mouseExit(MouseEvent e) {
\r
668 public void mouseHover(MouseEvent e) {
\r
673 public class SWTKeyInput implements KeyInput, KeyListener {
\r
675 boolean init = false;
\r
676 RawInputListener listener;
\r
678 public SWTKeyInput(SWTCanvas canvas) {
\r
679 this.canvas = canvas;
\r
683 public void destroy() {
\r
684 this.canvas.canvas.removeKeyListener(this);
\r
688 public void initialize() {
\r
689 this.canvas.canvas.addKeyListener(this);
\r
694 public boolean isInitialized() {
\r
699 public void setInputListener(RawInputListener listener) {
\r
700 this.listener = listener;
\r
703 public long getInputTimeNanos() {
\r
704 return Sys.getTime() * LwjglTimer.LWJGL_TIME_TO_NANOS;
\r
707 private List<KeyInputEvent> events = new ArrayList<KeyInputEvent>();
\r
709 KeyInputEvent prevEvent = new KeyInputEvent(0, (char)0, false, false);
\r
712 public void update() {
\r
713 if (listener == null || events.size() == 0)
\r
715 listener.beginInput();
\r
717 for (KeyInputEvent e : events) {
\r
718 //System.out.println("Key " + e.getKeyCode() + " " + e.getKeyChar() + " " + e.isPressed() + " " + e.isRepeating());
\r
720 // SWT reports wrong key code in released event for a key, if multiple keys are down at the same time
\r
722 // press 'a' -> event press a
\r
723 // press 'b' -> event press b
\r
724 // release 'a' -> event release b
\r
725 // keep 'b' pressed -> event press b (with slight pause before events starts coming by)
\r
726 // release 'b' -> event release b
\r
728 // press 'a' -> event press a
\r
729 // press 'b' -> event press b
\r
730 // release 'b' -> event release b
\r
731 // keep 'a' pressed -> nothing happens.
\r
732 // release 'a' -> nothing happens
\r
734 if (e.isPressed()) {
\r
735 if (e.getKeyCode() != prevEvent.getKeyCode() && prevEvent.isPressed()) {
\r
736 listener.onKeyEvent(new KeyInputEvent(prevEvent.getKeyCode(), prevEvent.getKeyChar(), false, false));
\r
740 listener.onKeyEvent(e);
\r
744 listener.endInput();
\r
749 public void keyPressed(KeyEvent e) {
\r
750 events.add(new KeyInputEvent(getLWJGLKeyCode(e.keyCode), e.character, true, false));
\r
755 public void keyReleased(KeyEvent e) {
\r
757 events.add(new KeyInputEvent(getLWJGLKeyCode(e.keyCode), e.character, false, false));
\r
760 private int getLWJGLKeyCode(int swtKeyCode) {
\r
761 // TODO : LWJGL uses mapping/layout of US keyboard, these have to be checked
\r
762 if(swtKeyCode > 1024) {
\r
764 switch (swtKeyCode) {
\r
766 keyCode = Keyboard.KEY_LCONTROL;
\r
769 keyCode = Keyboard.KEY_LMETA;
\r
773 keyCode = Keyboard.KEY_LSHIFT;
\r
775 case SWT.ARROW_LEFT:
\r
776 keyCode = Keyboard.KEY_LEFT;
\r
778 case SWT.ARROW_RIGHT:
\r
779 keyCode = Keyboard.KEY_RIGHT;
\r
782 keyCode = Keyboard.KEY_UP;
\r
784 case SWT.ARROW_DOWN:
\r
785 keyCode = Keyboard.KEY_DOWN;
\r
788 keyCode = Keyboard.KEY_NUMPAD0;
\r
791 keyCode = Keyboard.KEY_NUMPAD1;
\r
794 keyCode = Keyboard.KEY_NUMPAD2;
\r
797 keyCode = Keyboard.KEY_NUMPAD3;
\r
800 keyCode = Keyboard.KEY_NUMPAD4;
\r
803 keyCode = Keyboard.KEY_NUMPAD5;
\r
806 keyCode = Keyboard.KEY_NUMPAD6;
\r
809 keyCode = Keyboard.KEY_NUMPAD7;
\r
812 keyCode = Keyboard.KEY_NUMPAD8;
\r
815 keyCode = Keyboard.KEY_NUMPAD9;
\r
817 case SWT.KEYPAD_CR:
\r
818 keyCode = Keyboard.KEY_NUMPADENTER;
\r
821 keyCode = Keyboard.KEY_NUMLOCK;
\r
823 case SWT.SCROLL_LOCK:
\r
824 keyCode = Keyboard.KEY_SCROLL;
\r
826 case SWT.CAPS_LOCK:
\r
827 keyCode = Keyboard.KEY_CAPITAL;
\r
830 keyCode = Keyboard.KEY_INSERT;
\r
833 keyCode = Keyboard.KEY_HOME;
\r
836 keyCode = Keyboard.KEY_END;
\r
839 keyCode = Keyboard.KEY_NEXT;
\r
841 case SWT.PAGE_DOWN:
\r
842 keyCode = Keyboard.KEY_PRIOR;
\r
845 keyCode = Keyboard.KEY_PAUSE;
\r
848 keyCode = Keyboard.KEY_PAUSE;
\r
850 case SWT.PRINT_SCREEN:
\r
851 keyCode = Keyboard.KEY_SYSRQ;
\r
856 case SWT.KEYPAD_MULTIPLY:
\r
857 keyCode = Keyboard.KEY_MULTIPLY;
\r
859 case SWT.KEYPAD_DIVIDE:
\r
860 keyCode = Keyboard.KEY_DIVIDE;
\r
862 case SWT.KEYPAD_DECIMAL:
\r
863 keyCode = Keyboard.KEY_DECIMAL;
\r
866 keyCode = Keyboard.KEY_F1;
\r
869 keyCode = Keyboard.KEY_F2;
\r
872 keyCode = Keyboard.KEY_F3;
\r
875 keyCode = Keyboard.KEY_F4;
\r
878 keyCode = Keyboard.KEY_F5;
\r
881 keyCode = Keyboard.KEY_F6;
\r
884 keyCode = Keyboard.KEY_F7;
\r
887 keyCode = Keyboard.KEY_F8;
\r
890 keyCode = Keyboard.KEY_F9;
\r
893 keyCode = Keyboard.KEY_F10;
\r
896 keyCode = Keyboard.KEY_F11;
\r
899 keyCode = Keyboard.KEY_F12;
\r
902 keyCode = Keyboard.KEY_NONE;
\r
907 } else if (swtKeyCode == 8) {
\r
908 return Keyboard.KEY_BACK;
\r
909 } else if (swtKeyCode == SWT.ESC) {
\r
910 return Keyboard.KEY_ESCAPE;
\r
911 } else if (swtKeyCode == SWT.SPACE) {
\r
912 return Keyboard.KEY_SPACE;
\r
913 } else if (swtKeyCode >= 49 && swtKeyCode < 58) { // 1 - 9
\r
914 return swtKeyCode - 47;
\r
915 } else if (swtKeyCode == 48) {
\r
916 return Keyboard.KEY_0;
\r
917 } else if (swtKeyCode == SWT.TAB) {
\r
918 return Keyboard.KEY_TAB;
\r
919 } else if (swtKeyCode == 46) {
\r
920 return Keyboard.KEY_PERIOD;
\r
921 } else if (swtKeyCode == 44) {
\r
922 return Keyboard.KEY_COMMA;
\r
923 } else if (swtKeyCode == 39) { // '/* on SWE/FI keyboard
\r
924 return Keyboard.KEY_SLASH;
\r
925 } else if (swtKeyCode == 45) {
\r
926 return Keyboard.KEY_MINUS;
\r
927 } else if (swtKeyCode == 43) {
\r
928 return Keyboard.KEY_EQUALS; // +/? on SWE/FI keyboard
\r
929 } else if (swtKeyCode == SWT.DEL) {
\r
930 return Keyboard.KEY_DELETE;
\r
931 } else if (swtKeyCode == SWT.CR) {
\r
932 return Keyboard.KEY_RETURN;
\r
933 } else if (swtKeyCode == 167) { // § on SWE/FI keyboard
\r
934 return Keyboard.KEY_BACKSLASH;
\r
936 else if (swtKeyCode >= 97 )
\r
938 if (swtKeyCode >= 65 && swtKeyCode <= 90) {
\r
939 switch (swtKeyCode) {
\r
941 return Keyboard.KEY_A;
\r
943 return Keyboard.KEY_B;
\r
945 return Keyboard.KEY_C;
\r
947 return Keyboard.KEY_D;
\r
949 return Keyboard.KEY_E;
\r
951 return Keyboard.KEY_F;
\r
953 return Keyboard.KEY_G;
\r
955 return Keyboard.KEY_H;
\r
957 return Keyboard.KEY_I;
\r
959 return Keyboard.KEY_J;
\r
961 return Keyboard.KEY_K;
\r
963 return Keyboard.KEY_L;
\r
965 return Keyboard.KEY_M;
\r
967 return Keyboard.KEY_N;
\r
969 return Keyboard.KEY_O;
\r
971 return Keyboard.KEY_P;
\r
973 return Keyboard.KEY_Q;
\r
975 return Keyboard.KEY_R;
\r
977 return Keyboard.KEY_S;
\r
979 return Keyboard.KEY_T;
\r
981 return Keyboard.KEY_U;
\r
983 return Keyboard.KEY_V;
\r
985 return Keyboard.KEY_W;
\r
987 return Keyboard.KEY_X;
\r
989 return Keyboard.KEY_Y;
\r
991 return Keyboard.KEY_Z;
\r
995 return Keyboard.KEY_UNLABELED;
\r
999 private int getAWTKeyCode(int swtKeyCode) {
\r
1000 if(swtKeyCode > 1024) {
\r
1002 switch (swtKeyCode) {
\r
1004 keyCode = java.awt.event.KeyEvent.VK_CONTROL;
\r
1007 keyCode = java.awt.event.KeyEvent.VK_ALT;
\r
1011 keyCode = java.awt.event.KeyEvent.VK_SHIFT;
\r
1013 case SWT.ARROW_LEFT:
\r
1014 keyCode = java.awt.event.KeyEvent.VK_LEFT;
\r
1016 case SWT.ARROW_RIGHT:
\r
1017 keyCode = java.awt.event.KeyEvent.VK_RIGHT;
\r
1019 case SWT.ARROW_UP:
\r
1020 keyCode = java.awt.event.KeyEvent.VK_UP;
\r
1022 case SWT.ARROW_DOWN:
\r
1023 keyCode = java.awt.event.KeyEvent.VK_DOWN;
\r
1025 case SWT.KEYPAD_0:
\r
1026 keyCode = java.awt.event.KeyEvent.VK_NUMPAD0;
\r
1028 case SWT.KEYPAD_1:
\r
1029 keyCode = java.awt.event.KeyEvent.VK_NUMPAD1;
\r
1031 case SWT.KEYPAD_2:
\r
1032 keyCode = java.awt.event.KeyEvent.VK_NUMPAD2;
\r
1034 case SWT.KEYPAD_3:
\r
1035 keyCode = java.awt.event.KeyEvent.VK_NUMPAD3;
\r
1037 case SWT.KEYPAD_4:
\r
1038 keyCode = java.awt.event.KeyEvent.VK_NUMPAD4;
\r
1040 case SWT.KEYPAD_5:
\r
1041 keyCode = java.awt.event.KeyEvent.VK_NUMPAD5;
\r
1043 case SWT.KEYPAD_6:
\r
1044 keyCode = java.awt.event.KeyEvent.VK_NUMPAD6;
\r
1046 case SWT.KEYPAD_7:
\r
1047 keyCode = java.awt.event.KeyEvent.VK_NUMPAD7;
\r
1049 case SWT.KEYPAD_8:
\r
1050 keyCode = java.awt.event.KeyEvent.VK_NUMPAD8;
\r
1052 case SWT.KEYPAD_9:
\r
1053 keyCode = java.awt.event.KeyEvent.VK_NUMPAD9;
\r
1055 case SWT.KEYPAD_CR:
\r
1056 keyCode = java.awt.event.KeyEvent.VK_ENTER;
\r
1058 case SWT.NUM_LOCK:
\r
1059 keyCode = java.awt.event.KeyEvent.VK_NUM_LOCK;
\r
1061 case SWT.SCROLL_LOCK:
\r
1062 keyCode = java.awt.event.KeyEvent.VK_SCROLL_LOCK;
\r
1064 case SWT.CAPS_LOCK:
\r
1065 keyCode = java.awt.event.KeyEvent.VK_CAPS_LOCK;
\r
1068 keyCode = java.awt.event.KeyEvent.VK_INSERT;
\r
1071 keyCode = java.awt.event.KeyEvent.VK_HOME;
\r
1074 keyCode = java.awt.event.KeyEvent.VK_END;
\r
1077 keyCode = java.awt.event.KeyEvent.VK_PAGE_UP;
\r
1079 case SWT.PAGE_DOWN:
\r
1080 keyCode = java.awt.event.KeyEvent.VK_PAGE_DOWN;
\r
1083 keyCode = java.awt.event.KeyEvent.VK_PAUSE;
\r
1086 keyCode = java.awt.event.KeyEvent.VK_PAUSE;
\r
1088 case SWT.PRINT_SCREEN:
\r
1089 keyCode = java.awt.event.KeyEvent.VK_PRINTSCREEN;
\r
1092 keyCode = java.awt.event.KeyEvent.VK_HELP;
\r
1100 } else if (swtKeyCode == 8) {
\r
1101 return java.awt.event.KeyEvent.VK_BACK_SPACE;
\r
1103 else if (swtKeyCode >= 97 )
\r
1104 return swtKeyCode - 32;
\r
1106 return swtKeyCode;
\r