source: josm/trunk/src/org/openstreetmap/josm/actions/DownloadAction.java @ 12635

Last change on this file since 12635 was 12635, checked in by Don-vip, 4 months ago

see #15182 - checkstyle

  • Property svn:eol-style set to native
File size: 5.3 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
5import static org.openstreetmap.josm.tools.I18n.tr;
6
7import java.awt.event.ActionEvent;
8import java.awt.event.KeyEvent;
9import java.util.ArrayList;
10import java.util.List;
11import java.util.Optional;
12import java.util.concurrent.ExecutionException;
13import java.util.concurrent.Future;
14
15import javax.swing.JOptionPane;
16
17import org.openstreetmap.josm.actions.downloadtasks.AbstractDownloadTask;
18import org.openstreetmap.josm.actions.downloadtasks.DownloadGpsTask;
19import org.openstreetmap.josm.actions.downloadtasks.DownloadNotesTask;
20import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
21import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
22import org.openstreetmap.josm.data.Bounds;
23import org.openstreetmap.josm.data.ProjectionBounds;
24import org.openstreetmap.josm.data.ViewportData;
25import org.openstreetmap.josm.gui.MainApplication;
26import org.openstreetmap.josm.gui.MapFrame;
27import org.openstreetmap.josm.gui.download.DownloadDialog;
28import org.openstreetmap.josm.gui.util.GuiHelper;
29import org.openstreetmap.josm.tools.Logging;
30import org.openstreetmap.josm.tools.Pair;
31import org.openstreetmap.josm.tools.Shortcut;
32
33/**
34 * Action that opens a connection to the osm server and downloads map data.
35 *
36 * An dialog is displayed asking the user to specify a rectangle to grab.
37 * The url and account settings from the preferences are used.
38 *
39 * @author imi
40 */
41public class DownloadAction extends JosmAction {
42
43    /**
44     * Constructs a new {@code DownloadAction}.
45     */
46    public DownloadAction() {
47        super(tr("Download from OSM..."), "download", tr("Download map data from the OSM server."),
48              Shortcut.registerShortcut("file:download", tr("File: {0}", tr("Download from OSM...")), KeyEvent.VK_DOWN, Shortcut.CTRL_SHIFT),
49              true);
50        putValue("help", ht("/Action/Download"));
51    }
52
53    @Override
54    public void actionPerformed(ActionEvent e) {
55        DownloadDialog dialog = DownloadDialog.getInstance();
56        dialog.restoreSettings();
57        dialog.setVisible(true);
58
59        if (dialog.isCanceled()) {
60            return;
61        }
62
63        dialog.rememberSettings();
64
65        Optional<Bounds> selectedArea = dialog.getSelectedDownloadArea();
66        if (!selectedArea.isPresent()) {
67            JOptionPane.showMessageDialog(
68                    dialog,
69                    tr("Please select a download area first."),
70                    tr("Error"),
71                    JOptionPane.ERROR_MESSAGE
72            );
73            return;
74        }
75
76        final Bounds area = selectedArea.get();
77        final boolean zoom = dialog.isZoomToDownloadedDataRequired();
78        final List<Pair<AbstractDownloadTask<?>, Future<?>>> tasks = new ArrayList<>();
79
80        if (dialog.isDownloadOsmData()) {
81            DownloadOsmTask task = new DownloadOsmTask();
82            task.setZoomAfterDownload(zoom && !dialog.isDownloadGpxData() && !dialog.isDownloadNotes());
83            Future<?> future = task.download(dialog.isNewLayerRequired(), area, null);
84            MainApplication.worker.submit(new PostDownloadHandler(task, future));
85            if (zoom) {
86                tasks.add(new Pair<>(task, future));
87            }
88        }
89
90        if (dialog.isDownloadGpxData()) {
91            DownloadGpsTask task = new DownloadGpsTask();
92            task.setZoomAfterDownload(zoom && !dialog.isDownloadOsmData() && !dialog.isDownloadNotes());
93            Future<?> future = task.download(dialog.isNewLayerRequired(), area, null);
94            MainApplication.worker.submit(new PostDownloadHandler(task, future));
95            if (zoom) {
96                tasks.add(new Pair<>(task, future));
97            }
98        }
99
100        if (dialog.isDownloadNotes()) {
101            DownloadNotesTask task = new DownloadNotesTask();
102            task.setZoomAfterDownload(zoom && !dialog.isDownloadOsmData() && !dialog.isDownloadGpxData());
103            Future<?> future = task.download(false, area, null);
104            MainApplication.worker.submit(new PostDownloadHandler(task, future));
105            if (zoom) {
106                tasks.add(new Pair<>(task, future));
107            }
108        }
109
110        if (zoom && tasks.size() > 1) {
111            MainApplication.worker.submit(() -> {
112                ProjectionBounds bounds = null;
113                // Wait for completion of download jobs
114                for (Pair<AbstractDownloadTask<?>, Future<?>> p : tasks) {
115                    try {
116                        p.b.get();
117                        ProjectionBounds b = p.a.getDownloadProjectionBounds();
118                        if (bounds == null) {
119                            bounds = b;
120                        } else if (b != null) {
121                            bounds.extend(b);
122                        }
123                    } catch (InterruptedException | ExecutionException ex) {
124                        Logging.warn(ex);
125                    }
126                }
127                // Zoom to the larger download bounds
128                MapFrame map = MainApplication.getMap();
129                if (map != null && bounds != null) {
130                    final ProjectionBounds pb = bounds;
131                    GuiHelper.runInEDTAndWait(() -> map.mapView.zoomTo(new ViewportData(pb)));
132                }
133            });
134        }
135    }
136}
Note: See TracBrowser for help on using the repository browser.