/*****************************************************************************
* Copyright (c) 2006, 2007 g-Eclipse Consortium
* 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
*
* Initial development of the original code was made for the
* g-Eclipse project founded by European Union
* project number: FP6-IST-034327 http://www.geclipse.eu/
*
* Contributors:
* Thomas Koeckerbauer GUP, JKU - initial API and implementation
*****************************************************************************/
package eu.geclipse.gvid.internal;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.IOException;
class AwtEventConverter implements MouseMotionListener, MouseListener,
KeyListener, WindowListener, ComponentListener, MouseWheelListener {
private Events events;
private byte mouseState;
private IOException exception;
AwtEventConverter( final Events events ) {
this.events = events;
this.mouseState = 0;
this.exception = null;
}
void checkForException() throws IOException {
if( this.exception != null )
throw this.exception;
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
*/
public void mouseClicked( final MouseEvent mouseEvent ) {
// not needed
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
*/
public void mouseEntered( final MouseEvent mouseEvent ) {
try {
Event event = new Event();
event.type = Events.ACTIVE_EVENT;
event.active.gain = 1;
this.events.sendEvent( event );
} catch( IOException ioException ) {
this.exception = ioException;
}
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
*/
public void mouseExited( final MouseEvent mouseEvent ) {
try {
Event event = new Event();
event.type = Events.ACTIVE_EVENT;
event.active.gain = 0;
this.events.sendEvent( event );
} catch( IOException ioException ) {
this.exception = ioException;
}
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
*/
public void mousePressed( final MouseEvent mouseEvent ) {
try {
Event event = new Event();
event.type = Events.MOUSE_PRESS_EVENT;
event.button.button = ( byte )mouseEvent.getButton();
this.mouseState |= 1 << event.button.button;
event.button.x = ( short )mouseEvent.getX();
event.button.y = ( short )mouseEvent.getY();
this.events.sendEvent( event );
} catch( IOException ioException ) {
this.exception = ioException;
}
}
/* (non-Javadoc)
* @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
*/
public void mouseReleased( final MouseEvent mouseEvent ) {
try {
Event event = new Event();
event.type = Events.MOUSE_RELEASE_EVENT;
event.button.button = ( byte )mouseEvent.getButton();
this.mouseState &= ~( 1 << event.button.button );
event.button.x = ( short )mouseEvent.getX();
event.button.y = ( short )mouseEvent.getY();
this.events.sendEvent( event );
} catch( IOException ioException ) {
this.exception = ioException;
}
}
/* (non-Javadoc)
* @see java.awt.event.KeyListener#keyPressed(java.awt.event.KeyEvent)
*/
public void keyPressed( final KeyEvent keyEvent ) {
try {
Event event = convertKeyEvent( keyEvent );
event.type = Events.KEY_PRESS_EVENT;
this.events.sendEvent( event );
} catch( IOException ioException ) {
this.exception = ioException;
}
}
/* (non-Javadoc)
* @see java.awt.event.KeyListener#keyReleased(java.awt.event.KeyEvent)
*/
public void keyReleased( final KeyEvent keyEvent ) {
try {
Event event = convertKeyEvent( keyEvent );
event.type = Events.KEY_RELEASE_EVENT;
this.events.sendEvent( event );
} catch( IOException ioException ) {
this.exception = ioException;
}
}
private Event convertKeyEvent( final KeyEvent awtEvent ) {
Event event = new Event();
short modifier = 0;
event.type = Events.KEY_PRESS_EVENT;
event.key.key = (short) awtEvent.getKeyChar();
switch (awtEvent.getKeyCode()) {
case KeyEvent.VK_ENTER: event.key.key = 13; break;
case KeyEvent.VK_F1: event.key.key = 282; break;
case KeyEvent.VK_F2: event.key.key = 283; break;
case KeyEvent.VK_F3: event.key.key = 284; break;
case KeyEvent.VK_F4: event.key.key = 285; break;
case KeyEvent.VK_F5: event.key.key = 286; break;
case KeyEvent.VK_F6: event.key.key = 287; break;
case KeyEvent.VK_F7: event.key.key = 288; break;
case KeyEvent.VK_F8: event.key.key = 289; break;
case KeyEvent.VK_F9: event.key.key = 290; break;
case KeyEvent.VK_F10: event.key.key = 291; break;
case KeyEvent.VK_F11: event.key.key = 292; break;
case KeyEvent.VK_F12: event.key.key = 293; break;
case KeyEvent.VK_SHIFT: event.key.key = 303; break;
case KeyEvent.VK_CONTROL: event.key.key = 306; break;
case KeyEvent.VK_ALT: event.key.key = 308; break;
case KeyEvent.VK_PAUSE: event.key.key = 302; break;
case KeyEvent.VK_BACK_SPACE: event.key.key = 8; break;
case KeyEvent.VK_MINUS: event.key.key = 269; break;
case KeyEvent.VK_UP: event.key.key = 273; break;
case KeyEvent.VK_DOWN: event.key.key = 274; break;
case KeyEvent.VK_RIGHT: event.key.key = 275; break;
case KeyEvent.VK_LEFT: event.key.key = 276; break;
default:
event.key.key = (short) awtEvent.getKeyChar();
break;
}
// SDL modifier constants
if ((awtEvent.getModifiers()
& InputEvent.SHIFT_MASK) != 0) modifier |= 0x0001;
if ((awtEvent.getModifiers()
& InputEvent.CTRL_MASK) != 0) modifier |= 0x0040;
if ((awtEvent.getModifiers()
& InputEvent.ALT_MASK) != 0) modifier |= 0x0100;
if ((awtEvent.getModifiers()
& InputEvent.META_MASK) != 0) modifier |= 0x0400;
event.key.modifier = modifier;
return event;
}
/* (non-Javadoc)
* @see java.awt.event.KeyListener#keyTyped(java.awt.event.KeyEvent)
*/
public void keyTyped( final KeyEvent keyEvent ) {
// not needed
}
/* (non-Javadoc)
* @see java.awt.event.WindowListener#windowActivated(java.awt.event.WindowEvent)
*/
public void windowActivated( final WindowEvent windowEvent ) {
// not needed
}
/* (non-Javadoc)
* @see java.awt.event.WindowListener#windowClosed(java.awt.event.WindowEvent)
*/
public void windowClosed( final WindowEvent windowEvent ) {
// not needed
}
/* (non-Javadoc)
* @see java.awt.event.WindowListener#windowClosing(java.awt.event.WindowEvent)
*/
public void windowClosing( final WindowEvent windowEvent ) {
try {
Event event = new Event();
event.type = Events.QUIT_EVENT;
this.events.sendEvent( event );
} catch( IOException ioException ) {
this.exception = ioException;
}
}
/* (non-Javadoc)
* @see java.awt.event.WindowListener#windowDeactivated(java.awt.event.WindowEvent)
*/
public void windowDeactivated( final WindowEvent windowEvent ) {
// not needed
}
/* (non-Javadoc)
* @see java.awt.event.WindowListener#windowDeiconified(java.awt.event.WindowEvent)
*/
public void windowDeiconified( final WindowEvent windowEvent ) {
// not needed
}
/* (non-Javadoc)
* @see java.awt.event.WindowListener#windowIconified(java.awt.event.WindowEvent)
*/
public void windowIconified( final WindowEvent windowEvent ) {
// not needed
}
/* (non-Javadoc)
* @see java.awt.event.WindowListener#windowOpened(java.awt.event.WindowEvent)
*/
public void windowOpened( final WindowEvent windowEvent ) {
// not needed
}
/* (non-Javadoc)
* @see java.awt.event.ComponentListener#componentHidden(java.awt.event.ComponentEvent)
*/
public void componentHidden( final ComponentEvent componentEvent ) {
// not needed
}
/* (non-Javadoc)
* @see java.awt.event.ComponentListener#componentMoved(java.awt.event.ComponentEvent)
*/
public void componentMoved( final ComponentEvent componentEvent ) {
// not needed
}
/* (non-Javadoc)
* @see java.awt.event.ComponentListener#componentResized(java.awt.event.ComponentEvent)
*/
public void componentResized( final ComponentEvent componentEvent ) {
try {
Component component = ( Component )componentEvent.getSource();
Dimension componentSize = component.getSize();
Event event = new Event();
event.type = Events.VIDEO_RESIZE_EVENT;
event.resize.w = ( short )componentSize.getWidth();
event.resize.h = ( short )componentSize.getHeight();
this.events.sendEvent( event );
} catch( IOException ioException ) {
this.exception = ioException;
}
}
/* (non-Javadoc)
* @see java.awt.event.ComponentListener#componentShown(java.awt.event.ComponentEvent)
*/
public void componentShown( final ComponentEvent componentEvent ) {
// not needed
}
/* (non-Javadoc)
* @see java.awt.event.MouseMotionListener#mouseDragged(java.awt.event.MouseEvent)
*/
public void mouseDragged( final MouseEvent mouseEvent ) {
try {
Event event = new Event();
event.type = Events.MOUSE_MOVE_EVENT;
event.motion.state = this.mouseState;
event.motion.x = ( short )mouseEvent.getX();
event.motion.y = ( short )mouseEvent.getY();
event.motion.xrel = 0;
event.motion.yrel = 0;
this.events.sendEvent( event );
} catch( IOException ioException ) {
this.exception = ioException;
}
}
/* (non-Javadoc)
* @see java.awt.event.MouseMotionListener#mouseMoved(java.awt.event.MouseEvent)
*/
public void mouseMoved( final MouseEvent mouseEvent ) {
try {
Event event = new Event();
event.type = Events.MOUSE_MOVE_EVENT;
event.motion.state = this.mouseState;
event.motion.x = ( short )mouseEvent.getX();
event.motion.y = ( short )mouseEvent.getY();
event.motion.xrel = 0;
event.motion.yrel = 0;
this.events.sendEvent( event );
} catch( IOException ioException ) {
this.exception = ioException;
}
}
/* (non-Javadoc)
* @see java.awt.event.MouseWheelListener#mouseWheelMoved(java.awt.event.MouseWheelEvent)
*/
public void mouseWheelMoved( final MouseWheelEvent mouseWheelEvent ) {
try {
Event event = new Event();
event.type = Events.MOUSE_PRESS_EVENT;
if( mouseWheelEvent.getWheelRotation() < 0 )
event.button.button = 4; // should be done in a different way
else
event.button.button = 5;
event.button.x = ( short )mouseWheelEvent.getX();
event.button.y = ( short )mouseWheelEvent.getY();
this.events.sendEvent( event );
event.type = Events.MOUSE_RELEASE_EVENT;
this.events.sendEvent( event );
} catch( IOException ioException ) {
this.exception = ioException;
}
}
}