Ticket #2602: josm.child-parent-search.2.patch
File josm.child-parent-search.2.patch, 4.1 KB (added by , 16 years ago) |
---|
-
src/org/openstreetmap/josm/actions/search/SearchCompiler.java
11 11 import java.util.regex.Pattern; 12 12 import java.util.regex.PatternSyntaxException; 13 13 14 import org.openstreetmap.josm.Main; 14 15 import org.openstreetmap.josm.data.osm.Node; 15 16 import org.openstreetmap.josm.data.osm.OsmPrimitive; 16 17 import org.openstreetmap.josm.data.osm.Relation; 18 import org.openstreetmap.josm.data.osm.RelationMember; 17 19 import org.openstreetmap.josm.data.osm.User; 18 20 import org.openstreetmap.josm.data.osm.Way; 21 import org.openstreetmap.josm.data.osm.visitor.CollectBackReferencesVisitor; 19 22 import org.openstreetmap.josm.tools.DateUtils; 20 23 21 24 /** … … 319 322 } 320 323 @Override public String toString() {return "untagged";} 321 324 } 325 326 private static class Parent extends Match { 327 private final Match child; 328 public Parent(Match m) { child = m; } 329 @Override public boolean match(OsmPrimitive osm) throws ParseError { 330 boolean isParent = false; 331 if (osm instanceof Way) { 332 for (Node n : ((Way)osm).nodes) 333 isParent |= child.match(n); 334 } else if (osm instanceof Relation) { 335 for (RelationMember member : ((Relation)osm).members) { 336 if (member.member != null) 337 isParent |= child.match(member.member); 338 } 339 } 340 return isParent; 341 } 342 @Override public String toString() {return "parentof(" + child + ")";} 343 } 322 344 345 private static class Child extends Match { 346 private final Match parent; 347 public Child(Match m) { parent = m; } 348 @Override public boolean match(OsmPrimitive osm) throws ParseError { 349 boolean isChild = false; 350 CollectBackReferencesVisitor backRefs = new CollectBackReferencesVisitor(Main.ds); 351 osm.visit(backRefs); 352 for (OsmPrimitive p : backRefs.data) { 353 isChild |= parent.match(p); 354 } 355 return isChild; 356 } 357 @Override public String toString() {return "childof(" + parent + ")";} 358 } 359 323 360 public static class ParseError extends Exception { 324 361 public ParseError(String msg) { 325 362 super(msg); … … 387 424 return parsePat(); 388 425 } 389 426 390 private Match parsePat() {427 private Match parsePat() throws ParseError { 391 428 String tok = tokenizer.readText(); 392 429 393 430 if (tokenizer.readIfEqual(":")) { … … 407 444 return new Untagged(); 408 445 } else if (tok.equals("selected")) { 409 446 return new Selected(); 447 } else if (tok.equals("child")) { 448 return new Child(parseParens()); 449 } else if (tok.equals("parent")) { 450 return new Parent(parseParens()); 410 451 } else { 411 452 return new Any(tok); 412 453 } -
src/org/openstreetmap/josm/actions/search/SearchAction.java
93 93 + "<li>"+tr("<b>selected</b> - all selected objects")+"</li>" 94 94 + "<li>"+tr("<b>incomplete</b> - all incomplete objects")+"</li>" 95 95 + "<li>"+tr("<b>untagged</b> - all untagged objects")+"</li>" 96 + "<li>"+tr("<b>child <i>expr</i></b> - all children of objects matching the expression")+"</li>" 97 + "<li>"+tr("<b>parent <i>expr</i></b> - all parents of objects matching the expression")+"</li>" 96 98 + "<li>"+tr("Use <b>|</b> or <b>OR</b> to combine with logical or")+"</li>" 97 99 + "<li>"+tr("Use <b>\"</b> to quote operators (e.g. if key contains :)")+"</li>" 98 100 + "<li>"+tr("Use <b>(</b> and <b>)</b> to group expressions")+"</li>"