Ticket #23728: 23728-2.patch
File 23728-2.patch, 7.8 KB (added by , 14 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; … … 41 43 import org.openstreetmap.josm.gui.PleaseWaitRunnable; 42 44 import org.openstreetmap.josm.gui.io.importexport.AllFormatsImporter; 43 45 import org.openstreetmap.josm.gui.io.importexport.FileImporter; 46 import org.openstreetmap.josm.gui.io.importexport.ImageImporter; 44 47 import org.openstreetmap.josm.gui.io.importexport.Options; 48 import org.openstreetmap.josm.gui.layer.Layer; 49 import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer; 45 50 import org.openstreetmap.josm.gui.util.GuiHelper; 46 51 import org.openstreetmap.josm.gui.widgets.AbstractFileChooser; 47 52 import org.openstreetmap.josm.gui.widgets.FileChooserManager; … … 293 298 chosenImporter = null; 294 299 } 295 300 getProgressMonitor().setTicksCount(files.size()); 301 boolean openImageViewerDialog = false; 296 302 297 303 if (chosenImporter != null) { 298 304 // The importer was explicitly chosen, so use it. … … 345 351 List<FileImporter> importers = new ArrayList<>(importerMap.keySet()); 346 352 Collections.sort(importers); 347 353 Collections.reverse(importers); 348 349 354 for (FileImporter importer : importers) { 355 if (importer instanceof ImageImporter) 356 openImageViewerDialog = true; 350 357 importData(importer, new ArrayList<>(importerMap.get(importer))); 351 358 } 352 359 … … 377 384 int maxsize = Math.max(0, Config.getPref().getInt("file-open.history.max-size", 15)); 378 385 PreferencesUtils.putListBounded(Config.getPref(), "file-open.history", maxsize, new ArrayList<>(fileHistory)); 379 386 } 387 if (openImageViewerDialog && !GraphicsEnvironment.isHeadless()) { 388 showFirstImage(); 389 } 380 390 } 381 391 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 382 405 /** 383 406 * Import data files with the given importer. 384 407 * @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; … … 64 66 import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToPreviousMarker; 65 67 import org.openstreetmap.josm.gui.layer.Layer; 66 68 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener; 67 import org.openstreetmap.josm.gui.util.GuiHelper;68 69 import org.openstreetmap.josm.gui.util.imagery.Vector3D; 69 70 import org.openstreetmap.josm.tools.ImageProvider; 70 71 import org.openstreetmap.josm.tools.ListenerList; … … 89 90 GpxData gpxFauxData; 90 91 91 92 private CorrelateGpxWithImages gpxCorrelateAction; 93 private ShowImageAction showImageAction; 92 94 93 95 private final Icon icon = ImageProvider.get("dialogs/geoimage/photo-marker"); 94 96 private final Icon selectedIcon = ImageProvider.get("dialogs/geoimage/photo-marker-selected"); … … 191 193 this.useThumbs = useThumbs; 192 194 this.data.addImageDataUpdateListener(this); 193 195 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 196 } 208 197 209 198 private final class ImageMouseListener extends MouseAdapter { … … 348 337 entries.add(SeparatorLayerAction.INSTANCE); 349 338 entries.add(new JumpToNextMarker(this)); 350 339 entries.add(new JumpToPreviousMarker(this)); 340 entries.add(getShowImageAction()); 351 341 entries.add(SeparatorLayerAction.INSTANCE); 352 342 entries.add(new LayerListPopup.InfoAction(this)); 353 343 … … 517 507 } 518 508 } 519 509 510 if (!ImageViewerDialog.hasInstance()) 511 return; 512 520 513 final IImageEntry<?> currentImage = ImageViewerDialog.getCurrentImage(); 521 514 for (ImageEntry e: data.getSelectedImages()) { 522 515 if (e != null && e.getPos() != null) { … … 997 990 .sorted(Comparator.comparing(ImageEntry::getExifInstant)) 998 991 .collect(toList()); 999 992 } 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 } 1000 1032 }