Changeset 15502 in josm
- Timestamp:
- 2019-11-03T22:11:11+01:00 (5 years ago)
- Location:
- trunk
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java
r15497 r15502 73 73 * A list of tracks this file consists of 74 74 */ 75 private final ArrayList<GpxTrack> privateTracks = new ArrayList<>(); 75 private final ArrayList<IGpxTrack> privateTracks = new ArrayList<>(); 76 76 /** 77 77 * GPX routes in this file … … 100 100 * @see #getTracks() 101 101 */ 102 public final Collection<GpxTrack> tracks = new ListeningCollection<GpxTrack>(privateTracks, this::invalidate) { 102 public final Collection<IGpxTrack> tracks = new ListeningCollection<IGpxTrack>(privateTracks, this::invalidate) { 103 103 104 104 @Override 105 protected void removed(GpxTrack cursor) { 105 protected void removed(IGpxTrack cursor) { 106 106 cursor.removeListener(proxy); 107 107 super.removed(cursor); … … 109 109 110 110 @Override 111 protected void added(GpxTrack cursor) { 111 protected void added(IGpxTrack cursor) { 112 112 super.added(cursor); 113 113 cursor.addListener(proxy); … … 174 174 175 175 if (cutOverlapping) { 176 for (GpxTrack trk : other.privateTracks) { 176 for (IGpxTrack trk : other.privateTracks) { 177 177 cutOverlapping(trk, connect); 178 178 } … … 186 186 } 187 187 188 private void cutOverlapping(GpxTrack trk, boolean connect) { 188 private void cutOverlapping(IGpxTrack trk, boolean connect) { 189 189 List<IGpxTrackSegment> segsOld = new ArrayList<>(trk.getSegments()); 190 190 List<IGpxTrackSegment> segsNew = new ArrayList<>(); … … 366 366 if (segSpans == null) { 367 367 segSpans = new ArrayList<>(); 368 for (GpxTrack trk : privateTracks) { 368 for (IGpxTrack trk : privateTracks) { 369 369 for (IGpxTrackSegment seg : trk.getSegments()) { 370 370 GpxTrackSegmentSpan s = GpxTrackSegmentSpan.tryGetFromSegment(seg); … … 392 392 * @return The tracks. 393 393 */ 394 public synchronized Collection<GpxTrack> getTracks() { 394 public synchronized Collection<IGpxTrack> getTracks() { 395 395 return Collections.unmodifiableCollection(privateTracks); 396 396 } … … 418 418 * @since 12156 419 419 */ 420 public synchronized void addTrack(GpxTrack track) { 420 public synchronized void addTrack(IGpxTrack track) { 421 421 if (privateTracks.stream().anyMatch(t -> t == track)) { 422 422 throw new IllegalArgumentException(MessageFormat.format("The track was already added to this data: {0}", track)); … … 432 432 * @since 12156 433 433 */ 434 public synchronized void removeTrack(GpxTrack track) { 434 public synchronized void removeTrack(IGpxTrack track) { 435 435 if (!privateTracks.removeIf(t -> t == track)) { 436 436 throw new IllegalArgumentException(MessageFormat.format("The track was not in this data: {0}", track)); … … 626 626 * @return The stream 627 627 * @see #getTracks() 628 * @see GpxTrack#getSegments() 628 * @see IGpxTrack#getSegments() 629 629 * @see IGpxTrackSegment#getWayPoints() 630 630 * @since 12156 … … 698 698 } 699 699 } 700 for (GpxTrack trk : privateTracks) { 700 for (IGpxTrack trk : privateTracks) { 701 701 Bounds trkBounds = trk.getBounds(); 702 702 if (trkBounds != null) { … … 716 716 */ 717 717 public synchronized double length() { 718 return privateTracks.stream().mapToDouble(GpxTrack::length).sum(); 718 return privateTracks.stream().mapToDouble(IGpxTrack::length).sum(); 719 719 } 720 720 … … 724 724 * @return minimum and maximum dates in array of 2 elements 725 725 */ 726 public static Date[] getMinMaxTimeForTrack(GpxTrack trk) { 726 public static Date[] getMinMaxTimeForTrack(IGpxTrack trk) { 727 727 final LongSummaryStatistics statistics = trk.getSegments().stream() 728 728 .flatMap(seg -> seg.getWayPoints().stream()) … … 793 793 double py = p.north(); 794 794 double rx = 0.0, ry = 0.0, sx, sy, x, y; 795 for (GpxTrack track : privateTracks) { 795 for (IGpxTrack track : privateTracks) { 796 796 for (IGpxTrackSegment seg : track.getSegments()) { 797 797 WayPoint r = null; … … 907 907 public static class LinesIterator implements Iterator<Line> { 908 908 909 private Iterator<GpxTrack> itTracks; 909 private Iterator<IGpxTrack> itTracks; 910 910 private int idxTracks; 911 911 private Iterator<IGpxTrackSegment> itTrackSegments; … … 915 915 private final boolean[] trackVisibility; 916 916 private Map<String, Object> trackAttributes; 917 private GpxTrack curTrack; 917 private IGpxTrack curTrack; 918 918 919 919 /** -
trunk/src/org/openstreetmap/josm/data/gpx/GpxImageCorrelation.java
r15496 r15502 38 38 List<List<List<WayPoint>>> trks = new ArrayList<>(); 39 39 40 for (GpxTrack trk : selectedGpx.tracks) { 40 for (IGpxTrack trk : selectedGpx.tracks) { 41 41 List<List<WayPoint>> segs = new ArrayList<>(); 42 42 for (IGpxTrackSegment seg : trk.getSegments()) { -
trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
r15497 r15502 32 32 import org.openstreetmap.josm.data.gpx.GpxData; 33 33 import org.openstreetmap.josm.data.gpx.GpxData.GpxDataChangeListener; 34 import org.openstreetmap.josm.data.gpx.GpxTrack; 34 import org.openstreetmap.josm.data.gpx.IGpxTrack; 35 35 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor; 36 36 import org.openstreetmap.josm.data.projection.Projection; … … 126 126 public void setColor(Color color) { 127 127 data.beginUpdate(); 128 for (GpxTrack trk : data.getTracks()) { 128 for (IGpxTrack trk : data.getTracks()) { 129 129 trk.setColor(color); 130 130 } … … 143 143 * @return The timespan as a string 144 144 */ 145 public static String getTimespanForTrack(GpxTrack trk) { 145 public static String getTimespanForTrack(IGpxTrack trk) { 146 146 Date[] bounds = GpxData.getMinMaxTimeForTrack(trk); 147 147 String ts = ""; … … 201 201 .append("</td></tr></thead>"); 202 202 203 for (GpxTrack trk : data.getTracks()) { 203 for (IGpxTrack trk : data.getTracks()) { 204 204 info.append("<tr><td>"); 205 205 if (trk.getAttributes().containsKey(GpxConstants.GPX_NAME)) { … … 330 330 long from = fromDate.getTime(); 331 331 long to = toDate.getTime(); 332 for (GpxTrack trk : data.getTracks()) { 332 for (IGpxTrack trk : data.getTracks()) { 333 333 Date[] t = GpxData.getMinMaxTimeForTrack(trk); 334 334 -
trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
r15498 r15502 72 72 import org.openstreetmap.josm.data.gpx.GpxTimeOffset; 73 73 import org.openstreetmap.josm.data.gpx.GpxTimezone; 74 import org.openstreetmap.josm.data.gpx.GpxTrack; 74 import org.openstreetmap.josm.data.gpx.IGpxTrack; 75 75 import org.openstreetmap.josm.data.gpx.IGpxTrackSegment; 76 76 import org.openstreetmap.josm.data.gpx.WayPoint; … … 1263 1263 long firstGPXDate = -1; 1264 1264 // Finds first GPX point 1265 outer: for (GpxTrack trk : gpx.tracks) { 1265 outer: for (IGpxTrack trk : gpx.tracks) { 1266 1266 for (IGpxTrackSegment segment : trk.getSegments()) { 1267 1267 for (WayPoint curWp : segment.getWayPoints()) { -
trunk/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java
r15496 r15502 35 35 import javax.swing.table.DefaultTableModel; 36 36 import javax.swing.table.TableCellRenderer; 37 import javax.swing.table.TableModel; 37 38 import javax.swing.table.TableRowSorter; 38 39 … … 40 41 import org.openstreetmap.josm.data.SystemOfMeasurement; 41 42 import org.openstreetmap.josm.data.gpx.GpxConstants; 42 import org.openstreetmap.josm.data.gpx.GpxTrack; 43 import org.openstreetmap.josm.data.gpx.IGpxTrack; 43 44 import org.openstreetmap.josm.gui.ExtendedDialog; 44 45 import org.openstreetmap.josm.gui.MainApplication; … … 119 120 Object[][] tracks = new Object[layer.data.tracks.size()][5]; 120 121 int i = 0; 121 for (GpxTrack trk : layer.data.tracks) { 122 for (IGpxTrack trk : layer.data.tracks) { 122 123 Map<String, Object> attr = trk.getAttributes(); 123 124 String name = (String) Optional.ofNullable(attr.get(GpxConstants.GPX_NAME)).orElse(""); … … 132 133 } 133 134 134 private void showColorDialog(List<GpxTrack> tracks) { 135 private void showColorDialog(List<IGpxTrack> tracks) { 135 136 Color cl = tracks.stream().filter(Objects::nonNull) 136 .map(GpxTrack::getColor).filter(Objects::nonNull) 137 .map(IGpxTrack::getColor).filter(Objects::nonNull) 137 138 .findAny().orElse(GpxDrawHelper.DEFAULT_COLOR_PROPERTY.get()); 138 139 JColorChooser c = new JColorChooser(cl); … … 171 172 final String[] headers = {tr("Name"), tr("Description"), tr("Timespan"), tr("Length"), tr("URL")}; 172 173 DefaultTableModel model = new DefaultTableModel(content, headers); 173 final JTable t = new JTable(model) { 174 @Override 175 public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { 176 Component c = super.prepareRenderer(renderer, row, col); 177 if (c instanceof JComponent) { 178 JComponent jc = (JComponent) c; 179 jc.setToolTipText(getValueAt(row, col).toString()); 180 if (content.length > row 181 && content[row].length > 5 182 && content[row][5] instanceof GpxTrack) { 183 Color color = ((GpxTrack) content[row][5]).getColor(); 184 if (color != null) { 185 double brightness = Math.sqrt(Math.pow(color.getRed(), 2) * .241 186 + Math.pow(color.getGreen(), 2) * .691 187 + Math.pow(color.getBlue(), 2) * .068); 188 if (brightness > 250) { 189 color = color.darker(); 190 } 191 if (isRowSelected(row)) { 192 jc.setBackground(color); 193 if (brightness <= 130) { 194 jc.setForeground(Color.WHITE); 195 } else { 196 jc.setForeground(Color.BLACK); 197 } 198 } else { 199 if (brightness > 200) { 200 color = color.darker(); //brightness >250 is darkened twice on purpose 201 } 202 jc.setForeground(color); 203 jc.setBackground(Color.WHITE); 204 } 205 } else { 206 jc.setForeground(Color.BLACK); 207 if (isRowSelected(row)) { 208 jc.setBackground(new Color(175, 210, 210)); 209 } else { 210 jc.setBackground(Color.WHITE); 211 } 212 } 213 } 214 } 215 return c; 216 } 217 218 @Override 219 public boolean isCellEditable(int rowIndex, int colIndex) { 220 return colIndex <= 1; 221 } 222 223 @Override 224 public void tableChanged(TableModelEvent e) { 225 super.tableChanged(e); 226 int col = e.getColumn(); 227 int row = e.getFirstRow(); 228 if (row >= 0 && row < content.length && col >= 0 && col <= 1) { 229 Object t = content[row][5]; 230 String val = (String) getValueAt(row, col); 231 if (t != null && t instanceof GpxTrack) { 232 GpxTrack trk = (GpxTrack) t; 233 if (col == 0) { 234 trk.put("name", val); 235 } else { 236 trk.put("desc", val); 237 } 238 } else { 239 throw new InvalidArgumentException("Invalid object in table, must be GpxTrack."); 240 } 241 } 242 } 243 }; 174 final GpxTrackTable t = new GpxTrackTable(content, model); 244 175 // define how to sort row 245 176 TableRowSorter<DefaultTableModel> rowSorter = new TableRowSorter<>(); … … 366 297 protected void buttonAction(int buttonIndex, ActionEvent evt) { 367 298 if (buttonIndex == 0) { 368 List<GpxTrack> trks = new ArrayList<>(); 299 List<IGpxTrack> trks = new ArrayList<>(); 369 300 for (int i : table.getSelectedRows()) { 370 301 Object trk = content[i][5]; 371 if (trk != null && trk instanceof GpxTrack) { 372 trks.add((GpxTrack) trk); 302 if (trk != null && trk instanceof IGpxTrack) { 303 trks.add((IGpxTrack) trk); 373 304 } 374 305 } … … 407 338 layer.setVisible(v == 2 || !s.isSelectionEmpty()); 408 339 } 340 341 private static class GpxTrackTable extends JTable { 342 final Object[][] content; 343 344 public GpxTrackTable(Object[][] content, TableModel model) { 345 super(model); 346 this.content = content; 347 } 348 349 @Override 350 public Component prepareRenderer(TableCellRenderer renderer, int row, int col) { 351 Component c = super.prepareRenderer(renderer, row, col); 352 if (c instanceof JComponent) { 353 JComponent jc = (JComponent) c; 354 jc.setToolTipText(getValueAt(row, col).toString()); 355 if (content.length > row 356 && content[row].length > 5 357 && content[row][5] instanceof IGpxTrack) { 358 Color color = ((IGpxTrack) content[row][5]).getColor(); 359 if (color != null) { 360 double brightness = Math.sqrt(Math.pow(color.getRed(), 2) * .241 361 + Math.pow(color.getGreen(), 2) * .691 362 + Math.pow(color.getBlue(), 2) * .068); 363 if (brightness > 250) { 364 color = color.darker(); 365 } 366 if (isRowSelected(row)) { 367 jc.setBackground(color); 368 if (brightness <= 130) { 369 jc.setForeground(Color.WHITE); 370 } else { 371 jc.setForeground(Color.BLACK); 372 } 373 } else { 374 if (brightness > 200) { 375 color = color.darker(); //brightness >250 is darkened twice on purpose 376 } 377 jc.setForeground(color); 378 jc.setBackground(Color.WHITE); 379 } 380 } else { 381 jc.setForeground(Color.BLACK); 382 if (isRowSelected(row)) { 383 jc.setBackground(new Color(175, 210, 210)); 384 } else { 385 jc.setBackground(Color.WHITE); 386 } 387 } 388 } 389 } 390 return c; 391 } 392 393 @Override 394 public boolean isCellEditable(int rowIndex, int colIndex) { 395 return colIndex <= 1; 396 } 397 398 @Override 399 public void tableChanged(TableModelEvent e) { 400 super.tableChanged(e); 401 int col = e.getColumn(); 402 int row = e.getFirstRow(); 403 if (row >= 0 && row < content.length && col >= 0 && col <= 1) { 404 Object t = content[row][5]; 405 String val = (String) getValueAt(row, col); 406 if (t != null && t instanceof IGpxTrack) { 407 IGpxTrack trk = (IGpxTrack) t; 408 if (col == 0) { 409 trk.put("name", val); 410 } else { 411 trk.put("desc", val); 412 } 413 } else { 414 throw new InvalidArgumentException("Invalid object in table, must be IGpxTrack."); 415 } 416 } 417 } 418 } 409 419 } -
trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java
r15496 r15502 8 8 import org.openstreetmap.josm.actions.DownloadAlongAction; 9 9 import org.openstreetmap.josm.data.gpx.GpxData; 10 import org.openstreetmap.josm.data.gpx.GpxTrack; 10 import org.openstreetmap.josm.data.gpx.IGpxTrack; 11 11 import org.openstreetmap.josm.data.gpx.IGpxTrackSegment; 12 12 import org.openstreetmap.josm.data.gpx.WayPoint; … … 60 60 Path2D gpxPath = new Path2D.Double(); 61 61 if (near == NEAR_TRACK || near == NEAR_BOTH) { 62 for (GpxTrack trk : data.tracks) { 62 for (IGpxTrack trk : data.tracks) { 63 63 for (IGpxTrackSegment segment : trk.getSegments()) { 64 64 boolean first = true; -
trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java
r15496 r15502 16 16 import org.openstreetmap.josm.data.coor.LatLon; 17 17 import org.openstreetmap.josm.data.gpx.GpxData; 18 import org.openstreetmap.josm.data.gpx.GpxTrack; 18 import org.openstreetmap.josm.data.gpx.IGpxTrack; 19 19 import org.openstreetmap.josm.data.gpx.IGpxTrackSegment; 20 20 import org.openstreetmap.josm.data.gpx.WayPoint; … … 92 92 PrecacheWmsTask createTask() { 93 93 List<LatLon> points = new ArrayList<>(); 94 for (GpxTrack trk : data.tracks) { 94 for (IGpxTrack trk : data.tracks) { 95 95 for (IGpxTrackSegment segment : trk.getSegments()) { 96 96 for (WayPoint p : segment.getWayPoints()) { -
trunk/src/org/openstreetmap/josm/gui/layer/gpx/ImportAudioAction.java
r15496 r15502 21 21 import org.openstreetmap.josm.data.gpx.GpxConstants; 22 22 import org.openstreetmap.josm.data.gpx.GpxData; 23 import org.openstreetmap.josm.data.gpx.GpxTrack; 23 import org.openstreetmap.josm.data.gpx.IGpxTrack; 24 24 import org.openstreetmap.josm.data.gpx.IGpxTrackSegment; 25 25 import org.openstreetmap.josm.data.gpx.WayPoint; … … 147 147 double firstTime = -1.0; 148 148 if (hasTracks) { 149 for (GpxTrack track : layer.data.tracks) { 149 for (IGpxTrack track : layer.data.tracks) { 150 150 for (IGpxTrackSegment seg : track.getSegments()) { 151 151 for (WayPoint w : seg.getWayPoints()) { … … 206 206 if (layer.data.tracks != null && Config.getPref().getBoolean("marker.audiofromnamedtrackpoints", false) 207 207 && !layer.data.tracks.isEmpty()) { 208 for (GpxTrack track : layer.data.tracks) { 208 for (IGpxTrack track : layer.data.tracks) { 209 209 for (IGpxTrackSegment seg : track.getSegments()) { 210 210 for (WayPoint w : seg.getWayPoints()) { … … 227 227 WayPoint w2 = null; 228 228 229 for (GpxTrack track : layer.data.tracks) { 229 for (IGpxTrack track : layer.data.tracks) { 230 230 for (IGpxTrackSegment seg : track.getSegments()) { 231 231 for (WayPoint w : seg.getWayPoints()) { … … 263 263 if ((Config.getPref().getBoolean("marker.audiofromstart") || waypoints.isEmpty()) && hasTracks) { 264 264 boolean gotOne = false; 265 for (GpxTrack track : layer.data.tracks) { 265 for (IGpxTrack track : layer.data.tracks) { 266 266 for (IGpxTrackSegment seg : track.getSegments()) { 267 267 for (WayPoint w : seg.getWayPoints()) { -
trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/PlayHeadMarker.java
r15496 r15502 18 18 import org.openstreetmap.josm.data.coor.EastNorth; 19 19 import org.openstreetmap.josm.data.coor.LatLon; 20 import org.openstreetmap.josm.data.gpx.GpxTrack; 20 import org.openstreetmap.josm.data.gpx.IGpxTrack; 21 21 import org.openstreetmap.josm.data.gpx.IGpxTrackSegment; 22 22 import org.openstreetmap.josm.data.gpx.WayPoint; … … 327 327 WayPoint w2 = null; 328 328 329 for (GpxTrack track : trackLayer.data.getTracks()) { 329 for (IGpxTrack track : trackLayer.data.getTracks()) { 330 330 for (IGpxTrackSegment trackseg : track.getSegments()) { 331 331 for (WayPoint w: trackseg.getWayPoints()) { -
trunk/src/org/openstreetmap/josm/io/GpxWriter.java
r15497 r15502 29 29 import org.openstreetmap.josm.data.gpx.GpxRoute; 30 30 import org.openstreetmap.josm.data.gpx.GpxTrack; 31 import org.openstreetmap.josm.data.gpx.IGpxTrack; 31 32 import org.openstreetmap.josm.data.gpx.IGpxTrackSegment; 32 33 import org.openstreetmap.josm.data.gpx.IWithAttributes; … … 85 86 //Prepare extensions for writing 86 87 data.beginUpdate(); 87 data.getTracks().forEach(trk -> trk.convertColor(colorFormat)); 88 data.getTracks().stream() 89 .filter(GpxTrack.class::isInstance).map(GpxTrack.class::cast) 90 .forEach(trk -> trk.convertColor(colorFormat)); 88 91 data.getExtensions().removeAllWithPrefix("josm"); 89 92 if (data.fromServer) { … … 259 262 260 263 private void writeTracks() { 261 for (GpxTrack trk : data.getTracks()) { 264 for (IGpxTrack trk : data.getTracks()) { 262 265 openln("trk"); 263 266 writeAttr(trk, RTE_TRK_KEYS); -
trunk/test/unit/org/openstreetmap/josm/data/gpx/GpxDataTest.java
r15497 r15502 114 114 115 115 /** 116 * Test method for {@link GpxData#getTracks()}, {@link GpxData#addTrack(GpxTrack)}, {@link GpxData#removeTrack(GpxTrack)}. 116 * Test method for {@link GpxData#getTracks()}, {@link GpxData#addTrack(IGpxTrack)}, {@link GpxData#removeTrack(IGpxTrack)}. 117 117 */ 118 118 @Test … … 136 136 137 137 /** 138 * Test method for {@link GpxData#addTrack(GpxTrack)}. 138 * Test method for {@link GpxData#addTrack(IGpxTrack)}. 139 139 */ 140 140 @Test(expected = IllegalArgumentException.class) … … 146 146 147 147 /** 148 * Test method for {@link GpxData#removeTrack(GpxTrack)}. 148 * Test method for {@link GpxData#removeTrack(IGpxTrack)}. 149 149 */ 150 150 @Test(expected = IllegalArgumentException.class) -
trunk/test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java
r15496 r15502 23 23 import org.openstreetmap.josm.data.gpx.GpxConstants; 24 24 import org.openstreetmap.josm.data.gpx.GpxData; 25 import org.openstreetmap.josm.data.gpx.GpxTrack; 25 import org.openstreetmap.josm.data.gpx.IGpxTrack; 26 26 import org.openstreetmap.josm.data.gpx.IGpxTrackSegment; 27 27 import org.openstreetmap.josm.data.gpx.WayPoint; … … 240 240 // Check that track is correct 241 241 assertEquals(1, gpx.getTrackCount()); 242 GpxTrack track = gpx.getTracks().iterator().next(); 242 IGpxTrack track = gpx.getTracks().iterator().next(); 243 243 Collection<IGpxTrackSegment> segments = track.getSegments(); 244 244 assertEquals(1, segments.size()); -
trunk/test/unit/org/openstreetmap/josm/io/nmea/NmeaReaderTest.java
r15496 r15502 24 24 import org.openstreetmap.josm.data.gpx.GpxConstants; 25 25 import org.openstreetmap.josm.data.gpx.GpxData; 26 import org.openstreetmap.josm.data.gpx.GpxTrack; 26 import org.openstreetmap.josm.data.gpx.IGpxTrack; 27 27 import org.openstreetmap.josm.data.gpx.IGpxTrackSegment; 28 28 import org.openstreetmap.josm.data.gpx.WayPoint; … … 95 95 assertEquals(1, gpx.tracks.size()); 96 96 assertEquals(1, in.data.tracks.size()); 97 GpxTrack gpxTrack = gpx.tracks.iterator().next(); 98 GpxTrack nmeaTrack = in.data.tracks.iterator().next(); 97 IGpxTrack gpxTrack = gpx.tracks.iterator().next(); 98 IGpxTrack nmeaTrack = in.data.tracks.iterator().next(); 99 99 assertEquals(gpxTrack.getBounds(), nmeaTrack.getBounds()); 100 100 int nTracks = gpxTrack.getSegments().size();
Note:
See TracChangeset
for help on using the changeset viewer.