// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.utilsplugin2.actions;
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.LinkedList;
import java.util.List;
import java.util.Set;
import javax.swing.JOptionPane;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.JosmAction;
import org.openstreetmap.josm.command.AddCommand;
import org.openstreetmap.josm.command.Command;
import org.openstreetmap.josm.command.SequenceCommand;
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.gui.Notification;
import org.openstreetmap.josm.tools.Geometry;
import org.openstreetmap.josm.tools.Shortcut;
public class AddIntersectionsAction extends JosmAction {
/**
* Constructs a new {@code AddIntersectionsAction}.
*/
public AddIntersectionsAction() {
super(tr("Add nodes at intersections"), "addintersect", tr("Add missing nodes at intersections of selected ways."),
Shortcut.registerShortcut("tools:addintersect", tr("Tool: {0}", tr("Add nodes at intersections")),
KeyEvent.VK_I, Shortcut.SHIFT),
true);
putValue("help", ht("/Action/AddIntersections"));
}
@Override
public void actionPerformed(ActionEvent arg0) {
if (!isEnabled())
return;
List<Way> ways = OsmPrimitive.getFilteredList(getLayerManager().getEditDataSet().getSelected(), Way.class);
if (ways.isEmpty()) {
new Notification(
tr("Please select one or more ways with intersections of segments."))
.setIcon(JOptionPane.INFORMATION_MESSAGE)
.show();
return;
}
LinkedList<Command> cmds = new LinkedList<>();
Geometry.addIntersections(ways, false, cmds);
if (!cmds.isEmpty()) {
Main.main.undoRedo.add(new SequenceCommand(tr("Add nodes at intersections"), cmds));
Set<Node> nodes = new HashSet<>(10);
// find and select newly added nodes
for (Command cmd: cmds) if (cmd instanceof AddCommand) {
Collection<? extends OsmPrimitive> pp = cmd.getParticipatingPrimitives();
for (OsmPrimitive p : pp) { // find all affected nodes
if (p instanceof Node && p.isNew())
nodes.add((Node) p);
}
if (!nodes.isEmpty()) {
getLayerManager().getEditDataSet().setSelected(nodes);
}
}
}
}
@Override
protected void updateEnabledState() {
updateEnabledStateOnCurrentSelection();
}
@Override
protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
setEnabled(selection != null && !selection.isEmpty());
}
}