/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.eas.client.forms.components.rt; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.HashSet; import java.util.Objects; import java.util.Set; import javax.swing.SpinnerNumberModel; /** * * @author mg */ public class SpinnerDoubleModel extends SpinnerNumberModel { protected Double value; protected Double min; protected Double max; protected double step; protected Set<PropertyChangeListener> valueChangeListeners = new HashSet<>(); public SpinnerDoubleModel(Double aValue, Double aMin, Double aMax, double aStep) { super(); value = aValue; step = aStep; setMin(aMin); setMax(aMax); } public Double getMin() { return min; } public void setMin(Double aMin) { if (!Objects.equals(min, aMin)) { min = aMin; } } public Double getMax() { return max; } public void setMax(Double aMax) { if (!Objects.equals(max, aMax)) { max = aMax; } } public double getStep() { return step; } public void setStep(double aValue) { step = aValue; } @Override public Object getValue() { return value; } @Override public void setValue(Object oValue) { if (oValue instanceof Double && ((Double) oValue).isNaN()) { oValue = null; } if (oValue != null) { assert oValue instanceof Double; Double aValue = (Double) oValue; if (!Objects.equals(value, aValue)) { Double newValue = checkValue(aValue); if (!Objects.equals(value, newValue)) { Double oldValue = value; value = newValue; fireValueChanged(oldValue, newValue); } } } else if (value != null) { Double oldValue = value; value = null; fireValueChanged(oldValue, null); } } @Override public Object getNextValue() { if (value == null) { value = 0.0d; } return incrementedValue(true); } @Override public Object getPreviousValue() { if (value == null) { value = 0.0d; } return incrementedValue(false); } private Double incrementedValue(boolean dir) { double newValue = value + step * (dir ? 1 : -1); if ((max != null) && (max.compareTo(newValue) < 0)) { return null; } if ((min != null) && (min.compareTo(newValue) > 0)) { return null; } else { return newValue; } } private Double checkValue(Double aValue) { if (max != null && max.compareTo(aValue) < 0) { return max; } if (min != null && min.compareTo(aValue) > 0) { return min; } return aValue; } public void addValueChangeListener(PropertyChangeListener l) { valueChangeListeners.add(l); } public void removeValueChangeListener(PropertyChangeListener l) { valueChangeListeners.add(l); } public PropertyChangeListener[] getValueChangeListeners() { return valueChangeListeners.toArray(new PropertyChangeListener[]{}); } protected void fireValueChanged(Double aOldValue, Double aNewValue) { super.fireStateChanged(); PropertyChangeEvent changeEvent = new PropertyChangeEvent(this, "value", aOldValue, aNewValue); valueChangeListeners.stream().forEach((l) -> { l.propertyChange(changeEvent); }); } }