X-Git-Url: http://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Fload%2FGpsLoader.java;h=2196e0c3ff29695a13ac72f8abdf3e8bf528dcea;hb=140e9d165f85c3d4f0435a311e091209313faa2a;hp=0d3d8f4dce06b697ba72088040c2470d314ae5fd;hpb=54b9d8bc8f0025ccf97a67d9dd217ef1f9cf082f;p=GpsPrune.git diff --git a/tim/prune/load/GpsLoader.java b/tim/prune/load/GpsLoader.java index 0d3d8f4..2196e0c 100644 --- a/tim/prune/load/GpsLoader.java +++ b/tim/prune/load/GpsLoader.java @@ -6,8 +6,12 @@ import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; import java.io.BufferedReader; +import java.io.File; import java.io.InputStreamReader; +import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.BoxLayout; @@ -20,19 +24,22 @@ import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JTextField; import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import tim.prune.App; -import tim.prune.Config; import tim.prune.ExternalTools; import tim.prune.GenericFunction; import tim.prune.I18nManager; +import tim.prune.config.Config; import tim.prune.data.Altitude; +import tim.prune.data.SourceInfo; import tim.prune.load.xml.XmlFileLoader; import tim.prune.load.xml.XmlHandler; +import tim.prune.save.GpxExporter; /** * Class to manage the loading of GPS data using GpsBabel @@ -43,8 +50,10 @@ public class GpsLoader extends GenericFunction implements Runnable private JDialog _dialog = null; private JTextField _deviceField = null, _formatField = null; private JCheckBox _waypointCheckbox = null, _trackCheckbox = null; + private JCheckBox _saveCheckbox = null; private JButton _okButton = null; private JProgressBar _progressBar = null; + private File _saveFile = null; private boolean _cancelled = false; @@ -68,7 +77,7 @@ public class GpsLoader extends GenericFunction implements Runnable public void begin() { // Check if gpsbabel looks like it's installed - if (_gpsBabelChecked || ExternalTools.isGpsbabelInstalled() + if (_gpsBabelChecked || ExternalTools.isToolInstalled(ExternalTools.TOOL_GPSBABEL) || JOptionPane.showConfirmDialog(_dialog, I18nManager.getText("dialog.gpsload.nogpsbabel"), I18nManager.getText(getNameKey()), @@ -109,12 +118,21 @@ public class GpsLoader extends GenericFunction implements Runnable JLabel deviceLabel = new JLabel(I18nManager.getText("dialog.gpsload.device")); deviceLabel.setHorizontalAlignment(SwingConstants.RIGHT); gridPanel.add(deviceLabel); - _deviceField = new JTextField(Config.getGpsDevice(), 12); + _deviceField = new JTextField(Config.getConfigString(Config.KEY_GPS_DEVICE), 12); + _deviceField.addKeyListener(new KeyAdapter() { + public void keyReleased(KeyEvent e) + { + // close dialog if escape pressed + if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { + _dialog.dispose(); + } + } + }); gridPanel.add(_deviceField); JLabel formatLabel = new JLabel(I18nManager.getText("dialog.gpsload.format")); formatLabel.setHorizontalAlignment(SwingConstants.RIGHT); gridPanel.add(formatLabel); - _formatField = new JTextField(Config.getGpsFormat(), 12); + _formatField = new JTextField(Config.getConfigString(Config.KEY_GPS_FORMAT), 12); gridPanel.add(_formatField); gridPanel.setAlignmentX(Component.CENTER_ALIGNMENT); gridPanel.setBorder(BorderFactory.createEmptyBorder(10, 5, 5, 20)); @@ -135,6 +153,11 @@ public class GpsLoader extends GenericFunction implements Runnable _trackCheckbox.addChangeListener(checkboxListener); _trackCheckbox.setAlignmentX(Component.CENTER_ALIGNMENT); mainPanel.add(_trackCheckbox); + // Checkbox for immediately saving to file + _saveCheckbox = new JCheckBox(I18nManager.getText("dialog.gpsload.save")); + _saveCheckbox.setAlignmentX(Component.CENTER_ALIGNMENT); + mainPanel.add(_saveCheckbox); + // progress bar (initially invisible) _progressBar = new JProgressBar(0, 10); mainPanel.add(_progressBar); @@ -199,14 +222,13 @@ public class GpsLoader extends GenericFunction implements Runnable if (_waypointCheckbox.isSelected() || _trackCheckbox.isSelected()) { _progressBar.setIndeterminate(true); + _saveFile = null; try { - callGpsBabel(_waypointCheckbox.isSelected(), _trackCheckbox.isSelected()); + callGpsBabel(); } catch (Exception e) { - // System.err.println("Error: " + e.getClass().getName()); - // System.err.println("Error: " + e.getMessage()); _app.showErrorMessageNoLookup(getNameKey(), e.getMessage()); _cancelled = true; } @@ -223,64 +245,127 @@ public class GpsLoader extends GenericFunction implements Runnable /** * Execute the call to gpsbabel and pass the results back to the app - * @param inWaypoints true to load waypoints - * @param inTracks true to load track points */ - private void callGpsBabel(boolean inWaypoints, boolean inTracks) throws Exception + private void callGpsBabel() throws Exception { // Set up command to call gpsbabel - String[] commands = null; - if (inWaypoints && inTracks) { - // Both waypoints and track points selected - commands = new String[] {"gpsbabel", "-w", "-t", "-i", _formatField.getText(), - "-f", _deviceField.getText(), "-o", "gpx", "-F", "-"}; - } - else - { - // Only waypoints OR track points selected - commands = new String[] {"gpsbabel", "-w", "-i", _formatField.getText(), - "-f", _deviceField.getText(), "-o", "gpx", "-F", "-"}; - if (inTracks) { - commands[1] = "-t"; - } - } + final String device = _deviceField.getText().trim(); + final String format = _formatField.getText().trim(); + String[] commands = getCommandArray(device, format); + // Save GPS settings in config + Config.setConfigString(Config.KEY_GPS_DEVICE, device); + Config.setConfigString(Config.KEY_GPS_FORMAT, format); - String errorMessage = ""; + String errorMessage = "", errorMessage2 = ""; XmlHandler handler = null; Process process = Runtime.getRuntime().exec(commands); + String line = null; - // Pass input stream to try to parse the xml - try + if (_saveFile != null) { - XmlFileLoader xmlLoader = new XmlFileLoader(_app); - SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser(); - saxParser.parse(process.getInputStream(), xmlLoader); - handler = xmlLoader.getHandler(); - if (handler == null) { - errorMessage = "Null handler"; + // data is being saved to file, so need to wait for it to finish + process.waitFor(); + // try to read error message, if any + try { + BufferedReader r = new BufferedReader(new InputStreamReader(process.getErrorStream())); + while ((line = r.readLine()) != null) { + errorMessage += line + "\n"; + } + // Close error stream + try { + r.close(); + } catch (Exception e) {} } + catch (Exception e) {} // couldn't get error message + + // Trigger it to be loaded by app + if (process.exitValue() == 0) + { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + ArrayList fileList = new ArrayList(); + fileList.add(_saveFile); + _app.loadDataFiles(fileList); + } + }); + } + else if (errorMessage.length() > 0) { + throw new Exception(errorMessage); + } + else throw new Exception(I18nManager.getText("error.gpsload.unknown")); } - catch (Exception e) { - errorMessage = e.getMessage(); - } + else + { + // Pass input stream to try to parse the xml + try + { + XmlFileLoader xmlLoader = new XmlFileLoader(_app); + SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser(); + saxParser.parse(process.getInputStream(), xmlLoader); + handler = xmlLoader.getHandler(); + if (handler == null) { + errorMessage = "Null handler"; + } + } + catch (Exception e) { + errorMessage = e.getMessage(); + } - // Read the error stream to see if there's a better error message there - BufferedReader r = new BufferedReader(new InputStreamReader(process.getErrorStream())); - String line = null; - String errorMessage2 = ""; - while ((line = r.readLine()) != null) { - errorMessage2 += line + "\n"; + // Read the error stream to see if there's a better error message there + BufferedReader r = new BufferedReader(new InputStreamReader(process.getErrorStream())); + while ((line = r.readLine()) != null) { + errorMessage2 += line + "\n"; + } + // Close error stream + try { + r.close(); + } catch (Exception e) {} + + if (errorMessage2.length() > 0) {errorMessage = errorMessage2;} + if (errorMessage.length() > 0) {throw new Exception(errorMessage);} + + // Send data back to app + _app.informDataLoaded(handler.getFieldArray(), handler.getDataArray(), Altitude.Format.METRES, + new SourceInfo(_deviceField.getText(), SourceInfo.FILE_TYPE.GPSBABEL), + handler.getTrackNameList()); } - // Close error stream - try { - r.close(); - } catch (Exception e) {} + } - if (errorMessage2.length() > 0) {errorMessage = errorMessage2;} - if (errorMessage.length() > 0) {throw new Exception(errorMessage);} - // Send data back to app - _app.informDataLoaded(handler.getFieldArray(), handler.getDataArray(), - Altitude.Format.METRES, _deviceField.getText()); + /** + * Get the commands to call + * @param inDevice device name to use + * @param inFormat format to use + * @return String array containing commands + */ + private String[] getCommandArray(String inDevice, String inFormat) + { + String[] commands = null; + final String command = Config.getConfigString(Config.KEY_GPSBABEL_PATH); + final boolean loadWaypoints = _waypointCheckbox.isSelected(); + final boolean loadTrack = _trackCheckbox.isSelected(); + if (loadWaypoints && loadTrack) { + // Both waypoints and track points selected + commands = new String[] {command, "-w", "-t", "-i", inFormat, + "-f", inDevice, "-o", "gpx", "-F", "-"}; + } + else + { + // Only waypoints OR track points selected + commands = new String[] {command, "-w", "-i", inFormat, + "-f", inDevice, "-o", "gpx", "-F", "-"}; + if (loadTrack) { + commands[1] = "-t"; + } + } + // Do we want to save the gpx straight to file? + if (_saveCheckbox.isSelected()) { + // Select file to save to + _saveFile = GpxExporter.chooseGpxFile(_parentFrame); + if (_saveFile != null) { + commands[commands.length-1] = _saveFile.getAbsolutePath(); + } + } + return commands; } }