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 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 p.add(export, GBC.std()); 055 p.add(lbl, GBC.std()); 056 p.add(GBC.glue(1,0), GBC.std().fill(GBC.HORIZONTAL)); 057 return p; 058 } 059 060 @Override 061 public boolean shallExport() { 062 return export.isSelected(); 063 } 064 065 @Override 066 public boolean requiresZip() { 067 return true; 068 } 069 070 @Override 071 public Element export(ExportSupport support) throws IOException { 072 Element layerEl = support.createElement("layer"); 073 layerEl.setAttribute("type", "markers"); 074 layerEl.setAttribute("version", "0.1"); 075 076 Element file = support.createElement("file"); 077 layerEl.appendChild(file); 078 079 String zipPath = "layers/" + String.format("%02d", support.getLayerIndex()) + "/data.gpx"; 080 file.appendChild(support.createTextNode(zipPath)); 081 addDataFile(support.getOutputStreamZip(zipPath)); 082 083 return layerEl; 084 } 085 086 @SuppressWarnings("resource") 087 protected void addDataFile(OutputStream out) { 088 Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8); 089 MarkerWriter w = new MarkerWriter(new PrintWriter(writer)); 090 w.write(layer); 091 w.flush(); 092 } 093 094 public static class MarkerWriter extends GpxWriter { 095 096 public MarkerWriter(PrintWriter out) { 097 super(out); 098 } 099 100 public void write(MarkerLayer layer) { 101 GpxData data = new GpxData(); 102 data.attr.put(GpxData.META_DESC, "exported JOSM marker layer"); 103 for (Marker m : layer.data) { 104 data.waypoints.add(m.convertToWayPoint()); 105 } 106 super.write(data); 107 } 108 } 109}