001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.io.session; 003 004import java.awt.Component; 005import java.awt.GridBagLayout; 006import java.io.IOException; 007import java.io.OutputStream; 008import java.io.OutputStreamWriter; 009import java.io.PrintWriter; 010import java.io.Writer; 011import java.nio.charset.StandardCharsets; 012import java.util.Collection; 013import java.util.Collections; 014 015import javax.swing.JLabel; 016import javax.swing.JPanel; 017import javax.swing.SwingConstants; 018 019import org.openstreetmap.josm.Main; 020import org.openstreetmap.josm.data.gpx.GpxData; 021import org.openstreetmap.josm.gui.layer.Layer; 022import org.openstreetmap.josm.gui.layer.markerlayer.Marker; 023import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer; 024import org.openstreetmap.josm.io.GpxWriter; 025import org.openstreetmap.josm.io.session.SessionWriter.ExportSupport; 026import org.openstreetmap.josm.tools.GBC; 027import org.w3c.dom.Element; 028 029/** 030 * Session exporter for {@link MarkerLayer}. 031 * @since 5684 032 */ 033public class MarkerSessionExporter extends AbstractSessionExporter<MarkerLayer> { 034 035 /** 036 * Constructs a new {@code MarkerSessionExporter}. 037 * @param layer marker layer to export 038 */ 039 public MarkerSessionExporter(MarkerLayer layer) { // NO_UCD (unused code) 040 super(layer); 041 } 042 043 @Override 044 public Collection<Layer> getDependencies() { 045 Layer gpxLayer = layer.fromLayer; 046 if (gpxLayer != null && Main.getLayerManager().containsLayer(gpxLayer)) 047 return Collections.singleton(gpxLayer); 048 return Collections.emptySet(); 049 } 050 051 @Override 052 public Component getExportPanel() { 053 final JPanel p = new JPanel(new GridBagLayout()); 054 export.setSelected(true); 055 final JLabel lbl = new JLabel(layer.getName(), layer.getIcon(), SwingConstants.LEFT); 056 lbl.setToolTipText(layer.getToolTipText()); 057 lbl.setLabelFor(export); 058 p.add(export, GBC.std()); 059 p.add(lbl, GBC.std()); 060 p.add(GBC.glue(1, 0), GBC.std().fill(GBC.HORIZONTAL)); 061 return p; 062 } 063 064 @Override 065 public boolean requiresZip() { 066 return true; 067 } 068 069 @Override 070 public Element export(ExportSupport support) throws IOException { 071 Element layerEl = support.createElement("layer"); 072 layerEl.setAttribute("type", "markers"); 073 layerEl.setAttribute("version", "0.1"); 074 075 Element file = support.createElement("file"); 076 layerEl.appendChild(file); 077 078 String zipPath = "layers/" + String.format("%02d", support.getLayerIndex()) + "/data.gpx"; 079 file.appendChild(support.createTextNode(zipPath)); 080 addDataFile(support.getOutputStreamZip(zipPath)); 081 082 return layerEl; 083 } 084 085 @SuppressWarnings("resource") 086 protected void addDataFile(OutputStream out) { 087 Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8); 088 MarkerWriter w = new MarkerWriter(new PrintWriter(writer)); 089 w.write(layer); 090 w.flush(); 091 } 092 093 /** 094 * Writes GPX file from marker data. 095 */ 096 public static class MarkerWriter extends GpxWriter { 097 098 /** 099 * Constructs a new {@code MarkerWriter}. 100 * @param out The output writer 101 */ 102 public MarkerWriter(PrintWriter out) { 103 super(out); 104 } 105 106 /** 107 * Writes the given markers data. 108 * @param layer The layer data to write 109 */ 110 public void write(MarkerLayer layer) { 111 GpxData data = new GpxData(); 112 data.put(GpxData.META_DESC, "exported JOSM marker layer"); 113 for (Marker m : layer.data) { 114 data.waypoints.add(m.convertToWayPoint()); 115 } 116 super.write(data); 117 } 118 } 119}