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

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

replaced calls to JOptionPane.* by calls to OptionPaneUtil.*

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