Changeset 7169 in josm for trunk/src/org


Ignore:
Timestamp:
2014-05-22T20:11:33+02:00 (10 years ago)
Author:
simon04
Message:

fix #9361 - MapCSS: consider multipolygon when matching outer ring of a multipolygon for the selector

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java

    r7166 r7169  
    55import java.util.Collections;
    66import java.util.List;
     7import java.util.NoSuchElementException;
    78import java.util.regex.PatternSyntaxException;
    89
     
    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
     
    204206                        // abort if first match has been found
    205207                        break;
    206                     } else if (!e.osm.equals(p) && p.isUsable()) {
     208                    } else if (isPrimitiveUsable(p)) {
    207209                        p.accept(this);
    208210                    }
    209211                }
     212            }
     213
     214            public boolean isPrimitiveUsable(OsmPrimitive p) {
     215                return !e.osm.equals(p) && p.isUsable();
    210216            }
    211217        }
     
    227233        }
    228234
    229         private final class ContainsFinder extends AbstractFinder {
     235        private class ContainsFinder extends AbstractFinder {
    230236            private ContainsFinder(Environment e) {
    231237                super(e);
     
    266272                    return false;
    267273                }
     274
     275                ContainsFinder containsFinder;
     276                try {
     277                    // if right selector also matches relations and if matched primitive is a way which is part of a multipolygon,
     278                    // use the multipolygon for further analysis
     279                    if (!((GeneralSelector) right).matchesBase(OsmPrimitiveType.RELATION) || !(e.osm instanceof Way)) {
     280                        throw new NoSuchElementException();
     281                    }
     282                    final Collection<Relation> multipolygons = Utils.filteredCollection(Utils.filter(
     283                            e.osm.getReferrers(), Predicates.hasTag("type", "multipolygon")), Relation.class);
     284                    final Relation multipolygon = multipolygons.iterator().next();
     285                    if (multipolygon == null) throw new NoSuchElementException();
     286                    containsFinder = new ContainsFinder(e.withPrimitive(multipolygon)) {
     287                        @Override
     288                        public boolean isPrimitiveUsable(OsmPrimitive p) {
     289                            return super.isPrimitiveUsable(p) && !multipolygon.getMemberPrimitives().contains(p);
     290                        }
     291                    };
     292                } catch (NoSuchElementException ignore) {
     293                    containsFinder = new ContainsFinder(e);
     294                }
    268295                e.parent = e.osm;
    269296
    270                 final ContainsFinder containsFinder = new ContainsFinder(e);
    271                 if (right instanceof GeneralSelector) {
    272                     if (((GeneralSelector) right).matchesBase(OsmPrimitiveType.NODE)) {
     297                if (left instanceof GeneralSelector) {
     298                    if (((GeneralSelector) left).matchesBase(OsmPrimitiveType.NODE)) {
    273299                        containsFinder.visit(e.osm.getDataSet().searchNodes(e.osm.getBBox()));
    274300                    }
    275                     if (((GeneralSelector) right).matchesBase(OsmPrimitiveType.WAY)) {
     301                    if (((GeneralSelector) left).matchesBase(OsmPrimitiveType.WAY)) {
    276302                        containsFinder.visit(e.osm.getDataSet().searchWays(e.osm.getBBox()));
    277303                    }
Note: See TracChangeset for help on using the changeset viewer.