001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.data.osm; 003 004import java.util.Collection; 005import java.util.Collections; 006 007import org.openstreetmap.josm.data.osm.FilterMatcher.FilterType; 008import org.openstreetmap.josm.tools.Utils; 009 010/** 011 * 012 * @author Petr_DlouhĂ˝ 013 */ 014public final class FilterWorker { 015 016 private FilterWorker() { 017 // Hide default constructor for utils classes 018 } 019 020 /** 021 * Apply the filters to the primitives of the data set. 022 * 023 * @param all the collection of primitives for that the filter state should 024 * be updated 025 * @param filterMatcher the FilterMatcher 026 * @return true, if the filter state (normal / disabled / hidden) 027 * of any primitive has changed in the process 028 */ 029 public static boolean executeFilters(Collection<OsmPrimitive> all, FilterMatcher filterMatcher) { 030 boolean changed = false; 031 // first relations, then ways and nodes last; this is required to resolve dependencies 032 changed = doExecuteFilters(Utils.filter(all, OsmPrimitive.relationPredicate), filterMatcher); 033 changed |= doExecuteFilters(Utils.filter(all, OsmPrimitive.wayPredicate), filterMatcher); 034 changed |= doExecuteFilters(Utils.filter(all, OsmPrimitive.nodePredicate), filterMatcher); 035 return changed; 036 } 037 038 private static boolean doExecuteFilters(Collection<OsmPrimitive> all, FilterMatcher filterMatcher) { 039 040 boolean changed = false; 041 042 for (OsmPrimitive primitive: all) { 043 FilterType hiddenType = filterMatcher.isHidden(primitive); 044 if (hiddenType != FilterType.NOT_FILTERED) { 045 changed |= primitive.setDisabledState(true); 046 primitive.setHiddenType(hiddenType == FilterType.EXPLICIT); 047 } else { 048 FilterType disabledType = filterMatcher.isDisabled(primitive); 049 if (disabledType != FilterType.NOT_FILTERED) { 050 changed |= primitive.setDisabledState(false); 051 primitive.setDisabledType(disabledType == FilterType.EXPLICIT); 052 } else { 053 changed |= primitive.unsetDisabledState(); 054 } 055 } 056 } 057 return changed; 058 } 059 060 public static boolean executeFilters(OsmPrimitive primitive, FilterMatcher filterMatcher) { 061 return doExecuteFilters(Collections.singleton(primitive), filterMatcher); 062 } 063 064 public static void clearFilterFlags(Collection<OsmPrimitive> prims) { 065 for (OsmPrimitive osm : prims) { 066 osm.unsetDisabledState(); 067 } 068 } 069}