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