import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.HashMap;
import java.util.Map;
/**
* This class represents a keyboard listener. It is configurable by the controller that
* instantiates it.
*
* This listener keeps three maps, one each for key typed, key pressed and key released
* Each map stores a key mapping. A key mapping is a pair
* (keystroke,code to be executed with that keystroke)
* The latter part of that pair is actually a function object, i.e. an object of a class
* that implements the Runnable interface
*
* This class implements the KeyListener interface, so that its object can be used as a
* valid keylistener for Java Swing.
*/
public class KeyboardListener implements KeyListener {
private Map keyTypedMap;
private Map keyPressedMap;
private Map keyReleasedMap;
/**
* Empty default constructor
*/
public KeyboardListener() {
}
/**
* Set the map for key typed events. Key typed events in Java Swing are characters
*
* @param map
*/
public void setKeyTypedMap(Map map) {
keyTypedMap = map;
}
/**
* Set the map for key pressed events. Key pressed events in Java Swing are integer codes
*
* @param map
*/
public void setKeyPressedMap(Map map) {
keyPressedMap = map;
}
/**
* Set the map for key released events. Key released events in Java Swing are integer codes
*
* @param map
*/
public void setKeyReleasedMap(Map map) {
keyReleasedMap = map;
}
/**
* This is called when the view detects that a key has been typed.
* Find if anything has been mapped to this key character and if so, execute it
*
* @param e
*/
@Override
public void keyTyped(KeyEvent e) {
if (keyTypedMap.containsKey(e.getKeyChar()))
keyTypedMap.get(e.getKeyChar()).run();
}
/**
* This is called when the view detects that a key has been pressed.
* Find if anything has been mapped to this key code and if so, execute it
*
* @param e
*/
@Override
public void keyPressed(KeyEvent e) {
if (keyPressedMap.containsKey(e.getKeyCode()))
keyPressedMap.get(e.getKeyCode()).run();
}
/**
* This is called when the view detects that a key has been released.
* Find if anything has been mapped to this key code and if so, execute it
*
* @param e
*/
@Override
public void keyReleased(KeyEvent e) {
if (keyReleasedMap.containsKey(e.getKeyCode()))
keyReleasedMap.get(e.getKeyCode()).run();
}
}