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}