Ticket #2602: josm.child-parent-search.patch

File josm.child-parent-search.patch, 3.7 KB (added by Matt, 17 years ago)

Patch to add "child" and "parent" keywords to search.

  • src/org/openstreetmap/josm/actions/search/SearchCompiler.java

     
    1111import java.util.regex.Pattern;
    1212import java.util.regex.PatternSyntaxException;
    1313
     14import org.openstreetmap.josm.Main;
    1415import org.openstreetmap.josm.data.osm.Node;
    1516import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1617import org.openstreetmap.josm.data.osm.Relation;
     18import org.openstreetmap.josm.data.osm.RelationMember;
    1719import org.openstreetmap.josm.data.osm.User;
    1820import org.openstreetmap.josm.data.osm.Way;
     21import org.openstreetmap.josm.data.osm.visitor.CollectBackReferencesVisitor;
    1922import org.openstreetmap.josm.tools.DateUtils;
    2023
    2124/**
     
    319322        }
    320323        @Override public String toString() {return "untagged";}
    321324    }
     325   
     326    /**
     327     * Matches objects which are parents of a selected object.
     328     */
     329    private static class Parent extends Match {
     330        @Override public boolean match(OsmPrimitive osm) {
     331            boolean isParent = false;
     332            if (osm instanceof Way) {
     333                for (Node n : ((Way)osm).nodes)
     334                    isParent |= n.selected;
     335            } else if (osm instanceof Relation) {
     336                for (RelationMember member : ((Relation)osm).members) {
     337                    if (member.member != null)
     338                        isParent |= member.member.selected;
     339                }
     340            }
     341            return isParent;
     342        }
     343        @Override public String toString() {return "parent";}
     344    }
     345   
     346    /**
     347     * Matches objects which are children of a selected object.
     348     */
     349    private static class Child extends Match {
     350        @Override public boolean match(OsmPrimitive osm) {
     351            boolean isChild = false;
     352            CollectBackReferencesVisitor backRefs = new CollectBackReferencesVisitor(Main.ds);
     353            osm.visit(backRefs);
     354            for (OsmPrimitive parent : backRefs.data) {
     355                isChild |= parent.selected;
     356            }
     357            return isChild;
     358        }
     359       
     360        @Override public String toString() {return "child";}
     361    }
    322362
    323363    public static class ParseError extends Exception {
    324364        public ParseError(String msg) {
     
    407447            return new Untagged();
    408448        } else if (tok.equals("selected")) {
    409449            return new Selected();
     450        } else if (tok.equals("parent")) {
     451            return new Parent();
     452        } else if (tok.equals("child")) {
     453            return new Child();
    410454        } else {
    411455            return new Any(tok);
    412456        }
  • src/org/openstreetmap/josm/actions/search/SearchAction.java

     
    9393                + "<li>"+tr("<b>selected</b> - all selected objects")+"</li>"
    9494                + "<li>"+tr("<b>incomplete</b> - all incomplete objects")+"</li>"
    9595                + "<li>"+tr("<b>untagged</b> - all untagged objects")+"</li>"
     96                + "<li>"+tr("<b>child</b> - all children of selected objects")+"</li>"
     97                + "<li>"+tr("<b>parent</b> - all parents of selected objects")+"</li>"
    9698                + "<li>"+tr("Use <b>|</b> or <b>OR</b> to combine with logical or")+"</li>"
    9799                + "<li>"+tr("Use <b>\"</b> to quote operators (e.g. if key contains :)")+"</li>"
    98100                + "<li>"+tr("Use <b>(</b> and <b>)</b> to group expressions")+"</li>"