Changeset 3367 in josm for trunk/src/org/openstreetmap
- Timestamp:
- 2010-07-08T08:41:20+02:00 (14 years ago)
- 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 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 -
trunk/src/org/openstreetmap/josm/data/osm/FilterWorker.java
r3356 r3367 33 33 */ 34 34 public static void executeFilters(Collection<OsmPrimitive> all, FilterMatcher filterMatcher) { 35 36 // First relation and ways 35 37 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 } 42 46 } 43 47 } 44 48 49 // Then nodes (because they state may depend on parent ways) 45 50 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(); 66 58 } 67 59 }
Note:
See TracChangeset
for help on using the changeset viewer.