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