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.JCheckBox; 016import javax.swing.JLabel; 017import javax.swing.JPanel; 018import javax.swing.SwingConstants; 019 020import org.openstreetmap.josm.Main; 021import org.openstreetmap.josm.data.gpx.GpxData; 022import org.openstreetmap.josm.gui.layer.Layer; 023import org.openstreetmap.josm.gui.layer.markerlayer.Marker; 024import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer; 025import org.openstreetmap.josm.io.GpxWriter; 026import org.openstreetmap.josm.io.session.SessionWriter.ExportSupport; 027import org.openstreetmap.josm.tools.GBC; 028import org.w3c.dom.Element; 029 030public class MarkerSessionExporter implements SessionLayerExporter { 031 032 private final MarkerLayer layer; 033 private JCheckBox export; 034 035 public MarkerSessionExporter(MarkerLayer layer) { 036 this.layer = layer; 037 } 038 039 @Override 040 public Collection<Layer> getDependencies() { 041 Layer gpxLayer = layer.fromLayer; 042 if (gpxLayer != null && Main.map.mapView.hasLayer(gpxLayer)) 043 return Collections.singleton(gpxLayer); 044 return Collections.emptySet(); 045 } 046 047 @Override 048 public Component getExportPanel() { 049 final JPanel p = new JPanel(new GridBagLayout()); 050 export = new JCheckBox(); 051 export.setSelected(true); 052 final JLabel lbl = new JLabel(layer.getName(), layer.getIcon(), SwingConstants.LEFT); 053 lbl.setToolTipText(layer.getToolTipText()); 054 lbl.setLabelFor(export); 055 p.add(export, GBC.std()); 056 p.add(lbl, GBC.std()); 057 p.add(GBC.glue(1, 0), GBC.std().fill(GBC.HORIZONTAL)); 058 return p; 059 } 060 061 @Override 062 public boolean shallExport() { 063 return export.isSelected(); 064 } 065 066 @Override 067 public boolean requiresZip() { 068 return true; 069 } 070 071 @Override 072 public Element export(ExportSupport support) throws IOException { 073 Element layerEl = support.createElement("layer"); 074 layerEl.setAttribute("type", "markers"); 075 layerEl.setAttribute("version", "0.1"); 076 077 Element file = support.createElement("file"); 078 layerEl.appendChild(file); 079 080 String zipPath = "layers/" + String.format("%02d", support.getLayerIndex()) + "/data.gpx"; 081 file.appendChild(support.createTextNode(zipPath)); 082 addDataFile(support.getOutputStreamZip(zipPath)); 083 084 return layerEl; 085 } 086 087 @SuppressWarnings("resource") 088 protected void addDataFile(OutputStream out) { 089 Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8); 090 MarkerWriter w = new MarkerWriter(new PrintWriter(writer)); 091 w.write(layer); 092 w.flush(); 093 } 094 095 public static class MarkerWriter extends GpxWriter { 096 097 public MarkerWriter(PrintWriter out) { 098 super(out); 099 } 100 101 public void write(MarkerLayer layer) { 102 GpxData data = new GpxData(); 103 data.put(GpxData.META_DESC, "exported JOSM marker layer"); 104 for (Marker m : layer.data) { 105 data.waypoints.add(m.convertToWayPoint()); 106 } 107 super.write(data); 108 } 109 } 110}