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