Changeset 3367 in josm for trunk/src/org/openstreetmap/josm


Ignore:
Timestamp:
2010-07-08T08:41:20+02:00 (14 years ago)
Author:
jttt
Message:

Fix filters

Location:
trunk/src/org/openstreetmap/josm/data/osm
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java

    r3355 r3367  
    1717        final Match match;
    1818        final boolean isDelete;
     19        final boolean isInverted;
    1920
    2021        FilterInfo(Filter filter) throws ParseError {
     
    2728            Match compiled = SearchCompiler.compile(filter.text, filter.caseSensitive, filter.regexSearch);
    2829            this.match = filter.inverted?new Not(compiled):compiled;
     30            this.isInverted = filter.inverted;
    2931        }
    3032    }
     
    4345            }
    4446
    45             List<FilterInfo> list = filter.hiding?hiddenFilters:disabledFilters;
     47            FilterInfo fi = new FilterInfo(filter);
     48            if (fi.isDelete) {
     49                if (filter.hiding) {
     50                    // Remove only hide flag
     51                    hiddenFilters.add(fi);
     52                } else {
     53                    // Remove both flags
     54                    disabledFilters.add(fi);
     55                    hiddenFilters.add(fi);
     56                }
     57            } else {
     58                if (filter.mode == SearchMode.replace) {
     59                    if (filter.hiding) {
     60                        hiddenFilters.clear();
     61                        disabledFilters.clear();
     62                    }
     63                }
    4664
    47             if (filter.mode == SearchMode.replace) {
    48                 // No point in evalutaing filter when value will get replaced anyway (and yes, there is no point in using replace mode with filters)
    49                 list.clear();
     65                disabledFilters.add(fi);
     66                if (filter.hiding) {
     67                    hiddenFilters.add(fi);
     68                }
    5069            }
    51 
    52             list.add(new FilterInfo(filter));
    5370        }
    5471    }
    5572
    56     private boolean test(List<FilterInfo> filters, OsmPrimitive primitive) {
     73    private boolean getState(OsmPrimitive primitive, boolean hidden) {
     74        return hidden?primitive.isDisabledAndHidden():primitive.isDisabled();
     75    }
     76
     77    private boolean allParentWaysFiltered(OsmPrimitive primitive, boolean hidden) {
     78        List<OsmPrimitive> refs = primitive.getReferrers();
     79        if (refs.isEmpty())
     80            return false;
     81
     82        for (OsmPrimitive p: refs) {
     83            if (p instanceof Way && !getState(p, hidden))
     84                return false;
     85        }
     86
     87        return true;
     88    }
     89
     90    private boolean oneParentWayNotFiltered(OsmPrimitive primitive, boolean hidden) {
     91        List<OsmPrimitive> refs = primitive.getReferrers();
     92        for (OsmPrimitive p: refs) {
     93            if (p instanceof Way && !getState(p, hidden))
     94                return true;
     95        }
     96
     97        return false;
     98    }
     99
     100    private boolean test(List<FilterInfo> filters, OsmPrimitive primitive, boolean hidden) {
    57101        boolean selected = false;
     102        boolean onlyInvertedFilters = true;
     103
    58104        for (FilterInfo fi: filters) {
    59105            if (fi.isDelete && selected && fi.match.match(primitive)) {
    60106                selected = false;
    61             } else if (!fi.isDelete && !selected && fi.match.match(primitive)) {
     107            } else if (!fi.isDelete && (!selected || (onlyInvertedFilters && !fi.isInverted)) && fi.match.match(primitive)) {
    62108                selected = true;
     109                onlyInvertedFilters = onlyInvertedFilters && fi.isInverted;
    63110            }
    64111        }
    65         return selected;
     112
     113        if (primitive instanceof Node) {
     114            if (!selected)
     115                return !primitive.isTagged() && allParentWaysFiltered(primitive, hidden);
     116            if (onlyInvertedFilters)
     117                return selected && !oneParentWayNotFiltered(primitive, hidden);
     118            return true;
     119        } else
     120            return selected;
     121
    66122    }
    67123
    68124    public boolean isHidden(OsmPrimitive primitive) {
    69         return test(hiddenFilters, primitive);
     125        return test(hiddenFilters, primitive, true);
    70126    }
    71127
    72128    public boolean isDisabled(OsmPrimitive primitive) {
    73         return test(disabledFilters, primitive);
     129        return test(disabledFilters, primitive, false);
    74130    }
    75131
  • trunk/src/org/openstreetmap/josm/data/osm/FilterWorker.java

    r3356 r3367  
    3333     */
    3434    public static void executeFilters(Collection<OsmPrimitive> all, FilterMatcher filterMatcher) {
     35
     36        // First relation and ways
    3537        for (OsmPrimitive primitive: all) {
    36             if (filterMatcher.isHidden(primitive)) {
    37                 primitive.setDisabledState(true);
    38             } else if (filterMatcher.isDisabled(primitive)) {
    39                 primitive.setDisabledState(false);
    40             } else {
    41                 primitive.unsetDisabledState();
     38            if (!(primitive instanceof Node)) {
     39                if (filterMatcher.isHidden(primitive)) {
     40                    primitive.setDisabledState(true);
     41                } else if (filterMatcher.isDisabled(primitive)) {
     42                    primitive.setDisabledState(false);
     43                } else {
     44                    primitive.unsetDisabledState();
     45                }
    4246            }
    4347        }
    4448
     49        // Then nodes (because they state may depend on parent ways)
    4550        for (OsmPrimitive primitive: all) {
    46             if (primitive instanceof Way && primitive.isDisabled()) {
    47                 Way w = (Way)primitive;
    48                 for (Node n: w.getNodes()) {
    49 
    50                     if (n.isTagged()) {
    51                         continue;
    52                     }
    53 
    54                     boolean disabled = w.isDisabled();
    55                     boolean hidden = w.isDisabledAndHidden();
    56                     for (OsmPrimitive ref: n.getReferrers()) {
    57                         if (ref instanceof Way) {
    58                             disabled = disabled && ref.isDisabled();
    59                             hidden = hidden && ref.isDisabledAndHidden();
    60                         }
    61                     }
    62 
    63                     if (disabled) {
    64                         n.setDisabledState(hidden);
    65                     }
     51            if (primitive instanceof Node) {
     52                if (filterMatcher.isHidden(primitive)) {
     53                    primitive.setDisabledState(true);
     54                } else if (filterMatcher.isDisabled(primitive)) {
     55                    primitive.setDisabledState(false);
     56                } else {
     57                    primitive.unsetDisabledState();
    6658                }
    6759            }
Note: See TracChangeset for help on using the changeset viewer.