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

Last change on this file since 1814 was 1811, checked in by jttt, 15 years ago

PleaseWait refactoring. Progress is now reported using ProgressMonitor interface, that is available through PleaseWaitRunnable.

File size: 7.5 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.PleaseWaitRunnable;
21import org.openstreetmap.josm.gui.layer.Layer;
22import org.openstreetmap.josm.gui.layer.OsmDataLayer;
23import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
24import org.openstreetmap.josm.gui.progress.ProgressMonitor;
25import org.openstreetmap.josm.io.OsmApi;
26import org.openstreetmap.josm.io.OsmServerBackreferenceReader;
27import org.openstreetmap.josm.io.OsmTransferException;
28import org.openstreetmap.josm.tools.Shortcut;
29import org.xml.sax.SAXException;
30
31/**
32 * This action loads the set of primitives referring to the current selection from the OSM
33 * server.
34 *
35 *
36 */
37public class DownloadReferrersAction extends JosmAction implements SelectionChangedListener, LayerChangeListener {
38
39 public DownloadReferrersAction() {
40 super(tr("Download referrers from OSM..."), "downloadreferrers", tr("Download primitives referring to one of the selected primitives"),
41 Shortcut.registerShortcut("file:downloadreferrers", tr("File: {0}", tr("Download referrers...")), KeyEvent.VK_D, Shortcut.GROUPS_ALT2+Shortcut.GROUP_HOTKEY), true);
42
43 Layer.listeners.add(this);
44 DataSet.selListeners.add(this);
45 refreshEnabled();
46 }
47
48 /**
49 * Downloads the primitives referring to the primitives in <code>primitives</code>.
50 * Does nothing if primitives is null or empty.
51 *
52 * @param primitives the collection of primitives.
53 */
54 public void downloadReferrers(Collection<OsmPrimitive> primitives) {
55 if (primitives == null || primitives.isEmpty()) return;
56 Main.worker.submit(new DownloadReferrersTask(primitives));
57 }
58
59
60 public void actionPerformed(ActionEvent e) {
61 if (!isEnabled())
62 return;
63 OsmDataLayer layer = Main.map.mapView.getEditLayer();
64 Collection<OsmPrimitive> primitives = layer.data.getSelected();
65 downloadReferrers(primitives);
66 }
67
68 /**
69 * The asynchronous task for downloading referring primitives
70 *
71 */
72 class DownloadReferrersTask extends PleaseWaitRunnable {
73 private DataSet ds;
74 private boolean cancelled;
75 Exception lastException;
76 private Collection<OsmPrimitive> primitives;
77 private DataSet parents;
78
79 public DownloadReferrersTask(Collection<OsmPrimitive> primitives) {
80 super("Download referrers", false /* don't ignore exception*/);
81 cancelled = false;
82 this.primitives = primitives;
83 parents = new DataSet();
84 }
85
86 protected void showLastException() {
87 String msg = lastException.getMessage();
88 if (msg == null) {
89 msg = lastException.toString();
90 }
91 JOptionPane.showMessageDialog(
92 Main.map,
93 msg,
94 tr("Error"),
95 JOptionPane.ERROR_MESSAGE
96 );
97 }
98
99 @Override
100 protected void cancel() {
101 cancelled = true;
102 OsmApi.getOsmApi().cancel();
103 }
104
105 @Override
106 protected void finish() {
107 if (cancelled)
108 return;
109 if (lastException != null) {
110 showLastException();
111 return;
112 }
113
114 MergeVisitor visitor = new MergeVisitor(Main.map.mapView.getEditLayer().data, parents);
115 visitor.merge();
116 SwingUtilities.invokeLater(
117 new Runnable() {
118 public void run() {
119 Main.map.mapView.getEditLayer().fireDataChange();
120 Main.map.mapView.repaint();
121 }
122 }
123 );
124 if (visitor.getConflicts().isEmpty())
125 return;
126 Main.map.mapView.getEditLayer().getConflicts().add(visitor.getConflicts());
127 JOptionPane op = new JOptionPane(
128 tr("There were {0} conflicts during import.",
129 visitor.getConflicts().size()),
130 JOptionPane.WARNING_MESSAGE
131 );
132 JDialog dialog = op.createDialog(null, tr("Conflicts in data"));
133 dialog.setAlwaysOnTop(true);
134 dialog.setModal(true);
135 dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
136 dialog.setVisible(true);
137 }
138
139 protected void downloadParents(OsmPrimitive primitive, ProgressMonitor progressMonitor) throws OsmTransferException{
140 OsmServerBackreferenceReader reader = new OsmServerBackreferenceReader(primitive);
141 DataSet ds = reader.parseOsm(progressMonitor);
142 MergeVisitor visitor = new MergeVisitor(parents, ds);
143 visitor.merge();
144 }
145
146 @Override
147 protected void realRun() throws SAXException, IOException, OsmTransferException {
148 try {
149 progressMonitor.setTicksCount(primitives.size());
150 int i=1;
151 for (OsmPrimitive primitive: primitives) {
152 if (cancelled)
153 return;
154 progressMonitor.subTask(tr("({0}/{1}) Loading parents of primitive {2}", i+1,primitives.size(), primitive.getName()));
155 downloadParents(primitive, progressMonitor.createSubTaskMonitor(1, false));
156 i++;
157 }
158 } catch(Exception e) {
159 if (cancelled)
160 return;
161 lastException = e;
162 }
163 }
164 }
165
166 /**
167 * Refreshes the enabled state
168 *
169 */
170 protected void refreshEnabled() {
171 setEnabled(Main.map != null
172 && Main.map.mapView !=null
173 && Main.map.mapView.getEditLayer() != null
174 && ! Main.map.mapView.getEditLayer().data.getSelected().isEmpty()
175 );
176 }
177
178 /* ---------------------------------------------------------------------------------- */
179 /* Interface SelectionChangeListener */
180 /* ---------------------------------------------------------------------------------- */
181 public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
182 refreshEnabled();
183 }
184
185 /* ---------------------------------------------------------------------------------- */
186 /* Interface LayerChangeListener */
187 /* ---------------------------------------------------------------------------------- */
188 public void activeLayerChange(Layer oldLayer, Layer newLayer) {
189 refreshEnabled();
190 }
191
192 public void layerAdded(Layer newLayer) {
193 refreshEnabled();
194 }
195
196 public void layerRemoved(Layer oldLayer) {
197 refreshEnabled();
198 }
199}
Note: See TracBrowser for help on using the repository browser.