From c4f037026a8db67afea68185926fd25041ab9f9c Mon Sep 17 00:00:00 2001
From: Anders Arnholm <Anders@Arnholm.se>
Date: Tue, 26 Apr 2011 21:50:49 +0200
Subject: [PATCH] Show depth if in gpx files.

Signed-off-by: Anders Arnholm <Anders@Arnholm.se>
---
 src/org/openstreetmap/josm/gui/layer/GpxLayer.java |   40 ++++++++++++++++++--
 .../josm/gui/preferences/DrawingPreference.java    |    8 ++++
 src/org/openstreetmap/josm/io/GpxReader.java       |   12 +++++-
 3 files changed, 54 insertions(+), 6 deletions(-)

diff --git a/src/org/openstreetmap/josm/gui/layer/GpxLayer.java b/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
index 83e9df8..dc4bd0b 100644
--- a/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
+++ b/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
@@ -89,6 +89,7 @@ public class GpxLayer extends Layer {
     private Color computeCacheColorUsed;
     private colorModes computeCacheColored;
     private int computeCacheColorTracksTune;
+    private boolean computeCacheDepthUsed;
     private boolean isLocalFile;
 
     private final List<GpxTrack> lastTracks = new ArrayList<GpxTrack>(); // List of tracks at last paint
@@ -329,8 +330,8 @@ public class GpxLayer extends Layer {
         lastTracks.addAll(data.tracks);
 
         g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
-        Main.pref.getBoolean("mappaint.gpx.use-antialiasing", false) ?
-                RenderingHints.VALUE_ANTIALIAS_ON : RenderingHints.VALUE_ANTIALIAS_OFF);
+                Main.pref.getBoolean("mappaint.gpx.use-antialiasing", false) ?
+                        RenderingHints.VALUE_ANTIALIAS_ON : RenderingHints.VALUE_ANTIALIAS_OFF);
 
         /****************************************************************
          ********** STEP 1 - GET CONFIG VALUES **************************
@@ -361,6 +362,7 @@ public class GpxLayer extends Layer {
         // paint large dots for points
         boolean large = Main.pref.getBoolean("draw.rawgps.large");
         boolean hdopcircle = Main.pref.getBoolean("draw.rawgps.hdopcircle", true);
+        boolean depth = Main.pref.getBoolean("draw.rawgps.depth",false);
         // color the lines
         colorModes colored = colorModes.none;
         try {
@@ -383,16 +385,18 @@ public class GpxLayer extends Layer {
          ********** STEP 2a - CHECK CACHE VALIDITY **********************
          ****************************************************************/
         if ((computeCacheMaxLineLengthUsed != maxLineLength) || (!neutralColor.equals(computeCacheColorUsed))
-                || (computeCacheColored != colored) || (computeCacheColorTracksTune != colorTracksTune)) {
+                || (computeCacheColored != colored) || (computeCacheColorTracksTune != colorTracksTune
+                        || (computeCacheDepthUsed != depth))) {
             // System.out.println("(re-)computing gpx line styles, reason: CCIS=" +
             // computeCacheInSync + " CCMLLU=" + (computeCacheMaxLineLengthUsed != maxLineLength) +
             // " CCCU=" + (!neutralColor.equals(computeCacheColorUsed)) + " CCC=" +
-            // (computeCacheColored != colored));
+            // (computeCacheColored != colored) + " CCD=" + (computeCacheDepthUsed != depth));
             computeCacheMaxLineLengthUsed = maxLineLength;
             computeCacheInSync = false;
             computeCacheColorUsed = neutralColor;
             computeCacheColored = colored;
             computeCacheColorTracksTune = colorTracksTune;
+            computeCacheDepthUsed = depth;
         }
 
         /****************************************************************
@@ -621,6 +625,34 @@ public class GpxLayer extends Layer {
             } // end for segment
         } // end if large
 
+        /****************************************************************
+         ********** STEP 3g - Display depth?                     ********
+         ****************************************************************/
+        if (depth) {
+            Point old = null;
+            for (Collection<WayPoint> segment : visibleSegments) {
+                for (WayPoint trkPnt : segment) {
+                    LatLon c = trkPnt.getCoor();
+                    if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
+                        continue;
+                    }
+                    Point screen = mv.getPoint(trkPnt.getEastNorth());
+                    if (trkPnt.drawLine) {
+                        String pDepth = trkPnt.getString("Depth");
+                        if(pDepth != null) {
+                            // skip points that are on the same screenposition
+                            if (old != null && ((old.x != screen.x) || (old.y != screen.y))) {
+                                g.setColor(trkPnt.customColoring);
+                                g.drawString(pDepth, screen.x+15, screen.y);
+                            }
+                        }
+                    }
+                    old = screen;
+                } // end for trkpnt
+            } // end for segment
+        } // end if lines
+
+
         // Long duration = System.currentTimeMillis() - startTime;
         // System.out.println(duration);
     } // end paint
diff --git a/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java b/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java
index 785026d..69852ba 100644
--- a/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java
+++ b/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java
@@ -42,6 +42,7 @@ public class DrawingPreference implements PreferenceSetting {
     private JCheckBox forceRawGpsLines = new JCheckBox(tr("Force lines if no segments imported."));
     private JCheckBox largeGpsPoints = new JCheckBox(tr("Draw large GPS points."));
     private JCheckBox hdopCircleGpsPoints = new JCheckBox(tr("Draw a circle form HDOP value."));
+    private JCheckBox showRawGpsDepth = new JCheckBox(tr("Show depth form gpx extention."));
     private ButtonGroup colorGroup;
     private JRadioButton colorTypeVelocity = new JRadioButton(tr("Velocity (red = slow, green = fast)"));
     private JRadioButton colorTypeDilution = new JRadioButton(tr("Dilution of Position (red = high, green = low, if available)"));
@@ -160,6 +161,12 @@ public class DrawingPreference implements PreferenceSetting {
         hdopCircleGpsPoints.setToolTipText(tr("Draw a circle form HDOP value."));
         panel.add(hdopCircleGpsPoints, GBC.eop().insets(20,0,0,0));
 
+        // Show gpxx:Depth
+        showRawGpsDepth.setSelected(Main.pref.getBoolean("draw.rawgps.depth", false));
+        showRawGpsDepth.setToolTipText(tr("Show Depth form gpxx:Depth on tracks."));
+        panel.add(showRawGpsDepth, GBC.eop().insets(20,0,0,0));
+
+
         // largeGpsPoints
         largeGpsPoints.setSelected(Main.pref.getBoolean("draw.rawgps.large", false));
         largeGpsPoints.setToolTipText(tr("Draw larger dots for the GPS points."));
@@ -305,6 +312,7 @@ public class DrawingPreference implements PreferenceSetting {
         int ccti=colorTypeVelocityTune.getSelectedIndex();
         Main.pref.putInteger("draw.rawgps.colorTracksTune", ccti==2 ? 10 : (ccti==1 ? 20 : 45));
         Main.pref.put("draw.rawgps.hdopcircle", hdopCircleGpsPoints.isSelected());
+        Main.pref.put("draw.rawgps.depth", showRawGpsDepth.isSelected());
         Main.pref.put("draw.rawgps.large", largeGpsPoints.isSelected());
         Main.pref.put("draw.segment.direction", directionHint.isSelected());
         Main.pref.put("draw.segment.head_only", headArrow.isSelected());
diff --git a/src/org/openstreetmap/josm/io/GpxReader.java b/src/org/openstreetmap/josm/io/GpxReader.java
index 83d0d49..8e18da3 100644
--- a/src/org/openstreetmap/josm/io/GpxReader.java
+++ b/src/org/openstreetmap/josm/io/GpxReader.java
@@ -40,7 +40,7 @@ public class GpxReader {
      * The resulting gpx data
      */
     public GpxData data;
-    private enum State { init, metadata, wpt, rte, trk, ext, author, link, trkseg, copyright}
+    private enum State { init, metadata, wpt, rte, trk, ext, author, link, trkseg, copyright, wptext}
     private InputSource inputSource;
 
     private class Parser extends DefaultHandler {
@@ -163,7 +163,7 @@ public class GpxReader {
                     currentLink = new GpxLink(atts.getValue("href"));
                 } else if (qName.equals("extensions")) {
                     states.push(currentState);
-                    currentState = State.ext;
+                    currentState = State.wptext;
                 }
                 break;
             case rte:
@@ -323,6 +323,14 @@ public class GpxReader {
                     currentState = states.pop();
                 }
                 break;
+            case wptext:
+                if (qName.equals("extensions")) {
+                    currentState = states.pop();
+                }
+                if (qName.equals("Depth")) {
+                    currentWayPoint.attr.put(qName, accumulator.toString());
+                }
+                break;
             default:
                 if (qName.equals("wpt")) {
                     currentState = states.pop();
-- 
1.7.4.1

