[6380] | 1 | // License: GPL. For details, see LICENSE file.
|
---|
[115] | 2 | package org.openstreetmap.josm.gui;
|
---|
| 3 |
|
---|
[3754] | 4 | import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
|
---|
| 5 |
|
---|
[10078] | 6 | import java.awt.Dimension;
|
---|
[115] | 7 |
|
---|
| 8 | import javax.swing.JSlider;
|
---|
[10078] | 9 | import javax.swing.UIManager;
|
---|
[115] | 10 | import javax.swing.event.ChangeEvent;
|
---|
| 11 | import javax.swing.event.ChangeListener;
|
---|
| 12 |
|
---|
[2252] | 13 | import org.openstreetmap.josm.gui.help.Helpful;
|
---|
[13201] | 14 | import org.openstreetmap.josm.gui.NavigatableComponent.ZoomChangeListener;
|
---|
[115] | 15 |
|
---|
[12391] | 16 | /**
|
---|
| 17 | * This is the slider used in the top left corner of the map view. It allows the user to select the scale
|
---|
| 18 | */
|
---|
[13201] | 19 | class MapSlider extends JSlider implements ZoomChangeListener, ChangeListener, Helpful {
|
---|
[1169] | 20 |
|
---|
[12537] | 21 | private static final double ZOOM_STEP = 1.1;
|
---|
[115] | 22 | private final MapView mv;
|
---|
[8840] | 23 | private boolean preventChange;
|
---|
[9818] | 24 | private int lastValue;
|
---|
[155] | 25 |
|
---|
[8836] | 26 | MapSlider(MapView mv) {
|
---|
[10078] | 27 | super(0, 160);
|
---|
[1169] | 28 | setOpaque(false);
|
---|
| 29 | this.mv = mv;
|
---|
[13201] | 30 | NavigatableComponent.addZoomChangeListener(this);
|
---|
[1169] | 31 | addChangeListener(this);
|
---|
[2114] | 32 | // Call this manually once so it gets setup correctly
|
---|
[13201] | 33 | zoomChanged();
|
---|
[10078] | 34 | int w = UIManager.getDefaults().getInt("Slider.thumbWidth") + 150;
|
---|
| 35 | setPreferredSize(new Dimension(w, 27));
|
---|
[155] | 36 | }
|
---|
[1169] | 37 |
|
---|
[6084] | 38 | @Override
|
---|
[13201] | 39 | public void zoomChanged() {
|
---|
[9818] | 40 | double maxScale = this.mv.getMaxScale();
|
---|
[12537] | 41 | int zoom = (int) Math.round(Math.log(maxScale/mv.getScale())/Math.log(ZOOM_STEP));
|
---|
[8510] | 42 | preventChange = true;
|
---|
[1722] | 43 | setValue(zoom);
|
---|
[9818] | 44 | lastValue = zoom;
|
---|
[8510] | 45 | preventChange = false;
|
---|
[1169] | 46 | }
|
---|
| 47 |
|
---|
[6084] | 48 | @Override
|
---|
[1169] | 49 | public void stateChanged(ChangeEvent e) {
|
---|
[1337] | 50 | if (preventChange) return;
|
---|
[1722] | 51 |
|
---|
[9818] | 52 | if (!getModel().getValueIsAdjusting() && mv.getNativeScaleLayer() != null) {
|
---|
| 53 | if (getValue() < lastValue) {
|
---|
| 54 | mv.zoomOut();
|
---|
| 55 | } else if (getValue() > lastValue) {
|
---|
| 56 | mv.zoomIn();
|
---|
| 57 | }
|
---|
| 58 | } else {
|
---|
| 59 | double maxScale = this.mv.getMaxScale();
|
---|
[12537] | 60 | double scale = maxScale/Math.pow(ZOOM_STEP, getValue());
|
---|
[9818] | 61 | double snapped = mv.scaleFloor(scale);
|
---|
| 62 | mv.zoomTo(this.mv.getCenter(), snapped);
|
---|
| 63 | }
|
---|
[13201] | 64 | zoomChanged();
|
---|
[1169] | 65 | }
|
---|
| 66 |
|
---|
[6084] | 67 | @Override
|
---|
[1169] | 68 | public String helpTopic() {
|
---|
[3754] | 69 | return ht("/MapView/Slider");
|
---|
[1169] | 70 | }
|
---|
[2512] | 71 | }
|
---|