Changeset 3367 in josm for trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java
- Timestamp:
- 2010-07-08T08:41:20+02:00 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java
r3355 r3367 17 17 final Match match; 18 18 final boolean isDelete; 19 final boolean isInverted; 19 20 20 21 FilterInfo(Filter filter) throws ParseError { … … 27 28 Match compiled = SearchCompiler.compile(filter.text, filter.caseSensitive, filter.regexSearch); 28 29 this.match = filter.inverted?new Not(compiled):compiled; 30 this.isInverted = filter.inverted; 29 31 } 30 32 } … … 43 45 } 44 46 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 } 46 64 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 } 50 69 } 51 52 list.add(new FilterInfo(filter));53 70 } 54 71 } 55 72 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) { 57 101 boolean selected = false; 102 boolean onlyInvertedFilters = true; 103 58 104 for (FilterInfo fi: filters) { 59 105 if (fi.isDelete && selected && fi.match.match(primitive)) { 60 106 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)) { 62 108 selected = true; 109 onlyInvertedFilters = onlyInvertedFilters && fi.isInverted; 63 110 } 64 111 } 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 66 122 } 67 123 68 124 public boolean isHidden(OsmPrimitive primitive) { 69 return test(hiddenFilters, primitive );125 return test(hiddenFilters, primitive, true); 70 126 } 71 127 72 128 public boolean isDisabled(OsmPrimitive primitive) { 73 return test(disabledFilters, primitive );129 return test(disabledFilters, primitive, false); 74 130 } 75 131
Note:
See TracChangeset
for help on using the changeset viewer.