/* * $Id$ * * Copyright (c) 2000-2003 by Rodney Kinney * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License (LGPL) as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, copies are available * at http://www.opensource.org. */ package VASSAL.configure; import java.awt.Dimension; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.BoxLayout; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.KeyStroke; import VASSAL.i18n.Resources; /** * A Configurer for {@link KeyStroke} values */ public class HotKeyConfigurer extends Configurer implements KeyListener { private JTextField tf; private JPanel p; public HotKeyConfigurer(String key, String name) { this(key, name, KeyStroke.getKeyStroke((char) 0)); } public HotKeyConfigurer(String key, String name, KeyStroke val) { super(key, name, val); } public void setValue(Object o) { super.setValue(o); if (tf != null && !tf.getText().equals(keyToString())) { tf.setText(keyToString()); } } public String keyToString() { return getString((KeyStroke) getValue()); } public String getValueString() { return encode((KeyStroke) getValue()); } public void setValue(String s) { setValue(s == null ? null : decode(s)); } public java.awt.Component getControls() { if (p == null) { p = new JPanel(); p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS)); tf = new JTextField(8); tf.setMaximumSize(new Dimension(tf.getMaximumSize().width,tf.getPreferredSize().height)); tf.setText(keyToString()); tf.addKeyListener(this); p.add(new JLabel(getName())); p.add(tf); } return p; } public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_DELETE: case KeyEvent.VK_BACK_SPACE: setValue(null); break; case KeyEvent.VK_SHIFT: case KeyEvent.VK_CONTROL: case KeyEvent.VK_META: case KeyEvent.VK_ALT: break; default: setValue(KeyStroke.getKeyStrokeForEvent(e)); } } public void keyReleased(KeyEvent e) { tf.setText(getString((KeyStroke) getValue())); } /** * A plain text representation of a KeyStroke. Doesn't differ much * from {@link KeyEvent#getKeyText} */ public static String getString(KeyStroke k) { if (k == null) { return null; } String s = KeyEvent.getKeyText(k.getKeyCode()); s = s.replace(' ', '_'); if ((k.getModifiers() & KeyEvent.SHIFT_MASK) > 0) { s = Resources.getString("Keys.shift") + " " + s; //$NON-NLS-1$ //$NON-NLS-2$ } if ((k.getModifiers() & KeyEvent.CTRL_MASK) > 0) { s = Resources.getString("Keys.ctrl") + " " + s; //$NON-NLS-1$ //$NON-NLS-2$ } if ((k.getModifiers() & KeyEvent.META_MASK) > 0) { s = Resources.getString("Keys.meta") + " " + s; //$NON-NLS-1$ //$NON-NLS-2$ } if ((k.getModifiers() & KeyEvent.ALT_MASK) > 0) { s = Resources.getString("Keys.alt") + " " + s; //$NON-NLS-1$ //$NON-NLS-2$ } return s.toUpperCase(); } /** * Decode a String into a KeyStroke */ public static KeyStroke decode(String s) { final int index = s.indexOf(','); //$NON-NLS-1$ if (index < 0) return null; try { return KeyStroke.getKeyStroke (Integer.parseInt(s.substring(0, index)), Integer.parseInt(s.substring(index + 1))); } // FIXME: review error message catch (NumberFormatException e) { return null; } catch (IllegalArgumentException e) { return null; } } /** * Encode a KeyStroke into a String */ public static String encode(KeyStroke stroke) { return stroke == null ? "" : stroke.getKeyCode() + "," + stroke.getModifiers(); //$NON-NLS-1$ //$NON-NLS-2$ } }