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.layer.GpxLayer;
018import org.openstreetmap.josm.gui.layer.Layer;
019import org.openstreetmap.josm.gui.layer.OsmDataLayer;
020import org.openstreetmap.josm.io.FileExporter;
021import org.openstreetmap.josm.io.GpxImporter;
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("Export to GPX..."), KeyEvent.VK_E, Shortcut.CTRL));
037        putValue("help", ht("/Action/GpxExport"));
038    }
039
040    /**
041     * Get the layer to export.
042     * @return The layer to export, either a {@link GpxLayer} or {@link OsmDataLayer}.
043     */
044    protected Layer getLayer() {
045        Layer layer = Main.getLayerManager().getActiveLayer();
046        return (layer instanceof GpxLayer || layer instanceof OsmDataLayer) ? layer : null;
047    }
048
049    @Override
050    public void actionPerformed(ActionEvent e) {
051        if (!isEnabled())
052            return;
053        Layer layer = getLayer();
054        if (layer == null) {
055            JOptionPane.showMessageDialog(
056                    Main.parent,
057                    tr("Nothing to export. Get some data first."),
058                    tr("Information"),
059                    JOptionPane.INFORMATION_MESSAGE
060            );
061            return;
062        }
063        export(layer);
064    }
065
066    /**
067     * Exports a layer to a file. Launches a file chooser to request the user to enter a file name.
068     *
069     * <code>layer</code> must not be null. <code>layer</code> must be an instance of
070     * {@link OsmDataLayer} or {@link GpxLayer}.
071     *
072     * @param layer the layer
073     * @throws IllegalArgumentException if layer is null
074     * @throws IllegalArgumentException if layer is neither an instance of {@link OsmDataLayer}
075     *  nor of {@link GpxLayer}
076     */
077    public void export(Layer layer) {
078        CheckParameterUtil.ensureParameterNotNull(layer, "layer");
079        if (!(layer instanceof OsmDataLayer) && !(layer instanceof GpxLayer))
080            throw new IllegalArgumentException(MessageFormat.format("Expected instance of OsmDataLayer or GpxLayer. Got ''{0}''.",
081                    layer.getClass().getName()));
082
083        File file = createAndOpenSaveFileChooser(tr("Export GPX file"), GpxImporter.getFileFilter());
084        if (file == null)
085            return;
086
087        for (FileExporter exporter : ExtensionFileFilter.getExporters()) {
088            if (exporter.acceptFile(file, layer)) {
089                try {
090                    exporter.exportData(file, layer);
091                } catch (IOException e) {
092                    Main.error(e);
093                }
094            }
095        }
096    }
097
098    /**
099     * Refreshes the enabled state
100     */
101    @Override
102    protected void updateEnabledState() {
103        setEnabled(getLayer() != null);
104    }
105}