package glug.gui.model;
import static java.lang.Math.ceil;
import static java.lang.Math.exp;
import static java.lang.Math.log;
import static java.lang.Math.round;
import javax.swing.BoundedRangeModel;
public class LogarithmicBoundedRange {
private final double multFactor = 1<<16;
private final BoundedRangeModel linearBoundedRangeModel;
public LogarithmicBoundedRange(BoundedRangeModel linearBoundedRangeModel) {
this.linearBoundedRangeModel = linearBoundedRangeModel;
}
public void setMaxMillisecondsPerPixel(double millisecondsPerPixel) {
linearBoundedRangeModel.setMaximum((int) ceil(linearScaleDoubleValueFor(millisecondsPerPixel)));
}
public void setMinMillisecondsPerPixel(double millisecondsPerPixel) {
linearBoundedRangeModel.setMinimum(linearScaleValueFor(millisecondsPerPixel));
}
public void setCurrentMillisecondsPerPixel(double millisecondsPerPixel) {
linearBoundedRangeModel.setValue(linearScaleValueFor(millisecondsPerPixel));
}
public double getCurrentMillisecondsPerPixel() {
return millisecondsPerPixelFor(linearBoundedRangeModel.getValue());
}
private int linearScaleValueFor(double millisecondsPerPixel) {
return (int) round(linearScaleDoubleValueFor(millisecondsPerPixel));
}
private double linearScaleDoubleValueFor(double millisecondsPerPixel) {
return round(log(millisecondsPerPixel) * multFactor);
}
private double millisecondsPerPixelFor(int linearScaleValue) {
return exp((linearScaleValue / multFactor));
}
}