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.JpgImporter;
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 aciton 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        JpgImporter importer = new JpgImporter(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}