Ticket #23728: 23728-2.patch

File 23728-2.patch, 7.8 KB (added by GerdP, 14 months ago)
  • 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;
     
    4143import org.openstreetmap.josm.gui.PleaseWaitRunnable;
    4244import org.openstreetmap.josm.gui.io.importexport.AllFormatsImporter;
    4345import org.openstreetmap.josm.gui.io.importexport.FileImporter;
     46import org.openstreetmap.josm.gui.io.importexport.ImageImporter;
    4447import org.openstreetmap.josm.gui.io.importexport.Options;
     48import org.openstreetmap.josm.gui.layer.Layer;
     49import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
    4550import org.openstreetmap.josm.gui.util.GuiHelper;
    4651import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
    4752import org.openstreetmap.josm.gui.widgets.FileChooserManager;
     
    293298                chosenImporter = null;
    294299            }
    295300            getProgressMonitor().setTicksCount(files.size());
     301            boolean openImageViewerDialog = false;
    296302
    297303            if (chosenImporter != null) {
    298304                // The importer was explicitly chosen, so use it.
     
    345351                List<FileImporter> importers = new ArrayList<>(importerMap.keySet());
    346352                Collections.sort(importers);
    347353                Collections.reverse(importers);
    348 
    349354                for (FileImporter importer : importers) {
     355                    if (importer instanceof ImageImporter)
     356                        openImageViewerDialog = true;
    350357                    importData(importer, new ArrayList<>(importerMap.get(importer)));
    351358                }
    352359
     
    377384                int maxsize = Math.max(0, Config.getPref().getInt("file-open.history.max-size", 15));
    378385                PreferencesUtils.putListBounded(Config.getPref(), "file-open.history", maxsize, new ArrayList<>(fileHistory));
    379386            }
     387            if (openImageViewerDialog && !GraphicsEnvironment.isHeadless()) {
     388                showFirstImage();
     389            }
    380390        }
    381391
     392        private static void showFirstImage() {
     393            // We do have to wrap the EDT call in a worker call, since layers may be created in the EDT.
     394            // And the layer must be added to the layer list in order for the dialog to work properly.
     395            MainApplication.worker.execute(() -> {
     396                Optional<Layer> l = MainApplication.getLayerManager().getLayers().stream()
     397                        .filter(GeoImageLayer.class::isInstance).findFirst();
     398                if (l.isPresent()) {
     399                    GeoImageLayer imageLayer = (GeoImageLayer) l.get();
     400                    GuiHelper.runInEDT(imageLayer::showFirstImage);
     401                }
     402            });
     403        }
     404
    382405        /**
    383406         * Import data files with the given importer.
    384407         * @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;
     
    6466import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToPreviousMarker;
    6567import org.openstreetmap.josm.gui.layer.Layer;
    6668import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
    67 import org.openstreetmap.josm.gui.util.GuiHelper;
    6869import org.openstreetmap.josm.gui.util.imagery.Vector3D;
    6970import org.openstreetmap.josm.tools.ImageProvider;
    7071import org.openstreetmap.josm.tools.ListenerList;
     
    8990    GpxData gpxFauxData;
    9091
    9192    private CorrelateGpxWithImages gpxCorrelateAction;
     93    private ShowImageAction showImageAction;
    9294
    9395    private final Icon icon = ImageProvider.get("dialogs/geoimage/photo-marker");
    9496    private final Icon selectedIcon = ImageProvider.get("dialogs/geoimage/photo-marker-selected");
     
    191193        this.useThumbs = useThumbs;
    192194        this.data.addImageDataUpdateListener(this);
    193195        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         }
    207196    }
    208197
    209198    private final class ImageMouseListener extends MouseAdapter {
     
    348337        entries.add(SeparatorLayerAction.INSTANCE);
    349338        entries.add(new JumpToNextMarker(this));
    350339        entries.add(new JumpToPreviousMarker(this));
     340        entries.add(getShowImageAction());
    351341        entries.add(SeparatorLayerAction.INSTANCE);
    352342        entries.add(new LayerListPopup.InfoAction(this));
    353343
     
    517507            }
    518508        }
    519509
     510        if (!ImageViewerDialog.hasInstance())
     511            return;
     512       
    520513        final IImageEntry<?> currentImage = ImageViewerDialog.getCurrentImage();
    521514        for (ImageEntry e: data.getSelectedImages()) {
    522515            if (e != null && e.getPos() != null) {
     
    997990                .sorted(Comparator.comparing(ImageEntry::getExifInstant))
    998991                .collect(toList());
    999992    }
     993
     994    private class ShowImageAction extends AbstractAction {
     995        ShowImageAction() {
     996            super(tr("Show image"), ImageProvider.get("dialogs/geoimage", ImageProvider.ImageSizes.MENU));
     997            setEnabled(true);
     998        }
     999
     1000        @Override
     1001        public void actionPerformed(ActionEvent e) {
     1002            if (getSelection().isEmpty())
     1003                showFirstImage();
     1004            else
     1005                ImageViewerDialog.getInstance().displayImages(getSelection());
     1006        }
     1007    }
     1008
     1009    /**
     1010     * Returns the showImageAction
     1011     *
     1012     * @return the showImageAction
     1013     */
     1014    private ShowImageAction getShowImageAction() {
     1015        if (showImageAction == null) {
     1016            showImageAction = new ShowImageAction();
     1017        }
     1018        return showImageAction;
     1019    }
     1020
     1021    /**
     1022     * Open ImageViewerDialog with the first image in layer (if available).
     1023     *
     1024     * @since xxx
     1025     */
     1026    public void showFirstImage() {
     1027        if (data != null && !data.getImages().isEmpty()) {
     1028            data.setSelectedImage(data.getFirstImage());
     1029            ImageViewerDialog.getInstance().displayImages(getSelection());
     1030        }
     1031    }
    10001032}