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.util.Collection;
008import java.util.Collections;
009import java.util.LinkedHashMap;
010import java.util.Map;
011
012import javax.swing.JCheckBox;
013import javax.swing.JLabel;
014import javax.swing.JPanel;
015import javax.swing.SwingConstants;
016
017import org.openstreetmap.josm.data.Preferences;
018import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryPreferenceEntry;
019import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
020import org.openstreetmap.josm.gui.layer.ImageryLayer;
021import org.openstreetmap.josm.gui.layer.Layer;
022import org.openstreetmap.josm.gui.layer.TMSLayer;
023import org.openstreetmap.josm.gui.layer.WMSLayer;
024import org.openstreetmap.josm.gui.layer.WMTSLayer;
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 TMSLayer and WMSLayer.
031 */
032public class ImagerySessionExporter implements SessionLayerExporter {
033
034    private ImageryLayer layer;
035    private JCheckBox export;
036
037    public ImagerySessionExporter(ImageryLayer layer) {
038        this.layer = layer;
039    }
040
041    public ImagerySessionExporter(TMSLayer layer) {
042        this((ImageryLayer) layer);
043    }
044
045    public ImagerySessionExporter(WMSLayer layer) {
046        this((ImageryLayer) layer);
047    }
048
049    public ImagerySessionExporter(WMTSLayer layer) {
050        this((ImageryLayer) layer);
051    }
052
053    @Override
054    public Collection<Layer> getDependencies() {
055        return Collections.emptySet();
056    }
057
058    @Override
059    public Component getExportPanel() {
060        final JPanel p = new JPanel(new GridBagLayout());
061        export = new JCheckBox();
062        export.setSelected(true);
063        final JLabel lbl = new JLabel(layer.getName(), layer.getIcon(), SwingConstants.LEFT);
064        lbl.setToolTipText(layer.getToolTipText());
065        lbl.setLabelFor(export);
066        p.add(export, GBC.std());
067        p.add(lbl, GBC.std());
068        p.add(GBC.glue(1, 0), GBC.std().fill(GBC.HORIZONTAL));
069        return p;
070    }
071
072    @Override
073    public boolean shallExport() {
074        return export.isSelected();
075    }
076
077    @Override
078    public boolean requiresZip() {
079        return false;
080    }
081
082    @Override
083    public Element export(ExportSupport support) throws IOException {
084        Element layerElem = support.createElement("layer");
085        layerElem.setAttribute("type", "imagery");
086        layerElem.setAttribute("version", "0.1");
087        ImageryPreferenceEntry e = new ImageryPreferenceEntry(layer.getInfo());
088        Map<String, String> data = new LinkedHashMap<>(Preferences.serializeStruct(e, ImageryPreferenceEntry.class));
089        if (layer instanceof AbstractTileSourceLayer) {
090            AbstractTileSourceLayer tsLayer = (AbstractTileSourceLayer) layer;
091            data.put("automatic-downloading", Boolean.toString(tsLayer.autoLoad));
092            data.put("automatically-change-resolution", Boolean.toString(tsLayer.autoZoom));
093            data.put("show-errors", Boolean.toString(tsLayer.showErrors));
094        }
095        data.put("dx", String.valueOf(layer.getDx()));
096        data.put("dy", String.valueOf(layer.getDy()));
097        for (Map.Entry<String, String> entry : data.entrySet()) {
098            Element attrElem = support.createElement(entry.getKey());
099            layerElem.appendChild(attrElem);
100            attrElem.appendChild(support.createTextNode(entry.getValue()));
101        }
102        return layerElem;
103    }
104
105}