package glug.gui.zoom;
import glug.gui.UITimeScale;
import glug.gui.model.LogarithmicBoundedRange;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JViewport;
import org.joda.time.Interval;
public class ZoomFactorSlideUpdater {
private final LogarithmicBoundedRange logarithmicBoundedRange;
private final JViewport viewport;
private final UITimeScale timeScale;
public ZoomFactorSlideUpdater(UITimeScale timeScale, LogarithmicBoundedRange logarithmicBoundedRange, JViewport viewport) {
this.viewport = viewport;
this.timeScale = timeScale;
this.logarithmicBoundedRange = logarithmicBoundedRange;
updateSliderBounds();
timeScale.addChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
updateSliderValue();
}
});
viewport.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
updateSliderMax();
}
});
}
private void updateSliderValue() {
// We should be safe from an infinite recursive loop because LogarithmicBoundedRange round-trips
logarithmicBoundedRange.setCurrentMillisecondsPerPixel(timeScale.getMillisecondsPerPixel());
}
private void updateSliderBounds() {
logarithmicBoundedRange.setMinMillisecondsPerPixel(0.1);
updateSliderMax();
}
public void updateSliderMax() {
Interval fullInterval = timeScale.getFullInterval();
if (fullInterval!=null) {
logarithmicBoundedRange.setMaxMillisecondsPerPixel(millisPerPixelRequredToShowEntireIntervalInViewPort(fullInterval));
}
}
private double millisPerPixelRequredToShowEntireIntervalInViewPort(Interval interval) {
return ((double) interval.toDurationMillis()) / viewport.getExtentSize().width;
}
}