001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.actions;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.event.ActionEvent;
007import java.util.concurrent.Future;
008
009import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
010import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
011import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
012import org.openstreetmap.josm.data.Bounds;
013import org.openstreetmap.josm.gui.MainApplication;
014import org.openstreetmap.josm.io.BoundingBoxDownloader;
015import org.openstreetmap.josm.io.NetworkManager;
016import org.openstreetmap.josm.io.OnlineResource;
017
018/**
019 * Action that downloads the OSM data within the current view from the server.
020 *
021 * No interaction is required.
022 */
023public final class DownloadOsmInViewAction extends JosmAction {
024
025    /**
026     * Creates a new {@code DownloadOsmInViewAction}.
027     */
028    public DownloadOsmInViewAction() {
029        super(tr("Download in current view"), "download_in_view", tr("Download map data from the OSM server in current view"), null, false,
030                "dialogs/download_in_view", true);
031    }
032
033    @Override
034    public void actionPerformed(ActionEvent e) {
035        final Bounds bounds = MainApplication.getMap().mapView.getRealBounds();
036        DownloadOsmInViewTask task = new DownloadOsmInViewTask();
037        task.setZoomAfterDownload(false);
038        Future<?> future = task.download(bounds);
039        MainApplication.worker.submit(new PostDownloadHandler(task, future));
040    }
041
042    @Override
043    protected void updateEnabledState() {
044        setEnabled(getLayerManager().getActiveLayer() != null
045                && !NetworkManager.isOffline(OnlineResource.OSM_API));
046    }
047
048    private static class DownloadOsmInViewTask extends DownloadOsmTask {
049        Future<?> download(Bounds downloadArea) {
050            return download(new DownloadTask(new DownloadParams(), new BoundingBoxDownloader(downloadArea), null, false), downloadArea);
051        }
052    }
053}