source: subversion/applications/editors/josm/plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/actions/SplitOnIntersectionsAction.java

Last change on this file was 34816, checked in by gerdp, 3 months ago

fix checkstyle issues

File size: 5.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.plugins.utilsplugin2.actions;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.event.ActionEvent;
7import java.awt.event.KeyEvent;
8import java.util.ArrayList;
9import java.util.Collection;
10import java.util.HashMap;
11import java.util.Iterator;
12import java.util.List;
13import java.util.Map;
14import java.util.Map.Entry;
15
16import javax.swing.JOptionPane;
17
18import org.openstreetmap.josm.actions.JosmAction;
19import org.openstreetmap.josm.command.Command;
20import org.openstreetmap.josm.command.SequenceCommand;
21import org.openstreetmap.josm.command.SplitWayCommand;
22import org.openstreetmap.josm.data.UndoRedoHandler;
23import org.openstreetmap.josm.data.osm.Node;
24import org.openstreetmap.josm.data.osm.OsmPrimitive;
25import org.openstreetmap.josm.data.osm.Way;
26import org.openstreetmap.josm.gui.Notification;
27import org.openstreetmap.josm.tools.Shortcut;
28
29/**
30 * Splits selected ways on T-intersections. Target points should belong only to one way (except selected one),
31 * or two selected ways.
32 *
33 * @author Zverik
34 */
35public class SplitOnIntersectionsAction extends JosmAction {
36    private static final String TITLE = tr("Split adjacent ways");
37    private static final String TOOL_DESC = tr("Split adjacent ways on T-intersections");
38    public SplitOnIntersectionsAction() {
39        super(TITLE, "dumbutils/splitonintersections", TOOL_DESC,
40            Shortcut.registerShortcut("tools:splitonintersections", tr("Tool: {0}", tr("Split adjacent ways")),
41            KeyEvent.VK_P, Shortcut.ALT_CTRL_SHIFT),
42            true);
43    }
44
45    @Override
46    public void actionPerformed(ActionEvent e) {
47        List<Command> list = new ArrayList<>();
48        List<Way> selectedWays = new ArrayList<>(getLayerManager().getEditDataSet().getSelectedWays());
49        Map<Way, List<Node>> splitWays = new HashMap<>();
50
51        for (Way way : selectedWays) {
52            if (way.getNodesCount() > 1 && !way.hasIncompleteNodes() && !way.isClosed())
53                for (Node node : new Node[] {way.getNode(0), way.getNode(way.getNodesCount() - 1)}) {
54                    List<Way> refs = node.getParentWays();
55                    refs.remove(way);
56                    if (selectedWays.size() > 1) {
57                        // When several ways are selected, split only those among selected
58                        Iterator<Way> it = refs.iterator();
59                        while (it.hasNext()) {
60                            if (!selectedWays.contains(it.next()))
61                                it.remove();
62                        }
63                    }
64
65                    Iterator<Way> it = refs.iterator();
66                    while (it.hasNext()) {
67                        Way w = it.next();
68                        if (w.isDeleted() || w.isIncomplete() || !w.isInnerNode(node))
69                            it.remove();
70                    }
71                    if (refs.size() == 1) {
72                        if (splitWays.containsKey(refs.get(0)))
73                            splitWays.get(refs.get(0)).add(node);
74                        else {
75                            List<Node> nodes = new ArrayList<>(1);
76                            nodes.add(node);
77                            splitWays.put(refs.get(0), nodes);
78                        }
79                    } else if (refs.size() > 1) {
80                        new Notification(
81                                tr("There are several ways containing one of the splitting nodes. Select ways participating in this operation.")
82                                ).setIcon(JOptionPane.WARNING_MESSAGE).show();
83                        return;
84                    }
85                }
86        }
87
88        if (splitWays.isEmpty()) {
89            new Notification(tr("The selection cannot be used for action ''{0}''", TOOL_DESC))
90                    .setIcon(JOptionPane.WARNING_MESSAGE).show();
91            return;
92        }
93
94        for (Entry<Way, List<Node>> entry : splitWays.entrySet()) {
95            SplitWayCommand split = SplitWayCommand.split(entry.getKey(), entry.getValue(), selectedWays);
96            if (split != null) {
97                // execute, we need the result, see also #16006
98                UndoRedoHandler.getInstance().add(split);
99                selectedWays.remove(split.getOriginalWay());
100                selectedWays.addAll(split.getNewWays());
101                list.add(split);
102            }
103        }
104
105        if (!list.isEmpty()) {
106            if (list.size() > 1) {
107                // create a single command for the previously executed commands
108                SequenceCommand seq = new SequenceCommand(TITLE, list);
109                for (int i = 0; i < list.size(); i++) {
110                    UndoRedoHandler.getInstance().undo();
111                }
112                UndoRedoHandler.getInstance().add(seq);
113            }
114            getLayerManager().getEditDataSet().clearSelection();
115        }
116    }
117
118    @Override
119    protected void updateEnabledState() {
120        updateEnabledStateOnCurrentSelection();
121    }
122
123    @Override
124    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
125        boolean ok = false;
126        if (selection != null)
127            for (OsmPrimitive p : selection) {
128                if (p instanceof Way)
129                    ok = true;
130                else {
131                    ok = false;
132                    break;
133                }
134            }
135        setEnabled(ok);
136    }
137}
Note: See TracBrowser for help on using the repository browser.