source: josm/trunk/src/org/openstreetmap/josm/gui/MapSlider.java@ 12153

Last change on this file since 12153 was 10078, checked in by wiktorn, 8 years ago

New nicer map slider.

Patch submitted by: michael2402

Closes: #12644

  • Property svn:eol-style set to native
File size: 2.1 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5
6import java.awt.Dimension;
7import java.beans.PropertyChangeEvent;
8import java.beans.PropertyChangeListener;
9
10import javax.swing.JSlider;
11import javax.swing.UIManager;
12import javax.swing.event.ChangeEvent;
13import javax.swing.event.ChangeListener;
14
15import org.openstreetmap.josm.gui.help.Helpful;
16
17class MapSlider extends JSlider implements PropertyChangeListener, ChangeListener, Helpful {
18
19 private static final double zoomStep = 1.1;
20 private final MapView mv;
21 private boolean preventChange;
22 private int lastValue;
23
24 MapSlider(MapView mv) {
25 super(0, 160);
26 setOpaque(false);
27 this.mv = mv;
28 mv.addPropertyChangeListener("scale", this);
29 addChangeListener(this);
30 // Call this manually once so it gets setup correctly
31 propertyChange(null);
32 int w = UIManager.getDefaults().getInt("Slider.thumbWidth") + 150;
33 setPreferredSize(new Dimension(w, 27));
34 }
35
36 @Override
37 public void propertyChange(PropertyChangeEvent evt) {
38 double maxScale = this.mv.getMaxScale();
39 int zoom = (int) Math.round(Math.log(maxScale/mv.getScale())/Math.log(zoomStep));
40 preventChange = true;
41 setValue(zoom);
42 lastValue = zoom;
43 preventChange = false;
44 }
45
46 @Override
47 public void stateChanged(ChangeEvent e) {
48 if (preventChange) return;
49
50 if (!getModel().getValueIsAdjusting() && mv.getNativeScaleLayer() != null) {
51 if (getValue() < lastValue) {
52 mv.zoomOut();
53 } else if (getValue() > lastValue) {
54 mv.zoomIn();
55 }
56 } else {
57 double maxScale = this.mv.getMaxScale();
58 double scale = maxScale/Math.pow(zoomStep, getValue());
59 double snapped = mv.scaleFloor(scale);
60 mv.zoomTo(this.mv.getCenter(), snapped);
61 }
62 propertyChange(null);
63 }
64
65 @Override
66 public String helpTopic() {
67 return ht("/MapView/Slider");
68 }
69}
Note: See TracBrowser for help on using the repository browser.