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

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

code refactoring for unit tests / headless mode

  • Property svn:eol-style set to native
File size: 5.2 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.GridBagLayout;
8import java.awt.event.ActionEvent;
9import java.io.IOException;
10import java.util.ArrayList;
11import java.util.List;
12
13import javax.swing.AbstractAction;
14import javax.swing.JLabel;
15import javax.swing.JOptionPane;
16import javax.swing.JPanel;
17
18import org.openstreetmap.josm.Main;
19import org.openstreetmap.josm.actions.AbstractMergeAction.LayerListCellRenderer;
20import org.openstreetmap.josm.data.coor.LatLon;
21import org.openstreetmap.josm.data.gpx.GpxData;
22import org.openstreetmap.josm.data.gpx.GpxTrack;
23import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
24import org.openstreetmap.josm.data.gpx.WayPoint;
25import org.openstreetmap.josm.gui.ExtendedDialog;
26import org.openstreetmap.josm.gui.PleaseWaitRunnable;
27import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
28import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer.PrecacheTask;
29import org.openstreetmap.josm.gui.progress.ProgressTaskId;
30import org.openstreetmap.josm.gui.progress.ProgressTaskIds;
31import org.openstreetmap.josm.gui.widgets.JosmComboBox;
32import org.openstreetmap.josm.io.OsmTransferException;
33import org.openstreetmap.josm.tools.GBC;
34import org.openstreetmap.josm.tools.ImageProvider;
35import org.xml.sax.SAXException;
36
37/**
38 * Class downloading WMS and TMS along the GPX track
39 *
40 */
41public class DownloadWmsAlongTrackAction extends AbstractAction {
42
43 private final transient GpxData data;
44
45 /**
46 * @param data that represents GPX track, along which data should be downloaded
47 */
48 public DownloadWmsAlongTrackAction(final GpxData data) {
49 super(tr("Precache imagery tiles along this track"), ImageProvider.get("downloadalongtrack"));
50 this.data = data;
51 }
52
53 @Override
54 public void actionPerformed(ActionEvent e) {
55 final List<LatLon> points = new ArrayList<>();
56 for (GpxTrack trk : data.tracks) {
57 for (GpxTrackSegment segment : trk.getSegments()) {
58 for (WayPoint p : segment.getWayPoints()) {
59 points.add(p.getCoor());
60 }
61 }
62 }
63 for (WayPoint p : data.waypoints) {
64 points.add(p.getCoor());
65 }
66 final AbstractTileSourceLayer layer = askedLayer();
67 if (layer != null) {
68 PleaseWaitRunnable task = new PleaseWaitRunnable(tr("Precaching WMS")) {
69 private PrecacheTask precacheTask;
70
71 @Override
72 protected void realRun() throws SAXException, IOException, OsmTransferException {
73 precacheTask = layer.new PrecacheTask(progressMonitor);
74 layer.downloadAreaToCache(precacheTask, points, 0, 0);
75 while (!precacheTask.isFinished() && !progressMonitor.isCanceled()) {
76 synchronized (this) {
77 try {
78 wait(200);
79 } catch (InterruptedException ex) {
80 Main.warn("InterruptedException in "+getClass().getSimpleName()+" while precaching WMS");
81 }
82 }
83 }
84 }
85
86 @Override
87 protected void finish() {
88 }
89
90 @Override
91 protected void cancel() {
92 precacheTask.cancel();
93 }
94
95 @Override
96 public ProgressTaskId canRunInBackground() {
97 return ProgressTaskIds.PRECACHE_WMS;
98 }
99 };
100 Main.worker.execute(task);
101 }
102 }
103
104 protected AbstractTileSourceLayer askedLayer() {
105 List<AbstractTileSourceLayer> targetLayers = Main.map.mapView.getLayersOfType(AbstractTileSourceLayer.class);
106 if (targetLayers.isEmpty()) {
107 if (!GraphicsEnvironment.isHeadless()) {
108 warnNoImageryLayers();
109 }
110 return null;
111 }
112 JosmComboBox<AbstractTileSourceLayer> layerList = new JosmComboBox<>(targetLayers.toArray(new AbstractTileSourceLayer[0]));
113 layerList.setRenderer(new LayerListCellRenderer());
114 layerList.setSelectedIndex(0);
115 JPanel pnl = new JPanel(new GridBagLayout());
116 pnl.add(new JLabel(tr("Please select the imagery layer.")), GBC.eol());
117 pnl.add(layerList, GBC.eol());
118 if (GraphicsEnvironment.isHeadless()) {
119 // return first layer in headless mode, for unit tests
120 return targetLayers.get(0);
121 }
122 ExtendedDialog ed = new ExtendedDialog(Main.parent, tr("Select imagery layer"), new String[]{tr("Download"), tr("Cancel")});
123 ed.setButtonIcons(new String[]{"dialogs/down", "cancel"});
124 ed.setContent(pnl);
125 ed.showDialog();
126 if (ed.getValue() != 1) {
127 return null;
128 }
129 return (AbstractTileSourceLayer) layerList.getSelectedItem();
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.