/**
*
*/
package at.dallermassl.josm.plugin.openvisible;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.JosmAction;
import org.openstreetmap.josm.data.coor.LatLon;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.gui.MapView;
import org.openstreetmap.josm.gui.layer.GpxLayer;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
import org.openstreetmap.josm.io.GpxImporter;
import org.openstreetmap.josm.io.GpxReader;
import org.openstreetmap.josm.io.IllegalDataException;
import org.openstreetmap.josm.io.OsmImporter;
import org.openstreetmap.josm.io.OsmReader;
import org.openstreetmap.josm.tools.Shortcut;
import org.xml.sax.SAXException;
import at.dallermassl.josm.plugin.openvisible.OsmGpxBounds;
/**
* @author cdaller
*
*/
public class OpenVisibleAction extends JosmAction {
private File lastDirectory;
public OpenVisibleAction() {
super(tr("Open Visible..."), "openvisible",
tr("Open only files that are visible in current view."),
Shortcut.registerShortcut("tools:openvisible", tr("Menu: {0}", tr("Open Visible...")),
KeyEvent.VK_I, Shortcut.ALT_CTRL_SHIFT), true);
}
/* (non-Javadoc)
* @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent e) {
if(Main.map == null || Main.map.mapView == null) {
JOptionPane.showMessageDialog(Main.parent, tr("No view open - cannot determine boundaries!"));
return;
}
MapView view = Main.map.mapView;
Rectangle bounds = view.getBounds();
LatLon bottomLeft = view.getLatLon(bounds.x, bounds.y + bounds.height);
LatLon topRight = view.getLatLon(bounds.x + bounds.width, bounds.y);
System.err.println("FileFind Bounds: " + bottomLeft + " to " + topRight);
JFileChooser fileChooser;
if(lastDirectory != null) {
fileChooser = new JFileChooser(lastDirectory);
} else {
fileChooser = new JFileChooser();
}
fileChooser.setMultiSelectionEnabled(true);
fileChooser.showOpenDialog(Main.parent);
File[] files = fileChooser.getSelectedFiles();
lastDirectory = fileChooser.getCurrentDirectory();
for(File file : files) {
try {
OsmGpxBounds parser = new OsmGpxBounds();
parser.parse(new BufferedInputStream(new FileInputStream(file)));
if(parser.intersects(bottomLeft.lat(), topRight.lat(), bottomLeft.lon(), topRight.lon())) {
System.out.println(file.getAbsolutePath()); // + "," + parser.minLat + "," + parser.maxLat + "," + parser.minLon + "," + parser.maxLon);
if(file.getName().endsWith("osm")) {
openAsData(file);
} else if(file.getName().endsWith("gpx")) {
openFileAsGpx(file);
}
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} catch (SAXException e1) {
e1.printStackTrace();
} catch(IllegalDataException e1) {
e1.printStackTrace();
}
}
}
private void openAsData(File file) throws SAXException, IOException, FileNotFoundException, IllegalDataException {
String fn = file.getName();
if (new OsmImporter().acceptFile(file)) {
DataSet dataSet = OsmReader.parseDataSet(new FileInputStream(file), NullProgressMonitor.INSTANCE);
OsmDataLayer layer = new OsmDataLayer(dataSet, fn, file);
Main.getLayerManager().addLayer(layer);
}
else
JOptionPane.showMessageDialog(Main.parent, fn+": "+tr("Unknown file extension: {0}", fn.substring(fn.lastIndexOf('.')+1)));
}
private void openFileAsGpx(File file) throws SAXException, IOException, FileNotFoundException {
String fn = file.getName();
if (new GpxImporter().acceptFile(file)) {
GpxReader r = null;
if (file.getName().endsWith(".gpx.gz")) {
r = new GpxReader(new GZIPInputStream(new FileInputStream(file)));
} else{
r = new GpxReader(new FileInputStream(file));
}
if (!r.parse(true)) {
// input was not properly parsed, abort
JOptionPane.showMessageDialog(Main.parent, tr("Parsing file \"{0}\" failed", file));
throw new IllegalStateException();
}
r.getGpxData().storageFile = file;
GpxLayer gpxLayer = new GpxLayer(r.getGpxData(), fn);
Main.getLayerManager().addLayer(gpxLayer);
Main.getLayerManager().addLayer(new MarkerLayer(r.getGpxData(), tr("Markers from {0}", fn), file, gpxLayer));
} else {
throw new IllegalStateException();
}
}
}