001 package swingui;
002
003 import java.awt.BorderLayout;
004 import java.awt.GridLayout;
005 import java.awt.event.ActionEvent;
006 import java.awt.event.ActionListener;
007 import java.awt.event.KeyEvent;
008 import java.awt.event.KeyListener;
009
010 import javax.swing.JButton;
011 import javax.swing.JFrame;
012 import javax.swing.JLabel;
013 import javax.swing.JPanel;
014 import javax.swing.JTextField;
015
016 import components.GameObject;
017 import components.GameSpace;
018
019 /** AddKeyWindow is a mutable class that extends JFrame to make a window that allows the user to add a key trigger
020 * <p>
021 * Unfortunately, AddKeyWindow is not modal, so if the user wished it, she could ignore it and
022 * continue to use the main program. This would not actually cause any problems with gameplay, however.
023 * AddKeyWindow does at least request focus, so hopefully it will not be ignored.
024 * <p>
025 * This window listens for key presses and updates two (uneditable) textfields with the key name
026 * and key code of whatever key is pressed. When the user clicks "Select", the chosen key is added as a
027 * trigger to the object that started this window.
028 * <p>
029 * It might have been nicer to use JDialog, but JDialog cannot use KeyListeners for reasons that
030 * are not entirely clear.
031 *
032 * @author ruthdhan
033 *
034 */
035 public class AddKeyWindow extends JFrame implements KeyListener, ActionListener {
036 private static final long serialVersionUID = 1776L;
037 //fields
038 private TriggerPanel parent;
039 private GameSpace gs;
040 private GameObject obj;
041 private boolean down;
042
043 //components
044 private JButton okay;
045 private JTextField keyText;
046 private JTextField keyCode;
047
048 /** construct an AddKeyWindow, with references to its parent, its GameSpace and Object,
049 * and which direction we want to add a key trigger in (key press or release).
050 * @param parent - the TriggerPanel that this was caled from
051 * @param gs - the current GameSpace
052 * @param obj - the object to add a trigger to
053 * @param down - true if we want to add a key press, false for key release
054 */
055 public AddKeyWindow(TriggerPanel parent, GameSpace gs, GameObject obj, boolean down) {
056 super();
057 this.parent = parent;
058 this.gs = gs;
059 this.obj = obj;
060 this.down = down;
061
062 //components
063 okay = new JButton("Select");
064 okay.setEnabled(false);
065 okay.setFocusable(false); //no focus! how shall i listen to keys if you do that?
066 keyText = new JTextField("");
067 keyText.setEditable(false);
068 keyCode = new JTextField("");
069 keyCode.setEditable(false);
070
071 //panels + layout
072 JPanel keypicker = new JPanel();
073 keypicker.setLayout(new GridLayout(2, 2));
074 keypicker.add(new JLabel (" KEY: "));
075 keypicker.add(keyText);
076 keypicker.add(new JLabel("CODE: "));
077 keypicker.add(keyCode);
078 add(keypicker, BorderLayout.CENTER);
079 add(okay, BorderLayout.SOUTH);
080
081 //key listener
082 addKeyListener(this);
083
084 //okay button
085 okay.addActionListener(this);
086
087 //check layout
088 validate();
089
090 //finish up
091 setSize(200, 100);
092 setVisible(true);
093 requestFocus();
094 }
095
096 /** when a key is pressed, update the textfields
097 * @effects textfields **/
098 public void keyPressed(KeyEvent arg0) {
099 System.err.println("key pressed!");
100 okay.setEnabled(true);
101 keyText.setText(KeyEvent.getKeyText(arg0.getKeyCode()));
102 keyCode.setText(""+arg0.getKeyCode());
103 }
104 public void keyReleased(KeyEvent arg0) {}
105 public void keyTyped(KeyEvent arg0) {}
106
107 /** when select button is clicked, add key trigger and dispose of dialog **/
108 public void actionPerformed(ActionEvent arg0) {
109 if (arg0.getSource().equals(okay)) {
110 System.err.println("clicked OKAY");
111 int code = Integer.valueOf(keyCode.getText());
112 if (code > 0) {
113 if (down)
114 gs.addDownKey(code, obj);
115 else
116 gs.addUpKey(code, obj);
117 }
118 parent.updateTriggerList();
119 this.dispose();
120 }
121 }
122 }