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