Ignore:
Timestamp:
2012-08-13T09:10:23+02:00 (12 years ago)
Author:
bastiK
Message:

filter: improved multipolygon handling (fixes #5149, see #6160)

Location:
trunk/src/org/openstreetmap/josm/data/osm
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java

    r5437 r5442  
    1111import org.openstreetmap.josm.actions.search.SearchCompiler.Not;
    1212import org.openstreetmap.josm.actions.search.SearchCompiler.ParseError;
     13import org.openstreetmap.josm.tools.SubclassFilteredCollection;
    1314
    1415/**
     
    4243 * way without its nodes cannot be edited properly.
    4344 *
     45 * Multipolygons and (untagged) member ways are handled in a similar way.
    4446 */
    4547public class FilterMatcher {
     
    183185    }
    184186
     187    private boolean allParentMultipolygonsFiltered(OsmPrimitive primitive, boolean hidden) {
     188        boolean isExplicit = false;
     189        for (Relation r : new SubclassFilteredCollection<OsmPrimitive, Relation>(
     190                primitive.getReferrers(), OsmPrimitive.multipolygonPredicate)) {
     191            if (!isFiltered(r, hidden))
     192                return false;
     193            isExplicit |= isFilterExplicit(r, hidden);
     194        }
     195        return isExplicit;
     196    }
     197
     198    private boolean oneParentMultipolygonNotFiltered(OsmPrimitive primitive, boolean hidden) {
     199        for (Relation r : new SubclassFilteredCollection<OsmPrimitive, Relation>(
     200                primitive.getReferrers(), OsmPrimitive.multipolygonPredicate)) {
     201            if (!isFiltered(r, hidden))
     202                return true;
     203        }
     204        return false;
     205    }
     206
    185207    private FilterType test(List<FilterInfo> filters, OsmPrimitive primitive, boolean hidden) {
    186208
     
    209231
    210232        if (primitive instanceof Node) {
    211             // Technically not hidden by any filter, but we hide it anyway, if
    212             // it is untagged and all parent ways are hidden.
    213             if (!filtered) {
     233            if (filtered) {
     234                // If there is a parent way, that is not hidden, we  show the
     235                // node anyway, unless there is no non-inverted filter that
     236                // applies to the node directly.
     237                if (explicitlyFiltered)
     238                    return FilterType.PASSIV;
     239                else {
     240                    if (oneParentWayNotFiltered(primitive, hidden))
     241                        return FilterType.NOT_FILTERED;
     242                    else
     243                        return FilterType.PASSIV;
     244                }
     245            } else {
    214246                if (!primitive.isTagged() && allParentWaysFiltered(primitive, hidden))
     247                    // Technically not hidden by any filter, but we hide it anyway, if
     248                    // it is untagged and all parent ways are hidden.
    215249                    return FilterType.PASSIV;
    216250                else
    217251                    return FilterType.NOT_FILTERED;
    218252            }
    219             // At this point, selected == true, so the node is hidden.
    220             // However, if there is a parent way, that is not hidden, we ignore
    221             // this and show the node anyway, unless there is no non-inverted
    222             // filter that applies to the node directly.
    223             if (!explicitlyFiltered) {
    224                 if (!oneParentWayNotFiltered(primitive, hidden))
    225                     return FilterType.PASSIV;
     253        } else if (primitive instanceof Way) {
     254            if (filtered) {
     255                if (explicitlyFiltered)
     256                    return FilterType.EXPLICIT;
     257                else {
     258                    if (oneParentMultipolygonNotFiltered(primitive, hidden))
     259                        return FilterType.NOT_FILTERED;
     260                    else
     261                        return FilterType.PASSIV;
     262                }
     263            } else {
     264                if (!primitive.isTagged() && allParentMultipolygonsFiltered(primitive, hidden))
     265                    return FilterType.EXPLICIT;
    226266                else
    227267                    return FilterType.NOT_FILTERED;
    228268            }
    229             return FilterType.PASSIV;
    230269        } else {
    231270            if (filtered)
  • trunk/src/org/openstreetmap/josm/data/osm/FilterWorker.java

    r5437 r5442  
    4444                if (disabledType != FilterType.NOT_FILTERED) {
    4545                    changed |= primitive.setDisabledState(false);
    46                     primitive.setDisabledType(hiddenType == FilterType.EXPLICIT);
     46                    primitive.setDisabledType(disabledType == FilterType.EXPLICIT);
    4747                } else {
    4848                    changed |= primitive.unsetDisabledState();
  • trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java

    r5437 r5442  
    214214        @Override public boolean evaluate(OsmPrimitive primitive) {
    215215            return primitive.getClass() == Relation.class;
     216        }
     217    };
     218
     219    public static final Predicate<OsmPrimitive> multipolygonPredicate = new Predicate<OsmPrimitive>() {
     220        @Override public boolean evaluate(OsmPrimitive primitive) {
     221            return primitive.getClass() == Relation.class && ((Relation) primitive).isMultipolygon();
    216222        }
    217223    };
Note: See TracChangeset for help on using the changeset viewer.