Ticket #17187: 17187-alpha.patch

File 17187-alpha.patch, 38.1 KB (added by GerdP, 7 years ago)

work in progress

  • src/org/openstreetmap/josm/plugins/utilsplugin2/actions/AddIntersectionsAction.java

     
    66
    77import java.awt.event.ActionEvent;
    88import java.awt.event.KeyEvent;
     9import java.util.ArrayList;
    910import java.util.Collection;
    1011import java.util.HashSet;
    1112import java.util.LinkedList;
     
    4647    public void actionPerformed(ActionEvent arg0) {
    4748        if (!isEnabled())
    4849            return;
    49         List<Way> ways = OsmPrimitive.getFilteredList(getLayerManager().getEditDataSet().getSelected(), Way.class);
     50        List<Way> ways = new ArrayList<>(getLayerManager().getEditDataSet().getSelectedWays());
    5051        if (ways.isEmpty()) {
    5152            new Notification(
    5253                    tr("Please select one or more ways with intersections of segments."))
  • src/org/openstreetmap/josm/plugins/utilsplugin2/actions/AlignWayNodesAction.java

     
    114114                // Otherwise calculate position by solving y=mx+c (simplified)
    115115                double m1 = (by - ay) / (bx - ax);
    116116                double c1 = ay - (ax * m1);
    117                 double m2 = (-1) / m1;
     117                double m2 = -1.0 / m1;
    118118                double c2 = ny - (nx * m2);
    119119
    120120                nx = (c2 - c1) / (m1 - m2);
     
    145145    private Set<Way> findCommonWays(Set<Node> nodes) {
    146146        Set<Way> ways = null;
    147147        for (Node n : nodes.stream().filter(n -> n.getDataSet() != null).collect(Collectors.toList())) {
    148             List<Way> referrers = OsmPrimitive.getFilteredList(n.getReferrers(), Way.class);
    149148            if (ways == null)
    150                 ways = new HashSet<>(referrers);
     149                ways = new HashSet<>(n.getParentWays());
    151150            else {
    152                 ways.retainAll(referrers);
     151                ways.retainAll(n.getParentWays());
    153152            }
    154153        }
    155154        return ways;
  • src/org/openstreetmap/josm/plugins/utilsplugin2/actions/ExtractPointAction.java

     
    4747    @Override
    4848    public void actionPerformed(ActionEvent e) {
    4949        DataSet ds = getLayerManager().getEditDataSet();
    50         Collection<OsmPrimitive> selection = ds.getSelected();
    51         List<Node> selectedNodes = OsmPrimitive.getFilteredList(selection, Node.class);
     50        Collection<Node> selectedNodes = ds.getSelectedNodes();
    5251        if (selectedNodes.size() != 1) {
    5352            new Notification(tr("This tool extracts node from its ways and requires single node to be selected."))
    5453            .setIcon(JOptionPane.WARNING_MESSAGE).show();
    5554            return;
    5655        }
    57         Node nd = selectedNodes.get(0);
     56        Node nd = selectedNodes.iterator().next();
    5857        Node ndCopy = new Node(nd.getCoor());
    5958        List<Command> cmds = new LinkedList<>();
    6059
  • src/org/openstreetmap/josm/plugins/utilsplugin2/actions/PasteRelationsAction.java

     
    2727import org.openstreetmap.josm.gui.datatransfer.data.PrimitiveTransferData;
    2828import org.openstreetmap.josm.tools.Logging;
    2929import org.openstreetmap.josm.tools.Shortcut;
     30import org.openstreetmap.josm.tools.Utils;
    3031
    3132/**
    3233 * Pastes relation membership from objects in the paste buffer onto selected object(s).
     
    5859        for (PrimitiveData pdata : data) {
    5960            OsmPrimitive p = getLayerManager().getEditDataSet().getPrimitiveById(pdata.getUniqueId(), pdata.getType());
    6061            if (p != null) {
    61                 for (Relation r : OsmPrimitive.getFilteredList(p.getReferrers(), Relation.class)) {
     62                for (Relation r : Utils.filteredCollection(p.getReferrers(), Relation.class)) {
    6263                    String role = relations.get(r);
    6364                    for (RelationMember m : r.getMembers()) {
    6465                        if (m.getMember().equals(p)) {
  • src/org/openstreetmap/josm/plugins/utilsplugin2/actions/SplitObjectAction.java

     
    77
    88import java.awt.event.ActionEvent;
    99import java.awt.event.KeyEvent;
     10import java.util.ArrayList;
    1011import java.util.Collection;
    1112import java.util.Collections;
    1213import java.util.HashMap;
     
    2122import org.openstreetmap.josm.command.DeleteCommand;
    2223import org.openstreetmap.josm.command.SplitWayCommand;
    2324import org.openstreetmap.josm.data.UndoRedoHandler;
     25import org.openstreetmap.josm.data.osm.DataSet;
    2426import org.openstreetmap.josm.data.osm.Node;
    2527import org.openstreetmap.josm.data.osm.OsmPrimitive;
    2628import org.openstreetmap.josm.data.osm.Way;
     
    5557     */
    5658    @Override
    5759    public void actionPerformed(ActionEvent e) {
    58         Collection<OsmPrimitive> selection = getLayerManager().getEditDataSet().getSelected();
    59 
    60         List<Node> selectedNodes = OsmPrimitive.getFilteredList(selection, Node.class);
    61         List<Way> selectedWays = OsmPrimitive.getFilteredList(selection, Way.class);
    62 
    63         if (!checkSelection(selection)) {
     60        DataSet ds = getLayerManager().getEditDataSet();
     61        if (!checkSelection(ds.getSelected())) {
    6462            showWarningNotification(tr("The current selection cannot be used for splitting."));
    6563            return;
    6664        }
    6765
     66        List<Node> selectedNodes = new ArrayList<>(ds.getSelectedNodes());
     67        List<Way> selectedWays = new ArrayList<>(ds.getSelectedWays());
     68
    6869        Way selectedWay = null;
    6970        Way splitWay = null;
    7071
     
    9192        if (selectedWay == null && !selectedNodes.isEmpty()) {
    9293            Map<Way, Integer> wayOccurenceCounter = new HashMap<>();
    9394            for (Node n : selectedNodes) {
    94                 for (Way w : OsmPrimitive.getFilteredList(n.getReferrers(), Way.class)) {
     95                for (Way w : n.getParentWays()) {
    9596                    if (!w.isUsable()) {
    9697                        continue;
    9798                    }
  • src/org/openstreetmap/josm/plugins/utilsplugin2/actions/SplitOnIntersectionsAction.java

     
    4545    @Override
    4646    public void actionPerformed(ActionEvent e) {
    4747        List<Command> list = new ArrayList<>();
    48         List<Way> selectedWays = OsmPrimitive.getFilteredList(getLayerManager().getEditDataSet().getSelected(), Way.class);
     48        List<Way> selectedWays = new ArrayList<>(getLayerManager().getEditDataSet().getSelectedWays());
    4949        Map<Way, List<Node>> splitWays = new HashMap<>();
    5050
    5151        for (Way way : selectedWays) {
    5252            if (way.getNodesCount() > 1 && !way.hasIncompleteNodes() && !way.isClosed())
    5353                for (Node node : new Node[] {way.getNode(0), way.getNode(way.getNodesCount() - 1)}) {
    54                     List<Way> refs = OsmPrimitive.getFilteredList(node.getReferrers(), Way.class);
     54                    List<Way> refs = node.getParentWays();
    5555                    refs.remove(way);
    5656                    if (selectedWays.size() > 1) {
    5757                        // When several ways are selected, split only those among selected
  • src/org/openstreetmap/josm/plugins/utilsplugin2/actions/UnGlueRelationAction.java

     
    2323import org.openstreetmap.josm.gui.MainApplication;
    2424import org.openstreetmap.josm.plugins.utilsplugin2.command.ChangeRelationMemberCommand;
    2525import org.openstreetmap.josm.tools.Shortcut;
     26import org.openstreetmap.josm.tools.Utils;
    2627
    2728/**
    2829 * Duplicate nodes, ways and relations that are used by multiple relations.
     
    5758
    5859        for (OsmPrimitive p : selection) {
    5960            boolean first = true;
    60             for (Relation relation : OsmPrimitive.getFilteredList(p.getReferrers(), Relation.class)) {
     61            for (Relation relation : Utils.filteredCollection(p.getReferrers(), Relation.class)) {
    6162                if (relation.isDeleted()) {
    6263                    continue;
    6364                }
  • src/org/openstreetmap/josm/plugins/utilsplugin2/curves/CircleArcMaker.java

     
    1919import org.openstreetmap.josm.data.coor.EastNorth;
    2020import org.openstreetmap.josm.data.osm.DataSet;
    2121import org.openstreetmap.josm.data.osm.Node;
    22 import org.openstreetmap.josm.data.osm.OsmPrimitive;
    2322import org.openstreetmap.josm.data.osm.Way;
    2423import org.openstreetmap.josm.gui.MainApplication;
    2524
     
    5655        //// Anchor nodes
    5756        Node n1 = null, n2 = null, n3 = null;
    5857
    59         if (false) {
    60             int nodeCount = selectedNodes.size();
    61             int wayCount = selectedWays.size();
    62 
    63             // TODO: filter garbage nodes based on selected ways
    64 
    65             // Never interested in more than 3 nodes. Nodes prioritized by reverse selection order, but keep their order.
    66             // TODO: replace by helper function (eg. getPostFixList(int count))
    67             Node[] nodesOfInterest = new Node[3];
    68             int nodesOfInterestCount = Math.min(nodeCount, 3);
    69             for (int i = nodesOfInterestCount - 1; i >= 0; i--) {
    70                 nodesOfInterest[i] = selectedNodes.get(nodeCount - 1 - i);
    71             }
    72         }
    73 
    7458        Set<Way> targetWays = new HashSet<>();
    7559        DataSet ds = MainApplication.getLayerManager().getEditDataSet();
    7660
     
    124108            }
    125109
    126110            for (Node n : consideredNodes) {
    127                 targetWays.addAll(OsmPrimitive.getFilteredList(n.getReferrers(), Way.class));
     111                targetWays.addAll(n.getParentWays());
    128112            }
    129113        }
    130114        if (!nodesHaveBeenChoosen) {
     
    296280        }
    297281        assert (closestIndexToP2 != 0);
    298282
    299         double a = direction * (stepLength);
     283        double a = direction * stepLength;
    300284        points.add(p1);
    301285        if (indexJustBeforeP2 == 0 && includeAnchors) {
    302286            points.add(p2);
  • src/org/openstreetmap/josm/plugins/utilsplugin2/replacegeometry/ReplaceGeometryUtils.java

     
    106106     * Replace a node with another node (similar to MergeNodesAction)
    107107     */
    108108    public static ReplaceGeometryCommand buildReplaceNodeCommand(Node subjectNode, Node referenceNode) {
    109         if (!OsmPrimitive.getFilteredList(subjectNode.getReferrers(), Way.class).isEmpty()) {
     109        if (!subjectNode.getParentWays().isEmpty()) {
    110110            throw new ReplaceGeometryException(tr("Node belongs to way(s), cannot replace."));
    111111        }
    112112        // FIXME: handle different layers
     
    114114        Command c = MergeNodesAction.mergeNodes(
    115115            Arrays.asList(subjectNode, referenceNode), referenceNode);
    116116        if (c == null) {
    117             // User canceled
     117            // User cancelled
    118118            return null;
    119119        }
    120120        commands.add(c);
     
    131131     * @param referenceObject object with greater spatial quality
    132132     */
    133133    public static ReplaceGeometryCommand buildUpgradeNodeCommand(Node subjectNode, OsmPrimitive referenceObject) {
    134         if (!OsmPrimitive.getFilteredList(subjectNode.getReferrers(), Way.class).isEmpty()) {
     134        if (!subjectNode.getParentWays().isEmpty()) {
    135135            throw new ReplaceGeometryException(tr("Node belongs to way(s), cannot replace."));
    136136        }
    137137
     
    168168        try {
    169169            commands.addAll(getTagConflictResolutionCommands(subjectNode, referenceObject));
    170170        } catch (UserCancelException e) {
    171             // user canceled tag merge dialog
     171            // user cancelled tag merge dialog
    172172            return null;
    173173        }
    174174
     
    254254        try {
    255255            commands.addAll(getTagConflictResolutionCommands(referenceWay, subjectWay));
    256256        } catch (UserCancelException e) {
    257             // user canceled tag merge dialog
     257            // user cancelled tag merge dialog
    258258            Logging.trace(e);
    259259            return null;
    260260        }
  • src/org/openstreetmap/josm/plugins/utilsplugin2/search/ConnectedMatch.java

     
    1616 * Matches all ways connected to [nodes and ways which match the expression]..
    1717 */
    1818public class ConnectedMatch extends SearchCompiler.UnaryMatch {
    19     private Collection<Way> connected = null;
     19    private Set<Way> connected = null;
    2020    boolean all;
    2121
    2222    public ConnectedMatch(SearchCompiler.Match match, boolean all) {
     
    7979    public boolean equals(Object obj) {
    8080        if (this == obj)
    8181            return true;
    82         if (!super.equals(obj) || getClass() != obj.getClass())
     82        if (!super.equals(obj) || !(obj instanceof ConnectedMatch))
    8383            return false;
    8484        ConnectedMatch other = (ConnectedMatch) obj;
    8585        if (all != other.all)
  • src/org/openstreetmap/josm/plugins/utilsplugin2/search/InsideMatch.java

     
    33
    44import java.util.Collection;
    55import java.util.HashSet;
     6import java.util.Set;
    67
    78import org.openstreetmap.josm.data.osm.OsmPrimitive;
    89import org.openstreetmap.josm.data.osm.Relation;
     
    1516 * Matches all objects contained within the match expression.
    1617 */
    1718public class InsideMatch extends SearchCompiler.UnaryMatch {
    18     private Collection<OsmPrimitive> inside = null;
     19    private Set<OsmPrimitive> inside = null;
    1920
    2021    public InsideMatch(SearchCompiler.Match match) {
    2122        super(match);
     
    6061    public boolean equals(Object obj) {
    6162        if (this == obj)
    6263            return true;
    63         if (!super.equals(obj) || getClass() != obj.getClass())
     64        if (!super.equals(obj) || !(obj instanceof InsideMatch))
    6465            return false;
    6566        InsideMatch other = (InsideMatch) obj;
    6667        if (inside == null) {
  • src/org/openstreetmap/josm/plugins/utilsplugin2/search/IntersectingMatch.java

     
    1515 * Find (all) ways intersecting ways or nodes which match the expression.
    1616 */
    1717public class IntersectingMatch extends SearchCompiler.UnaryMatch {
    18     private Collection<Way> intersecting = null;
     18    private Set<Way> intersecting = null;
    1919    boolean all;
    2020
    2121    public IntersectingMatch(SearchCompiler.Match match, boolean all) {
     
    6969    public boolean equals(Object obj) {
    7070        if (this == obj)
    7171            return true;
    72         if (!super.equals(obj) || getClass() != obj.getClass())
     72        if (!super.equals(obj) || !(obj instanceof IntersectingMatch))
    7373            return false;
    7474        IntersectingMatch other = (IntersectingMatch) obj;
    7575        if (all != other.all)
  • src/org/openstreetmap/josm/plugins/utilsplugin2/search/RangeMatch.java

     
    5353    public boolean equals(Object obj) {
    5454        if (this == obj)
    5555            return true;
    56         if (obj == null || getClass() != obj.getClass())
     56        if (!(obj instanceof RangeMatch))
    5757            return false;
    5858        RangeMatch other = (RangeMatch) obj;
    5959        if (max != other.max)
  • src/org/openstreetmap/josm/plugins/utilsplugin2/selection/AdjacentNodesAction.java

     
    88import java.awt.event.KeyEvent;
    99import java.util.Collection;
    1010import java.util.HashSet;
     11import java.util.LinkedHashSet;
    1112import java.util.Set;
    1213
    1314import org.openstreetmap.josm.actions.JosmAction;
     
    3637    @Override
    3738    public void actionPerformed(ActionEvent e) {
    3839        DataSet ds = getLayerManager().getEditDataSet();
    39         Collection<OsmPrimitive> selection = ds.getSelected();
    40         Set<Node> selectedNodes = OsmPrimitive.getFilteredSet(selection, Node.class);
     40        Collection<Node> selectedNodes = ds.getSelectedNodes();
     41        Set<Way> selectedWays = new LinkedHashSet<>(ds.getSelectedWays());
    4142
    42         Set<Way> selectedWays = OsmPrimitive.getFilteredSet(ds.getSelected(), Way.class);
    43 
    4443        // if no nodes and no ways are selected, do nothing
    4544        if (selectedNodes.isEmpty() && selectedWays.isEmpty()) return;
    4645
    4746        if (selectedWays.isEmpty()) {
    48             // if one node is selected, used ways connected to it to extend selecteons
     47            // if one node is selected, use ways connected to it to extend selection
    4948            // activeWays are remembered for next extend action (!!!)
    5049
    51             // FIXME: some strange behaviour is possible if user delete some of these way
     50            // FIXME: some strange behaviour is possible if user deletes some of these ways
    5251            // how to clear activeWays during such user actions? Do not know
    5352            if (selectedNodes.size() == 1) {
    5453                activeWays.clear();
    55                 //                System.out.println("Cleared active ways");
    5654            }
    5755        } else {
    5856            // use only ways that were selected for adding nodes
  • src/org/openstreetmap/josm/plugins/utilsplugin2/selection/AdjacentWaysAction.java

     
    3535    @Override
    3636    public void actionPerformed(ActionEvent e) {
    3737        DataSet ds = getLayerManager().getEditDataSet();
    38         Collection<OsmPrimitive> selection = ds.getSelected();
    39         Set<Node> selectedNodes = OsmPrimitive.getFilteredSet(selection, Node.class);
     38        Collection<Node> selectedNodes = ds.getSelectedNodes();
     39        Collection<Way> selectedWays = ds.getSelectedWays();
    4040
    41         Set<Way> selectedWays = OsmPrimitive.getFilteredSet(ds.getSelected(), Way.class);
    42 
    4341        // select ways attached to already selected ways
    4442        Set<Way> newWays = new HashSet<>();
    4543        NodeWayUtils.addWaysConnectedToWays(selectedWays, newWays);
  • src/org/openstreetmap/josm/plugins/utilsplugin2/selection/ConnectedWaysAction.java

     
    3232    @Override
    3333    public void actionPerformed(ActionEvent e) {
    3434        DataSet ds = getLayerManager().getEditDataSet();
    35         Collection<OsmPrimitive> selection = ds.getSelected();
    36         Set<Node> selectedNodes = OsmPrimitive.getFilteredSet(selection, Node.class);
    37         Set<Way> selectedWays = OsmPrimitive.getFilteredSet(ds.getSelected(), Way.class);
     35        Collection<Node> selectedNodes = ds.getSelectedNodes();
     36        Collection<Way> selectedWays = ds.getSelectedWays();
    3837
    3938        Set<Way> newWays = new HashSet<>();
    4039
  • src/org/openstreetmap/josm/plugins/utilsplugin2/selection/IntersectedWaysAction.java

     
    3434    @Override
    3535    public void actionPerformed(ActionEvent e) {
    3636        DataSet ds = getLayerManager().getEditDataSet();
    37         Set<Way> selectedWays = OsmPrimitive.getFilteredSet(ds.getSelected(), Way.class);
     37        Collection<Way> selectedWays = ds.getSelectedWays();
    3838
    3939        // select ways attached to already selected ways
    4040        if (!selectedWays.isEmpty()) {
  • src/org/openstreetmap/josm/plugins/utilsplugin2/selection/IntersectedWaysRecursiveAction.java

     
    3535    @Override
    3636    public void actionPerformed(ActionEvent e) {
    3737        DataSet ds = getLayerManager().getEditDataSet();
    38         Set<Way> selectedWays = OsmPrimitive.getFilteredSet(ds.getSelected(), Way.class);
     38        Collection<Way> selectedWays = ds.getSelectedWays();
    3939
    4040        if (!selectedWays.isEmpty()) {
    4141            Set<Way> newWays = new HashSet<>();
  • src/org/openstreetmap/josm/plugins/utilsplugin2/selection/MiddleNodesAction.java

     
    3333
    3434    @Override
    3535    public void actionPerformed(ActionEvent e) {
    36         Collection<OsmPrimitive> selection = getLayerManager().getEditDataSet().getSelected();
    37         Set<Node> selectedNodes = OsmPrimitive.getFilteredSet(selection, Node.class);
     36        Set<Node> selectedNodes = new HashSet<>(getLayerManager().getEditDataSet().getSelectedNodes());
    3837
    3938        // if no 2 nodes and no ways are selected, do nothing
    4039        if (selectedNodes.size() != 2) {
  • src/org/openstreetmap/josm/plugins/utilsplugin2/selection/NodeWayUtils.java

     
    4646     * @param nodes collection to place the nodes we found
    4747     */
    4848    static void addNeighbours(Way w, Node n, Collection<Node> nodes) {
     49        if (!n.getParentWays().contains(w))
     50                return;
     51
    4952        List<Node> nodeList = w.getNodes();
    50 
    5153        int idx = nodeList.indexOf(n);
    5254        if (idx == -1) return;
    5355
     
    7476     * Adds all ways attached to way to specified collection
    7577     * @param w way to find attached ways
    7678     * @param ways  collection to place the ways we found
     79     * @return number of ways added
    7780     */
    7881    static int addWaysConnectedToWay(Way w, Set<Way> ways) {
    7982        int s = ways.size();
     
    8083        List<Node> nodes = w.getNodes();
    8184        boolean flag = ways.contains(w);
    8285        for (Node n: nodes) {
    83             ways.addAll(OsmPrimitive.getFilteredList(n.getReferrers(), Way.class));
     86            ways.addAll(n.getParentWays());
    8487        }
    8588        if (!flag) ways.remove(w);
    8689        return ways.size() - s;
     
    9093     * Adds all ways attached to node to specified collection
    9194     * @param n Node to find attached ways
    9295     * @param ways  collection to place the ways we found
     96     * @return number of ways added
    9397     */
    9498    static int addWaysConnectedToNode(Node n, Set<Way> ways) {
    9599        int s = ways.size();
    96         ways.addAll(OsmPrimitive.getFilteredList(n.getReferrers(), Way.class));
     100        ways.addAll(n.getParentWays());
    97101        return ways.size() - s;
    98102    }
    99103
     
    102106     * @param ways collection of ways to search
    103107     * @param w way to check intersections
    104108     * @param newWays set to place the ways we found
     109     * @return number of ways possibly added added to newWays
    105110     */
    106111    static int addWaysIntersectingWay(Collection<Way> ways, Way w, Set<Way> newWays, Set<Way> excludeWays) {
    107112        List<Pair<Node, Node>> nodePairs = w.getNodePairs(false);
     
    153158     * @param allWays collection of ways to search
    154159     * @param initWays ways to check intersections
    155160     * @param newWays set to place the ways we found
     161     * @return number of ways added to newWays
    156162     */
    157163    public static int addWaysIntersectingWays(Collection<Way> allWays, Collection<Way> initWays, Set<Way> newWays) {
    158164        int count = 0;
     
    168174        }
    169175    }
    170176
    171     public static int addWaysConnectedToNodes(Set<Node> selectedNodes, Set<Way> newWays) {
     177    public static int addWaysConnectedToNodes(Collection<Node> selectedNodes, Set<Way> newWays) {
    172178        int s = newWays.size();
    173179        for (Node node: selectedNodes) {
    174180            addWaysConnectedToNode(node, newWays);
     
    234240        Node n1 = it.next();
    235241        Node n2 = it.next();
    236242        Set<Way> ways = new HashSet<>();
    237         ways.addAll(OsmPrimitive.getFilteredList(n1.getReferrers(), Way.class));
     243        ways.addAll(n1.getParentWays());
    238244        for (Way w: ways) {
    239245
    240246            if (w.isUsable() && w.containsNode(n2) && w.containsNode(n1)) {
     
    343349        }
    344350    }
    345351
    346     static boolean isPointInsideMultipolygon(EastNorth p, Relation rel) {
    347         Set<Way> usedWays = OsmPrimitive.getFilteredSet(rel.getMemberPrimitives(), Way.class);
    348         return isPointInsidePolygon(p, buildPointList(usedWays));
    349     }
    350 
    351352    static void addAllInsideMultipolygon(DataSet data, Relation rel, Set<Way> newWays, Set<Node> newNodes) {
    352353        if (!rel.isMultipolygon()) return;
    353354        BBox box = rel.getBBox();
     
    462463        return interCount;
    463464    }
    464465
    465     public static Collection<OsmPrimitive> selectAllInside(Collection<OsmPrimitive> selected, DataSet dataset) {
    466         return selectAllInside(selected, dataset, true);
    467     }
    468 
    469     public static Collection<OsmPrimitive> selectAllInside(Collection<OsmPrimitive> selected, DataSet dataset, boolean ignoreNodesOfFoundWays) {
    470         Set<Way> selectedWays = OsmPrimitive.getFilteredSet(selected, Way.class);
    471         Set<Relation> selectedRels = OsmPrimitive.getFilteredSet(selected, Relation.class);
    472 
    473         for (Iterator<Relation> it = selectedRels.iterator(); it.hasNext();) {
    474             Relation r = it.next();
    475             if (!r.isMultipolygon()) {
    476                 it.remove();
    477             }
    478         }
    479 
     466    public static Set<OsmPrimitive> selectAllInside(Collection<OsmPrimitive> selected, DataSet dataset, boolean ignoreNodesOfFoundWays) {
    480467        Set<Way> newWays = new HashSet<>();
    481468        Set<Node> newNodes = new HashSet<>();
    482         // select nodes and ways inside slexcted ways and multipolygons
    483         if (!selectedWays.isEmpty()) {
    484             for (Way w: selectedWays) {
    485                 addAllInsideWay(dataset, w, newWays, newNodes);
    486             }
     469        // select nodes and ways inside selected ways and multipolygons
     470        for (OsmPrimitive p: selected) {
     471                if (p instanceof Way) {
     472                        addAllInsideWay(dataset, (Way)p, newWays, newNodes);
     473                }
    487474        }
    488         if (!selectedRels.isEmpty()) {
    489             for (Relation r: selectedRels) {
    490                 addAllInsideMultipolygon(dataset, r, newWays, newNodes);
    491             }
     475        for (OsmPrimitive p: selected) {
     476                if (!(p instanceof Relation) || p.isMultipolygon())
     477                        continue;
     478                addAllInsideMultipolygon(dataset, (Relation) p, newWays, newNodes);
    492479        }
    493480        if (ignoreNodesOfFoundWays) {
    494481            for (Way w : newWays) {
  • src/org/openstreetmap/josm/plugins/utilsplugin2/selection/SelectHighwayAction.java

     
    4141    @Override
    4242    public void actionPerformed(ActionEvent e) {
    4343        DataSet ds = getLayerManager().getEditDataSet();
    44         List<Way> selectedWays = OsmPrimitive.getFilteredList(ds.getSelected(), Way.class);
     44        List<Way> selectedWays = new ArrayList<>(ds.getSelectedWays());
    4545
    4646        if (selectedWays.size() == 1) {
    4747            ds.setSelected(selectNamedRoad(selectedWays.get(0)));
     
    6363            nodeQueue.add(firstWay.firstNode());
    6464            while (!nodeQueue.isEmpty()) {
    6565                Node node = nodeQueue.remove();
    66                 for (Way p : OsmPrimitive.getFilteredList(node.getReferrers(), Way.class)) {
     66                for (Way p : node.getParentWays()) {
    6767                    if (!newWays.contains(p) && p.hasKey(key) && p.get(key).equals(value)) {
    6868                        newWays.add(p);
    6969                        nodeQueue.add(p.firstNode().equals(node) ? p.lastNode() : p.firstNode());
     
    159159            for (int i = 0; i < nodesToCheck.size(); i++) {
    160160                Node node = nodesToCheck.get(i);
    161161                Integer nodeRef = nodeRefs.get(i);
    162                 for (Way way : OsmPrimitive.getFilteredList(node.getReferrers(), Way.class)) {
     162                for (Way way : node.getParentWays()) {
    163163                    if ((way.firstNode().equals(node) || way.lastNode().equals(node)) &&
    164164                            !tree.contains(way) && suits(way)) {
    165165                        tree.add(way);
  • src/org/openstreetmap/josm/plugins/utilsplugin2/selection/SelectModNodesAction.java

     
    1919import org.openstreetmap.josm.tools.Shortcut;
    2020
    2121/**
    22  * Unselects all nodes
     22 * Select last modified nodes.
    2323 */
    2424public class SelectModNodesAction extends JosmAction {
    2525    private int lastHash;
     
    3838        DataSet ds = getLayerManager().getEditDataSet();
    3939        if (ds != null) {
    4040            Collection<OsmPrimitive> selection = ds.getSelected();
    41             ds.clearSelection(OsmPrimitive.getFilteredSet(selection, Node.class));
     41            ds.clearSelection(ds.getSelectedNodes());
    4242            Command cmd = null;
    4343
    4444            if (UndoRedoHandler.getInstance().commands == null) return;
     
    4545            int num = UndoRedoHandler.getInstance().commands.size();
    4646            if (num == 0) return;
    4747            int k = 0, idx;
     48            //FIXME: selection.hashCode() changes with each call of ds.getSelected()
    4849            if (selection != null && !selection.isEmpty() && selection.hashCode() == lastHash) {
    4950                // we are selecting next command in history if nothing is selected
    5051                idx = UndoRedoHandler.getInstance().commands.indexOf(lastCmd);
  • src/org/openstreetmap/josm/plugins/utilsplugin2/selection/SelectModWaysAction.java

     
    1414import org.openstreetmap.josm.command.Command;
    1515import org.openstreetmap.josm.data.UndoRedoHandler;
    1616import org.openstreetmap.josm.data.osm.DataSet;
    17 import org.openstreetmap.josm.data.osm.Node;
    1817import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1918import org.openstreetmap.josm.data.osm.Way;
    2019import org.openstreetmap.josm.tools.Shortcut;
    2120
    2221/**
    23  * Unselects all nodes
     22 * Select last modified ways.
    2423 */
    2524public class SelectModWaysAction extends JosmAction {
    2625    private int lastHash;
     
    3938        DataSet ds = getLayerManager().getEditDataSet();
    4039        if (ds != null) {
    4140            Collection<OsmPrimitive> selection = ds.getSelected();
    42             ds.clearSelection(OsmPrimitive.getFilteredSet(selection, Node.class));
     41            ds.clearSelection(ds.getSelectedNodes());
    4342            Command cmd;
    4443
    4544            if (UndoRedoHandler.getInstance().commands == null) return;
     
    4645            int num = UndoRedoHandler.getInstance().commands.size();
    4746            if (num == 0) return;
    4847            int k = 0, idx;
     48            //FIXME: selection.hashCode() changes with each call of ds.getSelected()
    4949            if (selection != null && !selection.isEmpty() && selection.hashCode() == lastHash) {
    5050                // we are selecting next command in history if nothing is selected
    5151                idx = UndoRedoHandler.getInstance().commands.indexOf(lastCmd);
  • src/org/openstreetmap/josm/plugins/utilsplugin2/selection/UndoSelectionAction.java

     
    4040            if (history == null || history.isEmpty()) return; // empty history
    4141            if (lastSel != null) {
    4242                Collection<OsmPrimitive> selection = ds.getSelected();
    43                 if (selection.containsAll(lastSel) && lastSel.containsAll(selection)) {
     43                if (selection.containsAll(lastSel) && lastSel.size() == selection.size()) {
    4444                        // repeated action
    4545                } else {
    4646                        index = -1;
     
    5050            int num = history.size();
    5151            int k = 0;
    5252
    53             Set<OsmPrimitive> newsel = new HashSet<>();
     53            Set<OsmPrimitive> newSel = new HashSet<>();
    5454            while (k < num) {
    5555                if (index+1 < history.size()) index++; else index = 0;
    5656                Collection<? extends OsmPrimitive> histsel = history.get(index);
    5757                // remove deleted entities from selection
    58                 newsel.clear();
    59                 newsel.addAll(histsel);
    60                 newsel.removeIf(p -> p == null || p.isDeleted());
     58                newSel.clear();
     59                newSel.addAll(histsel);
     60                newSel.removeIf(p -> p == null || p.isDeleted());
    6161                k++;
    62                 if (!newsel.isEmpty()) {
    63                         if (newsel.containsAll(ds.getSelected()) && ds.getSelected().containsAll(newsel)) {
     62                if (!newSel.isEmpty()) {
     63                        Collection<OsmPrimitive> oldSel = ds.getSelected();
     64                        if (newSel.containsAll(oldSel) && oldSel.size() == newSel.size()) {
    6465                                // ignore no-change selection
    6566                                continue;
    6667                        }
     
    6970            }
    7071
    7172            // set new selection (is added to history)
    72             ds.setSelected(newsel);
     73            ds.setSelected(newSel);
    7374            lastSel = ds.getSelected();
    7475        }
    7576    }
  • src/org/openstreetmap/josm/plugins/utilsplugin2/selection/UnselectNodesAction.java

     
    77import java.awt.event.ActionEvent;
    88import java.awt.event.KeyEvent;
    99import java.util.Collection;
    10 import java.util.Set;
    1110
    1211import org.openstreetmap.josm.actions.JosmAction;
    13 import org.openstreetmap.josm.data.osm.Node;
    1412import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1513import org.openstreetmap.josm.tools.Shortcut;
    1614
    1715/**
    18  * Unselects all nodes
     16 * Unselects all nodes.
    1917 */
    2018public class UnselectNodesAction extends JosmAction {
    2119
     
    3230
    3331    @Override
    3432    public void actionPerformed(ActionEvent e) {
    35         Collection<OsmPrimitive> selection = getLayerManager().getEditDataSet().getSelected();
    36         Set<Node> selectedNodes = OsmPrimitive.getFilteredSet(selection, Node.class);
    37         getLayerManager().getEditDataSet().clearSelection(selectedNodes);
     33        getLayerManager().getEditDataSet().clearSelection(getLayerManager().getEditDataSet().getSelectedNodes());
    3834    }
    3935
    4036    @Override