package org.openstreetmap.josm.plugins.editgpx.data;
import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;
import org.openstreetmap.josm.data.gpx.GpxData;
import org.openstreetmap.josm.data.gpx.GpxRoute;
import org.openstreetmap.josm.data.gpx.GpxTrack;
import org.openstreetmap.josm.data.gpx.WayPoint;
public class EditGpxData {
private final List<EditGpxTrack> tracks = new ArrayList<>();
// Only copy of routes and waypoints to preserve all info when converting back to gpx track
private final List<GpxRoute> routes = new ArrayList<>();
private final List<WayPoint> waypoints = new ArrayList<>();
public void load(GpxData data) {
for (GpxTrack track: data.tracks) {
tracks.add(new EditGpxTrack(track));
}
routes.clear();
routes.addAll(data.routes);
waypoints.clear();
waypoints.addAll(data.waypoints);
}
public boolean isEmpty() {
for (EditGpxTrack track: tracks) {
for (EditGpxTrackSegment segment: track.getSegments()) {
if (!segment.getWayPoints().isEmpty()) {
return false;
}
}
}
return true;
}
public List<EditGpxTrack> getTracks() {
return tracks;
}
public GpxData createGpxData(boolean anonTime) {
GpxData result = new GpxData();
double minTime = 0.0;
if (anonTime) {
try {
minTime = minNonDeletedTime();
} catch (NoSuchElementException e) {
// minTime won't be used, so ignore the exception
}
}
for (EditGpxTrack track: tracks) {
if (!track.isDeleted()) {
GpxTrack newTrack = track.createGpxTrack(anonTime, minTime);
if (!newTrack.getSegments().isEmpty()) {
result.tracks.add(newTrack);
}
}
}
result.routes.addAll(routes);
result.waypoints.addAll(waypoints);
return result;
}
/**
* time of the oldest waypoint in the set of non-deleted waypoints
* in this data (in seconds since Epoch)
*/
public double minNonDeletedTime() {
boolean foundOne = false;
double minTime = 0.0;
for (EditGpxTrack track: tracks) {
if (!track.isDeleted()) {
try {
double t = track.minNonDeletedTime();
if ((!foundOne) || (t < minTime)) {
minTime = t;
}
foundOne = true;
} catch (NoSuchElementException e) {
continue;
}
}
}
if (!foundOne) {
throw new NoSuchElementException();
}
return minTime;
}
}