// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.globalsat; /// @author Raphael Mack <ramack@raphael-mack.de> import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.GraphicsEnvironment; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.io.IOException; import javax.swing.JDialog; import javax.swing.JOptionPane; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.JosmAction; import org.openstreetmap.josm.data.gpx.GpxData; import org.openstreetmap.josm.gui.PleaseWaitRunnable; import org.openstreetmap.josm.gui.layer.GpxLayer; import org.openstreetmap.josm.gui.progress.ProgressMonitor; import org.openstreetmap.josm.plugins.Plugin; import org.openstreetmap.josm.plugins.PluginInformation; import org.openstreetmap.josm.tools.Shortcut; import org.xml.sax.SAXException; import gnu.io.CommPortIdentifier; public class GlobalsatPlugin extends Plugin { private static GlobalsatDg100 device = null; public static GlobalsatDg100 dg100() { return device; } public static void setPortIdent(CommPortIdentifier port) { if (device != null) { device.disconnect(); } device = new GlobalsatDg100(port); } private static class ImportTask extends PleaseWaitRunnable { public GpxData data; public Exception eee; private boolean deleteAfter; ImportTask(boolean delete) { super(tr("Importing data from device.")); deleteAfter = delete; } @Override public void realRun() throws IOException, SAXException { progressMonitor.subTask(tr("Importing data from DG100...")); try { data = GlobalsatPlugin.dg100().readData(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, true)); } catch (Exception e) { eee = e; } } @Override protected void finish() { if (deleteAfter && GlobalsatPlugin.dg100().isCanceled() == false) { Main.pref.put("globalsat.deleteAfterDownload", true); try { GlobalsatPlugin.dg100().deleteData(); } catch (Exception ex) { JOptionPane.showMessageDialog(Main.parent, tr("Error deleting data.") + " " + ex.toString()); } } else { Main.pref.put("globalsat.deleteAfterDownload", false); } if (data != null && data.hasTrackPoints()) { Main.getLayerManager().addLayer(new GpxLayer(data, tr("imported data from {0}", "DG 100"))); Main.map.repaint(); } else { JOptionPane.showMessageDialog(Main.parent, tr("No data found on device.")); } if (eee != null) { eee.printStackTrace(); System.out.println(eee.getMessage()); JOptionPane.showMessageDialog(Main.parent, tr("Connection failed.") + " (" + eee.toString() + ")"); } GlobalsatPlugin.dg100().disconnect(); } @Override protected void cancel() { GlobalsatPlugin.dg100().cancel(); GlobalsatPlugin.dg100().disconnect(); } } GlobalsatImportAction importAction; public GlobalsatPlugin(PluginInformation info) { super(info); boolean error = false; try { CommPortIdentifier.getPortIdentifiers(); } catch (UnsatisfiedLinkError e) { error = true; // CHECKSTYLE.OFF: LineLength String msg = tr("Cannot load library rxtxSerial. If you need support to install it try Globalsat homepage at http://www.raphael-mack.de/josm-globalsat-gpx-import-plugin/"); // CHECKSTYLE.ON: LineLength Main.error(msg); if (!GraphicsEnvironment.isHeadless()) { JOptionPane.showMessageDialog(Main.parent, "<html>" + msg + "</html>"); } } if (!error) { importAction = new GlobalsatImportAction(); Main.main.menu.toolsMenu.add(importAction); } } class GlobalsatImportAction extends JosmAction { GlobalsatImportAction() { super(tr("Globalsat Import"), "globalsatImport", tr("Import Data from Globalsat Datalogger DG100 into GPX layer."), Shortcut.registerShortcut("menu:globalsatimport", tr("Menu: {0}", tr("Globalsat Import")), KeyEvent.VK_G, Shortcut.ALT_CTRL), false); } @Override public void actionPerformed(ActionEvent e) { GlobalsatImportDialog dialog = new GlobalsatImportDialog(); JOptionPane pane = new JOptionPane(dialog, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION); JDialog dlg = pane.createDialog(Main.parent, tr("Import")); dlg.setVisible(true); if (((Integer) pane.getValue()) == JOptionPane.OK_OPTION) { setPortIdent(dialog.getPort()); ImportTask task = new ImportTask(dialog.deleteFilesAfterDownload()); Main.worker.execute(task); } dlg.dispose(); } } }