package games.strategy.engine.data.properties; import java.io.File; import java.math.BigDecimal; import javax.swing.JComponent; import games.strategy.engine.ClientFileSystemHelper; import games.strategy.ui.DoubleTextField; public class DoubleProperty extends AEditableProperty { private static final long serialVersionUID = 5521967819500867581L; private final double m_max; private final double m_min; private double m_value; private final int m_places; public DoubleProperty(final String name, final String description, final double max, final double min, final double def, final int numberOfPlaces) { 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"); } m_max = max; m_min = min; m_places = numberOfPlaces; m_value = roundToPlace(def, numberOfPlaces, BigDecimal.ROUND_FLOOR); } private static double roundToPlace(final double number, final int places, final int BigDecimalRoundingMode) { BigDecimal bd = new BigDecimal(number); bd = bd.setScale(places, BigDecimalRoundingMode); return bd.doubleValue(); } @Override public Double 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("Double and 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 = roundToPlace((Double) value, m_places, BigDecimal.ROUND_FLOOR); } } @Override public JComponent getEditorComponent() { final DoubleTextField field = new DoubleTextField(m_min, m_max); field.setValue(m_value); field.addChangeListener(aField -> m_value = aField.getValue()); return field; } @Override public boolean validate(final Object value) { if (value instanceof Double) { double d; try { d = roundToPlace((Double) value, m_places, BigDecimal.ROUND_FLOOR); } catch (final Exception e) { return false; } if (d <= m_max && d >= m_min) { return true; } } return false; } }