package maps.gml.editor; import javax.swing.undo.AbstractUndoableEdit; import java.util.HashSet; import java.util.Collection; import maps.gml.GMLNode; import rescuecore2.log.Logger; /** A function for pruning nodes that are not attached to any edges. */ public class PruneOrphanNodesFunction extends AbstractFunction { /** Construct a PruneOrphanNodesFunction. @param editor The editor instance. */ public PruneOrphanNodesFunction(GMLEditor editor) { super(editor); } @Override public String getName() { return "Prune orphaned nodes"; } @Override public void execute() { // Go through all nodes and remove any that are not attached to edges. final Collection<GMLNode> remaining = new HashSet<GMLNode>(editor.getMap().getNodes()); final Collection<GMLNode> deleted = new HashSet<GMLNode>(); for (GMLNode next : remaining) { if (editor.getMap().getAttachedEdges(next).isEmpty()) { editor.getMap().removeNode(next); deleted.add(next); } } if (!deleted.isEmpty()) { editor.setChanged(); editor.getViewer().repaint(); } Logger.debug("Removed " + deleted.size() + " nodes"); editor.addEdit(new DeleteNodesEdit(deleted)); } private class DeleteNodesEdit extends AbstractUndoableEdit { private Collection<GMLNode> nodes; public DeleteNodesEdit(Collection<GMLNode> nodes) { this.nodes = nodes; } @Override public void undo() { super.undo(); editor.getMap().add(nodes); editor.getViewer().repaint(); } @Override public void redo() { super.redo(); editor.getMap().remove(nodes); editor.getViewer().repaint(); } } }