package toritools.controls;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* Mechanism for detecting if a key is pressed.
*
* @author toriscope
*
*/
public class KeyHolder extends KeyAdapter {
private HashMap<Integer, Boolean> keyBox = new HashMap<Integer, Boolean>();
private List<Integer> freeQueue = new ArrayList<Integer>();
public KeyHolder() {
}
public void clearKeys() {
keyBox.clear();
}
/**
* Checks to see if a key is pressed.
*
* @param key
* the key to poll for.
* @return whether or not the key is being pressed.
*/
public boolean isPressed(int key) {
if (!keyBox.containsKey(key))
return false;
return keyBox.get(key);
}
/**
* Imitates a normal keyPressed event, by returning the result of isPressed,
* and if the key is currently being held down, releases it when
* freeQueuedKeys() is called.
*
* @param key
* the key to poll for.
* @return whether or not the key is being pressed.
*/
public boolean isPressedThenRelease(int key) {
if (!keyBox.containsKey(key))
return false;
freeQueue.add(key);
Boolean b = keyBox.get(key);
return b == null ? false : b;
}
/**
* Triggered immediately when key is simply pressed upon.
*/
@Override
public void keyPressed(KeyEvent keyEvent) {
if (keyBox.get(keyEvent.getKeyCode()) == null) {
keyBox.put(keyEvent.getKeyCode(), true);
}
}
@Override
public void keyReleased(KeyEvent keyEvent) {
keyBox.remove(keyEvent.getKeyCode());
}
/**
* Free the current keys that are queued for freeing.
*/
public void freeQueuedKeys() {
for (Integer key : freeQueue) {
keyBox.put(key, false);
}
freeQueue.clear();
}
}