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}