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}