/*
* 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.text.ParseException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.JFormattedTextField;
import javax.swing.JSpinner;
/**
*
* @author mg
*/
public class VSpinner extends JSpinner implements HasEmptyText, HasEditable {
protected SpinnerDoubleModel model;
public VSpinner() {
super(new SpinnerDoubleModel(0.0d, null, null, 1.0d));
model = (SpinnerDoubleModel) super.getModel();
model.setValue(null);
model.addValueChangeListener(valueChangedAlerter);
}
protected PropertyChangeListener valueChangedAlerter = (PropertyChangeEvent evt) -> {
firePropertyChange(HasValue.VALUE_PROP_NAME, evt.getOldValue(), evt.getNewValue());
};
public final void setModel(SpinnerDoubleModel aModel) {
if (model != null) {
model.removeValueChangeListener(valueChangedAlerter);
}
model = aModel;
super.setModel(model);
if (model != null) {
model.addValueChangeListener(valueChangedAlerter);
}
}
@Override
public Object getNextValue() {
try {
((NumberEditor) getEditor()).getTextField().commitEdit();
} catch (ParseException ex) {
// no op
}
return super.getNextValue();
}
@Override
public Object getPreviousValue() {
try {
((NumberEditor) getEditor()).getTextField().commitEdit();
} catch (ParseException ex) {
// no op
}
return super.getPreviousValue();
}
@Override
public Double getValue() {
return (Double) getModel().getValue();
}
public void setValue(Double aValue) {
super.setValue(aValue);
}
public void addValueChangeListener(PropertyChangeListener listener) {
super.addPropertyChangeListener(HasValue.VALUE_PROP_NAME, listener);
}
@Override
public void requestFocus() {
if (getEditor() instanceof NumberEditor) {
JFormattedTextField ftf = ((NumberEditor) getEditor()).getTextField();
ftf.requestFocus();
}
}
@Override
public boolean requestFocus(boolean temporary) {
if (getEditor() instanceof NumberEditor) {
JFormattedTextField ftf = ((NumberEditor) getEditor()).getTextField();
return ftf.requestFocus(temporary);
}
return super.requestFocus(temporary);
}
@Override
public void commitEdit() throws ParseException {
try {
super.commitEdit();
} catch (ParseException ex) {
if ("".equals(getText())) {
model.setValue(null);
}
}
}
@Override
public void setOpaque(boolean aValue) {
super.setOpaque(aValue);
JComponent editor = getEditor();
editor.setOpaque(aValue);
if (editor instanceof NumberEditor) {
((NumberEditor) editor).getTextField().setOpaque(aValue);
}
}
protected String emptyText;
@Override
public String getEmptyText() {
return emptyText;
}
@Override
public void setEmptyText(String aValue) {
emptyText = aValue;
}
@Override
public boolean getEditable() {
JComponent editor = getEditor();
return ((NumberEditor) editor).getTextField().isEditable();
}
@Override
public void setEditable(boolean aValue) {
JComponent editor = getEditor();
((NumberEditor) editor).getTextField().setEditable(aValue);
}
public Double getMin() {
return model.getMin();
}
public void setMin(Double aValue) {
model.setMin(aValue);
}
public Double getMax() {
return model.getMax();
}
public void setMax(Double aValue) {
model.setMax(aValue);
}
public double getStep() {
return model.getStep();
}
public void setStep(double aValue) {
model.setStep(aValue);
}
public String getText() {
JComponent editor = getEditor();
return ((NumberEditor) editor).getTextField().getText();
}
public void setText(String aValue) throws Exception {
JComponent editor = getEditor();
((NumberEditor) editor).getTextField().setText(aValue != null ? aValue : "");
((NumberEditor) editor).getTextField().commitEdit();
}
}