source: subversion/applications/editors/josm/plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/selection/SelectModNodesAction.java

Last change on this file was 34932, checked in by gerdp, 4 weeks ago

fix #17483: respect active filters in select actions provided by utilsplugin2

File size: 3.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.plugins.utilsplugin2.selection;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.event.ActionEvent;
8import java.awt.event.KeyEvent;
9import java.util.Collection;
10import java.util.HashSet;
11import java.util.Set;
12
13import org.openstreetmap.josm.actions.JosmAction;
14import org.openstreetmap.josm.command.Command;
15import org.openstreetmap.josm.data.UndoRedoHandler;
16import org.openstreetmap.josm.data.osm.DataSet;
17import org.openstreetmap.josm.data.osm.Node;
18import org.openstreetmap.josm.data.osm.OsmPrimitive;
19import org.openstreetmap.josm.tools.Shortcut;
20
21/**
22 * Select last modified nodes.
23 */
24public class SelectModNodesAction extends JosmAction {
25    private Command lastCmd;
26
27    public SelectModNodesAction() {
28        super(tr("Select last modified nodes"), "selmodnodes",
29                tr("Select last modified nodes"),
30                Shortcut.registerShortcut("tools:selmodnodes", tr("Tool: {0}", "Select last modified nodes"),
31                        KeyEvent.VK_Z, Shortcut.SHIFT), true);
32        putValue("help", ht("/Action/SelectLastModifiedNodes"));
33    }
34
35    @Override
36    public void actionPerformed(ActionEvent e) {
37        DataSet ds = getLayerManager().getEditDataSet();
38        if (ds != null) {
39            Collection<OsmPrimitive> selection = ds.getSelected();
40            ds.clearSelection(ds.getSelectedWays());
41            Command cmd = null;
42
43            if (UndoRedoHandler.getInstance().commands == null) return;
44            int num = UndoRedoHandler.getInstance().commands.size();
45            if (num == 0) return;
46            int k = 0, idx;
47            // check if executed again, we cycle through all available commands
48            if (lastCmd != null && !selection.isEmpty()) {
49                idx = UndoRedoHandler.getInstance().commands.lastIndexOf(lastCmd);
50            } else {
51                idx = num;
52            }
53
54            Set<Node> nodes = new HashSet<>(10);
55            do {  //  select next history element
56                if (idx > 0) idx--; else idx = num-1;
57                cmd = UndoRedoHandler.getInstance().commands.get(idx);
58                if (cmd.getAffectedDataSet() == ds) {
59                    Collection<? extends OsmPrimitive> pp = cmd.getParticipatingPrimitives();
60                    nodes.clear();
61                    for (OsmPrimitive p : pp) {  // find all affected ways
62                        if (p instanceof Node && !p.isDeleted() && !p.isDisabled())
63                            nodes.add((Node) p);
64                    }
65                    if (!nodes.isEmpty() && !ds.getSelectedNodes().containsAll(nodes)) {
66                        ds.setSelected(nodes);
67                        lastCmd = cmd; // remember last used command and last selection
68                        return;
69                    }
70                }
71                k++;
72            } while (k < num); // try to find previous command if this affects nothing
73            lastCmd = null;
74        }
75    }
76
77    @Override
78    protected void updateEnabledState() {
79        setEnabled(getLayerManager().getEditDataSet() != null);
80    }
81}
Note: See TracBrowser for help on using the repository browser.