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