package com.revolsys.swing.field; import java.awt.Color; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import javax.swing.JSlider; import javax.swing.JTextField; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import com.revolsys.datatype.DataTypes; import com.revolsys.util.CaseConverter; import com.revolsys.util.Exceptions; import com.revolsys.util.Property; import com.revolsys.util.number.Integers; import com.revolsys.util.number.Numbers; public class Slider extends JSlider implements Field, FocusListener, ChangeListener { public static final Color DEFAULT_SELECTED_FOREGROUND = new JTextField().getSelectedTextColor(); private static final long serialVersionUID = 1L; private final FieldSupport fieldSupport; public Slider(final String fieldName) { this(fieldName, HORIZONTAL, 0, 100, 50); } public Slider(final String fieldName, final int orientation) { this(fieldName, orientation, 0, 100, 50); } public Slider(final String fieldName, final int min, final int max) { this(fieldName, min, max, (min + max) / 2); } public Slider(final String fieldName, final int min, final int max, final int value) { this(fieldName, HORIZONTAL, min, max, value); } public Slider(final String fieldName, final int orientation, final int min, final int max, final int value) { super(orientation, min, max, value); if (Property.hasValue(fieldName)) { setToolTipText(CaseConverter.toCapitalizedWords(fieldName)); } this.fieldSupport = new FieldSupport(this, fieldName, value, true); addChangeListener(this); } @Override public Field clone() { try { return (Field)super.clone(); } catch (final CloneNotSupportedException e) { return Exceptions.throwUncheckedException(e); } } @Override public void firePropertyChange(final String propertyName, final Object oldValue, final Object newValue) { super.firePropertyChange(propertyName, oldValue, newValue); } @Override public void focusGained(final FocusEvent e) { } @Override public void focusLost(final FocusEvent e) { final int value = getValue(); setFieldValue(value); } protected String getDisplayText(final Object value) { return DataTypes.toString(value); } @Override public FieldSupport getFieldSupport() { return this.fieldSupport; } @SuppressWarnings("unchecked") @Override public <T> T getFieldValue() { final Integer value = getValue(); return (T)value; } @Override public boolean isFieldValid() { return true; } @Override public void setEditable(final boolean editable) { setEnabled(editable); } @Override public void setFieldToolTip(final String toolTip) { setToolTipText(toolTip); } @Override public boolean setFieldValue(final Object value) { final Integer newValue = Integers.toInteger(value); final Integer fieldValue = getValue(); getUndoManager().discardAllEdits(); if (Numbers.equal(fieldValue, newValue)) { setValue(newValue); getUndoManager().discardAllEdits(); } return this.fieldSupport.setValue(newValue); } @Override public void setToolTipText(final String text) { if (this.fieldSupport == null || this.fieldSupport.setOriginalTooltipText(text)) { super.setToolTipText(text); } } @Override public void stateChanged(final ChangeEvent e) { updateFieldValue(); } @Override public String toString() { return getFieldName() + "=" + getFieldValue(); } @Override public void updateFieldValue() { setFieldValue(getValue()); } }