/* * $Id$ * * Copyright (c) 2004 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.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import VASSAL.tools.SequenceEncoder; /** * Configures an array of keystrokes */ public class KeyStrokeArrayConfigurer extends Configurer { private List<HotKeyConfigurer> configs = new ArrayList<HotKeyConfigurer>(); private Box controls; private JPanel panel; public KeyStrokeArrayConfigurer(String key, String name) { super(key, name); } public KeyStrokeArrayConfigurer(String key, String name, KeyStroke[] val) { super(key, name, val); } public Component getControls() { if (panel == null) { panel = new JPanel(new BorderLayout()); controls = Box.createVerticalBox(); final JScrollPane scroll = new JScrollPane(controls); Box b = Box.createHorizontalBox(); controls.add(b); JLabel l = new JLabel(getName()); b.add(l); JButton button = new JButton("Add"); b.add(button); button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { addKey(null); } }); panel.add(scroll, BorderLayout.CENTER); KeyStroke[] keyStrokes = (KeyStroke[]) value; if (keyStrokes != null) { for (int i = 0; i < keyStrokes.length; i++) { addKey(keyStrokes[i]); } } addKey(null); } return panel; } private void addKey(KeyStroke keyStroke) { HotKeyConfigurer config = new HotKeyConfigurer(null, null, keyStroke); configs.add(config); controls.add(config.getControls()); if (configs.size() > 5) { panel.setPreferredSize(new Dimension(panel.getPreferredSize().width, 150)); } else { panel.setPreferredSize(null); } Window w = SwingUtilities.getWindowAncestor(controls); if (w != null) { w.pack(); } } public String getValueString() { return encode(getKeyStrokes()); } public void setValue(String s) { setValue(decode(s)); } public void setValue(Object o) { super.setValue(o); if (controls != null) { KeyStroke[] keyStrokes = (KeyStroke[]) o; if (keyStrokes == null) { keyStrokes = new KeyStroke[0]; } for (int i = 0; i < keyStrokes.length; ++i) { if (i > configs.size()) { addKey(keyStrokes[i]); } else { configs.get(i).setValue(keyStrokes[i]); } } for (int i = keyStrokes.length; i < configs.size(); ++i) { configs.get(i).setValue(null); } } } public KeyStroke[] getKeyStrokes() { ArrayList<KeyStroke> l = new ArrayList<KeyStroke>(); for (HotKeyConfigurer hotKeyConfigurer : configs) { KeyStroke value = (KeyStroke) hotKeyConfigurer.getValue(); if (value != null) { l.add(value); } } return l.toArray(new KeyStroke[l.size()]); } public static KeyStroke[] decode(String s) { if (s == null) { return null; } ArrayList<KeyStroke> l = new ArrayList<KeyStroke>(); SequenceEncoder.Decoder st = new SequenceEncoder.Decoder(s, ','); while (st.hasMoreTokens()) { l.add(HotKeyConfigurer.decode(st.nextToken())); } return l.toArray(new KeyStroke[l.size()]); } public static String encode(KeyStroke[] keys) { if (keys == null) { return null; } SequenceEncoder se = new SequenceEncoder(','); for (int i = 0; i < keys.length; i++) { KeyStroke key = keys[i]; se.append(HotKeyConfigurer.encode(key)); } return se.getValue() != null ? se.getValue() : ""; } }