// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.utilsplugin2.search;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.search.SearchCompiler;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.Way;
import org.openstreetmap.josm.plugins.utilsplugin2.selection.NodeWayUtils;
/**
* Find (all) ways intersecting ways or nodes which match the expression.
*/
public class IntersectingMatch extends SearchCompiler.UnaryMatch {
private Collection<Way> intersecting = null;
boolean all;
public IntersectingMatch(SearchCompiler.Match match, boolean all) {
super(match);
this.all = all;
//init(all);
}
/**
* Find (all) ways intersecting ways which match the expression.
*/
private void init(boolean all) {
Collection<Way> matchedWays = new HashSet<>();
// find all ways that match the expression
Collection<Way> allWays = Main.getLayerManager().getEditDataSet().getWays();
for (Way way : allWays) {
if (match.match(way)) {
matchedWays.add(way);
}
}
Set<Way> newWays = new HashSet<>();
if (all) {
NodeWayUtils.addWaysIntersectingWaysRecursively(allWays, matchedWays, newWays);
} else {
NodeWayUtils.addWaysIntersectingWays(allWays, matchedWays, newWays);
}
intersecting = newWays;
}
@Override
public boolean match(OsmPrimitive osm) {
if (intersecting == null) {
init(all); // lazy initialization
}
if (osm instanceof Way) {
return intersecting.contains(osm);
}
return false;
}
}