Changeset 8613 in josm for trunk/src/org


Ignore:
Timestamp:
2015-07-23T12:06:09+02:00 (5 years ago)
Author:
bastiK
Message:

fixed #11496 - getVisibleLayersInZOrder() -> Comparator is not transitive (patch by michael2402)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/MapView.java

    r8612 r8613  
    2626import java.util.Collection;
    2727import java.util.Collections;
    28 import java.util.Comparator;
    2928import java.util.EnumSet;
    3029import java.util.LinkedHashSet;
    3130import java.util.List;
     31import java.util.ListIterator;
    3232import java.util.Set;
    3333import java.util.concurrent.CopyOnWriteArrayList;
     
    653653     * Creates a list of the visible layers in Z-Order, the layer with the lowest Z-Order
    654654     * first, layer with the highest Z-Order last.
     655     * <p>
     656     * The active data layer is pulled above all adjacent data layers.
    655657     *
    656658     * @return a list of the visible in Z-Order, the layer with the lowest Z-Order
     
    661663        try {
    662664            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
    665681                    ret.add(l);
    666682                }
    667683            }
    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            }
    684687            Collections.reverse(ret);
    685688            return ret;
Note: See TracChangeset for help on using the changeset viewer.