source: josm/trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadWmsAlongTrackAction.java@ 11535

Last change on this file since 11535 was 11535, checked in by Don-vip, 7 years ago

sonar - squid:S2142 - "InterruptedException" should not be ignored

  • Property svn:eol-style set to native
File size: 4.8 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.layer.gpx;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.GraphicsEnvironment;
7import java.awt.event.ActionEvent;
8import java.io.IOException;
9import java.util.ArrayList;
10import java.util.List;
11
12import javax.swing.AbstractAction;
13import javax.swing.JOptionPane;
14
15import org.openstreetmap.gui.jmapviewer.tilesources.AbstractTMSTileSource;
16import org.openstreetmap.josm.Main;
17import org.openstreetmap.josm.actions.AbstractMergeAction;
18import org.openstreetmap.josm.data.coor.LatLon;
19import org.openstreetmap.josm.data.gpx.GpxData;
20import org.openstreetmap.josm.data.gpx.GpxTrack;
21import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
22import org.openstreetmap.josm.data.gpx.WayPoint;
23import org.openstreetmap.josm.gui.PleaseWaitRunnable;
24import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
25import org.openstreetmap.josm.gui.progress.ProgressTaskId;
26import org.openstreetmap.josm.gui.progress.ProgressTaskIds;
27import org.openstreetmap.josm.io.OsmTransferException;
28import org.openstreetmap.josm.tools.ImageProvider;
29import org.xml.sax.SAXException;
30
31/**
32 * Class downloading WMS and TMS along the GPX track.
33 * @since 5715
34 */
35public class DownloadWmsAlongTrackAction extends AbstractAction {
36
37 private final transient GpxData data;
38
39 /**
40 * @param data that represents GPX track, along which data should be downloaded
41 */
42 public DownloadWmsAlongTrackAction(final GpxData data) {
43 super(tr("Precache imagery tiles along this track"), ImageProvider.get("downloadalongtrack"));
44 this.data = data;
45 }
46
47 static class PrecacheWmsTask extends PleaseWaitRunnable {
48
49 private final AbstractTileSourceLayer<? extends AbstractTMSTileSource> layer;
50 private final List<LatLon> points;
51 private AbstractTileSourceLayer<? extends AbstractTMSTileSource>.PrecacheTask precacheTask;
52
53 protected PrecacheWmsTask(AbstractTileSourceLayer<? extends AbstractTMSTileSource> layer, List<LatLon> points) {
54 super(tr("Precaching WMS"));
55 this.layer = layer;
56 this.points = points;
57 }
58
59 @Override
60 protected void realRun() throws SAXException, IOException, OsmTransferException {
61 precacheTask = layer.downloadAreaToCache(progressMonitor, points, 0, 0);
62 synchronized (this) {
63 try {
64 while (!precacheTask.isFinished() && !progressMonitor.isCanceled()) {
65 wait(200);
66 }
67 } catch (InterruptedException ex) {
68 Main.warn("InterruptedException in "+getClass().getSimpleName()+" while precaching WMS");
69 Thread.currentThread().interrupt();
70 }
71 }
72 }
73
74 @Override
75 protected void finish() {
76 // Do nothing
77 }
78
79 @Override
80 protected void cancel() {
81 precacheTask.cancel();
82 }
83
84 @Override
85 public ProgressTaskId canRunInBackground() {
86 return ProgressTaskIds.PRECACHE_WMS;
87 }
88 }
89
90 PrecacheWmsTask createTask() {
91 List<LatLon> points = new ArrayList<>();
92 for (GpxTrack trk : data.tracks) {
93 for (GpxTrackSegment segment : trk.getSegments()) {
94 for (WayPoint p : segment.getWayPoints()) {
95 points.add(p.getCoor());
96 }
97 }
98 }
99 for (WayPoint p : data.waypoints) {
100 points.add(p.getCoor());
101 }
102 AbstractTileSourceLayer<? extends AbstractTMSTileSource> layer = askedLayer();
103 return layer != null ? new PrecacheWmsTask(layer, points) : null;
104 }
105
106 @Override
107 public void actionPerformed(ActionEvent e) {
108 PrecacheWmsTask task = createTask();
109 if (task != null) {
110 Main.worker.execute(task);
111 }
112 }
113
114 @SuppressWarnings({ "rawtypes", "unchecked" })
115 protected AbstractTileSourceLayer<? extends AbstractTMSTileSource> askedLayer() {
116 if (!Main.isDisplayingMapView()) {
117 return null;
118 }
119 List<AbstractTileSourceLayer> targetLayers = Main.getLayerManager().getLayersOfType(AbstractTileSourceLayer.class);
120 if (targetLayers.isEmpty()) {
121 if (!GraphicsEnvironment.isHeadless()) {
122 warnNoImageryLayers();
123 }
124 return null;
125 }
126 return AbstractMergeAction.askTargetLayer(targetLayers.toArray(new AbstractTileSourceLayer[targetLayers.size()]),
127 tr("Please select the imagery layer."),
128 tr("Select imagery layer"),
129 tr("Download"), "dialogs/down");
130 }
131
132 protected void warnNoImageryLayers() {
133 JOptionPane.showMessageDialog(Main.parent, tr("There are no imagery layers."), tr("No imagery layers"), JOptionPane.WARNING_MESSAGE);
134 }
135}
Note: See TracBrowser for help on using the repository browser.