001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.layer.gpx;
003
004import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
005import static org.openstreetmap.josm.tools.I18n.tr;
006
007import java.awt.GridBagLayout;
008import java.awt.event.ActionEvent;
009import java.util.ArrayList;
010import java.util.List;
011
012import javax.swing.AbstractAction;
013import javax.swing.JLabel;
014import javax.swing.JOptionPane;
015import javax.swing.JPanel;
016
017import org.openstreetmap.josm.Main;
018import org.openstreetmap.josm.data.gpx.GpxTrack;
019import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
020import org.openstreetmap.josm.data.gpx.WayPoint;
021import org.openstreetmap.josm.data.osm.DataSet;
022import org.openstreetmap.josm.data.osm.Node;
023import org.openstreetmap.josm.data.osm.Way;
024import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
025import org.openstreetmap.josm.gui.layer.GpxLayer;
026import org.openstreetmap.josm.gui.layer.OsmDataLayer;
027import org.openstreetmap.josm.gui.widgets.UrlLabel;
028import org.openstreetmap.josm.tools.GBC;
029import org.openstreetmap.josm.tools.ImageProvider;
030import org.openstreetmap.josm.tools.date.DateUtils;
031
032public class ConvertToDataLayerAction extends AbstractAction {
033    private final GpxLayer layer;
034
035    public ConvertToDataLayerAction(final GpxLayer layer) {
036        super(tr("Convert to data layer"), ImageProvider.get("converttoosm"));
037        this.layer = layer;
038        putValue("help", ht("/Action/ConvertToDataLayer"));
039    }
040
041    @Override
042    public void actionPerformed(ActionEvent e) {
043        JPanel msg = new JPanel(new GridBagLayout());
044        msg.add(new JLabel(tr("<html>Upload of unprocessed GPS data as map data is considered harmful.<br>If you want to upload traces, look here:</html>")), GBC.eol());
045        msg.add(new UrlLabel(Main.getOSMWebsite() + "/traces", 2), GBC.eop());
046        if (!ConditionalOptionPaneUtil.showConfirmationDialog("convert_to_data", Main.parent, msg, tr("Warning"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, JOptionPane.OK_OPTION)) {
047            return;
048        }
049        DataSet ds = new DataSet();
050        for (GpxTrack trk : layer.data.tracks) {
051            for (GpxTrackSegment segment : trk.getSegments()) {
052                List<Node> nodes = new ArrayList<>();
053                for (WayPoint p : segment.getWayPoints()) {
054                    Node n = new Node(p.getCoor());
055                    String timestr = p.getString("time");
056                    if (timestr != null) {
057                        n.setTimestamp(DateUtils.fromString(timestr));
058                    }
059                    ds.addPrimitive(n);
060                    nodes.add(n);
061                }
062                Way w = new Way();
063                w.setNodes(nodes);
064                ds.addPrimitive(w);
065            }
066        }
067        Main.main.addLayer(new OsmDataLayer(ds, tr("Converted from: {0}", layer.getName()), layer.getAssociatedFile()));
068        Main.main.removeLayer(layer);
069    }
070
071}