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.awt.event.KeyEvent;
008import java.util.concurrent.Future;
009
010import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
011import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
012import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
013import org.openstreetmap.josm.data.Bounds;
014import org.openstreetmap.josm.gui.MainApplication;
015import org.openstreetmap.josm.io.BoundingBoxDownloader;
016import org.openstreetmap.josm.io.NetworkManager;
017import org.openstreetmap.josm.io.OnlineResource;
018import org.openstreetmap.josm.tools.Shortcut;
019
020/**
021 * Action that downloads the OSM data within the current view from the server.
022 *
023 * No interaction is required.
024 */
025public final class DownloadOsmInViewAction extends JosmAction {
026
027    /**
028     * Creates a new {@code DownloadOsmInViewAction}.
029     */
030    public DownloadOsmInViewAction() {
031        super(tr("Download in current view"), "download_in_view", tr("Download map data from the OSM server in current view"),
032                Shortcut.registerShortcut("file:downloadosminview",
033                tr("File: {0}", tr("Download in current view")), KeyEvent.CHAR_UNDEFINED, Shortcut.NONE), false,
034                "dialogs/download_in_view", true);
035    }
036
037    @Override
038    public void actionPerformed(ActionEvent e) {
039        final Bounds bounds = MainApplication.getMap().mapView.getRealBounds();
040        DownloadOsmInViewTask task = new DownloadOsmInViewTask();
041        task.setZoomAfterDownload(false);
042        Future<?> future = task.download(bounds);
043        MainApplication.worker.submit(new PostDownloadHandler(task, future));
044    }
045
046    @Override
047    protected boolean listenToSelectionChange() {
048        return false;
049    }
050
051    @Override
052    protected void updateEnabledState() {
053        setEnabled(getLayerManager().getActiveLayer() != null
054                && !NetworkManager.isOffline(OnlineResource.OSM_API));
055    }
056
057    private static class DownloadOsmInViewTask extends DownloadOsmTask {
058        Future<?> download(Bounds downloadArea) {
059            return download(new DownloadTask(new DownloadParams(), new BoundingBoxDownloader(downloadArea), null, false), downloadArea);
060        }
061    }
062}