Ticket #9361: 9361.patch

File 9361.patch, 4.2 KB (added by simon04, 11 years ago)
  • src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java

    diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
    index c8ddc52..d0dc8bc 100644
    a b package org.openstreetmap.josm.gui.mappaint.mapcss;  
    44import java.util.Collection;
    55import java.util.Collections;
    66import java.util.List;
     7import java.util.NoSuchElementException;
    78import java.util.regex.PatternSyntaxException;
    89
    910import org.openstreetmap.josm.Main;
    import org.openstreetmap.josm.gui.mappaint.Range;  
    1920import org.openstreetmap.josm.tools.CheckParameterUtil;
    2021import org.openstreetmap.josm.tools.Geometry;
    2122import org.openstreetmap.josm.tools.Pair;
     23import org.openstreetmap.josm.tools.Predicates;
    2224import org.openstreetmap.josm.tools.Utils;
    2325
    2426/**
    public interface Selector {  
    199201                    if (e.child != null) {
    200202                        // abort if first match has been found
    201203                        break;
    202                     } else if (!e.osm.equals(p) && p.isUsable()) {
     204                    } else if (isPrimitiveUsable(p)) {
    203205                        p.accept(this);
    204206                    }
    205207                }
    206208            }
     209
     210            public boolean isPrimitiveUsable(OsmPrimitive p) {
     211                return !e.osm.equals(p) && p.isUsable();
     212            }
    207213        }
    208214
    209215        private final class CrossingFinder extends AbstractFinder {
    public interface Selector {  
    222228            }
    223229        }
    224230
    225         private final class ContainsFinder extends AbstractFinder {
     231        private class ContainsFinder extends AbstractFinder {
    226232            private ContainsFinder(Environment e) {
    227233                super(e);
    228234                CheckParameterUtil.ensureThat(!(e.osm instanceof Node), "Nodes not supported");
    public interface Selector {  
    261267                    // nodes cannot contain elements
    262268                    return false;
    263269                }
     270
     271                ContainsFinder containsFinder;
     272                try {
     273                    // if right selector also matches relations and if matched primitive is a way which is part of a multipolygon,
     274                    // use the multipolygon for further analysis
     275                    if (!((GeneralSelector) right).matchesBase(OsmPrimitiveType.RELATION) || !(e.osm instanceof Way)) {
     276                        throw new NoSuchElementException();
     277                    }
     278                    final Collection<Relation> multipolygons = Utils.filteredCollection(Utils.filter(
     279                            e.osm.getReferrers(), Predicates.hasTag("type", "multipolygon")), Relation.class);
     280                    final Relation multipolygon = multipolygons.iterator().next();
     281                    if (multipolygon == null) throw new NoSuchElementException();
     282                    e.osm = multipolygon;
     283                    containsFinder = new ContainsFinder(e) {
     284                        @Override
     285                        public boolean isPrimitiveUsable(OsmPrimitive p) {
     286                            return super.isPrimitiveUsable(p) && !multipolygon.getMemberPrimitives().contains(p);
     287                        }
     288                    };
     289                } catch (NoSuchElementException ignore) {
     290                    containsFinder = new ContainsFinder(e);
     291                }
    264292                e.parent = e.osm;
    265293
    266                 final ContainsFinder containsFinder = new ContainsFinder(e);
    267                 if (right instanceof GeneralSelector) {
    268                     if (((GeneralSelector) right).matchesBase(OsmPrimitiveType.NODE)) {
     294                if (left instanceof GeneralSelector) {
     295                    if (((GeneralSelector) left).matchesBase(OsmPrimitiveType.NODE)) {
    269296                        containsFinder.visit(e.osm.getDataSet().searchNodes(e.osm.getBBox()));
    270297                    }
    271                     if (((GeneralSelector) right).matchesBase(OsmPrimitiveType.WAY)) {
     298                    if (((GeneralSelector) left).matchesBase(OsmPrimitiveType.WAY)) {
    272299                        containsFinder.visit(e.osm.getDataSet().searchWays(e.osm.getBBox()));
    273300                    }
    274301                } else {