package tk.amberide.engine.input.awt;
import java.awt.AWTEvent;
import java.awt.Toolkit;
import java.awt.event.AWTEventListener;
import java.awt.event.KeyEvent;
import java.util.HashSet;
import java.util.Stack;
public final class AWTKeyboard {
private static final Stack<KeyEvent> events = new Stack<KeyEvent>();
private static KeyEvent currentEvent;
private static HashSet<Integer> keyDownBuffer = new HashSet<Integer>();
private static AWTEventListener dispatch;
public static void create() {
Toolkit.getDefaultToolkit().addAWTEventListener(dispatch = new AWTEventListener() {
public void eventDispatched(AWTEvent e) {
if (e instanceof KeyEvent) {
KeyEvent event = (KeyEvent) e;
events.push(event);
switch (event.getID()) {
case KeyEvent.KEY_PRESSED:
keyDownBuffer.add(AWTInputMap.map(event));
break;
case KeyEvent.KEY_RELEASED:
keyDownBuffer.remove(AWTInputMap.map(event));
break;
}
}
}
}, AWTEvent.KEY_EVENT_MASK);
}
public static void destroy() {
if (isCreated()) {
Toolkit.getDefaultToolkit().removeAWTEventListener(dispatch);
events.clear();
keyDownBuffer.clear();
dispatch = null;
currentEvent = null;
}
}
protected static void ensureCreated() {
if (!isCreated()) {
throw new IllegalStateException("AWTKeyboard is not created");
}
}
public static boolean isCreated() {
return dispatch != null;
}
public static int getNumKeyboardEvents() {
ensureCreated();
return events.size();
}
public static boolean isKeyDown(int key) {
ensureCreated();
return keyDownBuffer.contains(key);
}
public static boolean next() {
ensureCreated();
if (!events.empty()) {
currentEvent = events.pop();
return true;
}
currentEvent = null;
return false;
}
public static char getEventCharacter() {
ensureCreated();
if (currentEvent != null) {
return currentEvent.getKeyChar();
}
return '\0';
}
public static int getEventKey() {
ensureCreated();
if (currentEvent != null) {
return AWTInputMap.map(currentEvent);
}
return -1;
}
public static boolean getEventKeyState() {
ensureCreated();
if (currentEvent != null) {
return currentEvent.getID() == KeyEvent.KEY_PRESSED;
}
return false;
}
}