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}