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;
009
010import javax.swing.JLabel;
011import javax.swing.JPanel;
012import javax.swing.SwingConstants;
013
014import org.openstreetmap.josm.gui.layer.Layer;
015import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
016import org.openstreetmap.josm.gui.layer.geoimage.ImageEntry;
017import org.openstreetmap.josm.tools.GBC;
018import org.openstreetmap.josm.tools.Logging;
019import org.w3c.dom.Element;
020
021/**
022 * Session exporter for {@link GeoImageLayer}.
023 * @since 5505
024 */
025public class GeoImageSessionExporter extends AbstractSessionExporter<GeoImageLayer> {
026
027    /**
028     * Constructs a new {@code GeoImageSessionExporter}.
029     * @param layer GeoImage layer to export
030     */
031    public GeoImageSessionExporter(GeoImageLayer layer) { // NO_UCD (unused code)
032        super(layer);
033    }
034
035    @Override
036    public Collection<Layer> getDependencies() {
037        if (layer.getGpxLayer() != null)
038            return Collections.singleton((Layer) layer.getGpxLayer());
039        else
040            return Collections.emptySet();
041    }
042
043    @Override
044    public Component getExportPanel() {
045        final JPanel p = new JPanel(new GridBagLayout());
046        export.setSelected(true);
047        final JLabel lbl = new JLabel(layer.getName(), layer.getIcon(), SwingConstants.LEFT);
048        lbl.setToolTipText(layer.getToolTipText());
049        lbl.setLabelFor(export);
050        p.add(export, GBC.std());
051        p.add(lbl, GBC.std());
052        p.add(GBC.glue(1, 0), GBC.std().fill(GBC.HORIZONTAL));
053        return p;
054    }
055
056    @Override
057    public Element export(SessionWriter.ExportSupport support) throws IOException {
058        Element layerElem = support.createElement("layer");
059        layerElem.setAttribute("type", "geoimage");
060        layerElem.setAttribute("version", "0.1");
061        addAttr("show-thumbnails", Boolean.toString(layer.isUseThumbs()), layerElem, support);
062
063        for (ImageEntry entry : layer.getImages()) {
064
065            Element imgElem = support.createElement("geoimage");
066
067            if (entry.getFile() == null) {
068                Logging.warn("No file attribute for image - skipping entry");
069                break;
070            }
071            addAttr("file", entry.getFile().getPath(), imgElem, support);
072            // FIXME: relative filenames as option
073            // FIXME: include images as option (?)
074
075            addAttr("thumbnail", Boolean.toString(entry.hasThumbnail()), imgElem, support);
076            if (entry.getPos() != null) {
077                Element posElem = support.createElement("position");
078                posElem.setAttribute("lat", Double.toString(entry.getPos().lat()));
079                posElem.setAttribute("lon", Double.toString(entry.getPos().lon()));
080                imgElem.appendChild(posElem);
081            }
082            if (entry.getSpeed() != null) {
083                addAttr("speed", entry.getSpeed().toString(), imgElem, support);
084            }
085            if (entry.getElevation() != null) {
086                addAttr("elevation", entry.getElevation().toString(), imgElem, support);
087            }
088            if (entry.hasGpsTime()) {
089                addAttr("gps-time", Long.toString(entry.getGpsTime().getTime()), imgElem, support);
090            }
091            if (entry.getExifOrientation() != null) {
092                addAttr("exif-orientation", Integer.toString(entry.getExifOrientation()), imgElem, support);
093            }
094            if (entry.hasExifTime()) {
095                addAttr("exif-time", Long.toString(entry.getExifTime().getTime()), imgElem, support);
096            }
097            if (entry.hasExifGpsTime()) {
098                addAttr("exif-gps-time", Long.toString(entry.getExifGpsTime().getTime()), imgElem, support);
099            }
100            if (entry.getExifCoor() != null) {
101                Element posElem = support.createElement("exif-coordinates");
102                posElem.setAttribute("lat", Double.toString(entry.getExifCoor().lat()));
103                posElem.setAttribute("lon", Double.toString(entry.getExifCoor().lon()));
104                imgElem.appendChild(posElem);
105            }
106            if (entry.getExifImgDir() != null) {
107                addAttr("exif-image-direction", entry.getExifImgDir().toString(), imgElem, support);
108            }
109            if (entry.hasNewGpsData()) {
110                addAttr("is-new-gps-data", Boolean.toString(entry.hasNewGpsData()), imgElem, support);
111            }
112
113            layerElem.appendChild(imgElem);
114        }
115        return layerElem;
116    }
117
118    private static void addAttr(String name, String value, Element element, SessionWriter.ExportSupport support) {
119        Element attrElem = support.createElement(name);
120        attrElem.appendChild(support.createTextNode(value));
121        element.appendChild(attrElem);
122    }
123}