// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.io.session; import java.awt.Component; import java.awt.GridBagLayout; import java.io.IOException; import java.util.Collection; import java.util.Collections; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.gui.layer.Layer; import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer; import org.openstreetmap.josm.gui.layer.geoimage.ImageEntry; import org.openstreetmap.josm.tools.GBC; import org.w3c.dom.Element; /** * Session exporter for {@link GeoImageLayer}. * @since 5505 */ public class GeoImageSessionExporter extends AbstractSessionExporter<GeoImageLayer> { /** * Constructs a new {@code GeoImageSessionExporter}. * @param layer GeoImage layer to export */ public GeoImageSessionExporter(GeoImageLayer layer) { // NO_UCD (unused code) super(layer); } @Override public Collection<Layer> getDependencies() { if (layer.getGpxLayer() != null) return Collections.singleton((Layer) layer.getGpxLayer()); else return Collections.emptySet(); } @Override public Component getExportPanel() { final JPanel p = new JPanel(new GridBagLayout()); export.setSelected(true); final JLabel lbl = new JLabel(layer.getName(), layer.getIcon(), SwingConstants.LEFT); lbl.setToolTipText(layer.getToolTipText()); lbl.setLabelFor(export); p.add(export, GBC.std()); p.add(lbl, GBC.std()); p.add(GBC.glue(1, 0), GBC.std().fill(GBC.HORIZONTAL)); return p; } @Override public Element export(SessionWriter.ExportSupport support) throws IOException { Element layerElem = support.createElement("layer"); layerElem.setAttribute("type", "geoimage"); layerElem.setAttribute("version", "0.1"); addAttr("show-thumbnails", Boolean.toString(layer.isUseThumbs()), layerElem, support); for (ImageEntry entry : layer.getImages()) { Element imgElem = support.createElement("geoimage"); if (entry.getFile() == null) { Main.warn("No file attribute for image - skipping entry"); break; } addAttr("file", entry.getFile().getPath(), imgElem, support); // FIXME: relative filenames as option // FIXME: include images as option (?) addAttr("thumbnail", Boolean.toString(entry.hasThumbnail()), imgElem, support); if (entry.getPos() != null) { Element posElem = support.createElement("position"); posElem.setAttribute("lat", Double.toString(entry.getPos().lat())); posElem.setAttribute("lon", Double.toString(entry.getPos().lon())); imgElem.appendChild(posElem); } if (entry.getSpeed() != null) { addAttr("speed", entry.getSpeed().toString(), imgElem, support); } if (entry.getElevation() != null) { addAttr("elevation", entry.getElevation().toString(), imgElem, support); } if (entry.hasGpsTime()) { addAttr("gps-time", Long.toString(entry.getGpsTime().getTime()), imgElem, support); } if (entry.getExifOrientation() != null) { addAttr("exif-orientation", Integer.toString(entry.getExifOrientation()), imgElem, support); } if (entry.hasExifTime()) { addAttr("exif-time", Long.toString(entry.getExifTime().getTime()), imgElem, support); } if (entry.hasExifGpsTime()) { addAttr("exif-gps-time", Long.toString(entry.getExifGpsTime().getTime()), imgElem, support); } if (entry.getExifCoor() != null) { Element posElem = support.createElement("exif-coordinates"); posElem.setAttribute("lat", Double.toString(entry.getExifCoor().lat())); posElem.setAttribute("lon", Double.toString(entry.getExifCoor().lon())); imgElem.appendChild(posElem); } if (entry.getExifImgDir() != null) { addAttr("exif-image-direction", entry.getExifImgDir().toString(), imgElem, support); } if (entry.hasNewGpsData()) { addAttr("is-new-gps-data", Boolean.toString(entry.hasNewGpsData()), imgElem, support); } layerElem.appendChild(imgElem); } return layerElem; } private static void addAttr(String name, String value, Element element, SessionWriter.ExportSupport support) { Element attrElem = support.createElement(name); attrElem.appendChild(support.createTextNode(value)); element.appendChild(attrElem); } }