001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.io; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.io.File; 007import java.io.FileInputStream; 008import java.io.IOException; 009 010import javax.swing.JOptionPane; 011import javax.swing.SwingUtilities; 012 013import org.openstreetmap.josm.Main; 014import org.openstreetmap.josm.actions.ExtensionFileFilter; 015import org.openstreetmap.josm.gui.HelpAwareOptionPane; 016import org.openstreetmap.josm.gui.Notification; 017import org.openstreetmap.josm.gui.layer.GpxLayer; 018import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer; 019import org.openstreetmap.josm.gui.progress.ProgressMonitor; 020import org.openstreetmap.josm.gui.util.GuiHelper; 021 022public class NMEAImporter extends FileImporter { 023 024 public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter( 025 "nmea,nme,nma,log,txt", "nmea", tr("NMEA-0183 Files") + " (*.nmea *.nme *.nma *.log *.txt)"); 026 027 public NMEAImporter() { 028 super(FILE_FILTER); 029 } 030 031 @Override public void importData(File file, ProgressMonitor progressMonitor) throws IOException { 032 final String fn = file.getName(); 033 final NmeaReader r = new NmeaReader(new FileInputStream(file), file.getAbsoluteFile().getParentFile()); 034 if (r.getNumberOfCoordinates() > 0) { 035 r.data.storageFile = file; 036 final GpxLayer gpxLayer = new GpxLayer(r.data, fn, true); 037 final File fileFinal = file; 038 039 GuiHelper.runInEDT(new Runnable() { 040 @Override 041 public void run() { 042 Main.main.addLayer(gpxLayer); 043 if (Main.pref.getBoolean("marker.makeautomarkers", true)) { 044 MarkerLayer ml = new MarkerLayer(r.data, tr("Markers from {0}", fn), fileFinal, gpxLayer); 045 if (!ml.data.isEmpty()) { 046 Main.main.addLayer(ml); 047 } 048 } 049 } 050 }); 051 } 052 showNmeaInfobox(r.getNumberOfCoordinates() > 0, r); 053 } 054 055 private void showNmeaInfobox(boolean success, NmeaReader r) { 056 final StringBuilder msg = new StringBuilder().append("<html>"); 057 msg.append(tr("Coordinates imported: {0}", r.getNumberOfCoordinates()) + "<br>"); 058 msg.append(tr("Malformed sentences: {0}", r.getParserMalformed()) + "<br>"); 059 msg.append(tr("Checksum errors: {0}", r.getParserChecksumErrors()) + "<br>"); 060 if (!success) { 061 msg.append(tr("Unknown sentences: {0}", r.getParserUnknown()) + "<br>"); 062 } 063 msg.append(tr("Zero coordinates: {0}", r.getParserZeroCoordinates())); 064 msg.append("</html>"); 065 if (success) { 066 SwingUtilities.invokeLater(new Runnable() { 067 @Override 068 public void run() { 069 new Notification( 070 "<h3>" + tr("NMEA import success:") + "</h3>" + msg.toString()) 071 .setIcon(JOptionPane.INFORMATION_MESSAGE) 072 .show(); 073 } 074 }); 075 } else { 076 HelpAwareOptionPane.showMessageDialogInEDT( 077 Main.parent, 078 msg.toString(), 079 tr("NMEA import failure!"), 080 JOptionPane.ERROR_MESSAGE, null); 081 } 082 } 083}