/* * A custom spinner that will step full integers unless less than or equal to 1 * at which point it will step tenths unless less than or equal to .1 at which * point it will step hundredths, etc. */ /* Copywrite 2012-2016 Will Winder This file is part of Universal Gcode Sender (UGS). UGS is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. UGS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with UGS. If not, see <http://www.gnu.org/licenses/>. */ package com.willwinder.universalgcodesender.uielements.components; import javax.swing.SpinnerNumberModel; /** * * @author wwinder */ public class StepSizeSpinnerModel extends SpinnerNumberModel { Double maxStepSize = null; public StepSizeSpinnerModel(Number value, Comparable min, Comparable max, Number size) { super (value, min, max, size); maxStepSize = size.doubleValue(); } private Double getPreviousStepSize() { Number stepSize = this.getStepSize(); Double size = stepSize.doubleValue(); // Determine if step size needs adjusting if (getNumber().doubleValue() == this.getStepSize().doubleValue()) { size /= 10.0; } return size; } private Double getNextStepSize() { Double size = this.getStepSize().doubleValue(); if (getNumber().doubleValue() >= (10 * size)) { if (this.getStepSize().doubleValue() < maxStepSize) { size *= 10; if (size > maxStepSize) { size = maxStepSize; } } } if (this.getNumber().doubleValue() == 0) { size = .0001; } return size; } /** * Returns the next value, or * <code>null</code> if adding the step size to the current value results in * a value greater than the maximum value. The current value is not changed. * * @return The next value, or * <code>null</code> if the current value is the maximum value represented * by this model. */ @Override public Object getNextValue() { Double num; this.setStepSize(getNextStepSize()); num = this.getNumber().doubleValue() + this.getStepSize().doubleValue(); // check upper bound if set if ((this.getMaximum() != null) && this.getMaximum().compareTo(num) < 0) { num = null; } return num; } /** * Returns the previous value, or * <code>null</code> if subtracting the step size from the current value * results in a value less than the minimum value. The current value is not * changed. * * @return The previous value, or * <code>null</code> if the current value is the minimum value represented * by this model. */ @Override public Object getPreviousValue() { Double num; this.setStepSize(getPreviousStepSize()); num = this.getNumber().doubleValue() - this.getStepSize().doubleValue(); // check lower bound if set if ((this.getMinimum() != null) && this.getMinimum().compareTo(num) > 0) { num = null; } return num; } }