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 }