source: josm/trunk/src/org/openstreetmap/josm/actions/ReverseWayAction.java@ 2277

Last change on this file since 2277 was 2256, checked in by Gubaer, 15 years ago

Removed inefficient DataSet:getSelected() when responding to fireSelectionChanged() in JOSM actions, see thread on dev
Still uses DataSet:getSelected() when responding to layer change events, this is less critical.

  • Property svn:eol-style set to native
File size: 4.0 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.event.ActionEvent;
7import java.awt.event.KeyEvent;
8import java.util.Collection;
9import java.util.Collections;
10import java.util.LinkedList;
11import java.util.List;
12
13import javax.swing.JOptionPane;
14
15import org.openstreetmap.josm.Main;
16import org.openstreetmap.josm.command.ChangeCommand;
17import org.openstreetmap.josm.command.Command;
18import org.openstreetmap.josm.command.SequenceCommand;
19import org.openstreetmap.josm.corrector.ReverseWayTagCorrector;
20import org.openstreetmap.josm.corrector.UserCancelException;
21import org.openstreetmap.josm.data.osm.DataSet;
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.tools.Shortcut;
26
27public final class ReverseWayAction extends JosmAction {
28
29 public ReverseWayAction() {
30 super(tr("Reverse Ways"), "wayflip", tr("Reverse the direction of all selected ways."),
31 Shortcut.registerShortcut("tools:reverse", tr("Tool: {0}", tr("Reverse Ways")), KeyEvent.VK_R, Shortcut.GROUP_EDIT), true);
32 }
33
34 public void actionPerformed(ActionEvent e) {
35 if (! isEnabled())
36 return;
37 if (getCurrentDataSet() == null)
38 return;
39
40 final Collection<Way> sel = new LinkedList<Way>();
41 for (OsmPrimitive primitive : getCurrentDataSet().getSelected()) {
42 if (primitive instanceof Way) {
43 sel.add((Way)primitive);
44 }
45 }
46 if (sel.isEmpty()) {
47 JOptionPane.showMessageDialog(
48 Main.parent,
49 tr("Please select at least one way."),
50 tr("Information"),
51 JOptionPane.INFORMATION_MESSAGE
52 );
53 return;
54 }
55
56 boolean propertiesUpdated = false;
57 ReverseWayTagCorrector reverseWayTagCorrector = new ReverseWayTagCorrector();
58 Collection<Command> c = new LinkedList<Command>();
59 for (Way w : sel) {
60 Way wnew = new Way(w);
61 List<Node> nodesCopy = wnew.getNodes();
62 Collections.reverse(nodesCopy);
63 wnew.setNodes(nodesCopy);
64 if (Main.pref.getBoolean("tag-correction.reverse-way", true)) {
65 try
66 {
67 final Collection<Command> changePropertyCommands = reverseWayTagCorrector.execute(w, wnew);
68 propertiesUpdated = propertiesUpdated
69 || (changePropertyCommands != null && !changePropertyCommands.isEmpty());
70 c.addAll(changePropertyCommands);
71 }
72 catch(UserCancelException ex)
73 {
74 return;
75 }
76 }
77 c.add(new ChangeCommand(w, wnew));
78 }
79 Main.main.undoRedo.add(new SequenceCommand(tr("Reverse ways"), c));
80 if (propertiesUpdated) {
81 DataSet.fireSelectionChanged(getCurrentDataSet().getSelected());
82 }
83 Main.map.repaint();
84 }
85
86 protected int getNumWaysInSelection() {
87 if (getCurrentDataSet() == null) return 0;
88 int ret = 0;
89 for (OsmPrimitive primitive : getCurrentDataSet().getSelected()) {
90 if (primitive instanceof Way) {
91 ret++;
92 }
93 }
94 return ret;
95 }
96
97 @Override
98 protected void updateEnabledState() {
99 if (getCurrentDataSet() == null) {
100 setEnabled(false);
101 } else {
102 updateEnabledState(getCurrentDataSet().getSelected());
103 }
104 }
105
106 @Override
107 protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
108 if (selection == null) {
109 setEnabled(false);
110 return;
111 }
112 int n = 0;
113 for (OsmPrimitive primitive : selection) {
114 if (primitive instanceof Way) {
115 n++;
116 }
117 }
118 setEnabled(n > 0);
119 }
120}
Note: See TracBrowser for help on using the repository browser.