source: subversion/applications/editors/josm/plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/selection/UndoSelectionAction.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.0 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.LinkedList;
12import java.util.Set;
13
14import org.openstreetmap.josm.actions.JosmAction;
15import org.openstreetmap.josm.data.osm.DataSet;
16import org.openstreetmap.josm.data.osm.OsmPrimitive;
17import org.openstreetmap.josm.tools.Shortcut;
18
19/**
20 * Use selection history to restore previous selection
21 */
22public class UndoSelectionAction extends JosmAction {
23
24    public UndoSelectionAction() {
25        super(tr("Undo selection"), "undoselection",
26                tr("Reselect last added object or selection form history"),
27                Shortcut.registerShortcut("tools:undoselection", tr("Tool: {0}", "Undo selection"),
28                        KeyEvent.VK_Z, Shortcut.CTRL_SHIFT), true);
29        putValue("help", ht("/Action/UndoSelection"));
30    }
31
32    private Collection<OsmPrimitive> lastSel;
33    private int index;
34
35    @Override
36    public void actionPerformed(ActionEvent e) {
37        DataSet ds = getLayerManager().getEditDataSet();
38        if (ds != null) {
39            LinkedList<Collection<? extends OsmPrimitive>> history = ds.getSelectionHistory();
40            if (history == null || history.isEmpty()) return; // empty history
41            if (lastSel != null) {
42                Collection<OsmPrimitive> selection = ds.getSelected();
43                if (lastSel.size() == selection.size() && selection.containsAll(lastSel)) {
44                    // repeated action
45                } else {
46                    index = -1;
47                }
48            }
49
50            int num = history.size();
51            int k = 0;
52
53            Set<OsmPrimitive> newSel = new HashSet<>();
54            while (k < num) {
55                if (index+1 < history.size()) index++; else index = 0;
56                Collection<? extends OsmPrimitive> histsel = history.get(index);
57                // remove deleted entities from selection
58                newSel.clear();
59                newSel.addAll(histsel);
60                newSel.removeIf(p -> p == null || p.isDeleted() || p.isDisabled());
61                k++;
62                if (!newSel.isEmpty()) {
63                    Collection<OsmPrimitive> oldSel = ds.getSelected();
64                    if (oldSel.size() == newSel.size() && newSel.containsAll(oldSel)) {
65                        // ignore no-change selection
66                        continue;
67                    }
68                    break;
69                }
70            }
71
72            // set new selection (is added to history)
73            ds.setSelected(newSel);
74            lastSel = ds.getSelected();
75        }
76    }
77
78    @Override
79    protected void updateEnabledState() {
80        DataSet ds = getLayerManager().getEditDataSet();
81        lastSel = null;
82        index = -1;
83        setEnabled(ds != null && ds.getSelectionHistory().isEmpty());
84    }
85}
Note: See TracBrowser for help on using the repository browser.