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.GpxConstants;
019import org.openstreetmap.josm.data.gpx.GpxTrack;
020import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
021import org.openstreetmap.josm.data.gpx.WayPoint;
022import org.openstreetmap.josm.data.osm.DataSet;
023import org.openstreetmap.josm.data.osm.Node;
024import org.openstreetmap.josm.data.osm.Way;
025import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
026import org.openstreetmap.josm.gui.layer.GpxLayer;
027import org.openstreetmap.josm.gui.layer.OsmDataLayer;
028import org.openstreetmap.josm.gui.widgets.UrlLabel;
029import org.openstreetmap.josm.tools.GBC;
030import org.openstreetmap.josm.tools.ImageProvider;
031import org.openstreetmap.josm.tools.date.DateUtils;
032
033public class ConvertToDataLayerAction extends AbstractAction {
034    private final GpxLayer layer;
035
036    public ConvertToDataLayerAction(final GpxLayer layer) {
037        super(tr("Convert to data layer"), ImageProvider.get("converttoosm"));
038        this.layer = layer;
039        putValue("help", ht("/Action/ConvertToDataLayer"));
040    }
041
042    @Override
043    public void actionPerformed(ActionEvent e) {
044        JPanel msg = new JPanel(new GridBagLayout());
045        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());
046        msg.add(new UrlLabel(Main.getOSMWebsite() + "/traces", 2), GBC.eop());
047        if (!ConditionalOptionPaneUtil.showConfirmationDialog("convert_to_data", Main.parent, msg, tr("Warning"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, JOptionPane.OK_OPTION)) {
048            return;
049        }
050        DataSet ds = new DataSet();
051        for (GpxTrack trk : layer.data.tracks) {
052            for (GpxTrackSegment segment : trk.getSegments()) {
053                List<Node> nodes = new ArrayList<>();
054                for (WayPoint p : segment.getWayPoints()) {
055                    Node n = new Node(p.getCoor());
056                    String timestr = p.getString(GpxConstants.PT_TIME);
057                    if (timestr != null) {
058                        n.setTimestamp(DateUtils.fromString(timestr));
059                    }
060                    ds.addPrimitive(n);
061                    nodes.add(n);
062                }
063                Way w = new Way();
064                w.setNodes(nodes);
065                ds.addPrimitive(w);
066            }
067        }
068        Main.main.addLayer(new OsmDataLayer(ds, tr("Converted from: {0}", layer.getName()), layer.getAssociatedFile()));
069        Main.main.removeLayer(layer);
070    }
071}