IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
diff --git a/src/org/openstreetmap/josm/data/ImageData.java b/src/org/openstreetmap/josm/data/ImageData.java
|
a
|
b
|
|
| 10 | 10 | import org.openstreetmap.josm.data.coor.LatLon; |
| 11 | 11 | import org.openstreetmap.josm.data.gpx.GpxImageEntry; |
| 12 | 12 | import org.openstreetmap.josm.data.osm.QuadBuckets; |
| | 13 | import org.openstreetmap.josm.gui.layer.Layer; |
| 13 | 14 | import org.openstreetmap.josm.gui.layer.geoimage.ImageEntry; |
| 14 | 15 | import org.openstreetmap.josm.tools.ListenerList; |
| 15 | 16 | |
| … |
… |
|
| 41 | 42 | |
| 42 | 43 | private final ListenerList<ImageDataUpdateListener> listeners = ListenerList.create(); |
| 43 | 44 | private final QuadBuckets<ImageEntry> geoImages = new QuadBuckets<>(); |
| | 45 | private Layer layer; |
| | 46 | |
| 44 | 47 | |
| 45 | 48 | /** |
| 46 | 49 | * Construct a new image container without images |
| … |
… |
|
| 375 | 378 | notifyImageUpdate(); |
| 376 | 379 | } |
| 377 | 380 | |
| | 381 | /** |
| | 382 | * Set the layer for use with {@link org.openstreetmap.josm.gui.layer.geoimage.ImageViewerDialog#displayImages(Layer, List)} |
| | 383 | * @param layer The layer to use for organization |
| | 384 | * @since xxx |
| | 385 | */ |
| | 386 | public void setLayer(Layer layer) { |
| | 387 | this.layer = layer; |
| | 388 | } |
| | 389 | |
| | 390 | /** |
| | 391 | * Get the layer that this data is associated with. May be {@code null}. |
| | 392 | * @return The layer this data is associated with. |
| | 393 | * @since xxx |
| | 394 | */ |
| | 395 | public Layer getLayer() { |
| | 396 | return this.layer; |
| | 397 | } |
| | 398 | |
| | 399 | |
| 378 | 400 | /** |
| 379 | 401 | * Add a listener that listens to image data changes |
| 380 | 402 | * @param listener the {@link ImageDataUpdateListener} |
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java b/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
|
a
|
b
|
|
| 171 | 171 | this.gpxData = gpxData; |
| 172 | 172 | this.useThumbs = useThumbs; |
| 173 | 173 | this.data.addImageDataUpdateListener(this); |
| | 174 | this.data.setLayer(this); |
| 174 | 175 | } |
| 175 | 176 | |
| 176 | 177 | private final class ImageMouseListener extends MouseAdapter { |
| … |
… |
|
| 231 | 232 | } |
| 232 | 233 | } else { |
| 233 | 234 | data.setSelectedImage(img); |
| | 235 | ImageViewerDialog.getInstance().displayImages(GeoImageLayer.this, Collections.singletonList(img)); |
| 234 | 236 | } |
| 235 | 237 | } |
| 236 | 238 | } |
| … |
… |
|
| 521 | 523 | * Show current photo on map and in image viewer. |
| 522 | 524 | */ |
| 523 | 525 | public void showCurrentPhoto() { |
| 524 | | if (data.getSelectedImage() != null) { |
| 525 | | clearOtherCurrentPhotos(); |
| 526 | | } |
| 527 | 526 | updateBufferAndRepaint(); |
| 528 | 527 | } |
| 529 | 528 | |
| … |
… |
|
| 628 | 627 | } |
| 629 | 628 | } |
| 630 | 629 | |
| 631 | | /** |
| 632 | | * Clears the currentPhoto of the other GeoImageLayer's. Otherwise there could be multiple selected photos. |
| 633 | | */ |
| 634 | | private void clearOtherCurrentPhotos() { |
| 635 | | for (GeoImageLayer layer: |
| 636 | | MainApplication.getLayerManager().getLayersOfType(GeoImageLayer.class)) { |
| 637 | | if (layer != this) { |
| 638 | | layer.getImageData().clearSelectedImage(); |
| 639 | | } |
| 640 | | } |
| 641 | | } |
| 642 | | |
| 643 | 630 | /** |
| 644 | 631 | * Registers a map mode for which the functionality of this layer should be available. |
| 645 | 632 | * @param mapMode Map mode to be registered |
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
|
a
|
b
|
|
| 8 | 8 | import java.awt.BorderLayout; |
| 9 | 9 | import java.awt.Component; |
| 10 | 10 | import java.awt.Dimension; |
| | 11 | import java.awt.FlowLayout; |
| 11 | 12 | import java.awt.GridBagConstraints; |
| 12 | 13 | import java.awt.GridBagLayout; |
| 13 | 14 | import java.awt.event.ActionEvent; |
| … |
… |
|
| 21 | 22 | import java.util.ArrayList; |
| 22 | 23 | import java.util.Arrays; |
| 23 | 24 | import java.util.Collections; |
| | 25 | import java.util.HashMap; |
| 24 | 26 | import java.util.List; |
| | 27 | import java.util.Map; |
| 25 | 28 | import java.util.Objects; |
| 26 | 29 | import java.util.Optional; |
| 27 | 30 | import java.util.concurrent.Future; |
| … |
… |
|
| 52 | 55 | import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener; |
| 53 | 56 | import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent; |
| 54 | 57 | import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent; |
| | 58 | import org.openstreetmap.josm.gui.layer.MainLayerManager; |
| 55 | 59 | import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent; |
| 56 | 60 | import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener; |
| 57 | 61 | import org.openstreetmap.josm.gui.layer.imagery.ImageryFilterSettings; |
| … |
… |
|
| 120 | 124 | private JButton btnOpenExternal; |
| 121 | 125 | private JButton btnDeleteFromDisk; |
| 122 | 126 | private JToggleButton tbCentre; |
| | 127 | /** The layer tab (used to select images when multiple layers provide images, makes for easy switching) */ |
| | 128 | private JPanel layers; |
| 123 | 129 | |
| 124 | 130 | private ImageViewerDialog() { |
| 125 | 131 | super(tr("Geotagged Images"), "geoimage", tr("Display geotagged images"), Shortcut.registerShortcut("tools:geotagged", |
| … |
… |
|
| 152 | 158 | |
| 153 | 159 | private void build() { |
| 154 | 160 | JPanel content = new JPanel(new BorderLayout()); |
| | 161 | this.layers = new JPanel(new FlowLayout(FlowLayout.LEADING)); |
| | 162 | content.add(layers, BorderLayout.NORTH); |
| 155 | 163 | |
| 156 | 164 | content.add(imgDisplay, BorderLayout.CENTER); |
| 157 | 165 | |
| … |
… |
|
| 213 | 221 | createLayout(content, false, null); |
| 214 | 222 | } |
| 215 | 223 | |
| | 224 | private void updateLayers() { |
| | 225 | if (this.tabbedEntries.size() <= 1) { |
| | 226 | this.layers.setVisible(false); |
| | 227 | } else { |
| | 228 | final IImageEntry<?> current; |
| | 229 | synchronized (this) { |
| | 230 | current = this.currentEntry; |
| | 231 | } |
| | 232 | this.layers.setVisible(true); |
| | 233 | // Remove all old components |
| | 234 | this.layers.removeAll(); |
| | 235 | MainLayerManager layerManager = MainApplication.getLayerManager(); |
| | 236 | List<Layer> invalidLayers = this.tabbedEntries.keySet().stream().filter(layer -> !layerManager.containsLayer(layer)) |
| | 237 | .collect(Collectors.toList()); |
| | 238 | // We need to do multiple calls to avoid ConcurrentModificationExceptions |
| | 239 | invalidLayers.forEach(this.tabbedEntries::remove); |
| | 240 | for (Map.Entry<Layer, List<IImageEntry<?>>> entry : this.tabbedEntries.entrySet()) { |
| | 241 | JButton layerButton = new JButton(tr(entry.getKey().getLabel())); |
| | 242 | layerButton.addActionListener(l -> this.displayImages(entry.getKey(), entry.getValue())); |
| | 243 | if (entry.getValue().contains(current)) { |
| | 244 | layerButton.setSelected(true); |
| | 245 | } |
| | 246 | this.layers.add(layerButton); |
| | 247 | } |
| | 248 | this.layers.invalidate(); |
| | 249 | } |
| | 250 | } |
| | 251 | |
| 216 | 252 | @Override |
| 217 | 253 | public void destroy() { |
| 218 | 254 | MainApplication.getLayerManager().removeActiveLayerChangeListener(this); |
| … |
… |
|
| 551 | 587 | return wasEnabled; |
| 552 | 588 | } |
| 553 | 589 | |
| | 590 | /** Used for tabbed panes */ |
| | 591 | private final transient Map<Layer, List<IImageEntry<?>>> tabbedEntries = new HashMap<>(); |
| 554 | 592 | private transient IImageEntry<? extends IImageEntry<?>> currentEntry; |
| 555 | 593 | |
| 556 | 594 | /** |
| … |
… |
|
| 578 | 616 | * @since 18246 |
| 579 | 617 | */ |
| 580 | 618 | public void displayImages(List<IImageEntry<?>> entries) { |
| | 619 | this.displayImages((Layer) null, entries); |
| | 620 | } |
| | 621 | |
| | 622 | /** |
| | 623 | * Displays images for the given layer. |
| | 624 | * @param layer The layer to use for the tab ui |
| | 625 | * @param entries image entries |
| | 626 | * @since xxx |
| | 627 | */ |
| | 628 | public void displayImages(Layer layer, List<IImageEntry<?>> entries) { |
| 581 | 629 | boolean imageChanged; |
| 582 | 630 | IImageEntry<?> entry = entries != null && entries.size() == 1 ? entries.get(0) : null; |
| 583 | 631 | |
| … |
… |
|
| 598 | 646 | } |
| 599 | 647 | } |
| 600 | 648 | |
| | 649 | if (entries == null || entries.isEmpty()) { |
| | 650 | this.tabbedEntries.remove(layer); |
| | 651 | } else { |
| | 652 | this.tabbedEntries.put(layer, entries); |
| | 653 | } |
| | 654 | this.updateLayers(); |
| 601 | 655 | if (entry != null) { |
| 602 | 656 | this.updateButtonsNonNullEntry(entry, imageChanged); |
| 603 | 657 | } else { |
| … |
… |
|
| 819 | 873 | |
| 820 | 874 | @Override |
| 821 | 875 | public void selectedImageChanged(ImageData data) { |
| 822 | | displayImages(new ArrayList<>(data.getSelectedImages())); |
| | 876 | displayImages(data.getLayer(), new ArrayList<>(data.getSelectedImages())); |
| 823 | 877 | } |
| 824 | 878 | |
| 825 | 879 | @Override |
| 826 | 880 | public void imageDataUpdated(ImageData data) { |
| 827 | | displayImages(new ArrayList<>(data.getSelectedImages())); |
| | 881 | displayImages(data.getLayer(), new ArrayList<>(data.getSelectedImages())); |
| 828 | 882 | } |
| 829 | 883 | } |