package org.korsakow.ide.ui.constraints; import javax.swing.JTextField; /** * Constrains a textfield to numbers in the given range. * @author d * */ public class NumberRangeTextFieldConstraint extends TextFieldConstraint { private final Class<? extends Number> numberClass; private Number minimum = null; private Number maximum = null; public NumberRangeTextFieldConstraint(Class<? extends Number> numberClass, Number minimum, Number maximum) { this.numberClass = numberClass; this.minimum = minimum; this.maximum = maximum; parseNumber(numberClass, "0"); // if we can't parse due to illegal number type throw now so the exception is more likely to get spotted } private Number parseNumber(Class<? extends Number> numberClass, String text) throws NumberFormatException { if (Double.class.isAssignableFrom(numberClass)) return Double.parseDouble(text); if (Float.class.isAssignableFrom(numberClass)) return Float.parseFloat(text); if (Long.class.isAssignableFrom(numberClass)) return Long.parseLong(text); if (Integer.class.isAssignableFrom(numberClass)) return Integer.parseInt(text); if (Short.class.isAssignableFrom(numberClass)) return Short.parseShort(text); if (Byte.class.isAssignableFrom(numberClass)) return Byte.parseByte(text); throw new IllegalArgumentException("can't parse this type of number: " + numberClass); } @Override protected void validate(JTextField textField) { String text = textField.getText(); Object value; try { value = parseNumber(numberClass, text); } catch (NumberFormatException nfe) { value = valueOnFocus.get(textField); } if (value instanceof Number) { Number numberValue = (Number)value; if (minimum != null) if (numberValue.doubleValue() < minimum.doubleValue()) value = minimum; if (maximum != null) if (numberValue.doubleValue() > maximum.doubleValue()) value = maximum; } textField.setText(value.toString()); } }