Changeset 1637 in josm for trunk/src


Ignore:
Timestamp:
2009-06-06T13:43:30+02:00 (15 years ago)
Author:
stoecker
Message:

applied new file io from #2064 - patch by dmuecke

Location:
trunk/src/org/openstreetmap/josm
Files:
4 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/DiskAccessAction.java

    r1415 r1637  
    55
    66import java.io.File;
    7 
    87import javax.swing.JFileChooser;
    98import org.openstreetmap.josm.Main;
    109import org.openstreetmap.josm.gui.ExtendedDialog;
    1110import org.openstreetmap.josm.tools.Shortcut;
     11import org.openstreetmap.josm.io.FileImporter;
    1212
    1313/**
     
    2525            curDir = ".";
    2626        JFileChooser fc = new JFileChooser(new File(curDir));
    27         if(title != null)
     27        if (title != null)
    2828            fc.setDialogTitle(title);
    2929
    3030        fc.setMultiSelectionEnabled(multiple);
    31         for (int i = 0; i < ExtensionFileFilter.filters.length; ++i)
    32             fc.addChoosableFileFilter(ExtensionFileFilter.filters[i]);
     31        for (FileImporter imExporter: ExtensionFileFilter.importers) {
     32            fc.addChoosableFileFilter(imExporter.filter);
     33        }
     34
    3335        fc.setAcceptAllFileFilterUsed(true);
    3436
  • trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java

    r1369 r1637  
    22package org.openstreetmap.josm.actions;
    33
    4 import static org.openstreetmap.josm.tools.I18n.tr;
    5 
    64import java.io.File;
     5import java.util.ArrayList;
     6import java.util.Arrays;
    77
    88import javax.swing.filechooser.FileFilter;
     9
     10import org.openstreetmap.josm.io.FileImporter;
     11import org.openstreetmap.josm.io.GpxImporter;
     12import org.openstreetmap.josm.io.NMEAImporter;
     13import org.openstreetmap.josm.io.OsmImporter;
    914
    1015/**
     
    1924    public final String defaultExtension;
    2025
    21     public static final int OSM = 0;
    22     public static final int GPX = 1;
    23     public static final int NMEA = 2;
    24 
    25     public static ExtensionFileFilter[] filters = {
    26         new ExtensionFileFilter("osm,xml", "osm", tr("OSM Server Files")+ " (*.osm *.xml)"),
    27         new ExtensionFileFilter("gpx,gpx.gz", "gpx", tr("GPX Files") + " (*.gpx *.gpx.gz)"),
    28         new ExtensionFileFilter("nmea,nme,nma,txt", "nmea", tr("NMEA-0183 Files") + " (*.nmea *.nme *.nma *.txt)"),
    29     };
     26    public static ArrayList<FileImporter> importers = new ArrayList<FileImporter>(Arrays.asList(new OsmImporter(),
     27            new GpxImporter(), new NMEAImporter()));
    3028
    3129    /**
  • trunk/src/org/openstreetmap/josm/actions/OpenFileAction.java

    r1573 r1637  
    66import java.awt.event.ActionEvent;
    77import java.awt.event.KeyEvent;
    8 import java.io.InputStream;
    98import java.io.File;
    10 import java.io.FileInputStream;
    11 import java.io.FileNotFoundException;
    129import java.io.IOException;
    13 import java.util.zip.GZIPInputStream;
    1410
    1511import javax.swing.JFileChooser;
     
    1713
    1814import org.openstreetmap.josm.Main;
    19 import org.openstreetmap.josm.data.osm.DataSet;
    20 import org.openstreetmap.josm.gui.layer.GpxLayer;
    21 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    22 import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
    23 import org.openstreetmap.josm.io.GpxReader;
    24 import org.openstreetmap.josm.io.NmeaReader;
    25 import org.openstreetmap.josm.io.OsmReader;
    26 import org.xml.sax.SAXException;
     15import org.openstreetmap.josm.io.FileImporter;
    2716import org.openstreetmap.josm.tools.Shortcut;
    2817
    2918/**
    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.
     19 * Open a file chooser dialog and select an file to import. Then call the gpx-import driver. Finally
     20 * open an internal frame into the main window with the gpx data shown.
    3221 *
    3322 * @author imi
     
    5847        try {
    5948            System.out.println("Open file: " + file.getAbsolutePath() + " (" + file.length() + " bytes)");
    60             if (asGpxData(file.getName()))
    61                 openFileAsGpx(file);
    62             else if (asNmeaData(file.getName()))
    63                 openFileAsNmea(file);
    64             else
    65                 openAsData(file);
    66         } catch (SAXException x) {
    67             x.printStackTrace();
    68             JOptionPane.showMessageDialog(Main.parent, tr("Error while parsing {0}",file.getName())+": "+x.getMessage());
     49            for (FileImporter importer : ExtensionFileFilter.importers)
     50                if (importer.acceptFile(file))
     51                    importer.importData(file);
    6952        } catch (IOException x) {
    7053            x.printStackTrace();
    71             JOptionPane.showMessageDialog(Main.parent, tr("Could not read \"{0}\"",file.getName())+"\n"+x.getMessage());
     54            JOptionPane.showMessageDialog(Main.parent, tr("Could not read \"{0}\"", file.getName()) + "\n"
     55                    + x.getMessage());
    7256        }
    7357    }
    7458
    75     private void openAsData(File file) throws SAXException, IOException, FileNotFoundException {
    76         String fn = file.getName();
    77         if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(fn)) {
    78             OsmReader osm = OsmReader.parseDataSetOsm(new FileInputStream(file), null, Main.pleaseWaitDlg);
    79             DataSet dataSet = osm.getDs();
    80             OsmDataLayer layer = new OsmDataLayer(dataSet, file.getName(), file);
    81             Main.main.addLayer(layer);
    82             layer.fireDataChange();
    83             if (osm.getParseNotes().length() != 0) {
    84                 /* display at most five lines */
    85                 String notes = osm.getParseNotes();
    86                 int j = 0;
    87                 for (int i = 0; i < 5; i++) {
    88                     j = notes.indexOf('\n', j + 1);
    89                 }
    90                 j = j >= 0 ? j : notes.length();
    91                 JOptionPane.showMessageDialog(Main.parent, notes.substring(0, j));
    92             }
    93         }
    94         else
    95             JOptionPane.showMessageDialog(Main.parent, fn+": "+tr("Unknown file extension: {0}", fn.substring(file.getName().lastIndexOf('.')+1)));
    96     }
    97 
    98     private void openFileAsGpx(File file) throws SAXException, IOException, FileNotFoundException {
    99         String fn = file.getName();
    100         if (ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(fn)) {
    101             GpxReader r = null;
    102             InputStream is;
    103             if (file.getName().endsWith(".gpx.gz")) {
    104                 is = new GZIPInputStream(new FileInputStream(file));
    105             } else {
    106                 is = new FileInputStream(file);
    107             }
    108             // Workaround for SAX BOM bug
    109             // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6206835
    110             if(!((is.read()==0xef)&&(is.read()==0xbb)&&(is.read()==0xbf))) {
    111                 is.close();
    112                 if (file.getName().endsWith(".gpx.gz")) {
    113                     is = new GZIPInputStream(new FileInputStream(file));
    114                 } else {
    115                     is = new FileInputStream(file);
    116                 }
    117             }
    118             r = new GpxReader(is,file.getAbsoluteFile().getParentFile());
    119             r.data.storageFile = file;
    120             GpxLayer gpxLayer = new GpxLayer(r.data, fn, true);
    121             Main.main.addLayer(gpxLayer);
    122             if (Main.pref.getBoolean("marker.makeautomarkers", true)) {
    123                 MarkerLayer ml = new MarkerLayer(r.data, tr("Markers from {0}", fn), file, gpxLayer);
    124                 if (ml.data.size() > 0) {
    125                     Main.main.addLayer(ml);
    126                 }
    127             }
    128 
    129         } else {
    130             throw new IllegalStateException();
    131         }
    132     }
    133 
    134     private void showNmeaInfobox(boolean success, NmeaReader r) {
    135         String msg = tr("Coordinates imported: ") + r.getNumberOfCoordinates() + "\n" +
    136         tr("Malformed sentences: ") + r.getParserMalformed() + "\n" +
    137         tr("Checksum errors: ") + r.getParserChecksumErrors() + "\n";
    138         if(!success) // don't scare the user unneccessarily
    139             msg += tr("Unknown sentences: ") + r.getParserUnknown() + "\n";
    140         msg += tr("Zero coordinates: ") + r.getParserZeroCoordinates();
    141         if(success) {
    142             JOptionPane.showMessageDialog(
    143                 Main.parent, msg,
    144                 tr("NMEA import success"),JOptionPane.INFORMATION_MESSAGE);
    145         } else {
    146             JOptionPane.showMessageDialog(
    147                 Main.parent, msg,
    148                 tr("NMEA import faliure!"),JOptionPane.ERROR_MESSAGE);
    149         }
    150     }
    151 
    152     private void openFileAsNmea(File file) throws IOException, FileNotFoundException {
    153         String fn = file.getName();
    154         if (ExtensionFileFilter.filters[ExtensionFileFilter.NMEA].acceptName(fn)) {
    155             NmeaReader r = new NmeaReader(new FileInputStream(file), file.getAbsoluteFile().getParentFile());
    156             if(r.getNumberOfCoordinates()>0) {
    157                 r.data.storageFile = file;
    158                 GpxLayer gpxLayer = new GpxLayer(r.data, fn, true);
    159                 Main.main.addLayer(gpxLayer);
    160                 if (Main.pref.getBoolean("marker.makeautomarkers", true)) {
    161                     MarkerLayer ml = new MarkerLayer(r.data, tr("Markers from {0}", fn), file, gpxLayer);
    162                     if (ml.data.size() > 0) {
    163                         Main.main.addLayer(ml);
    164                     }
    165                 }
    166             }
    167             showNmeaInfobox(r.getNumberOfCoordinates()>0, r);
    168         } else {
    169             throw new IllegalStateException();
    170         }
    171     }
    172 
    173     private boolean asGpxData(String fn) {
    174         return ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(fn);
    175     }
    176 
    177     private boolean asNmeaData(String fn) {
    178         return ExtensionFileFilter.filters[ExtensionFileFilter.NMEA].acceptName(fn);
    179     }
    180 
    181 
    18259}
  • trunk/src/org/openstreetmap/josm/actions/SaveActionBase.java

    r1525 r1637  
    2222import org.openstreetmap.josm.gui.layer.Layer;
    2323import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     24import org.openstreetmap.josm.io.GpxImporter;
    2425import org.openstreetmap.josm.io.GpxWriter;
     26import org.openstreetmap.josm.io.OsmImporter;
    2527import org.openstreetmap.josm.io.OsmWriter;
    2628import org.openstreetmap.josm.tools.Shortcut;
     
    150152        File tmpFile = null;
    151153        try {
    152             if (ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(file.getPath())) {
     154            GpxImporter gpxImExporter = new GpxImporter();
     155            OsmImporter osmImExporter = new OsmImporter();
     156            if (gpxImExporter.acceptFile(file))
    153157                GpxExportAction.exportGpx(file, layer);
    154             } else if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(file.getPath())) {
     158            else if (osmImExporter.acceptFile(file)) {
    155159                // use a tmp file because if something errors out in the
    156160                // process of writing the file, we might just end up with
     
    194198        File tmpFile = null;
    195199        try {
    196             if (ExtensionFileFilter.filters[ExtensionFileFilter.GPX].acceptName(file.getPath())) {
     200            GpxImporter gpxImExporter = new GpxImporter();
     201            if (gpxImExporter.acceptFile(file)) {
    197202
    198203                // use a tmp file because if something errors out in the
Note: See TracChangeset for help on using the changeset viewer.