Subject: [PATCH] Fix #22727: Listen to selection model changes instead of setVisible calls
---
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
|
|
| 175 | 175 | for (Layer l: MainApplication.getLayerManager().getLayers()) { |
| 176 | 176 | registerOnLayer(l); |
| 177 | 177 | } |
| | 178 | // This listener gets called _prior to_ the reorder event. If we do not delay the execution of the |
| | 179 | // model update, then the image will change instead of remaining the same. |
| | 180 | this.layers.getModel().addChangeListener(l -> MainApplication.worker.execute(() -> GuiHelper.runInEDT(() -> { |
| | 181 | Component selected = this.layers.getSelectedComponent(); |
| | 182 | if (selected instanceof MoveImgDisplayPanel) { |
| | 183 | ((MoveImgDisplayPanel<?>) selected).fireModelUpdate(); |
| | 184 | } |
| | 185 | }))); |
| 178 | 186 | } |
| 179 | 187 | |
| 180 | 188 | private static JButton createButton(AbstractAction action, Dimension buttonDim) { |
| … |
… |
|
| 297 | 305 | */ |
| 298 | 306 | private void addButtonsForImageLayers() { |
| 299 | 307 | List<MoveImgDisplayPanel<?>> alreadyAdded = this.getImageTabs().collect(Collectors.toList()); |
| 300 | | // Avoid the setVisible call recursively calling this method and adding duplicates |
| 301 | | alreadyAdded.forEach(m -> m.finishedAddingButtons = false); |
| 302 | 308 | List<Layer> availableLayers = MainApplication.getLayerManager().getLayers(); |
| 303 | 309 | List<IGeoImageLayer> geoImageLayers = availableLayers.stream() |
| 304 | 310 | .sorted(Comparator.comparingInt(entry -> /*reverse*/-availableLayers.indexOf(entry))) |
| … |
… |
|
| 322 | 328 | do { |
| 323 | 329 | int index = layers.indexOfTabComponent(source); |
| 324 | 330 | if (index >= 0) { |
| 325 | | getImageTabs().forEach(m -> m.finishedAddingButtons = false); |
| 326 | 331 | removeImageTab(((MoveImgDisplayPanel<?>) layers.getComponentAt(index)).layer); |
| 327 | | getImageTabs().forEach(m -> m.finishedAddingButtons = true); |
| 328 | 332 | getImageTabs().forEach(m -> m.setVisible(m.isVisible())); |
| 329 | 333 | return; |
| 330 | 334 | } |
| … |
… |
|
| 342 | 346 | // remove that layer, and then get a layer at index 1, which was previously at index 2. |
| 343 | 347 | .collect(Collectors.toList()).forEach(this::removeImageTab); |
| 344 | 348 | |
| 345 | | // This is need to avoid the first button becoming visible, and then recalling this method. |
| 346 | | this.getImageTabs().forEach(m -> m.finishedAddingButtons = true); |
| 347 | 349 | // After that, trigger the visibility set code |
| 348 | 350 | this.getImageTabs().forEach(m -> m.setVisible(m.isVisible())); |
| 349 | 351 | } |
| … |
… |
|
| 764 | 766 | private final T layer; |
| 765 | 767 | private final ImageDisplay imgDisplay; |
| 766 | 768 | |
| 767 | | /** |
| 768 | | * The purpose of this field is to avoid having the same tab added to the dialog multiple times. This is only a problem when the dialog |
| 769 | | * has multiple tabs on initialization (like from a session). |
| 770 | | */ |
| 771 | | boolean finishedAddingButtons; |
| 772 | 769 | MoveImgDisplayPanel(ImageDisplay imgDisplay, T layer) { |
| 773 | 770 | super(new BorderLayout()); |
| 774 | 771 | this.layer = layer; |
| 775 | 772 | this.imgDisplay = imgDisplay; |
| 776 | 773 | } |
| 777 | 774 | |
| 778 | | @Override |
| 779 | | public void setVisible(boolean visible) { |
| 780 | | super.setVisible(visible); |
| | 775 | /** |
| | 776 | * Call when the selection model updates |
| | 777 | */ |
| | 778 | void fireModelUpdate() { |
| 781 | 779 | JTabbedPane layers = ImageViewerDialog.getInstance().layers; |
| 782 | 780 | int index = layers.indexOfComponent(this); |
| 783 | | if (visible && this.finishedAddingButtons) { |
| | 781 | if (this == layers.getSelectedComponent()) { |
| 784 | 782 | if (!this.layer.getSelection().isEmpty() && !this.layer.getSelection().contains(ImageViewerDialog.getCurrentImage())) { |
| 785 | 783 | ImageViewerDialog.getInstance().displayImages(this.layer.getSelection()); |
| 786 | 784 | this.layer.invalidate(); // This will force the geoimage layers to update properly. |