Ticket #23728: 23728.patch

File 23728.patch, 7.2 KB (added by GerdP, 9 months ago)

Work in progress patch

  • src/org/openstreetmap/josm/actions/OpenFileAction.java

     
    66import static org.openstreetmap.josm.tools.I18n.tr;
    77import static org.openstreetmap.josm.tools.I18n.trn;
    88
     9import java.awt.GraphicsEnvironment;
    910import java.awt.event.ActionEvent;
    1011import java.awt.event.KeyEvent;
    1112import java.io.BufferedReader;
     
    2324import java.util.LinkedList;
    2425import java.util.List;
    2526import java.util.Objects;
     27import java.util.Optional;
    2628import java.util.Set;
    2729import java.util.concurrent.Future;
    2830import java.util.regex.Matcher;
     
    3335import javax.swing.SwingUtilities;
    3436import javax.swing.filechooser.FileFilter;
    3537
     38import org.openstreetmap.josm.data.Data;
     39import org.openstreetmap.josm.data.ImageData;
    3640import org.openstreetmap.josm.data.PreferencesUtils;
    3741import org.openstreetmap.josm.gui.HelpAwareOptionPane;
    3842import org.openstreetmap.josm.gui.MainApplication;
     
    4145import org.openstreetmap.josm.gui.PleaseWaitRunnable;
    4246import org.openstreetmap.josm.gui.io.importexport.AllFormatsImporter;
    4347import org.openstreetmap.josm.gui.io.importexport.FileImporter;
     48import org.openstreetmap.josm.gui.io.importexport.ImageImporter;
    4449import org.openstreetmap.josm.gui.io.importexport.Options;
     50import org.openstreetmap.josm.gui.layer.Layer;
     51import org.openstreetmap.josm.gui.layer.LayerManager;
     52import org.openstreetmap.josm.gui.layer.MainLayerManager;
     53import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
     54import org.openstreetmap.josm.gui.layer.geoimage.ImageViewerDialog;
    4555import org.openstreetmap.josm.gui.util.GuiHelper;
    4656import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
    4757import org.openstreetmap.josm.gui.widgets.FileChooserManager;
     
    293303                chosenImporter = null;
    294304            }
    295305            getProgressMonitor().setTicksCount(files.size());
     306            boolean openImageViewerDialog = false;
    296307
    297308            if (chosenImporter != null) {
    298309                // The importer was explicitly chosen, so use it.
     
    345356                List<FileImporter> importers = new ArrayList<>(importerMap.keySet());
    346357                Collections.sort(importers);
    347358                Collections.reverse(importers);
    348 
    349359                for (FileImporter importer : importers) {
     360                        if (importer instanceof ImageImporter)
     361                                openImageViewerDialog = true;
    350362                    importData(importer, new ArrayList<>(importerMap.get(importer)));
    351363                }
    352364
     
    377389                int maxsize = Math.max(0, Config.getPref().getInt("file-open.history.max-size", 15));
    378390                PreferencesUtils.putListBounded(Config.getPref(), "file-open.history", maxsize, new ArrayList<>(fileHistory));
    379391            }
     392                        if (openImageViewerDialog && !GraphicsEnvironment.isHeadless()) {
     393                                showFirstImage();
     394                        }
    380395        }
    381396
     397                private static void showFirstImage() {
     398                        // We do have to wrap the EDT call in a worker call, since layers may be created in the EDT.
     399                        // And the layer must be added to the layer list in order for the dialog to work properly.
     400                        MainApplication.worker.execute(() -> {
     401                                Optional<Layer> l = MainApplication.getLayerManager().getLayers().stream()
     402                                                .filter(GeoImageLayer.class::isInstance).findFirst();
     403                                if (l.isPresent()) {
     404                                        GeoImageLayer imageLayer = (GeoImageLayer) l.get();
     405                                        imageLayer.showFirstImage();
     406                                }
     407                        });
     408                }
     409
    382410        /**
    383411         * Import data files with the given importer.
    384412         * @param importer file importer
  • src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java

     
    1515import java.awt.Point;
    1616import java.awt.Rectangle;
    1717import java.awt.RenderingHints;
     18import java.awt.event.ActionEvent;
    1819import java.awt.event.MouseAdapter;
    1920import java.awt.event.MouseEvent;
    2021import java.awt.event.MouseMotionAdapter;
     
    3031import java.util.concurrent.ExecutorService;
    3132import java.util.concurrent.Executors;
    3233
     34import javax.swing.AbstractAction;
    3335import javax.swing.Action;
    3436import javax.swing.Icon;
    3537import javax.swing.ImageIcon;
     
    8991    GpxData gpxFauxData;
    9092
    9193    private CorrelateGpxWithImages gpxCorrelateAction;
     94    private ShowFirstImageAction showFirstImageAction;
    9295
    9396    private final Icon icon = ImageProvider.get("dialogs/geoimage/photo-marker");
    9497    private final Icon selectedIcon = ImageProvider.get("dialogs/geoimage/photo-marker-selected");
     
    191194        this.useThumbs = useThumbs;
    192195        this.data.addImageDataUpdateListener(this);
    193196        this.data.setLayer(this);
    194         if (!ImageViewerDialog.hasInstance()) {
    195             GuiHelper.runInEDTAndWait(() -> {
    196                 if (!ImageViewerDialog.hasInstance()) {
    197                     ImageViewerDialog.createInstance();
    198                 }
    199             });
    200         }
    201         if (getInvalidGeoImages().size() == data.size()) {
    202             this.data.setSelectedImage(this.data.getFirstImage());
    203             // We do have to wrap the EDT call in a worker call, since layers may be created in the EDT.
    204             // And the layer must be added to the layer list in order for the dialog to work properly.
    205             MainApplication.worker.execute(() -> GuiHelper.runInEDT(() -> ImageViewerDialog.getInstance().displayImages(this.getSelection())));
    206         }
    207197    }
    208198
    209199    private final class ImageMouseListener extends MouseAdapter {
     
    348338        entries.add(SeparatorLayerAction.INSTANCE);
    349339        entries.add(new JumpToNextMarker(this));
    350340        entries.add(new JumpToPreviousMarker(this));
     341        entries.add(getShowFirstImageAction());
    351342        entries.add(SeparatorLayerAction.INSTANCE);
    352343        entries.add(new LayerListPopup.InfoAction(this));
    353344
     
    997988                .sorted(Comparator.comparing(ImageEntry::getExifInstant))
    998989                .collect(toList());
    999990    }
     991
     992    private class ShowFirstImageAction extends AbstractAction  {
     993        public ShowFirstImageAction() {
     994            super(tr("Show first image"), ImageProvider.get("dialogs/first", ImageProvider.ImageSizes.MENU));
     995            setEnabled(true);
     996                }
     997
     998                @Override
     999                public void actionPerformed(ActionEvent e) {
     1000                        showFirstImage();
     1001                }
     1002    }
     1003
     1004    /**
     1005     * Returns the gpxCorrelateAction
     1006     * @return the gpxCorrelateAction
     1007     */
     1008    private ShowFirstImageAction getShowFirstImageAction() {
     1009        if (showFirstImageAction == null) {
     1010            showFirstImageAction = new ShowFirstImageAction();
     1011        }
     1012        return showFirstImageAction;
     1013    }
     1014
     1015    /**
     1016     * Open ImageViewerDialog with the first image in layer (if available).
     1017     * @since xxx
     1018     */
     1019        public void showFirstImage() {
     1020                if (data != null && !data.getImages().isEmpty()) {
     1021                        data.setSelectedImage(data.getFirstImage());
     1022                        GuiHelper.runInEDT(() -> ImageViewerDialog.getInstance().displayImages(getSelection()));
     1023                }
     1024        }
    10001025}