package controller.ui; import controller.EventHandler; import controller.action.ActionBoard; import controller.action.GCAction; import data.GameControlData; import data.HL; import data.Rules; import data.SPL; import java.awt.KeyEventDispatcher; import java.awt.KeyboardFocusManager; import java.awt.event.KeyEvent; /** * @author Michel Bartsch * * This class listens to the keyboard. It does not depend on the GUI. */ public class KeyboardListener implements KeyEventDispatcher { /** The key that is actually pressed, 0 if no key is pressed. */ private int pressing = 0; /** * Creates a new KeyboardListener and sets himself to listening. */ public KeyboardListener() { KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(this); } /** * This is called every time a key is pressed or released. * * @param e The key that has been pressed or released. * * @return If false, the key will be consumed. */ @Override public boolean dispatchKeyEvent(KeyEvent e) { if (e.getID() == KeyEvent.KEY_RELEASED) { pressing = 0; } else if (e.getID() == KeyEvent.KEY_PRESSED) { int key = e.getKeyCode(); if ((key == 0) || (key == pressing)) { return false; } pressing = key; return pressed(key); } return false; } /** * This is called once every time a key is pressed. It is called once and * not as long as the key is pressed. * You can easily set the keys for each action here. The actions are * to be performed via the actionPerformed method as they are in the * GUI. * * @param key The key that has just been pressed. * * @return If false, the key was used and should be consumed. */ private boolean pressed(int key) { GCAction event = null; switch (key) { case KeyEvent.VK_ESCAPE: event = ActionBoard.quit; break; case KeyEvent.VK_DELETE: event = ActionBoard.testmode; break; case KeyEvent.VK_BACK_SPACE: event = ActionBoard.undo[1]; break; default: if (Rules.league instanceof SPL) { switch (key) { case KeyEvent.VK_B: for (int i = 0; i < ActionBoard.out.length; ++i) { if (EventHandler.getInstance().data.team[i].teamColor == GameControlData.TEAM_BLUE) { event = ActionBoard.out[i]; } } break; case KeyEvent.VK_R: for (int i = 0; i < ActionBoard.out.length; ++i) { if (EventHandler.getInstance().data.team[i].teamColor == GameControlData.TEAM_RED) { event = ActionBoard.out[i]; } } break; case KeyEvent.VK_Y: for (int i = 0; i < ActionBoard.out.length; ++i) { if (EventHandler.getInstance().data.team[i].teamColor == GameControlData.TEAM_YELLOW) { event = ActionBoard.out[i]; } } break; case KeyEvent.VK_K: for (int i = 0; i < ActionBoard.out.length; ++i) { if (EventHandler.getInstance().data.team[i].teamColor == GameControlData.TEAM_BLACK) { event = ActionBoard.out[i]; } } break; case KeyEvent.VK_P: event = ActionBoard.pushing; break; case KeyEvent.VK_L: event = ActionBoard.leaving; break; case KeyEvent.VK_I: event = ActionBoard.inactive; break; case KeyEvent.VK_D: event = ActionBoard.defender; break; case KeyEvent.VK_G: event = ActionBoard.kickOffGoal; break; case KeyEvent.VK_O: event = ActionBoard.ballContact; break; case KeyEvent.VK_U: event = ActionBoard.pickUp; break; case KeyEvent.VK_C: event = ActionBoard.coachMotion; break; case KeyEvent.VK_T: event = ActionBoard.teammatePushing; break; case KeyEvent.VK_S: event = ActionBoard.substitute; break; } } else if (Rules.league instanceof HL) { switch (key) { case KeyEvent.VK_B: event = ActionBoard.out[EventHandler.getInstance().data.team[0].teamColor == GameControlData.TEAM_BLUE ? 0 : 1]; break; case KeyEvent.VK_R: event = ActionBoard.out[EventHandler.getInstance().data.team[0].teamColor == GameControlData.TEAM_RED ? 0 : 1]; break; case KeyEvent.VK_P: event = ActionBoard.pushing; break; case KeyEvent.VK_D: event = ActionBoard.defense; break; case KeyEvent.VK_M: event = ActionBoard.ballManipulation; break; case KeyEvent.VK_I: event = ActionBoard.pickUpHL; break; case KeyEvent.VK_A: event = ActionBoard.attack; break; case KeyEvent.VK_S: event = ActionBoard.substitute; break; } } } if (event != null) { event.actionPerformed(null); return true; } return false; } }