// License: GPL. Copyright 2007 by Immanuel Scholz and others
package org.openstreetmap.josm.actions;
import static org.openstreetmap.josm.actions.SaveActionBase.createAndOpenSaveFileChooser;
import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import javax.swing.JOptionPane;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.gui.layer.GpxLayer;
import org.openstreetmap.josm.gui.layer.Layer;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import org.openstreetmap.josm.io.FileExporter;
import org.openstreetmap.josm.tools.CheckParameterUtil;
import org.openstreetmap.josm.tools.Shortcut;
/**
* Exports data to gpx.
*/
public class GpxExportAction extends DiskAccessAction {
public GpxExportAction() {
super(tr("Export to GPX..."), "exportgpx", tr("Export the data to GPX file."),
Shortcut.registerShortcut("file:exportgpx", tr("Export to GPX..."), KeyEvent.VK_E, Shortcut.GROUP_MENU));
putValue("help", ht("/Action/GpxExport"));
}
protected GpxLayer getLayer() {
if (!Main.isDisplayingMapView()) return null;
if (Main.map.mapView.getActiveLayer() == null) return null;
Layer layer = Main.map.mapView.getActiveLayer();
if (! (layer instanceof GpxLayer)) return null;
return (GpxLayer)layer;
}
public void actionPerformed(ActionEvent e) {
if (!isEnabled())
return;
GpxLayer layer = getLayer();
if (layer == null) {
JOptionPane.showMessageDialog(
Main.parent,
tr("Nothing to export. Get some data first."),
tr("Information"),
JOptionPane.INFORMATION_MESSAGE
);
return;
}
export(layer);
}
/**
* Exports a layer to a file. Launches a file chooser to request the user to enter a file name.
*
* <code>layer</code> must not be null. <code>layer</code> must be an instance of
* {@see OsmDataLayer} or {@see GpxLayer}.
*
* @param layer the layer
* @exception IllegalArgumentException thrown if layer is null
* @exception IllegalArgumentException thrown if layer is neither an instance of {@see OsmDataLayer}
* nor of {@see GpxLayer}
*/
public void export(Layer layer) {
CheckParameterUtil.ensureParameterNotNull(layer, "layer");
if (! (layer instanceof OsmDataLayer) && ! (layer instanceof GpxLayer))
throw new IllegalArgumentException(MessageFormat.format("Expected instance of OsmDataLayer or GpxLayer. Got ''{0}''.", layer.getClass().getName()));
File file = createAndOpenSaveFileChooser(tr("Export GPX file"), ".gpx");
if (file == null)
return;
for (FileExporter exporter : ExtensionFileFilter.exporters) {
if (exporter.acceptFile(file, layer)) {
try {
exporter.exportData(file, layer);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
/**
* Refreshes the enabled state
*
*/
@Override
protected void updateEnabledState() {
boolean check =
Main.isDisplayingMapView()
&& Main.map.mapView.getActiveLayer() != null;
if(!check) {
setEnabled(false);
return;
}
Layer layer = Main.map.mapView.getActiveLayer();
setEnabled(layer instanceof GpxLayer);
}
}