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