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.io.importexport.FileExporter; 018import org.openstreetmap.josm.gui.io.importexport.GpxImporter; 019import org.openstreetmap.josm.gui.layer.GpxLayer; 020import org.openstreetmap.josm.gui.layer.Layer; 021import org.openstreetmap.josm.gui.layer.OsmDataLayer; 022import org.openstreetmap.josm.tools.CheckParameterUtil; 023import org.openstreetmap.josm.tools.Logging; 024import org.openstreetmap.josm.tools.Shortcut; 025 026/** 027 * Exports data to gpx. 028 * @since 78 029 */ 030public class GpxExportAction extends DiskAccessAction { 031 032 /** 033 * Constructs a new {@code GpxExportAction}. 034 */ 035 public GpxExportAction() { 036 super(tr("Export to GPX..."), "exportgpx", tr("Export the data to GPX file."), 037 Shortcut.registerShortcut("file:exportgpx", tr("Export to GPX..."), KeyEvent.VK_E, Shortcut.CTRL)); 038 putValue("help", ht("/Action/GpxExport")); 039 } 040 041 /** 042 * Deferring constructor for child classes. 043 * 044 * @param name see {@code DiskAccessAction} 045 * @param iconName see {@code DiskAccessAction} 046 * @param tooltip see {@code DiskAccessAction} 047 * @param shortcut see {@code DiskAccessAction} 048 * @param register see {@code DiskAccessAction} 049 * @param toolbarId see {@code DiskAccessAction} 050 * @param installAdapters see {@code DiskAccessAction} 051 * 052 * @since 13210 053 */ 054 protected GpxExportAction(String name, String iconName, String tooltip, Shortcut shortcut, 055 boolean register, String toolbarId, boolean installAdapters) { 056 super(name, iconName, tooltip, shortcut, register, toolbarId, installAdapters); 057 } 058 059 /** 060 * Get the layer to export. 061 * @return The layer to export, either a {@link GpxLayer} or {@link OsmDataLayer}. 062 */ 063 protected Layer getLayer() { 064 Layer layer = getLayerManager().getActiveLayer(); 065 return (layer instanceof GpxLayer || layer instanceof OsmDataLayer) ? layer : null; 066 } 067 068 @Override 069 public void actionPerformed(ActionEvent e) { 070 if (!isEnabled()) 071 return; 072 Layer layer = getLayer(); 073 if (layer == null) { 074 JOptionPane.showMessageDialog( 075 Main.parent, 076 tr("Nothing to export. Get some data first."), 077 tr("Information"), 078 JOptionPane.INFORMATION_MESSAGE 079 ); 080 return; 081 } 082 export(layer); 083 } 084 085 /** 086 * Exports a layer to a file. Launches a file chooser to request the user to enter a file name. 087 * 088 * <code>layer</code> must not be null. <code>layer</code> must be an instance of 089 * {@link OsmDataLayer} or {@link GpxLayer}. 090 * 091 * @param layer the layer 092 * @throws IllegalArgumentException if layer is null 093 * @throws IllegalArgumentException if layer is neither an instance of {@link OsmDataLayer} 094 * nor of {@link GpxLayer} 095 */ 096 public void export(Layer layer) { 097 CheckParameterUtil.ensureParameterNotNull(layer, "layer"); 098 if (!(layer instanceof OsmDataLayer) && !(layer instanceof GpxLayer)) 099 throw new IllegalArgumentException(MessageFormat.format("Expected instance of OsmDataLayer or GpxLayer. Got ''{0}''.", 100 layer.getClass().getName())); 101 102 File file = createAndOpenSaveFileChooser(tr("Export GPX file"), GpxImporter.getFileFilter()); 103 if (file == null) 104 return; 105 106 for (FileExporter exporter : ExtensionFileFilter.getExporters()) { 107 if (exporter.acceptFile(file, layer)) { 108 try { 109 exporter.exportData(file, layer); 110 } catch (IOException e) { 111 Logging.error(e); 112 } 113 } 114 } 115 } 116 117 /** 118 * Refreshes the enabled state 119 */ 120 @Override 121 protected void updateEnabledState() { 122 setEnabled(getLayer() != null); 123 } 124}