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

Last change on this file was 33579, checked in by donvip, 20 months ago

update to JOSM 12678

File size: 3.9 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.Point;
8import java.awt.event.ActionEvent;
9import java.awt.event.KeyEvent;
10import java.util.Collection;
11import java.util.HashSet;
12import java.util.Set;
13
14import javax.swing.JOptionPane;
15
16import org.openstreetmap.josm.actions.JosmAction;
17import org.openstreetmap.josm.actions.SelectByInternalPointAction;
18import org.openstreetmap.josm.data.osm.DataSet;
19import org.openstreetmap.josm.data.osm.Node;
20import org.openstreetmap.josm.data.osm.OsmPrimitive;
21import org.openstreetmap.josm.data.osm.Way;
22import org.openstreetmap.josm.gui.MainApplication;
23import org.openstreetmap.josm.gui.Notification;
24import org.openstreetmap.josm.tools.Shortcut;
25
26/**
27 * Extends current selection by selecting nodes on all touched ways
28 */
29public class SelectBoundaryAction extends JosmAction {
30    private Way lastUsedStartingWay; //used for repeated calls
31    private boolean lastUsedLeft;
32
33    public SelectBoundaryAction() {
34        super(tr("Area boundary [testing]"), "selboundary", tr("Select relation or all ways that forms area boundary"),
35                Shortcut.registerShortcut("tools:selboundary", tr("Tool: {0}", "Area boundary [testing]"),
36                        KeyEvent.VK_SLASH, Shortcut.SHIFT), true);
37        putValue("help", ht("/Action/SelectAreaBoundary"));
38    }
39
40    @Override
41    public void actionPerformed(ActionEvent e) {
42        DataSet ds = getLayerManager().getEditDataSet();
43        if (ds != null) {
44            Collection<Way> selectedWays = ds.getSelectedWays();
45            Collection<Node> selectedNodes = ds.getSelectedNodes();
46
47            Set<Way> newWays = new HashSet<>();
48
49            Way w = null;
50
51            if (selectedWays.isEmpty()) {
52                if (selectedNodes.size() == 1) {
53                    for (OsmPrimitive p : selectedNodes.iterator().next().getReferrers()) {
54                        if (p instanceof Way && p.isSelectable()) {
55                            w = (Way) p;
56                            break;
57                        }
58                    }
59                } else {
60                    Point p = MainApplication.getMap().mapView.getMousePosition();
61                    SelectByInternalPointAction.performSelection(MainApplication.getMap().mapView.getEastNorth(p.x, p.y), false, false);
62                    return;
63                }
64            } else if (selectedWays.size() == 1) {
65                w = selectedWays.iterator().next();
66            } else if (selectedWays.contains(lastUsedStartingWay)) {
67                w = lastUsedStartingWay; //repeated call for selected way
68                lastUsedLeft = !lastUsedLeft;
69            }
70
71            if (w == null) return; //no starting way found
72            if (!w.isSelectable()) return;
73            if (w.isClosed()) return;
74            if (w.getNodesCount() < 2) return;
75
76            newWays.add(w);
77            lastUsedStartingWay = w;
78
79            // try going left at each turn
80            if (!NodeWayUtils.addAreaBoundary(w, newWays, lastUsedLeft)) {
81                NodeWayUtils.addAreaBoundary(w, newWays, !lastUsedLeft); // try going right at each turn
82            }
83
84            if (!newWays.isEmpty()) {
85                ds.setSelected(newWays);
86            } else {
87                new Notification(tr("Nothing found. Please select way that is a part of some polygon formed by connected ways"))
88                .setIcon(JOptionPane.WARNING_MESSAGE).show();
89            }
90        }
91    }
92
93    @Override
94    protected void updateEnabledState() {
95        setEnabled(getLayerManager().getEditDataSet() != null);
96    }
97
98    @Override
99    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
100        setEnabled(selection != null && !selection.isEmpty());
101    }
102}
Note: See TracBrowser for help on using the repository browser.