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.text.MessageFormat;
013
014import javax.swing.JOptionPane;
015
016import org.openstreetmap.josm.Main;
017import org.openstreetmap.josm.gui.io.importexport.FileExporter;
018import org.openstreetmap.josm.gui.io.importexport.GpxImporter;
019import org.openstreetmap.josm.gui.layer.GpxLayer;
020import org.openstreetmap.josm.gui.layer.Layer;
021import org.openstreetmap.josm.gui.layer.OsmDataLayer;
022import org.openstreetmap.josm.tools.CheckParameterUtil;
023import org.openstreetmap.josm.tools.Logging;
024import org.openstreetmap.josm.tools.Shortcut;
025
026/**
027 * Exports data to gpx.
028 * @since 78
029 */
030public class GpxExportAction extends DiskAccessAction {
031
032    /**
033     * Constructs a new {@code GpxExportAction}.
034     */
035    public GpxExportAction() {
036        super(tr("Export to GPX..."), "exportgpx", tr("Export the data to GPX file."),
037                Shortcut.registerShortcut("file:exportgpx", tr("Export to GPX..."), KeyEvent.VK_E, Shortcut.CTRL));
038        putValue("help", ht("/Action/GpxExport"));
039    }
040
041    /**
042     * Deferring constructor for child classes.
043     *
044     * @param name see {@code DiskAccessAction}
045     * @param iconName see {@code DiskAccessAction}
046     * @param tooltip see {@code DiskAccessAction}
047     * @param shortcut see {@code DiskAccessAction}
048     * @param register see {@code DiskAccessAction}
049     * @param toolbarId see {@code DiskAccessAction}
050     * @param installAdapters see {@code DiskAccessAction}
051     *
052     * @since 13210
053     */
054    protected GpxExportAction(String name, String iconName, String tooltip, Shortcut shortcut,
055            boolean register, String toolbarId, boolean installAdapters) {
056        super(name, iconName, tooltip, shortcut, register, toolbarId, installAdapters);
057    }
058
059    /**
060     * Get the layer to export.
061     * @return The layer to export, either a {@link GpxLayer} or {@link OsmDataLayer}.
062     */
063    protected Layer getLayer() {
064        Layer layer = getLayerManager().getActiveLayer();
065        return (layer instanceof GpxLayer || layer instanceof OsmDataLayer) ? layer : null;
066    }
067
068    @Override
069    public void actionPerformed(ActionEvent e) {
070        if (!isEnabled())
071            return;
072        Layer layer = getLayer();
073        if (layer == null) {
074            JOptionPane.showMessageDialog(
075                    Main.parent,
076                    tr("Nothing to export. Get some data first."),
077                    tr("Information"),
078                    JOptionPane.INFORMATION_MESSAGE
079            );
080            return;
081        }
082        export(layer);
083    }
084
085    /**
086     * Exports a layer to a file. Launches a file chooser to request the user to enter a file name.
087     *
088     * <code>layer</code> must not be null. <code>layer</code> must be an instance of
089     * {@link OsmDataLayer} or {@link GpxLayer}.
090     *
091     * @param layer the layer
092     * @throws IllegalArgumentException if layer is null
093     * @throws IllegalArgumentException if layer is neither an instance of {@link OsmDataLayer}
094     *  nor of {@link GpxLayer}
095     */
096    public void export(Layer layer) {
097        CheckParameterUtil.ensureParameterNotNull(layer, "layer");
098        if (!(layer instanceof OsmDataLayer) && !(layer instanceof GpxLayer))
099            throw new IllegalArgumentException(MessageFormat.format("Expected instance of OsmDataLayer or GpxLayer. Got ''{0}''.",
100                    layer.getClass().getName()));
101
102        File file = createAndOpenSaveFileChooser(tr("Export GPX file"), GpxImporter.getFileFilter());
103        if (file == null)
104            return;
105
106        for (FileExporter exporter : ExtensionFileFilter.getExporters()) {
107            if (exporter.acceptFile(file, layer)) {
108                try {
109                    exporter.exportData(file, layer);
110                } catch (IOException e) {
111                    Logging.error(e);
112                }
113            }
114        }
115    }
116
117    /**
118     * Refreshes the enabled state
119     */
120    @Override
121    protected void updateEnabledState() {
122        setEnabled(getLayer() != null);
123    }
124}