// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui;
import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
import java.awt.Dimension;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JSlider;
import javax.swing.UIManager;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openstreetmap.josm.gui.help.Helpful;
class MapSlider extends JSlider implements PropertyChangeListener, ChangeListener, Helpful {
private static final double zoomStep = 1.1;
private final MapView mv;
private boolean preventChange;
private int lastValue;
MapSlider(MapView mv) {
super(0, 160);
setOpaque(false);
this.mv = mv;
mv.addPropertyChangeListener("scale", this);
addChangeListener(this);
// Call this manually once so it gets setup correctly
propertyChange(null);
int w = UIManager.getDefaults().getInt("Slider.thumbWidth") + 150;
setPreferredSize(new Dimension(w, 27));
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
double maxScale = this.mv.getMaxScale();
int zoom = (int) Math.round(Math.log(maxScale/mv.getScale())/Math.log(zoomStep));
preventChange = true;
setValue(zoom);
lastValue = zoom;
preventChange = false;
}
@Override
public void stateChanged(ChangeEvent e) {
if (preventChange) return;
if (!getModel().getValueIsAdjusting() && mv.getNativeScaleLayer() != null) {
if (getValue() < lastValue) {
mv.zoomOut();
} else if (getValue() > lastValue) {
mv.zoomIn();
}
} else {
double maxScale = this.mv.getMaxScale();
double scale = maxScale/Math.pow(zoomStep, getValue());
double snapped = mv.scaleFloor(scale);
mv.zoomTo(this.mv.getCenter(), snapped);
}
propertyChange(null);
}
@Override
public String helpTopic() {
return ht("/MapView/Slider");
}
}