package games.strategy.engine.data.properties; import java.io.File; import javax.swing.JComponent; import games.strategy.engine.ClientFileSystemHelper; import games.strategy.ui.IntTextField; public class NumberProperty extends AEditableProperty { // compatible with 0.9.0.2 saved games private static final long serialVersionUID = 6826763550643504789L; // Keep this in sync with the matchin property name, used by reflection. public static final String MAX_PROPERTY_NAME = "max"; private final int max; // Keep this in sync with the matchin property name, used by reflection. public static final String MIN_PROPERTY_NAME = "min"; private final int min; private int m_value; public NumberProperty(final String name, final String description, final int max, final int min, final int def) { super(name, description); if (max < min) { throw new IllegalThreadStateException("Max must be greater than min"); } if (def > max || def < min) { throw new IllegalThreadStateException("Default value out of range"); } this.max = max; this.min = min; m_value = def; } @Override public Integer getValue() { return m_value; } @Override public void setValue(final Object value) throws ClassCastException { if (value instanceof String) { // warn developer which have run with the option cache when Number properties were stored as strings // todo (kg) remove at a later point throw new RuntimeException( "Number properties are no longer stored as Strings. You should delete your option cache, located at " + new File(ClientFileSystemHelper.getUserRootFolder(), "optionCache").toString()); } else { m_value = (Integer) value; } } @Override public JComponent getEditorComponent() { final IntTextField field = new IntTextField(min, max); field.setValue(m_value); field.addChangeListener(aField -> m_value = aField.getValue()); return field; } @Override public boolean validate(final Object value) { if (value instanceof Integer) { final int i = ((Integer) value); if (i <= max && i >= min) { return true; } } return false; } }