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}