package org.osm2world.viewer.control.actions; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.io.File; import java.io.IOException; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.KeyStroke; import javax.swing.filechooser.FileNameExtensionFilter; import org.osm2world.core.osm.creation.OSMFileReader; import org.osm2world.viewer.model.Data; import org.osm2world.viewer.model.RenderOptions; import org.osm2world.viewer.view.RecentFilesUpdater; import org.osm2world.viewer.view.ViewerFrame; public class OpenOSMAction extends AbstractLoadOSMAction { private static final long serialVersionUID = -3092902524926341197L; private File lastPath = null; public OpenOSMAction(ViewerFrame viewerFrame, Data data, RenderOptions renderOptions) { super("Open OSM file", viewerFrame, data, renderOptions); putValue(SHORT_DESCRIPTION, "Opens a file with OpenStreetMap data"); putValue(MNEMONIC_KEY, KeyEvent.VK_O); putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke( KeyEvent.VK_O, ActionEvent.CTRL_MASK)); this.viewerFrame = viewerFrame; this.data = data; this.renderOptions = renderOptions; } @Override public void actionPerformed(ActionEvent arg0) { File osmFile = askFile(); if (osmFile != null) { openOSMFile(osmFile, true); } } public void openOSMFile(File osmFile, boolean resetCamera) { if (osmFile.length() > 1e7) { String[] options = new String[] {"Try anyway" ,"Cancel"}; int answer = JOptionPane.showOptionDialog(viewerFrame, "The input file is probably too big.\n" + "This viewer can only handle relatively small areas well.\n", "Large input file size", JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[1]); if (answer != JOptionPane.OK_OPTION) return; } try { loadOSMData(new OSMFileReader(osmFile), resetCamera); } catch (IOException e) { String msg = "File not found:\n" + osmFile; JOptionPane.showMessageDialog(viewerFrame, msg, "Error", JOptionPane.ERROR_MESSAGE); } RecentFilesUpdater.addRecentFile(osmFile); } private File askFile() { JFileChooser chooser = new JFileChooser(lastPath); chooser.setDialogTitle("Open OSM file"); chooser.setFileFilter(new FileNameExtensionFilter( "OpenStreetMap data files", "osm", "gz", "bz2", "pbf")); int returnVal = chooser.showOpenDialog(null); if (returnVal == JFileChooser.APPROVE_OPTION) { File selectedFile = chooser.getSelectedFile(); lastPath = selectedFile.getParentFile(); return selectedFile; } else { return null; } // /* alternative implementation using FileDialog */ // // FileDialog dialog = // new FileDialog(viewerFrame, "Open OSM file", FileDialog.LOAD); // // dialog.setVisible(true); // // return new File(dialog.getFile()); } }