/*
* Copyright (C) 2009 Quadduc <quadduc@gmail.com>
*
* This file is part of LateralGM.
* LateralGM is free software and comes with ABSOLUTELY NO WARRANTY.
* See LICENSE for details.
*/
package org.lateralgm.ui.swing.propertylink;
import javax.swing.BoundedRangeModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.lateralgm.util.PropertyLink;
import org.lateralgm.util.PropertyMap;
import org.lateralgm.util.PropertyMap.PropertyUpdateEvent;
public class BoundedRangeLink<K extends Enum<K>, V extends Number> extends PropertyLink<K,V>
implements ChangeListener
{
public final BoundedRangeModel model;
public final Converter<V> converter;
public BoundedRangeLink(BoundedRangeModel brm, Converter<V> c, PropertyMap<K> m, K k)
{
super(m,k);
model = brm;
converter = c;
reset();
model.addChangeListener(this);
}
@Override
protected void setComponent(V v)
{
model.setValue(converter.fromProperty(v));
}
@Override
public void remove()
{
super.remove();
model.removeChangeListener(this);
}
@Override
public void updated(PropertyUpdateEvent<K> e)
{
V v = map.get(key);
if (converter.fromProperty(v) == model.getValue()) return;
editComponent(v);
}
public void stateChanged(ChangeEvent e)
{
V v = converter.toProperty(model.getValue());
if (v.equals(map.get(key))) return;
editProperty(v);
}
public abstract static interface Converter<V extends Number>
{
V toProperty(int v);
int fromProperty(V v);
}
public static class IntegerConverter implements Converter<Integer>
{
public int fromProperty(Integer v)
{
return v;
}
public Integer toProperty(int v)
{
return v;
}
}
public static class DoubleConverter implements Converter<Double>
{
public final double step;
public DoubleConverter(double s)
{
step = s;
}
public int fromProperty(Double v)
{
return (int) Math.round(v * step);
}
public Double toProperty(int v)
{
return v / step;
}
}
}