001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui;
003
004import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
005import static org.openstreetmap.josm.tools.I18n.marktr;
006
007import java.awt.Color;
008import java.awt.Graphics;
009import java.awt.geom.Rectangle2D;
010
011import javax.accessibility.Accessible;
012import javax.accessibility.AccessibleContext;
013import javax.accessibility.AccessibleValue;
014import javax.swing.JComponent;
015
016import org.openstreetmap.josm.Main;
017import org.openstreetmap.josm.gui.help.Helpful;
018
019/**
020 * Map scale bar, displaying the distance in meter that correspond to 100 px on screen.
021 * @since 115
022 */
023public class MapScaler extends JComponent implements Helpful, Accessible {
024
025    private final NavigatableComponent mv;
026
027    private static final int PADDING_RIGHT = 100;
028
029    /**
030     * Constructs a new {@code MapScaler}.
031     * @param mv map view
032     */
033    public MapScaler(NavigatableComponent mv) {
034        this.mv = mv;
035        setSize(100+PADDING_RIGHT, 30);
036        setOpaque(false);
037    }
038
039    @Override
040    public void paint(Graphics g) {
041        String text = mv.getDist100PixelText();
042        Rectangle2D bound = g.getFontMetrics().getStringBounds(text, g);
043        g.setColor(getColor());
044        g.drawLine(0, 5, 99, 5);
045        g.drawLine(0, 0, 0, 10);
046        g.drawLine(99, 0, 99, 10);
047        g.drawLine(49, 3, 49, 7);
048        g.drawLine(24, 3, 24, 7);
049        g.drawLine(74, 3, 74, 7);
050        g.drawString(text, (int) (100-bound.getWidth()/2), 23);
051        g.drawString("0", 0, 23);
052    }
053
054    /**
055     * Returns the color of map scaler.
056     * @return the color of map scaler
057     */
058    public static Color getColor() {
059        return Main.pref.getColor(marktr("scale"), Color.white);
060    }
061
062    @Override
063    public String helpTopic() {
064        return ht("/MapView/Scaler");
065    }
066
067    @Override
068    public AccessibleContext getAccessibleContext() {
069        if (accessibleContext == null) {
070            accessibleContext = new AccessibleMapScaler();
071        }
072        return accessibleContext;
073    }
074
075    class AccessibleMapScaler extends AccessibleJComponent implements AccessibleValue {
076
077        @Override
078        public Number getCurrentAccessibleValue() {
079            return mv.getDist100Pixel();
080        }
081
082        @Override
083        public boolean setCurrentAccessibleValue(Number n) {
084            return false;
085        }
086
087        @Override
088        public Number getMinimumAccessibleValue() {
089            return null;
090        }
091
092        @Override
093        public Number getMaximumAccessibleValue() {
094            return null;
095        }
096    }
097}