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}