001    // License: GPL. Copyright 2007 by Immanuel Scholz and others
002    package org.openstreetmap.josm.actions;
003    
004    import static org.openstreetmap.josm.actions.SaveActionBase.createAndOpenSaveFileChooser;
005    import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
006    import static org.openstreetmap.josm.tools.I18n.tr;
007    
008    import java.awt.event.ActionEvent;
009    import java.awt.event.KeyEvent;
010    import java.io.File;
011    import java.io.IOException;
012    import java.text.MessageFormat;
013    
014    import javax.swing.JOptionPane;
015    
016    import org.openstreetmap.josm.Main;
017    import org.openstreetmap.josm.gui.layer.GpxLayer;
018    import org.openstreetmap.josm.gui.layer.Layer;
019    import org.openstreetmap.josm.gui.layer.OsmDataLayer;
020    import org.openstreetmap.josm.io.FileExporter;
021    import org.openstreetmap.josm.io.GpxImporter;
022    import org.openstreetmap.josm.tools.CheckParameterUtil;
023    import org.openstreetmap.josm.tools.Shortcut;
024    
025    /**
026     * Exports data to gpx.
027     */
028    public 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        public void actionPerformed(ActionEvent e) {
048            if (!isEnabled())
049                return;
050            Layer layer = getLayer();
051            if (layer == null) {
052                JOptionPane.showMessageDialog(
053                        Main.parent,
054                        tr("Nothing to export. Get some data first."),
055                        tr("Information"),
056                        JOptionPane.INFORMATION_MESSAGE
057                );
058                return;
059            }
060            export(layer);
061        }
062    
063        /**
064         * Exports a layer to a file. Launches a file chooser to request the user to enter a file name.
065         *
066         * <code>layer</code> must not be null. <code>layer</code> must be an instance of
067         * {@link OsmDataLayer} or {@link GpxLayer}.
068         *
069         * @param layer the layer
070         * @exception IllegalArgumentException thrown if layer is null
071         * @exception IllegalArgumentException thrown if layer is neither an instance of {@link OsmDataLayer}
072         *  nor of {@link GpxLayer}
073         */
074        public void export(Layer layer) {
075            CheckParameterUtil.ensureParameterNotNull(layer, "layer");
076            if (! (layer instanceof OsmDataLayer) && ! (layer instanceof GpxLayer))
077                throw new IllegalArgumentException(MessageFormat.format("Expected instance of OsmDataLayer or GpxLayer. Got ''{0}''.", layer.getClass().getName()));
078    
079            File file = createAndOpenSaveFileChooser(tr("Export GPX file"), GpxImporter.FILE_FILTER);
080            if (file == null)
081                return;
082    
083            for (FileExporter exporter : ExtensionFileFilter.exporters) {
084                if (exporter.acceptFile(file, layer)) {
085                    try {
086                        exporter.exportData(file, layer);
087                    } catch (IOException e1) {
088                        e1.printStackTrace();
089                    }
090                }
091            }
092        }
093    
094        /**
095         * Refreshes the enabled state
096         *
097         */
098        @Override
099        protected void updateEnabledState() {
100            setEnabled(getLayer() != null);
101        }
102    }