/*
* Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* This program 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.
* This program 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 this program; if not, see http://www.gnu.org/licenses/
*/
package org.esa.beam.smos.visat.swing;
import javax.swing.JFormattedTextField;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.beans.PropertyChangeEvent;
class SnapshotSelector {
private final JSpinner spinner;
private final JSlider slider;
private final JTextField sliderInfo;
private SnapshotSelectorModel model;
SnapshotSelector() {
spinner = new JSpinner();
slider = new JSlider();
slider.setSnapToTicks(true);
slider.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
int currentValue = slider.getModel().getValue();
slider.getModel().setValue(currentValue + e.getWheelRotation());
}
});
sliderInfo = new JTextField(10);
sliderInfo.setEditable(false);
}
SnapshotSelector(SnapshotSelectorModel model) {
this();
setModel(model);
}
/**
* Returns the spinner component.
* <p/>
* Note that registered <code>ChangeListener</code>s are notified
* each time a <code>ChangeEvent</code> is received from the model
* <em>or</em> the model is changed.
*
* @return the spinner component.
*/
JSpinner getSpinner() {
return spinner;
}
/**
* Returns the slider component.
* <p/>
* Note that registered <code>ChangeListener</code>s are notified
* each time a <code>ChangeEvent</code> is received from the model
* <em>or</em> the model is changed.
*
* @return the slider component.
*/
JSlider getSlider() {
return slider;
}
JTextField getSliderInfo() {
return sliderInfo;
}
final void setModel(SnapshotSelectorModel model) {
if (model == null) {
throw new IllegalArgumentException("null model");
}
if (this.model != model) {
this.model = model;
spinner.setModel(model.getSpinnerModel());
spinner.setEditor(new ListEditor(spinner));
slider.setModel(model.getSliderModel());
sliderInfo.setDocument(model.getSliderInfoDocument());
}
}
private static class ListEditor extends JSpinner.ListEditor {
public ListEditor(JSpinner spinner) {
super(spinner);
}
@Override
public void propertyChange(PropertyChangeEvent e) {
final JSpinner spinner = getSpinner();
if (spinner == null) {
// Indicates we aren't installed anywhere.
return;
}
final Object source = e.getSource();
final String name = e.getPropertyName();
if ((source instanceof JFormattedTextField) && "value".equals(name)) {
final Object lastValue = spinner.getValue();
// Try to set the new value
try {
final Object value = getTextField().getValue();
if (value instanceof Number) {
final Number number = (Number) value;
spinner.setValue(number.longValue());
} else {
spinner.setValue(Long.parseLong(value.toString()));
}
} catch (IllegalArgumentException iae) {
// SpinnerModel didn't like new value, reset
try {
((JFormattedTextField) source).setValue(lastValue);
} catch (IllegalArgumentException iae2) {
// Still bogus, nothing else we can do, the
// SpinnerModel and JFormattedTextField are now out
// of sync.
}
}
}
}
}
}