From f2d39103e41130520be8e4f17e93c7f4c9a752ae Mon Sep 17 00:00:00 2001
From: Michael Zangl <michael.zangl@student.kit.edu>
Date: Thu, 23 Jul 2015 11:51:14 +0200
Subject: [PATCH] Fixed #11496
---
src/org/openstreetmap/josm/gui/MapView.java | 41 ++++++++++++++++-------------
1 file changed, 22 insertions(+), 19 deletions(-)
diff --git a/src/org/openstreetmap/josm/gui/MapView.java b/src/org/openstreetmap/josm/gui/MapView.java
index 589082a..6a79957 100644
|
a
|
b
|
import java.util.ArrayList;
|
| 25 | 25 | import java.util.Arrays; |
| 26 | 26 | import java.util.Collection; |
| 27 | 27 | import java.util.Collections; |
| 28 | | import java.util.Comparator; |
| 29 | 28 | import java.util.EnumSet; |
| 30 | 29 | import java.util.LinkedHashSet; |
| 31 | 30 | import java.util.List; |
| | 31 | import java.util.ListIterator; |
| 32 | 32 | import java.util.Set; |
| 33 | 33 | import java.util.concurrent.CopyOnWriteArrayList; |
| 34 | 34 | import java.util.concurrent.locks.ReentrantReadWriteLock; |
| … |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
|
| 652 | 652 | /** |
| 653 | 653 | * Creates a list of the visible layers in Z-Order, the layer with the lowest Z-Order |
| 654 | 654 | * first, layer with the highest Z-Order last. |
| | 655 | * <p> |
| | 656 | * The active data layer is pulled above all adjacent data layers. |
| 655 | 657 | * |
| 656 | 658 | * @return a list of the visible in Z-Order, the layer with the lowest Z-Order |
| 657 | 659 | * first, layer with the highest Z-Order last. |
| … |
… |
implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
|
| 660 | 662 | layerLock.readLock().lock(); |
| 661 | 663 | try { |
| 662 | 664 | List<Layer> ret = new ArrayList<>(); |
| 663 | | for (Layer l: layers) { |
| 664 | | if (l.isVisible()) { |
| | 665 | // This is set while we delay the addition of the active layer. |
| | 666 | boolean activeLayerDelayed = false; |
| | 667 | for (ListIterator<Layer> iterator = layers.listIterator(layers.size()); iterator.hasPrevious();) { |
| | 668 | Layer l = iterator.previous(); |
| | 669 | if (!l.isVisible()) { |
| | 670 | // ignored |
| | 671 | } else if (l == activeLayer && l instanceof OsmDataLayer) { |
| | 672 | // delay and add after the current block of OsmDataLayer |
| | 673 | activeLayerDelayed = true; |
| | 674 | } else { |
| | 675 | if (activeLayerDelayed && !(l instanceof OsmDataLayer)) { |
| | 676 | // add active layer before the current one. |
| | 677 | ret.add(activeLayer); |
| | 678 | activeLayerDelayed = false; |
| | 679 | } |
| | 680 | // Add this layer now |
| 665 | 681 | ret.add(l); |
| 666 | 682 | } |
| 667 | 683 | } |
| 668 | | // sort according to position in the list of layers, with one exception: |
| 669 | | // an active data layer always becomes a higher Z-Order than all other data layers |
| 670 | | Collections.sort( |
| 671 | | ret, |
| 672 | | new Comparator<Layer>() { |
| 673 | | @Override |
| 674 | | public int compare(Layer l1, Layer l2) { |
| 675 | | if (l1 instanceof OsmDataLayer && l2 instanceof OsmDataLayer) { |
| 676 | | if (l1 == getActiveLayer()) return -1; |
| 677 | | if (l2 == getActiveLayer()) return 1; |
| 678 | | return Integer.compare(layers.indexOf(l1), layers.indexOf(l2)); |
| 679 | | } else |
| 680 | | return Integer.compare(layers.indexOf(l1), layers.indexOf(l2)); |
| 681 | | } |
| 682 | | } |
| 683 | | ); |
| | 684 | if (activeLayerDelayed) { |
| | 685 | ret.add(activeLayer); |
| | 686 | } |
| 684 | 687 | Collections.reverse(ret); |
| 685 | 688 | return ret; |
| 686 | 689 | } finally { |