001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.layer.gpx; 003 004import static org.openstreetmap.josm.gui.help.HelpUtil.ht; 005import static org.openstreetmap.josm.tools.I18n.tr; 006 007import java.awt.event.ActionEvent; 008import java.io.File; 009import java.util.LinkedList; 010import java.util.List; 011 012import javax.swing.AbstractAction; 013import javax.swing.JFileChooser; 014import javax.swing.JOptionPane; 015 016import org.openstreetmap.josm.gui.HelpAwareOptionPane; 017import org.openstreetmap.josm.gui.MainApplication; 018import org.openstreetmap.josm.gui.io.importexport.ImageImporter; 019import org.openstreetmap.josm.gui.layer.GpxLayer; 020import org.openstreetmap.josm.gui.progress.NullProgressMonitor; 021import org.openstreetmap.josm.gui.widgets.AbstractFileChooser; 022import org.openstreetmap.josm.gui.widgets.FileChooserManager; 023import org.openstreetmap.josm.spi.preferences.Config; 024import org.openstreetmap.josm.tools.ImageProvider; 025import org.openstreetmap.josm.tools.Utils; 026 027/** 028 * An action that imports images along a GPX path 029 */ 030public class ImportImagesAction extends AbstractAction { 031 private final transient GpxLayer layer; 032 033 /** 034 * Create a new {@link ImportImagesAction} 035 * @param layer The layer this action should be for 036 */ 037 public ImportImagesAction(final GpxLayer layer) { 038 super(tr("Import images")); 039 new ImageProvider("dialogs/geoimage").getResource().attachImageIcon(this, true); 040 this.layer = layer; 041 putValue("help", ht("/Action/ImportImages")); 042 } 043 044 private static void warnCantImportIntoServerLayer(GpxLayer layer) { 045 String msg = tr("<html>The data in the GPX layer ''{0}'' has been downloaded from the server.<br>"+ 046 "Because its way points do not include a timestamp we cannot correlate them with images.</html>", 047 Utils.escapeReservedCharactersHTML(layer.getName())); 048 HelpAwareOptionPane.showOptionDialog(MainApplication.getMainFrame(), msg, tr("Import not possible"), 049 JOptionPane.WARNING_MESSAGE, ht("/Action/ImportImages#CantImportIntoGpxLayerFromServer")); 050 } 051 052 private static void addRecursiveFiles(List<File> files, File... sel) { 053 if (sel == null) { // listFiles might return null 054 return; 055 } 056 for (File f : sel) { 057 if (f.isDirectory()) { 058 addRecursiveFiles(files, f.listFiles()); 059 } else if (Utils.hasExtension(f, "jpg")) { 060 files.add(f); 061 } 062 } 063 } 064 065 @Override 066 public void actionPerformed(ActionEvent e) { 067 if (layer.data.fromServer) { 068 warnCantImportIntoServerLayer(layer); 069 return; 070 } 071 ImageImporter importer = new ImageImporter(layer); 072 AbstractFileChooser fc = new FileChooserManager(true, "geoimage.lastdirectory", Config.getPref().get("lastDirectory")). 073 createFileChooser(true, null, importer.filter, JFileChooser.FILES_AND_DIRECTORIES).openFileChooser(); 074 if (fc != null) { 075 File[] sel = fc.getSelectedFiles(); 076 if (sel != null && sel.length > 0) { 077 List<File> files = new LinkedList<>(); 078 addRecursiveFiles(files, sel); 079 importer.importDataHandleExceptions(files, NullProgressMonitor.INSTANCE); 080 } 081 } 082 } 083 084}