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