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