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    }