// License: GPL. Copyright 2007 by Immanuel Scholz and others
package org.openstreetmap.josm.actions.downloadtasks;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.io.IOException;
import java.util.concurrent.Future;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.Bounds;
import org.openstreetmap.josm.data.gpx.GpxData;
import org.openstreetmap.josm.gui.PleaseWaitRunnable;
import org.openstreetmap.josm.gui.layer.GpxLayer;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.gui.progress.ProgressMonitor;
import org.openstreetmap.josm.io.BoundingBoxDownloader;
import org.openstreetmap.josm.io.OsmTransferException;
import org.xml.sax.SAXException;
public class DownloadGpsTask extends AbstractDownloadTask {
private DownloadTask downloadTask;
public Future<?> download(boolean newLayer, Bounds downloadArea, ProgressMonitor progressMonitor) {
downloadTask = new DownloadTask(newLayer,
new BoundingBoxDownloader(downloadArea), progressMonitor);
// We need submit instead of execute so we can wait for it to finish and get the error
// message if necessary. If no one calls getErrorMessage() it just behaves like execute.
return Main.worker.submit(downloadTask);
}
public Future<?> loadUrl(boolean a,java.lang.String b, ProgressMonitor progressMonitor) {
return null;
// FIXME this is not currently used
}
public void cancel() {
if (downloadTask != null) {
downloadTask.cancel();
}
}
class DownloadTask extends PleaseWaitRunnable {
private BoundingBoxDownloader reader;
private GpxData rawData;
private final boolean newLayer;
public DownloadTask(boolean newLayer, BoundingBoxDownloader reader, ProgressMonitor progressMonitor) {
super(tr("Downloading GPS data"));
this.reader = reader;
this.newLayer = newLayer;
}
@Override public void realRun() throws IOException, SAXException, OsmTransferException {
try {
if (isCanceled())
return;
rawData = reader.parseRawGps(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
} catch(Exception e) {
if (isCanceled())
return;
if (e instanceof OsmTransferException) {
rememberException(e);
} else {
rememberException(new OsmTransferException(e));
}
}
}
@Override protected void finish() {
if (isCanceled() || isFailed())
return;
if (rawData == null)
return;
rawData.recalculateBounds();
String name = tr("Downloaded GPX Data");
GpxLayer layer = new GpxLayer(rawData, name);
Layer x = findMergeLayer();
if (newLayer || x == null) {
Main.main.addLayer(layer);
} else {
x.mergeFrom(layer);
}
}
private Layer findMergeLayer() {
boolean merge = Main.pref.getBoolean("download.gps.mergeWithLocal", false);
if (!Main.isDisplayingMapView())
return null;
Layer active = Main.map.mapView.getActiveLayer();
if (active != null && active instanceof GpxLayer && (merge || ((GpxLayer)active).data.fromServer))
return active;
for (Layer l : Main.map.mapView.getAllLayers())
if (l instanceof GpxLayer && (merge || ((GpxLayer)l).data.fromServer))
return l;
return null;
}
@Override protected void cancel() {
setCanceled(true);
if (reader != null) {
reader.cancel();
}
}
}
}