source: josm/trunk/src/org/openstreetmap/josm/actions/JoinNodeWayAction.java@ 6848

Last change on this file since 6848 was 6814, checked in by Don-vip, 10 years ago

fix #8234 - remove duplicated/unused icons + javadoc

  • Property svn:eol-style set to native
File size: 4.4 KB
Line 
1//License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
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.ArrayList;
10import java.util.Collection;
11import java.util.Collections;
12import java.util.HashMap;
13import java.util.HashSet;
14import java.util.LinkedList;
15import java.util.List;
16import java.util.Map;
17
18import org.openstreetmap.josm.Main;
19import org.openstreetmap.josm.command.ChangeCommand;
20import org.openstreetmap.josm.command.Command;
21import org.openstreetmap.josm.command.SequenceCommand;
22import org.openstreetmap.josm.data.osm.Node;
23import org.openstreetmap.josm.data.osm.OsmPrimitive;
24import org.openstreetmap.josm.data.osm.Way;
25import org.openstreetmap.josm.data.osm.WaySegment;
26import org.openstreetmap.josm.tools.Shortcut;
27
28public class JoinNodeWayAction extends JosmAction {
29
30 /**
31 * Constructs a new {@code JoinNodeWayAction}.
32 */
33 public JoinNodeWayAction() {
34 super(tr("Join Node to Way"), "joinnodeway", tr("Include a node into the nearest way segments"),
35 Shortcut.registerShortcut("tools:joinnodeway", tr("Tool: {0}", tr("Join Node to Way")), KeyEvent.VK_J, Shortcut.DIRECT), true);
36 putValue("help", ht("/Action/JoinNodeWay"));
37 }
38
39 @Override
40 public void actionPerformed(ActionEvent e) {
41 if (!isEnabled())
42 return;
43 Collection<Node> selectedNodes = getCurrentDataSet().getSelectedNodes();
44 // Allow multiple selected nodes too?
45 if (selectedNodes.size() != 1) return;
46
47 Node node = selectedNodes.iterator().next();
48
49 Collection<Command> cmds = new LinkedList<Command>();
50
51 // If the user has selected some ways, only join the node to these.
52 boolean restrictToSelectedWays =
53 !getCurrentDataSet().getSelectedWays().isEmpty();
54
55 List<WaySegment> wss = Main.map.mapView.getNearestWaySegments(
56 Main.map.mapView.getPoint(node), OsmPrimitive.isSelectablePredicate);
57 HashMap<Way, List<Integer>> insertPoints = new HashMap<Way, List<Integer>>();
58 for (WaySegment ws : wss) {
59 // Maybe cleaner to pass a "isSelected" predicate to getNearestWaySegments, but this is less invasive.
60 if(restrictToSelectedWays && !ws.way.isSelected()) {
61 continue;
62 }
63
64 List<Integer> is;
65 if (insertPoints.containsKey(ws.way)) {
66 is = insertPoints.get(ws.way);
67 } else {
68 is = new ArrayList<Integer>();
69 insertPoints.put(ws.way, is);
70 }
71
72 if (ws.way.getNode(ws.lowerIndex) != node
73 && ws.way.getNode(ws.lowerIndex+1) != node) {
74 is.add(ws.lowerIndex);
75 }
76 }
77
78 for (Map.Entry<Way, List<Integer>> insertPoint : insertPoints.entrySet()) {
79 List<Integer> is = insertPoint.getValue();
80 if (is.isEmpty()) {
81 continue;
82 }
83
84 Way w = insertPoint.getKey();
85 List<Node> nodesToAdd = w.getNodes();
86 pruneSuccsAndReverse(is);
87 for (int i : is) {
88 nodesToAdd.add(i+1, node);
89 }
90 Way wnew = new Way(w);
91 wnew.setNodes(nodesToAdd);
92 cmds.add(new ChangeCommand(w, wnew));
93 }
94 if (cmds.isEmpty()) return;
95 Main.main.undoRedo.add(new SequenceCommand(tr("Join Node and Line"), cmds));
96 Main.map.repaint();
97 }
98
99 private static void pruneSuccsAndReverse(List<Integer> is) {
100 HashSet<Integer> is2 = new HashSet<Integer>();
101 for (int i : is) {
102 if (!is2.contains(i - 1) && !is2.contains(i + 1)) {
103 is2.add(i);
104 }
105 }
106 is.clear();
107 is.addAll(is2);
108 Collections.sort(is);
109 Collections.reverse(is);
110 }
111
112 @Override
113 protected void updateEnabledState() {
114 if (getCurrentDataSet() == null) {
115 setEnabled(false);
116 } else {
117 updateEnabledState(getCurrentDataSet().getSelected());
118 }
119 }
120
121 @Override
122 protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
123 setEnabled(selection != null && !selection.isEmpty());
124 }
125}
Note: See TracBrowser for help on using the repository browser.