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 final 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        lbl.setLabelFor(export);
048        p.add(export, GBC.std());
049        p.add(lbl, GBC.std());
050        p.add(GBC.glue(1, 0), GBC.std().fill(GBC.HORIZONTAL));
051        return p;
052    }
053
054    @Override
055    public boolean shallExport() {
056        return export.isSelected();
057    }
058
059    @Override
060    public boolean requiresZip() {
061        return false;
062    }
063
064    @Override
065    public Element export(SessionWriter.ExportSupport support) throws IOException {
066        Element layerElem = support.createElement("layer");
067        layerElem.setAttribute("type", "geoimage");
068        layerElem.setAttribute("version", "0.1");
069        addAttr("show-thumbnails", Boolean.toString(layer.isUseThumbs()), layerElem, support);
070
071        for (ImageEntry entry : layer.getImages()) {
072
073            Element imgElem = support.createElement("geoimage");
074
075            if (entry.getFile() == null) {
076                Main.warn("No file attribute for image - skipping entry");
077                break;
078            }
079            addAttr("file", entry.getFile().getPath(), imgElem, support);
080            // FIXME: relative filenames as option
081            // FIXME: include images as option (?)
082
083            addAttr("thumbnail", Boolean.toString(entry.hasThumbnail()), imgElem, support);
084            if (entry.getPos() != null) {
085                Element posElem = support.createElement("position");
086                posElem.setAttribute("lat", Double.toString(entry.getPos().lat()));
087                posElem.setAttribute("lon", Double.toString(entry.getPos().lon()));
088                imgElem.appendChild(posElem);
089            }
090            if (entry.getSpeed() != null) {
091                addAttr("speed", entry.getSpeed().toString(), imgElem, support);
092            }
093            if (entry.getElevation() != null) {
094                addAttr("elevation", entry.getElevation().toString(), imgElem, support);
095            }
096            if (entry.hasGpsTime()) {
097                addAttr("gps-time", Long.toString(entry.getGpsTime().getTime()), imgElem, support);
098            }
099            if (entry.getExifOrientation() != null) {
100                addAttr("exif-orientation", Integer.toString(entry.getExifOrientation()), imgElem, support);
101            }
102            if (entry.hasExifTime()) {
103                addAttr("exif-time", Long.toString(entry.getExifTime().getTime()), imgElem, support);
104            }
105            if (entry.hasExifGpsTime()) {
106                addAttr("exif-gps-time", Long.toString(entry.getExifGpsTime().getTime()), imgElem, support);
107            }
108            if (entry.getExifCoor() != null) {
109                Element posElem = support.createElement("exif-coordinates");
110                posElem.setAttribute("lat", Double.toString(entry.getExifCoor().lat()));
111                posElem.setAttribute("lon", Double.toString(entry.getExifCoor().lon()));
112                imgElem.appendChild(posElem);
113            }
114            if (entry.getExifImgDir() != null) {
115                addAttr("exif-image-direction", entry.getExifImgDir().toString(), imgElem, support);
116            }
117            if (entry.hasNewGpsData()) {
118                addAttr("is-new-gps-data", Boolean.toString(entry.hasNewGpsData()), imgElem, support);
119            }
120
121            layerElem.appendChild(imgElem);
122        }
123        return layerElem;
124    }
125
126    private static void addAttr(String name, String value, Element element, SessionWriter.ExportSupport support) {
127        Element attrElem = support.createElement(name);
128        attrElem.appendChild(support.createTextNode(value));
129        element.appendChild(attrElem);
130    }
131}