package aimax.osm.gui.swing.viewer; import java.text.DecimalFormat; import java.util.List; import javax.swing.JTextField; import aimax.osm.data.MapEvent; import aimax.osm.data.MapEventListener; import aimax.osm.data.OsmMap; import aimax.osm.data.Position; import aimax.osm.data.entities.MapNode; import aimax.osm.data.entities.Track; import aimax.osm.viewer.MapViewEvent; import aimax.osm.viewer.MapViewEventListener; /** * Text field which informs the user about results of the last map interaction. * @author Ruediger Lunde * */ public class InfoField extends JTextField { private static final long serialVersionUID = 1L; private MapEventHandler eventHandler; public InfoField(MapViewPane view, OsmMap map) { super(20); setEditable(false); eventHandler = new MapEventHandler(this, view, map); } public MapEventListener getMapDataEventListener() { return eventHandler; } public MapViewEventListener getMapViewEventListener() { return eventHandler; } /** * Updates the info field based on events sent by the MapViewPane. * * @author Ruediger Lunde */ static class MapEventHandler implements MapViewEventListener, MapEventListener { private JTextField infoField; private MapViewPane view; private OsmMap map; public MapEventHandler(JTextField infoField, MapViewPane view, OsmMap map) { this.infoField = infoField; this.map = map; this.view = view; } @Override public void eventHappened(MapViewEvent event) { if (event.getType() == MapViewEvent.Type.ZOOM) { if (map.getMarkers().isEmpty()) { DecimalFormat f = new DecimalFormat("#0.0"); double scale = view.getTransformer().computeScale(); String text = "Scale: 1 / "; if (scale <= 1e-4) text += (int) (0.001f / scale) + " 000"; else text += (int) (1f / scale) + ""; text += " Display Factor: " + f.format(view.getRenderer().getDisplayFactor()); // text += " (" + (int) // view.getTransformer().getDotsPerDeg() + ")"; infoField.setText(text); } } } @Override public void eventHappened(MapEvent event) { if (event.getType() == MapEvent.Type.MAP_NEW) { infoField.setText("Ways: " + map.getWayCount() + ", Nodes: " + map.getNodeCount() + ", POIs: " + map.getPoiCount()); } else if (event.getType() == MapEvent.Type.MARKER_ADDED) { List<MapNode> nodes = map.getMarkers(); DecimalFormat f1 = new DecimalFormat("#0.00"); MapNode marker = nodes.get(nodes.size() - 1); infoField.setText("Marker " + marker.getName() + ": Lat " + f1.format(marker.getLat()) + "; Lon " + f1.format(marker.getLon())); } else if (event.getType() == MapEvent.Type.TRACK_MODIFIED) { Track track = map.getTrack(event.getObjId()); if (track != null) { List<MapNode> nodes = track.getNodes(); DecimalFormat f1 = new DecimalFormat("#0.00"); double km = Position.getTrackLengthKM(nodes); String info = track.getName() + ": Length " + f1.format(km) + " km"; if (nodes.size() == 2) { DecimalFormat f2 = new DecimalFormat("#000"); MapNode m1 = nodes.get(nodes.size() - 2); MapNode m2 = nodes.get(nodes.size() - 1); int course = new Position(m1).getCourseTo(m2); info += "; Direction " + f2.format(course); } infoField.setText(info); } } else { infoField.setText(""); } } } }