source: subversion/applications/editors/josm/plugins/openvisible/src/at/dallermassl/josm/plugin/openvisible/OpenVisibleAction.java

Last change on this file was 34536, checked in by donvip, 8 months ago

update to JOSM 14153

  • Property svn:eol-style set to native
File size: 5.4 KB
Line 
1/**
2 *
3 */
4package at.dallermassl.josm.plugin.openvisible;
5
6import static org.openstreetmap.josm.tools.I18n.tr;
7
8import java.awt.Rectangle;
9import java.awt.event.ActionEvent;
10import java.awt.event.KeyEvent;
11import java.io.BufferedInputStream;
12import java.io.File;
13import java.io.FileInputStream;
14import java.io.FileNotFoundException;
15import java.io.IOException;
16import java.util.zip.GZIPInputStream;
17
18import javax.swing.JFileChooser;
19import javax.swing.JOptionPane;
20
21import org.openstreetmap.josm.actions.JosmAction;
22import org.openstreetmap.josm.data.coor.LatLon;
23import org.openstreetmap.josm.data.osm.DataSet;
24import org.openstreetmap.josm.gui.MainApplication;
25import org.openstreetmap.josm.gui.MapView;
26import org.openstreetmap.josm.gui.io.importexport.GpxImporter;
27import org.openstreetmap.josm.gui.io.importexport.OsmImporter;
28import org.openstreetmap.josm.gui.layer.GpxLayer;
29import org.openstreetmap.josm.gui.layer.OsmDataLayer;
30import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
31import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
32import org.openstreetmap.josm.io.GpxReader;
33import org.openstreetmap.josm.io.IllegalDataException;
34import org.openstreetmap.josm.io.OsmReader;
35import org.openstreetmap.josm.tools.Logging;
36import org.openstreetmap.josm.tools.Shortcut;
37import org.xml.sax.SAXException;
38
39/**
40 * @author cdaller
41 *
42 */
43public class OpenVisibleAction extends JosmAction {
44    private File lastDirectory;
45
46    public OpenVisibleAction() {
47        super(tr("Open Visible..."), "openvisible",
48        tr("Open only files that are visible in current view."),
49        Shortcut.registerShortcut("tools:openvisible", tr("Menu: {0}", tr("Open Visible...")),
50        KeyEvent.VK_I, Shortcut.ALT_CTRL_SHIFT), true);
51    }
52
53    /* (non-Javadoc)
54     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
55     */
56    @Override
57    public void actionPerformed(ActionEvent event) {
58        if(!MainApplication.isDisplayingMapView()) {
59            JOptionPane.showMessageDialog(MainApplication.getMainFrame(), tr("No view open - cannot determine boundaries!"));
60            return;
61        }
62        MapView view = MainApplication.getMap().mapView;
63        Rectangle bounds = view.getBounds();
64        LatLon bottomLeft = view.getLatLon(bounds.x, bounds.y + bounds.height);
65        LatLon topRight = view.getLatLon(bounds.x + bounds.width, bounds.y);
66
67        System.err.println("FileFind Bounds: " + bottomLeft + " to " + topRight);
68
69        JFileChooser fileChooser;
70        if(lastDirectory != null) {
71            fileChooser = new JFileChooser(lastDirectory);
72        } else {
73            fileChooser = new JFileChooser();
74        }
75        fileChooser.setMultiSelectionEnabled(true);
76        fileChooser.showOpenDialog(MainApplication.getMainFrame());
77        File[] files = fileChooser.getSelectedFiles();
78        lastDirectory = fileChooser.getCurrentDirectory();
79
80        for(File file : files) {
81            try {
82                OsmGpxBounds parser = new OsmGpxBounds();
83                parser.parse(new BufferedInputStream(new FileInputStream(file)));
84                if(parser.intersects(bottomLeft.lat(), topRight.lat(), bottomLeft.lon(), topRight.lon())) {
85                    System.out.println(file.getAbsolutePath()); // + "," + parser.minLat + "," + parser.maxLat + "," + parser.minLon + "," + parser.maxLon);
86                    if(file.getName().endsWith("osm")) {
87                        openAsData(file);
88                    } else if(file.getName().endsWith("gpx")) {
89                        openFileAsGpx(file);
90                    }
91
92                }
93            } catch (IOException | SAXException | IllegalDataException e) {
94                Logging.error(e);
95            }
96        }
97    }
98
99    private void openAsData(File file) throws SAXException, IOException, FileNotFoundException, IllegalDataException {
100        String fn = file.getName();
101        if (new OsmImporter().acceptFile(file)) {
102            DataSet dataSet = OsmReader.parseDataSet(new FileInputStream(file), NullProgressMonitor.INSTANCE);
103            OsmDataLayer layer = new OsmDataLayer(dataSet, fn, file);
104            MainApplication.getLayerManager().addLayer(layer);
105        }
106        else
107            JOptionPane.showMessageDialog(MainApplication.getMainFrame(), fn+": "+tr("Unknown file extension: {0}", fn.substring(fn.lastIndexOf('.')+1)));
108    }
109
110    private void openFileAsGpx(File file) throws SAXException, IOException, FileNotFoundException {
111        String fn = file.getName();
112        if (new GpxImporter().acceptFile(file)) {
113            GpxReader r = null;
114            if (file.getName().endsWith(".gpx.gz")) {
115                r = new GpxReader(new GZIPInputStream(new FileInputStream(file)));
116            } else{
117                r = new GpxReader(new FileInputStream(file));
118            }
119            if (!r.parse(true)) {
120                // input was not properly parsed, abort
121                JOptionPane.showMessageDialog(MainApplication.getMainFrame(), tr("Parsing file \"{0}\" failed", file));
122                throw new IllegalStateException();
123            }
124            r.getGpxData().storageFile = file;
125            GpxLayer gpxLayer = new GpxLayer(r.getGpxData(), fn);
126            MainApplication.getLayerManager().addLayer(gpxLayer);
127            MainApplication.getLayerManager().addLayer(new MarkerLayer(r.getGpxData(), tr("Markers from {0}", fn), file, gpxLayer));
128
129        } else {
130            throw new IllegalStateException();
131        }
132    }
133}
Note: See TracBrowser for help on using the repository browser.