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