Changeset 1603 in josm


Ignore:
Timestamp:
2009-05-19T19:01:13+02:00 (15 years ago)
Author:
stoecker
Message:

fixed #2602 - patch by Matt,avar - Search keywords child and parent

Location:
trunk/src/org/openstreetmap/josm
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java

    r1516 r1603  
    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 <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>"
    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>"
  • trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java

    r1499 r1603  
    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
     
    320323        @Override public String toString() {return "untagged";}
    321324    }
     325       
     326    private static class Parent extends Match {
     327        private Match child;
     328        public Parent(Match m) { child = m; }
     329        @Override public boolean match(OsmPrimitive osm) throws ParseError {
     330            boolean isParent = false;
     331
     332            // "parent" (null) should mean the same as "parent()"
     333            // (Always). I.e. match everything
     334            if (child == null)
     335                child = new Always();
     336               
     337            if (osm instanceof Way) {
     338                for (Node n : ((Way)osm).nodes)
     339                    isParent |= child.match(n);
     340            } else if (osm instanceof Relation) {
     341                for (RelationMember member : ((Relation)osm).members) {
     342                    if (member.member != null)
     343                        isParent |= child.match(member.member);
     344                }
     345            }
     346            return isParent;
     347        }
     348        @Override public String toString() {return "parent(" + child + ")";}
     349    }
     350
     351    private static class Child extends Match {
     352        private Match parent;
     353        public Child(Match m) { parent = m; }
     354        @Override public boolean match(OsmPrimitive osm) throws ParseError {
     355            // "child" (null) should mean the same as "child()"
     356            // (Always). I.e. match everything
     357            if (parent == null)
     358                parent = new Always();
     359
     360            boolean isChild = false;
     361            CollectBackReferencesVisitor backRefs = new CollectBackReferencesVisitor(Main.ds);
     362            osm.visit(backRefs);
     363            for (OsmPrimitive p : backRefs.data) {
     364                isChild |= parent.match(p);
     365            }
     366            return isChild;
     367        }
     368        @Override public String toString() {return "child(" + parent + ")";}
     369    }
    322370
    323371    public static class ParseError extends Exception {
     
    388436    }
    389437
    390     private Match parsePat() {
     438    private Match parsePat() throws ParseError {
    391439        String tok = tokenizer.readText();
    392440
     
    408456        } else if (tok.equals("selected")) {
    409457            return new Selected();
     458        } else if (tok.equals("child")) {
     459            return new Child(parseParens());
     460        } else if (tok.equals("parent")) {
     461            return new Parent(parseParens());
    410462        } else {
    411463            return new Any(tok);
  • trunk/src/org/openstreetmap/josm/plugins/PluginSelection.java

    r1591 r1603  
    3434import javax.swing.JOptionPane;
    3535import javax.swing.JPanel;
     36import javax.swing.UIManager;
    3637import javax.swing.event.HyperlinkEvent;
    3738import javax.swing.event.HyperlinkListener;
    3839import javax.swing.event.HyperlinkEvent.EventType;
    39 import javax.swing.UIManager;
    4040
    4141import org.openstreetmap.josm.Main;
     
    135135        if (pluginMap == null)
    136136            pluginMap = new HashMap<String, Boolean>();
    137         else
     137        else {
    138138            // Keep the map in bounds; possibly slightly pointless.
    139             for (final String pname : pluginMap.keySet())
    140                 if (availablePlugins.get(pname) == null) pluginMap.remove(pname);
     139            Set<String> pluginsToRemove = new HashSet<String>();
     140            for (final String pname : pluginMap.keySet()) {
     141                if (availablePlugins.get(pname) == null) pluginsToRemove.add(pname);
     142            }
     143           
     144            for (String pname : pluginsToRemove) {
     145                pluginMap.remove(pname);
     146            }
     147        }
    141148
    142149        pluginPanel.removeAll();
Note: See TracChangeset for help on using the changeset viewer.