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.Main; 017import org.openstreetmap.josm.gui.HelpAwareOptionPane; 018import org.openstreetmap.josm.gui.layer.GpxLayer; 019import org.openstreetmap.josm.gui.progress.NullProgressMonitor; 020import org.openstreetmap.josm.gui.widgets.AbstractFileChooser; 021import org.openstreetmap.josm.gui.widgets.FileChooserManager; 022import org.openstreetmap.josm.io.JpgImporter; 023import org.openstreetmap.josm.tools.ImageProvider; 024import org.openstreetmap.josm.tools.Utils; 025 026public class ImportImagesAction extends AbstractAction { 027 private final transient GpxLayer layer; 028 029 public ImportImagesAction(final GpxLayer layer) { 030 super(tr("Import images"), ImageProvider.get("dialogs/geoimage")); 031 this.layer = layer; 032 putValue("help", ht("/Action/ImportImages")); 033 } 034 035 private static void warnCantImportIntoServerLayer(GpxLayer layer) { 036 String msg = tr("<html>The data in the GPX layer ''{0}'' has been downloaded from the server.<br>"+ 037 "Because its way points do not include a timestamp we cannot correlate them with images.</html>", 038 layer.getName()); 039 HelpAwareOptionPane.showOptionDialog(Main.parent, msg, tr("Import not possible"), 040 JOptionPane.WARNING_MESSAGE, ht("/Action/ImportImages#CantImportIntoGpxLayerFromServer")); 041 } 042 043 private static void addRecursiveFiles(List<File> files, File[] sel) { 044 if (sel == null) { // listFiles might return null 045 return; 046 } 047 for (File f : sel) { 048 if (f.isDirectory()) { 049 addRecursiveFiles(files, f.listFiles()); 050 } else if (Utils.hasExtension(f, "jpg")) { 051 files.add(f); 052 } 053 } 054 } 055 056 @Override 057 public void actionPerformed(ActionEvent e) { 058 if (layer.data.fromServer) { 059 warnCantImportIntoServerLayer(layer); 060 return; 061 } 062 JpgImporter importer = new JpgImporter(layer); 063 AbstractFileChooser fc = new FileChooserManager(true, "geoimage.lastdirectory", Main.pref.get("lastDirectory")). 064 createFileChooser(true, null, importer.filter, JFileChooser.FILES_AND_DIRECTORIES).openFileChooser(); 065 if (fc != null) { 066 File[] sel = fc.getSelectedFiles(); 067 if (sel != null && sel.length > 0) { 068 List<File> files = new LinkedList<>(); 069 addRecursiveFiles(files, sel); 070 importer.importDataHandleExceptions(files, NullProgressMonitor.INSTANCE); 071 } 072 } 073 } 074 075}