X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=altosuilib%2FAltosUIMap.java;h=58371f05a090d892f88bc4f74ade73763a00039b;hb=3af81a45be69b4693396de4a5e2c386be566b933;hp=6b78c35a5f5b41d2ee14d12d06df6dea2df59beb;hpb=b13893245e8c66b48e23bb2005ef6ce46e69744f;p=fw%2Faltos diff --git a/altosuilib/AltosUIMap.java b/altosuilib/AltosUIMap.java index 6b78c35a..58371f05 100644 --- a/altosuilib/AltosUIMap.java +++ b/altosuilib/AltosUIMap.java @@ -16,7 +16,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_13; +package org.altusmetrum.altosuilib_14; import java.awt.*; import java.awt.event.*; @@ -28,7 +28,7 @@ import java.awt.geom.*; import java.util.*; import java.util.concurrent.*; import javax.imageio.*; -import org.altusmetrum.altoslib_13.*; +import org.altusmetrum.altoslib_14.*; public class AltosUIMap extends JComponent implements AltosFlightDisplay, AltosMapInterface { @@ -62,6 +62,28 @@ public class AltosUIMap extends JComponent implements AltosFlightDisplay, AltosM g.drawOval((int)pt.x-5, (int)pt.y-5, 10, 10); g.drawOval((int)pt.x-20, (int)pt.y-20, 40, 40); g.drawOval((int)pt.x-35, (int)pt.y-35, 70, 70); + + if (label != null) { + Rectangle2D bounds; + bounds = line_font.getStringBounds(label, g.getFontRenderContext()); + float x = (float) pt.x; + float y = (float) pt.y + (float) bounds.getHeight() / 2.0f; + + g.setFont(line_font); + g.setColor(Color.WHITE); + for (int dy = -2; dy <= 2; dy += 2) + for (int dx = -2; dx <= 2; dx += 2) + g.drawString(label, x + dx, y + dy); + if (0 <= state && state < AltosUIMap.stateColors.length) + g.setColor(AltosUIMap.stateColors[state]); + else + g.setColor(AltosUIMap.stateColors[AltosLib.ao_flight_invalid]); + g.drawString(label, x, y); + } + } + + MapMark(double lat, double lon, int state, String label) { + super(lat, lon, state, label); } MapMark(double lat, double lon, int state) { @@ -117,6 +139,8 @@ public class AltosUIMap extends JComponent implements AltosFlightDisplay, AltosM } String pos(double p, String pos, String neg) { + if (p == AltosLib.MISSING) + return ""; String h = pos; if (p < 0) { h = neg; @@ -127,25 +151,44 @@ public class AltosUIMap extends JComponent implements AltosFlightDisplay, AltosM return String.format("%s %4d° %9.6f'", h, deg, min); } + String height(double h, String label) { + if (h == AltosLib.MISSING) + return ""; + return String.format(" %s%s", + AltosConvert.height.show(6, h), + label); + } + + String speed(double s, String label) { + if (s == AltosLib.MISSING) + return ""; + return String.format(" %s%s", + AltosConvert.speed.show(6, s), + label); + } + public void mouseMoved(MouseEvent e) { AltosMapPathPoint point = map.nearest(e.getPoint().x, e.getPoint().y); - if (nearest_mark == null) - nearest_mark = map.add_mark(point.lat_lon.lat, - point.lat_lon.lon, - point.state); - else { - nearest_mark.lat_lon.lat = point.lat_lon.lat; - nearest_mark.lat_lon.lon = point.lat_lon.lon; - nearest_mark.state = point.state; - } if (point != null) { - nearest_label.setText(String.format("Time: %9.2f Position: %s %s", + if (nearest_mark == null) + nearest_mark = map.add_mark(point.gps.lat, + point.gps.lon, + point.state); + else { + nearest_mark.lat_lon.lat = point.gps.lat; + nearest_mark.lat_lon.lon = point.gps.lon; + nearest_mark.state = point.state; + } + nearest_label.setText(String.format("%9.2f sec %s%s%s%s", point.time, - pos(point.lat_lon.lat, + pos(point.gps.lat, "N", "S"), - pos(point.lat_lon.lon, - "E", "W"))); + pos(point.gps.lon, + "E", "W"), + height(point.gps_height, ""), + speed(point.gps.ground_speed, "(h)"), + speed(point.gps.climb_rate, "(v)"))); } else { nearest_label.setText(""); } @@ -256,7 +299,7 @@ public class AltosUIMap extends JComponent implements AltosFlightDisplay, AltosM g.setStroke(new BasicStroke(stroke_width, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND)); for (AltosMapPathPoint point : points) { - Point2D.Double cur = point2d(t.screen(point.lat_lon)); + Point2D.Double cur = point2d(t.screen(point.gps.lat, point.gps.lon)); if (prev != null) { Line2D.Double line = new Line2D.Double (prev, cur); Rectangle bounds = line.getBounds(); @@ -382,6 +425,10 @@ public class AltosUIMap extends JComponent implements AltosFlightDisplay, AltosM return new MapMark(lat, lon, state); } + public AltosMapMark new_mark(double lat, double lon, int state, String label) { + return new MapMark(lat, lon, state, label); + } + public AltosMapTile new_tile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size, int scale) { return new MapTile(cache, upper_left, center, zoom, maptype, px_size, scale); } @@ -455,6 +502,10 @@ public class AltosUIMap extends JComponent implements AltosFlightDisplay, AltosM map.add_mark(lat, lon, status); } + public void add_mark(double lat, double lon, int status, String label) { + map.add_mark(lat, lon, status, label); + } + public void clear_marks() { map.clear_marks(); } @@ -468,8 +519,8 @@ public class AltosUIMap extends JComponent implements AltosFlightDisplay, AltosM map.show(state, listener_state); } - public void show(AltosGPS gps, double time, int state) { - map.show(gps, time, state); + public void show(AltosGPS gps, double time, int state, double gps_height) { + map.show(gps, time, state, gps_height); } public String getName() {