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 { |