package com.revolsys.swing.map.component;
import java.awt.Dimension;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.border.BevelBorder;
import com.revolsys.swing.map.Viewport2D;
import com.revolsys.util.Property;
public class MapScale extends JLabel implements PropertyChangeListener {
private static final long serialVersionUID = 1L;
public static String formatScale(final Object scale) {
double scaleDouble;
if (scale instanceof Number) {
final Number number = (Number)scale;
scaleDouble = number.doubleValue();
if (scaleDouble <= 0 || number.longValue() == Long.MAX_VALUE
|| scaleDouble == Double.MAX_VALUE) {
return "Unlimited";
} else if (Double.isNaN(scaleDouble) || Double.isInfinite(scaleDouble)) {
return "Unknown";
}
} else {
if (scale == null) {
return "Unknown";
} else {
final String string = scale.toString();
if (Property.hasValue(string)) {
return string;
} else {
return "Unknown";
}
}
}
return "1:" + getFormat().format(scaleDouble);
}
public static DecimalFormat getFormat() {
final DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setGroupingSeparator(' ');
final DecimalFormat format = new DecimalFormat("#,###");
format.setDecimalFormatSymbols(formatSymbols);
return format;
}
private final Viewport2D viewport;
public MapScale(final Viewport2D viewport) {
this.viewport = viewport;
setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
setPreferredSize(new Dimension(100, 20));
Property.addListener(viewport, "scale", this);
setToolTipText("Map Scale");
}
@Override
public void propertyChange(final PropertyChangeEvent event) {
if ("scale".equals(event.getPropertyName())) {
final double scale = this.viewport.getScale();
setText(formatScale(scale));
}
}
}