source: josm/trunk/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java@ 2001

Last change on this file since 2001 was 1990, checked in by Gubaer, 15 years ago

fixed #3261: Use the "name:$CURRENT_LOCALE" name in the JOSM UI instead of "name" when it exists
new: new checkbox in LAF preferences for enabling/disabling localized names for primitives

File size: 6.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
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.io.IOException;
9import java.util.Collection;
10
11import javax.swing.JDialog;
12import javax.swing.JOptionPane;
13import javax.swing.SwingUtilities;
14
15import org.openstreetmap.josm.Main;
16import org.openstreetmap.josm.data.SelectionChangedListener;
17import org.openstreetmap.josm.data.osm.DataSet;
18import org.openstreetmap.josm.data.osm.OsmPrimitive;
19import org.openstreetmap.josm.data.osm.visitor.MergeVisitor;
20import org.openstreetmap.josm.gui.DefaultNameFormatter;
21import org.openstreetmap.josm.gui.OptionPaneUtil;
22import org.openstreetmap.josm.gui.PleaseWaitRunnable;
23import org.openstreetmap.josm.gui.layer.Layer;
24import org.openstreetmap.josm.gui.layer.OsmDataLayer;
25import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
26import org.openstreetmap.josm.gui.progress.ProgressMonitor;
27import org.openstreetmap.josm.io.OsmApi;
28import org.openstreetmap.josm.io.OsmServerBackreferenceReader;
29import org.openstreetmap.josm.io.OsmTransferException;
30import org.openstreetmap.josm.tools.Shortcut;
31import org.xml.sax.SAXException;
32
33/**
34 * This action loads the set of primitives referring to the current selection from the OSM
35 * server.
36 *
37 *
38 */
39public class DownloadReferrersAction extends JosmAction{
40
41 public DownloadReferrersAction() {
42 super(tr("Download referrers from OSM..."), "downloadreferrers", tr("Download primitives referring to one of the selected primitives"),
43 Shortcut.registerShortcut("file:downloadreferrers", tr("File: {0}", tr("Download referrers...")), KeyEvent.VK_D, Shortcut.GROUPS_ALT2+Shortcut.GROUP_HOTKEY), true);
44 }
45
46 /**
47 * Downloads the primitives referring to the primitives in <code>primitives</code>.
48 * Does nothing if primitives is null or empty.
49 *
50 * @param primitives the collection of primitives.
51 */
52 public void downloadReferrers(Collection<OsmPrimitive> primitives) {
53 if (primitives == null || primitives.isEmpty()) return;
54 Main.worker.submit(new DownloadReferrersTask(primitives));
55 }
56
57
58 public void actionPerformed(ActionEvent e) {
59 if (!isEnabled())
60 return;
61 OsmDataLayer layer = Main.map.mapView.getEditLayer();
62 Collection<OsmPrimitive> primitives = layer.data.getSelected();
63 downloadReferrers(primitives);
64 }
65
66 /**
67 * The asynchronous task for downloading referring primitives
68 *
69 */
70 class DownloadReferrersTask extends PleaseWaitRunnable {
71 private DataSet ds;
72 private boolean cancelled;
73 Exception lastException;
74 private Collection<OsmPrimitive> primitives;
75 private DataSet parents;
76
77 public DownloadReferrersTask(Collection<OsmPrimitive> primitives) {
78 super("Download referrers", false /* don't ignore exception*/);
79 cancelled = false;
80 this.primitives = primitives;
81 parents = new DataSet();
82 }
83
84 protected void showLastException() {
85 String msg = lastException.getMessage();
86 if (msg == null) {
87 msg = lastException.toString();
88 }
89 OptionPaneUtil.showMessageDialog(
90 Main.map,
91 msg,
92 tr("Error"),
93 JOptionPane.ERROR_MESSAGE
94 );
95 }
96
97 @Override
98 protected void cancel() {
99 cancelled = true;
100 OsmApi.getOsmApi().cancel();
101 }
102
103 @Override
104 protected void finish() {
105 if (cancelled)
106 return;
107 if (lastException != null) {
108 showLastException();
109 return;
110 }
111
112 MergeVisitor visitor = new MergeVisitor(Main.map.mapView.getEditLayer().data, parents);
113 visitor.merge();
114 SwingUtilities.invokeLater(
115 new Runnable() {
116 public void run() {
117 Main.map.mapView.getEditLayer().fireDataChange();
118 Main.map.mapView.repaint();
119 }
120 }
121 );
122 if (visitor.getConflicts().isEmpty())
123 return;
124 Main.map.mapView.getEditLayer().getConflicts().add(visitor.getConflicts());
125 OptionPaneUtil.showMessageDialog(
126 Main.parent,
127 tr("There were {0} conflicts during import.",
128 visitor.getConflicts().size()
129 ),
130 tr("Conflicts during download"),
131 JOptionPane.WARNING_MESSAGE
132 );
133 }
134
135 protected void downloadParents(OsmPrimitive primitive, ProgressMonitor progressMonitor) throws OsmTransferException{
136 OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(primitive);
137 DataSet ds = reader.parseOsm(progressMonitor);
138 MergeVisitor visitor = new MergeVisitor(parents, ds);
139 visitor.merge();
140 }
141
142 @Override
143 protected void realRun() throws SAXException, IOException, OsmTransferException {
144 try {
145 progressMonitor.setTicksCount(primitives.size());
146 int i=1;
147 for (OsmPrimitive primitive: primitives) {
148 if (cancelled)
149 return;
150 progressMonitor.subTask(tr("({0}/{1}) Loading parents of primitive {2}", i+1,primitives.size(), primitive.getDisplayName(DefaultNameFormatter.getInstance())));
151 downloadParents(primitive, progressMonitor.createSubTaskMonitor(1, false));
152 i++;
153 }
154 } catch(Exception e) {
155 if (cancelled)
156 return;
157 lastException = e;
158 }
159 }
160 }
161
162 /**
163 * Refreshes the enabled state
164 *
165 */
166 @Override
167 protected void updateEnabledState() {
168 setEnabled(getCurrentDataSet() != null && ! getCurrentDataSet().getSelected().isEmpty());
169 }
170}
Note: See TracBrowser for help on using the repository browser.