Ticket #23728: 23728-3.patch

File 23728-3.patch, 5.9 KB (added by GerdP, 2 years 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;
     
    4243import org.openstreetmap.josm.gui.io.importexport.AllFormatsImporter;
    4344import org.openstreetmap.josm.gui.io.importexport.FileImporter;
    4445import org.openstreetmap.josm.gui.io.importexport.Options;
     46import org.openstreetmap.josm.gui.layer.Layer;
     47import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
    4548import org.openstreetmap.josm.gui.util.GuiHelper;
    4649import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
    4750import org.openstreetmap.josm.gui.widgets.FileChooserManager;
     
    273276        @Override
    274277        protected void realRun() throws SAXException, IOException, OsmTransferException {
    275278            if (Utils.isEmpty(files)) return;
     279            List<Layer> oldLayers = MainApplication.getLayerManager().getLayers();
    276280
    277281            /*
    278282             * Find the importer with the chosen file filter
     
    377381                int maxsize = Math.max(0, Config.getPref().getInt("file-open.history.max-size", 15));
    378382                PreferencesUtils.putListBounded(Config.getPref(), "file-open.history", maxsize, new ArrayList<>(fileHistory));
    379383            }
     384            if (!canceled && !GraphicsEnvironment.isHeadless()) {
     385                checkNewLayers(oldLayers);
     386            }
    380387        }
    381388
     389        private static void checkNewLayers(List<Layer> oldLayers) {
     390            // We do have to wrap the EDT call in a worker call, since layers may be created in the EDT.
     391            // And the layer(s) must be added to the layer list in order for the dialog to work properly.
     392            MainApplication.worker.execute(() -> GuiHelper.runInEDT(() -> {
     393                List<Layer> newLayers = MainApplication.getLayerManager().getLayers();
     394                // see #23728: open first image of topmost new image layer
     395                for (Layer l : newLayers) {
     396                    if (oldLayers.contains(l))
     397                        return;
     398                    if (l instanceof GeoImageLayer) {
     399                        GeoImageLayer imageLayer = (GeoImageLayer) l;
     400                        imageLayer.jumpToNextMarker();
     401                        return;
     402                    }
     403                }
     404            }));
     405        }
     406
    382407        /**
    383408         * Import data files with the given importer.
    384409         * @param importer file importer
  • src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java

     
    6464import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToPreviousMarker;
    6565import org.openstreetmap.josm.gui.layer.Layer;
    6666import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
    67 import org.openstreetmap.josm.gui.util.GuiHelper;
    6867import org.openstreetmap.josm.gui.util.imagery.Vector3D;
    6968import org.openstreetmap.josm.tools.ImageProvider;
    7069import org.openstreetmap.josm.tools.ListenerList;
     
    191190        this.useThumbs = useThumbs;
    192191        this.data.addImageDataUpdateListener(this);
    193192        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         }
    207193    }
    208194
    209195    private final class ImageMouseListener extends MouseAdapter {
     
    517503            }
    518504        }
    519505
    520         final IImageEntry<?> currentImage = ImageViewerDialog.getCurrentImage();
    521506        for (ImageEntry e: data.getSelectedImages()) {
    522507            if (e != null && e.getPos() != null) {
    523508                Point p = mv.getPoint(e.getPos());
     
    532517                if (useThumbs && e.hasThumbnail()) {
    533518                    g.setColor(new Color(128, 0, 0, 122));
    534519                    g.fillRect(p.x - imgDim.width / 2, p.y - imgDim.height / 2, imgDim.width, imgDim.height);
    535                 } else if (e.equals(currentImage)) {
     520                } else if (e.equals(ImageViewerDialog.getCurrentImage())) {
    536521                    selectedIcon.paintIcon(mv, g,
    537522                            p.x - imgDim.width / 2,
    538523                            p.y - imgDim.height / 2);
     
    919904    @Override
    920905    public void jumpToNextMarker() {
    921906        data.setSelectedImage(data.getNextImage());
     907        if (data.getSelectedImage() != null)
     908            ImageViewerDialog.getInstance().displayImages(Collections.singletonList(data.getSelectedImage()));
     909
    922910    }
    923911
    924912    @Override
    925913    public void jumpToPreviousMarker() {
    926914        data.setSelectedImage(data.getPreviousImage());
     915        if (data.getSelectedImage() != null)
     916            ImageViewerDialog.getInstance().displayImages(Collections.singletonList(data.getSelectedImage()));
    927917    }
    928918
    929919    /**