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 }