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 }