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

Last change on this file since 2348 was 2348, checked in by Gubaer, 14 years ago

applied #3780: patch by hansendc: Shift selection is broken

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