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

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

findbugs: SC_START_IN_CTOR + UW_UNCOND_WAIT + UM_UNNECESSARY_MATH + UPM_UNCALLED_PRIVATE_METHOD + DM_STRING_TOSTRING + DM_BOXED_PRIMITIVE_FOR_COMPARE + SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS

  • Property svn:eol-style set to native
File size: 4.7 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 }
70 }
71 }
72
73 @Override
74 protected void finish() {
75 // Do nothing
76 }
77
78 @Override
79 protected void cancel() {
80 precacheTask.cancel();
81 }
82
83 @Override
84 public ProgressTaskId canRunInBackground() {
85 return ProgressTaskIds.PRECACHE_WMS;
86 }
87 }
88
89 PrecacheWmsTask createTask() {
90 List<LatLon> points = new ArrayList<>();
91 for (GpxTrack trk : data.tracks) {
92 for (GpxTrackSegment segment : trk.getSegments()) {
93 for (WayPoint p : segment.getWayPoints()) {
94 points.add(p.getCoor());
95 }
96 }
97 }
98 for (WayPoint p : data.waypoints) {
99 points.add(p.getCoor());
100 }
101 AbstractTileSourceLayer<? extends AbstractTMSTileSource> layer = askedLayer();
102 return layer != null ? new PrecacheWmsTask(layer, points) : null;
103 }
104
105 @Override
106 public void actionPerformed(ActionEvent e) {
107 PrecacheWmsTask task = createTask();
108 if (task != null) {
109 Main.worker.execute(task);
110 }
111 }
112
113 @SuppressWarnings({ "rawtypes", "unchecked" })
114 protected AbstractTileSourceLayer<? extends AbstractTMSTileSource> askedLayer() {
115 if (!Main.isDisplayingMapView()) {
116 return null;
117 }
118 List<AbstractTileSourceLayer> targetLayers = Main.map.mapView.getLayersOfType(AbstractTileSourceLayer.class);
119 if (targetLayers.isEmpty()) {
120 if (!GraphicsEnvironment.isHeadless()) {
121 warnNoImageryLayers();
122 }
123 return null;
124 }
125 return AbstractMergeAction.askTargetLayer(targetLayers.toArray(new AbstractTileSourceLayer[0]),
126 tr("Please select the imagery layer."),
127 tr("Select imagery layer"),
128 tr("Download"), "dialogs/down");
129 }
130
131 protected void warnNoImageryLayers() {
132 JOptionPane.showMessageDialog(Main.parent, tr("There are no imagery layers."), tr("No imagery layers"), JOptionPane.WARNING_MESSAGE);
133 }
134}
Note: See TracBrowser for help on using the repository browser.