source: josm/src/org/openstreetmap/josm/actions/OpenAction.java@ 295

Last change on this file since 295 was 295, checked in by imi, 17 years ago
  • added "download to new layer" option
  • added missing color preferences when opening preferences dialog
File size: 4.5 KB
Line 
1package org.openstreetmap.josm.actions;
2
3import static org.openstreetmap.josm.tools.I18n.tr;
4
5import java.awt.event.ActionEvent;
6import java.awt.event.InputEvent;
7import java.awt.event.KeyEvent;
8import java.io.File;
9import java.io.FileInputStream;
10import java.io.FileNotFoundException;
11import java.io.FileReader;
12import java.io.IOException;
13import java.util.Collection;
14import java.util.LinkedList;
15import java.util.zip.GZIPInputStream;
16
17import javax.swing.JFileChooser;
18import javax.swing.JOptionPane;
19
20import org.openstreetmap.josm.Main;
21import org.openstreetmap.josm.data.osm.DataSet;
22import org.openstreetmap.josm.gui.layer.OsmDataLayer;
23import org.openstreetmap.josm.gui.layer.RawGpsLayer;
24import org.openstreetmap.josm.gui.layer.RawGpsLayer.GpsPoint;
25import org.openstreetmap.josm.gui.layer.markerlayer.Marker;
26import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
27import org.openstreetmap.josm.io.OsmReader;
28import org.openstreetmap.josm.io.RawCsvReader;
29import org.openstreetmap.josm.io.RawGpsReader;
30import org.xml.sax.SAXException;
31
32/**
33 * Open a file chooser dialog and select an file to import. Than call the gpx-import
34 * driver. Finally open an internal frame into the main window with the gpx data shown.
35 *
36 * @author imi
37 */
38public class OpenAction extends DiskAccessAction {
39
40 /**
41 * Create an open action. The name is "Open a file".
42 */
43 public OpenAction() {
44 super(tr("Open"), "open", tr("Open a file."), KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK);
45 }
46
47 public void actionPerformed(ActionEvent e) {
48 JFileChooser fc = createAndOpenFileChooser(true, true);
49 if (fc == null)
50 return;
51 File[] files = fc.getSelectedFiles();
52 for (int i = files.length; i > 0; --i)
53 openFile(files[i-1]);
54 }
55
56 /**
57 * Open the given file.
58 */
59 public void openFile(File file) {
60 try {
61 if (asRawData(file.getName()))
62 openFileAsRawGps(file);
63 else
64 openAsData(file);
65 } catch (SAXException x) {
66 x.printStackTrace();
67 JOptionPane.showMessageDialog(Main.parent, tr("Error while parsing {0}",file.getName())+": "+x.getMessage());
68 } catch (IOException x) {
69 x.printStackTrace();
70 JOptionPane.showMessageDialog(Main.parent, tr("Could not read \"{0}\"",file.getName())+"\n"+x.getMessage());
71 }
72 }
73
74 private void openAsData(File file) throws SAXException, IOException, FileNotFoundException {
75 String fn = file.getName();
76 if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(fn)) {
77 DataSet dataSet = OsmReader.parseDataSet(new FileInputStream(file), null, Main.pleaseWaitDlg);
78 OsmDataLayer layer = new OsmDataLayer(dataSet, file.getName(), file);
79 Main.main.addLayer(layer);
80 } else if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(fn))
81 JOptionPane.showMessageDialog(Main.parent, fn+": "+tr("CSV Data import for non-GPS data is not implemented yet."));
82 else
83 JOptionPane.showMessageDialog(Main.parent, fn+": "+tr("Unknown file extension: {0}", fn.substring(file.getName().lastIndexOf('.')+1)));
84 }
85
86 private void openFileAsRawGps(File file) throws SAXException, IOException, FileNotFoundException {
87 String fn = file.getName();
88 Collection<Collection<GpsPoint>> gpsData = null;
89 Collection<Marker> markerData = null;
90 if (ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(fn)) {
91 RawGpsReader r = null;
92 if (file.getName().endsWith(".gpx.gz"))
93 r = new RawGpsReader(new GZIPInputStream(new FileInputStream(file)), file.getAbsoluteFile().getParentFile());
94 else
95 r = new RawGpsReader(new FileInputStream(file), file.getAbsoluteFile().getParentFile());
96 gpsData = r.trackData;
97 markerData = r.markerData;
98 } else if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(fn)) {
99 gpsData = new LinkedList<Collection<GpsPoint>>();
100 gpsData.add(new RawCsvReader(new FileReader(file)).parse());
101 } else
102 throw new IllegalStateException();
103 if (gpsData != null && !gpsData.isEmpty())
104 Main.main.addLayer(new RawGpsLayer(false, gpsData, tr("Tracks from {0}", file.getName()), file));
105 if (markerData != null && !markerData.isEmpty())
106 Main.main.addLayer(new MarkerLayer(markerData, tr ("Markers from {0}", file.getName()), file));
107 }
108
109 /**
110 * @return Return whether the file should be opened as raw gps data. May ask the
111 * user, if unsure.
112 */
113 private boolean asRawData(String fn) {
114 if (ExtensionFileFilter.filters[ExtensionFileFilter.CSV].acceptName(fn))
115 return true;
116 if (!ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(fn))
117 return false;
118 return true;
119 }
120}
Note: See TracBrowser for help on using the repository browser.