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 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}