001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.io.session;
003    
004    import java.awt.Component;
005    import java.awt.GridBagLayout;
006    import java.io.IOException;
007    import java.util.Collection;
008    import java.util.Collections;
009    
010    import javax.swing.JCheckBox;
011    import javax.swing.JLabel;
012    import javax.swing.JPanel;
013    import javax.swing.SwingConstants;
014    
015    import org.openstreetmap.josm.Main;
016    import org.openstreetmap.josm.gui.layer.Layer;
017    import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
018    import org.openstreetmap.josm.gui.layer.geoimage.ImageEntry;
019    import org.openstreetmap.josm.tools.GBC;
020    import org.w3c.dom.Element;
021    
022    public 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    
069            for (ImageEntry entry : layer.getImages()) {
070                
071                Element imgElem = support.createElement("geoimage");
072    
073                if (entry.getFile() == null) {
074                    Main.warn("No file attribute for image - skipping entry");
075                    break;
076                }
077                addAttr("file", entry.getFile().getPath(), imgElem, support);
078                // FIXME: relative filenames as option
079                // FIXME: include images as option (?)
080    
081                addAttr("thumbnail", Boolean.toString(entry.hasThumbnail()), imgElem, support);
082                if (entry.getPos() != null) {
083                    Element posElem = support.createElement("position");
084                    posElem.setAttribute("lat", Double.toString(entry.getPos().lat()));
085                    posElem.setAttribute("lon", Double.toString(entry.getPos().lon()));
086                    imgElem.appendChild(posElem);
087                }
088                if (entry.getSpeed() != null) {
089                    addAttr("speed", entry.getSpeed().toString(), imgElem, support);
090                }
091                if (entry.getElevation() != null) {
092                    addAttr("elevation", entry.getElevation().toString(), imgElem, support);
093                }
094                if (entry.getGpsTime() != null) {
095                    addAttr("gps-time", Long.toString(entry.getGpsTime().getTime()), imgElem, support);
096                }
097                if (entry.getExifOrientation() != null) {
098                    addAttr("exif-orientation", Integer.toString(entry.getExifOrientation()), imgElem, support);
099                }
100                if (entry.getExifTime() != null) {
101                    addAttr("exif-time", Long.toString(entry.getExifTime().getTime()), imgElem, support);
102                }
103                if (entry.getExifCoor() != null) {
104                    Element posElem = support.createElement("exif-coordinates");
105                    posElem.setAttribute("lat", Double.toString(entry.getExifCoor().lat()));
106                    posElem.setAttribute("lon", Double.toString(entry.getExifCoor().lon()));
107                    imgElem.appendChild(posElem);
108                }
109                if (entry.getExifImgDir() != null) {
110                    addAttr("exif-image-direction", entry.getExifImgDir().toString(), imgElem, support);
111                }
112    
113                layerElem.appendChild(imgElem);
114            }
115            return layerElem;
116        }
117    
118        private 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    }