// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.utilsplugin2.selection; import static org.openstreetmap.josm.gui.help.HelpUtil.ht; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.openstreetmap.josm.actions.JosmAction; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.data.osm.Node; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.data.osm.Way; import org.openstreetmap.josm.tools.Shortcut; /** * Extends current selection */ public class AdjacentNodesAction extends JosmAction { public static final boolean treeMode = false; public AdjacentNodesAction() { super(tr("Adjacent nodes"), "adjnodes", tr("Select adjacent nodes"), Shortcut.registerShortcut("tools:adjnodes", tr("Tool: {0}", "Adjacent nodes"), KeyEvent.VK_E, Shortcut.DIRECT), true); putValue("help", ht("/Action/AdjacentNodes")); } private Set<Way> activeWays = new HashSet<>(); @Override public void actionPerformed(ActionEvent e) { DataSet ds = getLayerManager().getEditDataSet(); Collection<OsmPrimitive> selection = ds.getSelected(); Set<Node> selectedNodes = OsmPrimitive.getFilteredSet(selection, Node.class); Set<Way> selectedWays = OsmPrimitive.getFilteredSet(ds.getSelected(), Way.class); // if no nodes and no ways are selected, do nothing if (selectedNodes.isEmpty() && selectedWays.isEmpty()) return; if (selectedWays.isEmpty()) { // if one node is selected, used ways connected to it to extend selecteons // activeWays are remembered for next extend action (!!!) // FIXME: some strange behaviour is possible if user delete some of these way // how to clear activeWays during such user actions? Do not know if (selectedNodes.size() == 1) { activeWays.clear(); // System.out.println("Cleared active ways"); } } else { // use only ways that were selected for adding nodes activeWays = selectedWays; } // selecting nodes of selected ways if (selectedNodes.isEmpty()) { HashSet<Node> newNodes = new HashSet<>(); NodeWayUtils.addNodesConnectedToWays(selectedWays, newNodes); activeWays.clear(); ds.setSelected(newNodes); return; } if (activeWays.isEmpty()) { NodeWayUtils.addWaysConnectedToNodes(selectedNodes, activeWays); } Set<Node> newNodes = new HashSet<>(); for (Node node: selectedNodes) { for (Way w: activeWays) { NodeWayUtils.addNeighbours(w, node, newNodes); } } // select only newly found nodes newNodes.removeAll(selectedNodes); // enable branching on next call of this function // if no new nodes were found, next search will include all touched ways if (newNodes.isEmpty()) { activeWays.clear(); } ds.addSelected(newNodes); } @Override protected void updateEnabledState() { updateEnabledStateOnCurrentSelection(); } @Override protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) { if (selection == null) { setEnabled(false); return; } setEnabled(!selection.isEmpty()); } }