package jas.util;
import java.lang.reflect.Constructor;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
public class JTextFieldBinding extends FieldBinding implements DocumentListener
{
protected JTextFieldBinding(JTextField field, byte flags)
{
this(field);
m_flags = flags;
}
protected JTextFieldBinding(JTextField field)
{
m_field = field;
field.getDocument().addDocumentListener(this);
}
void set(Object value)
{
String x = setValue(value);
if (!m_oldVal.equals(x))
{
m_field.setText(x);
m_oldVal = x;
}
}
protected String setValue(Object value)
{
String x;
if (value == null) x = "";
else if (value instanceof String) x = (String) value;
else x = value.toString();
return x;
}
protected Object getValue(String value, Class type) throws UnsupportedType
{
if (type.isPrimitive())
{
if (type == Double.TYPE ) return new Double(value);
if (type == Integer.TYPE) return new Integer(value);
throw new UnsupportedType(m_field,type);
}
else
{
Class[] strarg = { value.getClass() };
try
{
Constructor c = type.getConstructor(strarg);
Object[] args = { value };
return c.newInstance(args);
}
catch (Exception xx)
{
throw new UnsupportedType(m_field,type);
}
}
}
Object get(Class type) throws UnsupportedType
{
return getValue(m_field.getText(),type);
}
public void changedUpdate(DocumentEvent e) { update(); }
public void insertUpdate(DocumentEvent e) { update(); }
public void removeUpdate(DocumentEvent e) { update(); }
private void update()
{
String x = m_field.getText();
if (!x.equals(m_oldVal)) setChanged();
notifyObservers();
}
protected void reset()
{
super.reset();
m_oldVal = m_field.getText();
}
boolean hasValidInput()
{
final String value = m_field.getText();
if ((m_flags & MUST_BE_NUMBER) != 0)
{
try
{
double d = (m_flags & MUST_BE_INTEGER_FLAG) != 0 ? (double) Integer.parseInt(value) : Double.valueOf(value).doubleValue();
if ((m_flags & MUST_BE_POSITIVE) != 0 && d <= 0.0)
{
JOptionPane.showMessageDialog(m_field,
value.concat(" is invalid input; value must be positive."),
"Error", JOptionPane.ERROR_MESSAGE);
return false;
}
}
catch (NumberFormatException e)
{
JOptionPane.showMessageDialog(m_field,
value +" is invalid input; value must be a"+
((m_flags & MUST_BE_INTEGER) != 0 ? "n integer." : " number."),
"Error", JOptionPane.ERROR_MESSAGE);
return false;
}
}
return true;
}
private String m_oldVal = "";
private JTextField m_field;
private byte m_flags = 0;
public static final byte MUST_BE_NUMBER = 1;
private static final byte MUST_BE_INTEGER_FLAG = 2;
public static final byte MUST_BE_INTEGER = MUST_BE_INTEGER_FLAG | MUST_BE_NUMBER;
public static final byte MUST_BE_POSITIVE = 4;
}