001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.layer.gpx;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.geom.Path2D;
007
008import org.openstreetmap.josm.actions.DownloadAlongAction;
009import org.openstreetmap.josm.data.gpx.GpxData;
010import org.openstreetmap.josm.data.gpx.GpxTrack;
011import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
012import org.openstreetmap.josm.data.gpx.WayPoint;
013import org.openstreetmap.josm.gui.PleaseWaitRunnable;
014import org.openstreetmap.josm.gui.help.HelpUtil;
015
016/**
017 * Action that issues a series of download requests to the API, following the GPX track.
018 *
019 * @author fred
020 * @since 5715
021 */
022public class DownloadAlongTrackAction extends DownloadAlongAction {
023
024    private static final int NEAR_TRACK = 0;
025    private static final int NEAR_WAYPOINTS = 1;
026    private static final int NEAR_BOTH = 2;
027
028    private static final String PREF_DOWNLOAD_ALONG_TRACK_OSM = "downloadAlongTrack.download.osm";
029    private static final String PREF_DOWNLOAD_ALONG_TRACK_GPS = "downloadAlongTrack.download.gps";
030
031    private static final String PREF_DOWNLOAD_ALONG_TRACK_DISTANCE = "downloadAlongTrack.distance";
032    private static final String PREF_DOWNLOAD_ALONG_TRACK_AREA = "downloadAlongTrack.area";
033    private static final String PREF_DOWNLOAD_ALONG_TRACK_NEAR = "downloadAlongTrack.near";
034
035    private final transient GpxData data;
036
037    /**
038     * Constructs a new {@code DownloadAlongTrackAction}
039     * @param data The GPX data used to download along
040     */
041    public DownloadAlongTrackAction(GpxData data) {
042        super(tr("Download from OSM along this track"), "downloadalongtrack", null, null, false);
043        this.data = data;
044    }
045
046    @Override
047    protected PleaseWaitRunnable createTask() {
048        final DownloadAlongPanel panel = new DownloadAlongPanel(
049                PREF_DOWNLOAD_ALONG_TRACK_OSM, PREF_DOWNLOAD_ALONG_TRACK_GPS,
050                PREF_DOWNLOAD_ALONG_TRACK_DISTANCE, PREF_DOWNLOAD_ALONG_TRACK_AREA, PREF_DOWNLOAD_ALONG_TRACK_NEAR);
051
052        if (0 != panel.showInDownloadDialog(tr("Download from OSM along this track"), HelpUtil.ht("/Action/DownloadAlongTrack"))) {
053            return null;
054        }
055
056        final int near = panel.getNear();
057
058        // Convert the GPX data into a Path2D.
059        Path2D gpxPath = new Path2D.Double();
060        if (near == NEAR_TRACK || near == NEAR_BOTH) {
061            for (GpxTrack trk : data.tracks) {
062                for (GpxTrackSegment segment : trk.getSegments()) {
063                    boolean first = true;
064                    for (WayPoint p : segment.getWayPoints()) {
065                        if (first) {
066                            gpxPath.moveTo(p.lon(), p.lat());
067                            first = false;
068                        } else {
069                            gpxPath.lineTo(p.lon(), p.lat());
070                        }
071                    }
072                }
073            }
074        }
075        if (near == NEAR_WAYPOINTS || near == NEAR_BOTH) {
076            for (WayPoint p : data.waypoints) {
077                gpxPath.moveTo(p.lon(), p.lat());
078                gpxPath.closePath();
079            }
080        }
081        return createCalcTask(gpxPath, panel, tr("Download from OSM along this track"));
082    }
083}