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}