Ticket #23728: 23728.patch
File 23728.patch, 7.2 KB (added by , 9 months ago) |
---|
-
src/org/openstreetmap/josm/actions/OpenFileAction.java
6 6 import static org.openstreetmap.josm.tools.I18n.tr; 7 7 import static org.openstreetmap.josm.tools.I18n.trn; 8 8 9 import java.awt.GraphicsEnvironment; 9 10 import java.awt.event.ActionEvent; 10 11 import java.awt.event.KeyEvent; 11 12 import java.io.BufferedReader; … … 23 24 import java.util.LinkedList; 24 25 import java.util.List; 25 26 import java.util.Objects; 27 import java.util.Optional; 26 28 import java.util.Set; 27 29 import java.util.concurrent.Future; 28 30 import java.util.regex.Matcher; … … 33 35 import javax.swing.SwingUtilities; 34 36 import javax.swing.filechooser.FileFilter; 35 37 38 import org.openstreetmap.josm.data.Data; 39 import org.openstreetmap.josm.data.ImageData; 36 40 import org.openstreetmap.josm.data.PreferencesUtils; 37 41 import org.openstreetmap.josm.gui.HelpAwareOptionPane; 38 42 import org.openstreetmap.josm.gui.MainApplication; … … 41 45 import org.openstreetmap.josm.gui.PleaseWaitRunnable; 42 46 import org.openstreetmap.josm.gui.io.importexport.AllFormatsImporter; 43 47 import org.openstreetmap.josm.gui.io.importexport.FileImporter; 48 import org.openstreetmap.josm.gui.io.importexport.ImageImporter; 44 49 import org.openstreetmap.josm.gui.io.importexport.Options; 50 import org.openstreetmap.josm.gui.layer.Layer; 51 import org.openstreetmap.josm.gui.layer.LayerManager; 52 import org.openstreetmap.josm.gui.layer.MainLayerManager; 53 import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer; 54 import org.openstreetmap.josm.gui.layer.geoimage.ImageViewerDialog; 45 55 import org.openstreetmap.josm.gui.util.GuiHelper; 46 56 import org.openstreetmap.josm.gui.widgets.AbstractFileChooser; 47 57 import org.openstreetmap.josm.gui.widgets.FileChooserManager; … … 293 303 chosenImporter = null; 294 304 } 295 305 getProgressMonitor().setTicksCount(files.size()); 306 boolean openImageViewerDialog = false; 296 307 297 308 if (chosenImporter != null) { 298 309 // The importer was explicitly chosen, so use it. … … 345 356 List<FileImporter> importers = new ArrayList<>(importerMap.keySet()); 346 357 Collections.sort(importers); 347 358 Collections.reverse(importers); 348 349 359 for (FileImporter importer : importers) { 360 if (importer instanceof ImageImporter) 361 openImageViewerDialog = true; 350 362 importData(importer, new ArrayList<>(importerMap.get(importer))); 351 363 } 352 364 … … 377 389 int maxsize = Math.max(0, Config.getPref().getInt("file-open.history.max-size", 15)); 378 390 PreferencesUtils.putListBounded(Config.getPref(), "file-open.history", maxsize, new ArrayList<>(fileHistory)); 379 391 } 392 if (openImageViewerDialog && !GraphicsEnvironment.isHeadless()) { 393 showFirstImage(); 394 } 380 395 } 381 396 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 382 410 /** 383 411 * Import data files with the given importer. 384 412 * @param importer file importer -
src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
15 15 import java.awt.Point; 16 16 import java.awt.Rectangle; 17 17 import java.awt.RenderingHints; 18 import java.awt.event.ActionEvent; 18 19 import java.awt.event.MouseAdapter; 19 20 import java.awt.event.MouseEvent; 20 21 import java.awt.event.MouseMotionAdapter; … … 30 31 import java.util.concurrent.ExecutorService; 31 32 import java.util.concurrent.Executors; 32 33 34 import javax.swing.AbstractAction; 33 35 import javax.swing.Action; 34 36 import javax.swing.Icon; 35 37 import javax.swing.ImageIcon; … … 89 91 GpxData gpxFauxData; 90 92 91 93 private CorrelateGpxWithImages gpxCorrelateAction; 94 private ShowFirstImageAction showFirstImageAction; 92 95 93 96 private final Icon icon = ImageProvider.get("dialogs/geoimage/photo-marker"); 94 97 private final Icon selectedIcon = ImageProvider.get("dialogs/geoimage/photo-marker-selected"); … … 191 194 this.useThumbs = useThumbs; 192 195 this.data.addImageDataUpdateListener(this); 193 196 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 }207 197 } 208 198 209 199 private final class ImageMouseListener extends MouseAdapter { … … 348 338 entries.add(SeparatorLayerAction.INSTANCE); 349 339 entries.add(new JumpToNextMarker(this)); 350 340 entries.add(new JumpToPreviousMarker(this)); 341 entries.add(getShowFirstImageAction()); 351 342 entries.add(SeparatorLayerAction.INSTANCE); 352 343 entries.add(new LayerListPopup.InfoAction(this)); 353 344 … … 997 988 .sorted(Comparator.comparing(ImageEntry::getExifInstant)) 998 989 .collect(toList()); 999 990 } 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 } 1000 1025 }