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.UnsupportedEncodingException; 011import java.io.Writer; 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.w3c.dom.Element; 021 022import org.openstreetmap.josm.Main; 023import org.openstreetmap.josm.data.gpx.GpxData; 024import org.openstreetmap.josm.gui.layer.Layer; 025import org.openstreetmap.josm.gui.layer.markerlayer.Marker; 026import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer; 027import org.openstreetmap.josm.io.GpxWriter; 028import org.openstreetmap.josm.io.session.SessionWriter.ExportSupport; 029import org.openstreetmap.josm.tools.GBC; 030 031public class MarkerSessionExporter implements SessionLayerExporter { 032 033 private MarkerLayer layer; 034 private JCheckBox export; 035 036 public MarkerSessionExporter(MarkerLayer layer) { 037 this.layer = layer; 038 } 039 040 @Override 041 public Collection<Layer> getDependencies() { 042 Layer gpxLayer = layer.fromLayer; 043 if (gpxLayer != null && Main.map.mapView.hasLayer(gpxLayer)) 044 return Collections.singleton(gpxLayer); 045 return Collections.emptySet(); 046 } 047 048 @Override 049 public Component getExportPanel() { 050 final JPanel p = new JPanel(new GridBagLayout()); 051 export = new JCheckBox(); 052 export.setSelected(true); 053 final JLabel lbl = new JLabel(layer.getName(), layer.getIcon(), SwingConstants.LEFT); 054 lbl.setToolTipText(layer.getToolTipText()); 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 protected void addDataFile(OutputStream out) throws IOException { 088 Writer writer = null; 089 try { 090 writer = new OutputStreamWriter(out, "UTF-8"); 091 } catch (UnsupportedEncodingException e) { 092 throw new RuntimeException(e); 093 } 094 MarkerWriter w = new MarkerWriter(new PrintWriter(writer)); 095 w.write(layer); 096 w.flush(); 097 } 098 099 public static class MarkerWriter extends GpxWriter { 100 101 public MarkerWriter(PrintWriter out) { 102 super(out); 103 } 104 105 public void write(MarkerLayer layer) { 106 GpxData data = new GpxData(); 107 data.attr.put(GpxData.META_DESC, "exported JOSM marker layer"); 108 for (Marker m : layer.data) { 109 data.waypoints.add(m.convertToWayPoint()); 110 } 111 super.write(data); 112 } 113 } 114}