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        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}