source: josm/trunk/src/org/openstreetmap/josm/actions/OpenFileAction.java@ 1196

Last change on this file since 1196 was 1196, checked in by stoecker, 15 years ago

partly fix #1720. Patch by Russ Nelson

File size: 7.1 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2package org.openstreetmap.josm.actions;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.event.ActionEvent;
7import java.awt.event.KeyEvent;
8import java.io.InputStream;
9import java.io.File;
10import java.io.FileInputStream;
11import java.io.FileNotFoundException;
12import java.io.IOException;
13import java.util.zip.GZIPInputStream;
14
15import javax.swing.JFileChooser;
16import javax.swing.JOptionPane;
17
18import org.openstreetmap.josm.Main;
19import org.openstreetmap.josm.data.osm.DataSet;
20import org.openstreetmap.josm.gui.layer.GpxLayer;
21import org.openstreetmap.josm.gui.layer.OsmDataLayer;
22import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
23import org.openstreetmap.josm.io.GpxReader;
24import org.openstreetmap.josm.io.NmeaReader;
25import org.openstreetmap.josm.io.OsmReader;
26import org.xml.sax.SAXException;
27import org.openstreetmap.josm.tools.Shortcut;
28
29/**
30 * Open a file chooser dialog and select an file to import. Then call the gpx-import
31 * driver. Finally open an internal frame into the main window with the gpx data shown.
32 *
33 * @author imi
34 */
35public class OpenFileAction extends DiskAccessAction {
36
37 /**
38 * Create an open action. The name is "Open a file".
39 */
40 public OpenFileAction() {
41 super(tr("Open ..."), "open", tr("Open a file."),
42 Shortcut.registerShortcut("system:open", tr("File: {0}", tr("Open ...")), KeyEvent.VK_O, Shortcut.GROUP_MENU));
43 }
44
45 public void actionPerformed(ActionEvent e) {
46 JFileChooser fc = createAndOpenFileChooser(true, true, null);
47 if (fc == null)
48 return;
49 File[] files = fc.getSelectedFiles();
50 for (int i = files.length; i > 0; --i)
51 openFile(files[i-1]);
52 }
53
54 /**
55 * Open the given file.
56 */
57 public void openFile(File file) {
58 try {
59 if (asGpxData(file.getName()))
60 openFileAsGpx(file);
61 else if (asNmeaData(file.getName()))
62 openFileAsNmea(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 OsmReader osm = OsmReader.parseDataSetOsm(new FileInputStream(file), null, Main.pleaseWaitDlg);
78 DataSet dataSet = osm.getDs();
79 OsmDataLayer layer = new OsmDataLayer(dataSet, file.getName(), file);
80 Main.main.addLayer(layer);
81 layer.fireDataChange();
82 if (osm.getParseNotes().length() != 0) {
83 /* display at most five lines */
84 String notes = osm.getParseNotes();
85 int j = 0;
86 for (int i = 0; i < 5; i++) {
87 j = notes.indexOf('\n', j + 1);
88 }
89 JOptionPane.showMessageDialog(Main.parent, notes.substring(0, j));
90 }
91 }
92 else
93 JOptionPane.showMessageDialog(Main.parent, fn+": "+tr("Unknown file extension: {0}", fn.substring(file.getName().lastIndexOf('.')+1)));
94 }
95
96 private void openFileAsGpx(File file) throws SAXException, IOException, FileNotFoundException {
97 String fn = file.getName();
98 if (ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(fn)) {
99 GpxReader r = null;
100 InputStream is;
101 if (file.getName().endsWith(".gpx.gz")) {
102 is = new GZIPInputStream(new FileInputStream(file));
103 } else {
104 is = new FileInputStream(file);
105 }
106 // Workaround for SAX BOM bug
107 // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6206835
108 if(!((is.read()==0xef)&&(is.read()==0xbb)&&(is.read()==0xbf))) {
109 is.close();
110 if (file.getName().endsWith(".gpx.gz")) {
111 is = new GZIPInputStream(new FileInputStream(file));
112 } else {
113 is = new FileInputStream(file);
114 }
115 }
116 r = new GpxReader(is,file.getAbsoluteFile().getParentFile());
117 r.data.storageFile = file;
118 GpxLayer gpxLayer = new GpxLayer(r.data, fn);
119 Main.main.addLayer(gpxLayer);
120 if (Main.pref.getBoolean("marker.makeautomarkers", true)) {
121 MarkerLayer ml = new MarkerLayer(r.data, tr("Markers from {0}", fn), file, gpxLayer);
122 if (ml.data.size() > 0) {
123 Main.main.addLayer(ml);
124 }
125 }
126
127 } else {
128 throw new IllegalStateException();
129 }
130 }
131
132 private void showNmeaInfobox(boolean success, NmeaReader r) {
133 String msg = tr("Coordinates imported: ") + r.getNumberOfCoordinates() + "\n" +
134 tr("Malformed sentences: ") + r.getParserMalformed() + "\n" +
135 tr("Checksum errors: ") + r.getParserChecksumErrors() + "\n";
136 if(!success) // don't scare the user unneccessarily
137 msg += tr("Unknown sentences: ") + r.getParserUnknown() + "\n";
138 msg += tr("Zero coordinates: ") + r.getParserZeroCoordinates();
139 if(success) {
140 JOptionPane.showMessageDialog(
141 Main.parent, msg,
142 tr("NMEA import success"),JOptionPane.INFORMATION_MESSAGE);
143 } else {
144 JOptionPane.showMessageDialog(
145 Main.parent, msg,
146 tr("NMEA import faliure!"),JOptionPane.ERROR_MESSAGE);
147 }
148 }
149
150 private void openFileAsNmea(File file) throws IOException, FileNotFoundException {
151 String fn = file.getName();
152 if (ExtensionFileFilter.filters[ExtensionFileFilter.NMEA].acceptName(fn)) {
153 NmeaReader r = new NmeaReader(new FileInputStream(file), file.getAbsoluteFile().getParentFile());
154 if(r.getNumberOfCoordinates()>0) {
155 r.data.storageFile = file;
156 GpxLayer gpxLayer = new GpxLayer(r.data, fn);
157 Main.main.addLayer(gpxLayer);
158 if (Main.pref.getBoolean("marker.makeautomarkers", true)) {
159 MarkerLayer ml = new MarkerLayer(r.data, tr("Markers from {0}", fn), file, gpxLayer);
160 if (ml.data.size() > 0) {
161 Main.main.addLayer(ml);
162 }
163 }
164 }
165 showNmeaInfobox(r.getNumberOfCoordinates()>0, r);
166 } else {
167 throw new IllegalStateException();
168 }
169 }
170
171 private boolean asGpxData(String fn) {
172 return ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(fn);
173 }
174
175 private boolean asNmeaData(String fn) {
176 return ExtensionFileFilter.filters[ExtensionFileFilter.NMEA].acceptName(fn);
177 }
178
179
180}
Note: See TracBrowser for help on using the repository browser.