Ticket #473: MakeSliderMoreFineGrained.patch

File MakeSliderMoreFineGrained.patch, 2.8 KB (added by xeen, 15 years ago)

Make slider more fine grained and fix other bugs

  • src/org/openstreetmap/josm/gui/MapSlider.java

    diff -u -r -N -x .svn orig/src/org/openstreetmap/josm/gui/MapSlider.java trunk/src/org/openstreetmap/josm/gui/MapSlider.java
    old new  
    11// License: GPL. Copyright 2007 by Immanuel Scholz and others
    22package org.openstreetmap.josm.gui;
    33
    4 import java.awt.event.MouseAdapter;
    5 import java.awt.event.MouseEvent;
    64import java.beans.PropertyChangeEvent;
    75import java.beans.PropertyChangeListener;
    86
     
    1614class MapSlider extends JSlider implements PropertyChangeListener, ChangeListener, Helpful {
    1715
    1816    private final MapView mv;
    19     boolean clicked = false;
     17    boolean preventChange = false;
    2018
    2119    public MapSlider(MapView mv) {
    22         super(0, 20);
     20        super(35, 150);
    2321        setOpaque(false);
    2422        this.mv = mv;
    25         addMouseListener(new MouseAdapter(){
    26             @Override public void mousePressed(MouseEvent e) {
    27                 clicked = true;
    28             }
    29             @Override public void mouseReleased(MouseEvent e) {
    30                 clicked = false;
    31             }
    32         });
    3323        mv.addPropertyChangeListener("scale", this);
    3424        addChangeListener(this);
    3525    }
    3626
    3727    public void propertyChange(PropertyChangeEvent evt) {
    38         if (!getModel().getValueIsAdjusting())
    39             setValue(this.mv.zoom());
     28        if (getModel().getValueIsAdjusting()) return;
     29       
     30        double sizex = this.mv.scale * this.mv.getWidth();
     31        double sizey = this.mv.scale * this.mv.getHeight();
     32        for (int zoom = 0; zoom <= 150; zoom++, sizex *= 1.1, sizey *= 1.1) {
     33            if (sizex > this.mv.world.east() || sizey > this.mv.world.north()) {
     34                preventChange=true;
     35                setValue(zoom);
     36                preventChange=false;
     37                break;
     38            }
     39        }
    4040    }
    4141
    4242    public void stateChanged(ChangeEvent e) {
    43         if (!clicked)
    44             return;
     43        if (preventChange) return;
    4544        EastNorth pos = MapView.world;
    46         for (int zoom = 0; zoom < getValue(); ++zoom)
    47             pos = new EastNorth(pos.east()/2, pos.north()/2);
     45        for (int zoom = 0; zoom < getValue(); zoom++)
     46            pos = new EastNorth(pos.east()/1.1, pos.north()/1.1);
    4847        if (this.mv.getWidth() < this.mv.getHeight())
    49             this.mv.zoomTo(this.mv.center, pos.east()*2/(this.mv.getWidth()-20));
     48            this.mv.zoomTo(this.mv.center, pos.east()/(this.mv.getWidth()-20));
    5049        else
    51             this.mv.zoomTo(this.mv.center, pos.north()*2/(this.mv.getHeight()-20));
     50            this.mv.zoomTo(this.mv.center, pos.north()/(this.mv.getHeight()-20));
    5251    }
    5352
    5453    public String helpTopic() {