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 }