/*
* $Id$
*
* Copyright (c) 2000-2009 by Rodney Kinney, Brent Easton
*
* 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.
*/
/*
* Created by IntelliJ IDEA.
* User: rkinney
* Date: Jul 20, 2002
* Time: 3:52:36 AM
* To change template for new class use
* Code Style | Class Templates options (Tools | IDE Options).
*/
package VASSAL.configure;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.Box;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
/**
* A Configurer that returns a String from among a list of possible values
*/
public class StringEnumConfigurer extends Configurer {
private String[] validValues;
private JComboBox box;
private Box panel;
public StringEnumConfigurer(String key, String name, String[] validValues) {
super(key, name);
this.validValues = validValues;
}
public Component getControls() {
if (panel == null) {
panel = Box.createHorizontalBox();
panel.add(new JLabel(name));
box = new JComboBox(validValues);
box.setMaximumSize(new Dimension(box.getMaximumSize().width,box.getPreferredSize().height));
if (isValidValue(getValue())) {
box.setSelectedItem(getValue());
}
else if (validValues.length > 0) {
box.setSelectedIndex(0);
}
box.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
noUpdate = true;
setValue(box.getSelectedItem());
noUpdate = false;
}
});
panel.add(box);
}
return panel;
}
public void setEnabled(boolean enabled) {
box.setEnabled(enabled);
}
public void setEditable(boolean enabled) {
box.setEditable(enabled);
}
public boolean isValidValue(Object o) {
for (int i = 0; i < validValues.length; ++i) {
if (validValues[i].equals(o)) {
return true;
}
}
return false;
}
public String[] getValidValues() {
return validValues;
}
public void setValidValues(String[] s) {
validValues = s;
if (box == null) {
getControls();
}
box.setModel(new DefaultComboBoxModel(validValues));
}
public void setValue(Object o) {
if (validValues == null
|| isValidValue(o)) {
super.setValue(o);
if (!noUpdate && box != null) {
box.setSelectedItem(o);
}
}
}
public String getValueString() {
return box != null ? (String) box.getSelectedItem() : validValues[0];
}
public void setValue(String s) {
setValue((Object) s);
}
public static void main(String[] args) {
JFrame f = new JFrame();
StringEnumConfigurer c = new StringEnumConfigurer(null, "Pick one: ", new String[]{"one", "two", "three"});
c.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
System.err.println(evt.getPropertyName() + " = " + evt.getNewValue());
}
});
f.add(c.getControls());
f.pack();
f.setVisible(true);
}
}