001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.actions;
003
004import static org.openstreetmap.josm.actions.SaveActionBase.createAndOpenSaveFileChooser;
005import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
006import static org.openstreetmap.josm.tools.I18n.tr;
007
008import java.awt.event.ActionEvent;
009import java.awt.event.KeyEvent;
010import java.io.File;
011import java.io.IOException;
012import java.nio.file.InvalidPathException;
013import java.text.MessageFormat;
014
015import javax.swing.JOptionPane;
016
017import org.openstreetmap.josm.gui.MainApplication;
018import org.openstreetmap.josm.gui.io.importexport.FileExporter;
019import org.openstreetmap.josm.gui.io.importexport.GpxExporter;
020import org.openstreetmap.josm.gui.io.importexport.GpxImporter;
021import org.openstreetmap.josm.gui.layer.Layer;
022import org.openstreetmap.josm.tools.CheckParameterUtil;
023import org.openstreetmap.josm.tools.Shortcut;
024
025/**
026 * Exports data to gpx.
027 * @since 78
028 */
029public class GpxExportAction extends DiskAccessAction {
030
031    /**
032     * Constructs a new {@code GpxExportAction}.
033     */
034    public GpxExportAction() {
035        super(tr("Export to GPX..."), "exportgpx", tr("Export the data to GPX file."),
036                Shortcut.registerShortcut("file:exportgpx", tr("File: {0}", tr("Export to GPX...")), KeyEvent.VK_E, Shortcut.CTRL));
037        setHelpId(ht("/Action/GpxExport"));
038    }
039
040    /**
041     * Deferring constructor for child classes.
042     *
043     * @param name see {@code DiskAccessAction}
044     * @param iconName see {@code DiskAccessAction}
045     * @param tooltip see {@code DiskAccessAction}
046     * @param shortcut see {@code DiskAccessAction}
047     * @param register see {@code DiskAccessAction}
048     * @param toolbarId see {@code DiskAccessAction}
049     * @param installAdapters see {@code DiskAccessAction}
050     *
051     * @since 13210
052     */
053    protected GpxExportAction(String name, String iconName, String tooltip, Shortcut shortcut,
054            boolean register, String toolbarId, boolean installAdapters) {
055        super(name, iconName, tooltip, shortcut, register, toolbarId, installAdapters);
056    }
057
058    /**
059     * Get the layer to export.
060     * @return The layer to export, if supported, otherwise {@code null}.
061     */
062    protected Layer getLayer() {
063        Layer layer = getLayerManager().getActiveLayer();
064        return GpxExporter.isSupportedLayer(layer) ? layer : null;
065    }
066
067    @Override
068    public void actionPerformed(ActionEvent e) {
069        if (!isEnabled())
070            return;
071        Layer layer = getLayer();
072        if (layer == null) {
073            JOptionPane.showMessageDialog(
074                    MainApplication.getMainFrame(),
075                    tr("Nothing to export. Get some data first."),
076                    tr("Information"),
077                    JOptionPane.INFORMATION_MESSAGE
078            );
079            return;
080        }
081        export(layer);
082    }
083
084    /**
085     * Exports a layer to a file. Launches a file chooser to request the user to enter a file name.
086     *
087     * <code>layer</code> must not be null. <code>layer</code> must be of a supported type.
088     *
089     * @param layer the layer
090     * @throws IllegalArgumentException if layer is null
091     * @throws IllegalArgumentException if layer is not of a supported type.
092     * @see GpxExporter#isSupportedLayer
093     */
094    public void export(Layer layer) {
095        CheckParameterUtil.ensureParameterNotNull(layer, "layer");
096        if (!GpxExporter.isSupportedLayer(layer))
097            throw new IllegalArgumentException(MessageFormat.format("Expected instance of {0}. Got ''{1}''.",
098                    GpxExporter.getSupportedLayers(), layer.getClass().getName()));
099
100        File file = createAndOpenSaveFileChooser(tr("Export GPX file"), GpxImporter.getFileFilter());
101        if (file == null)
102            return;
103
104        for (FileExporter exporter : ExtensionFileFilter.getExporters()) {
105            if (exporter.acceptFile(file, layer)) {
106                try {
107                    exporter.exportData(file, layer);
108                } catch (IOException | InvalidPathException e) {
109                    SaveActionBase.showAndLogException(e);
110                }
111            }
112        }
113    }
114
115    @Override
116    protected boolean listenToSelectionChange() {
117        return false;
118    }
119
120    /**
121     * Refreshes the enabled state
122     */
123    @Override
124    protected void updateEnabledState() {
125        setEnabled(getLayer() != null);
126    }
127}