source: josm/trunk/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java@ 13130

Last change on this file since 13130 was 13130, checked in by Don-vip, 6 years ago

fix #15572 - use ImageProvider attach API for all JOSM actions to ensure proper icon size everywhere

  • Property svn:eol-style set to native
File size: 6.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.layer.gpx;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.GridBagLayout;
8import java.awt.event.ActionEvent;
9import java.io.File;
10import java.util.ArrayList;
11import java.util.Arrays;
12import java.util.Collection;
13import java.util.Iterator;
14import java.util.List;
15import java.util.Optional;
16
17import javax.swing.AbstractAction;
18import javax.swing.JLabel;
19import javax.swing.JOptionPane;
20import javax.swing.JPanel;
21
22import org.openstreetmap.josm.Main;
23import org.openstreetmap.josm.data.gpx.GpxConstants;
24import org.openstreetmap.josm.data.gpx.GpxTrack;
25import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
26import org.openstreetmap.josm.data.gpx.WayPoint;
27import org.openstreetmap.josm.data.osm.DataSet;
28import org.openstreetmap.josm.data.osm.Node;
29import org.openstreetmap.josm.data.osm.Way;
30import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
31import org.openstreetmap.josm.gui.MainApplication;
32import org.openstreetmap.josm.gui.layer.GpxLayer;
33import org.openstreetmap.josm.gui.layer.Layer;
34import org.openstreetmap.josm.gui.layer.OsmDataLayer;
35import org.openstreetmap.josm.gui.layer.markerlayer.Marker;
36import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
37import org.openstreetmap.josm.gui.widgets.UrlLabel;
38import org.openstreetmap.josm.spi.preferences.Config;
39import org.openstreetmap.josm.tools.GBC;
40import org.openstreetmap.josm.tools.ImageProvider;
41import org.openstreetmap.josm.tools.Logging;
42import org.openstreetmap.josm.tools.UncheckedParseException;
43import org.openstreetmap.josm.tools.date.DateUtils;
44
45/**
46 * An abstract action for a conversion from a {@code T} {@link Layer} to a {@link OsmDataLayer}.
47 * @param <T> the source layer class
48 */
49public abstract class ConvertToDataLayerAction<T extends Layer> extends AbstractAction {
50 /** source layer */
51 protected final transient T layer;
52
53 /**
54 * Constructs a new {@code ConvertToDataLayerAction}
55 * @param layer source layer
56 */
57 protected ConvertToDataLayerAction(final T layer) {
58 super(tr("Convert to data layer"));
59 new ImageProvider("converttoosm").getResource().attachImageIcon(this, true);
60 this.layer = layer;
61 putValue("help", ht("/Action/ConvertToDataLayer"));
62 }
63
64 /**
65 * Converts a {@link GpxLayer} to a {@link OsmDataLayer}.
66 */
67 public static class FromGpxLayer extends ConvertToDataLayerAction<GpxLayer> {
68
69 /**
70 * Creates a new {@code FromGpxLayer}.
71 * @param layer the source layer
72 */
73 public FromGpxLayer(GpxLayer layer) {
74 super(layer);
75 }
76
77 @Override
78 public DataSet convert() {
79 final DataSet ds = new DataSet();
80 for (GpxTrack trk : layer.data.getTracks()) {
81 for (GpxTrackSegment segment : trk.getSegments()) {
82 List<Node> nodes = new ArrayList<>();
83 for (WayPoint p : segment.getWayPoints()) {
84 Node n = new Node(p.getCoor());
85 String timestr = p.getString(GpxConstants.PT_TIME);
86 if (timestr != null) {
87 try {
88 n.setTimestamp(DateUtils.fromString(timestr));
89 } catch (UncheckedParseException e) {
90 Logging.log(Logging.LEVEL_WARN, e);
91 }
92 }
93 ds.addPrimitive(n);
94 nodes.add(n);
95 }
96 Way w = new Way();
97 w.setNodes(nodes);
98 ds.addPrimitive(w);
99 }
100 }
101 return ds;
102 }
103 }
104
105 /**
106 * Converts a {@link MarkerLayer} to a {@link OsmDataLayer}.
107 */
108 public static class FromMarkerLayer extends ConvertToDataLayerAction<MarkerLayer> {
109
110 /**
111 * Converts a {@link MarkerLayer} to a {@link OsmDataLayer}.
112 * @param layer marker layer
113 */
114 public FromMarkerLayer(MarkerLayer layer) {
115 super(layer);
116 }
117
118 @Override
119 public DataSet convert() {
120 final DataSet ds = new DataSet();
121 for (Marker marker : layer.data) {
122 final Node node = new Node(marker.getCoor());
123 final Collection<String> mapping = Config.getPref().getList("gpx.to-osm-mapping", Arrays.asList(
124 GpxConstants.GPX_NAME, "name",
125 GpxConstants.GPX_DESC, "description",
126 GpxConstants.GPX_CMT, "note",
127 GpxConstants.GPX_SRC, "source",
128 GpxConstants.PT_SYM, "gpxicon"));
129 if (mapping.size() % 2 == 0) {
130 final Iterator<String> it = mapping.iterator();
131 while (it.hasNext()) {
132 final String gpxKey = it.next();
133 final String osmKey = it.next();
134 Optional.ofNullable(marker.getTemplateValue(gpxKey, false))
135 .map(String::valueOf)
136 .ifPresent(s -> node.put(osmKey, s));
137 }
138 } else {
139 Logging.warn("Invalid gpx.to-osm-mapping Einstein setting: expecting even number of entries");
140 }
141 ds.addPrimitive(node);
142 }
143 return ds;
144 }
145 }
146
147 /**
148 * Performs the conversion to a {@link DataSet}.
149 * @return the resulting dataset
150 */
151 public abstract DataSet convert();
152
153 @Override
154 public void actionPerformed(ActionEvent e) {
155 JPanel msg = new JPanel(new GridBagLayout());
156 msg.add(new JLabel(
157 tr("<html>Upload of unprocessed GPS data as map data is considered harmful.<br>"
158 + "If you want to upload traces, look here:</html>")),
159 GBC.eol());
160 msg.add(new UrlLabel(Main.getOSMWebsite() + "/traces", 2), GBC.eop());
161 if (!ConditionalOptionPaneUtil.showConfirmationDialog("convert_to_data", Main.parent, msg, tr("Warning"),
162 JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, JOptionPane.OK_OPTION)) {
163 return;
164 }
165 final DataSet ds = convert();
166 final OsmDataLayer osmLayer = new OsmDataLayer(ds, tr("Converted from: {0}", layer.getName()), null);
167 if (layer.getAssociatedFile() != null) {
168 osmLayer.setAssociatedFile(new File(layer.getAssociatedFile().getParentFile(), layer.getAssociatedFile().getName() + ".osm"));
169 }
170 osmLayer.setUploadDiscouraged(true);
171 MainApplication.getLayerManager().addLayer(osmLayer);
172 MainApplication.getLayerManager().removeLayer(layer);
173 }
174}
Note: See TracBrowser for help on using the repository browser.