package tim.prune.load; import java.awt.BorderLayout; import java.awt.Component; 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 javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JProgressBar; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import tim.prune.App; import tim.prune.I18nManager; import tim.prune.config.Config; import tim.prune.data.SourceInfo; import tim.prune.data.SourceInfo.FILE_TYPE; import tim.prune.load.babel.BabelFilterPanel; /** * Class to manage the loading of data from a GPS device using GpsBabel */ public class BabelLoadFromGps extends BabelLoader { // Text fields for entering device and format private JTextField _deviceField = null, _formatField = null; /** * Constructor * @param inApp Application object to inform of data load */ public BabelLoadFromGps(App inApp) { super(inApp); } /** Get the name key */ public String getNameKey() { return "function.loadfromgps"; } /** @return device name as file path */ protected String getFilePath() { return _deviceField.getText(); } /** @return Source info */ protected SourceInfo getSourceInfo() { return new SourceInfo(_deviceField.getText(), FILE_TYPE.GPSBABEL); } /** @return input format */ protected String getInputFormat() { return _formatField.getText(); } /** @return true if function can be run */ protected boolean isInputOk() { return _waypointCheckbox.isSelected() || _trackCheckbox.isSelected(); } /** * @return a panel containing the main dialog components */ protected JPanel makeDialogComponents() { JPanel outerPanel = new JPanel(); outerPanel.setLayout(new BorderLayout()); // Main panel with options etc JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); // text fields for options JPanel gridPanel = new JPanel(); gridPanel.setLayout(new GridLayout(0, 2, 10, 3)); JLabel deviceLabel = new JLabel(I18nManager.getText("dialog.gpsload.device")); deviceLabel.setHorizontalAlignment(SwingConstants.RIGHT); gridPanel.add(deviceLabel); _deviceField = new JTextField(Config.getConfigString(Config.KEY_GPS_DEVICE), 12); KeyAdapter escapeListener = new KeyAdapter() { public void keyReleased(KeyEvent e) { // close dialog if escape pressed if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { _dialog.dispose(); } } }; _deviceField.addKeyListener(escapeListener); gridPanel.add(_deviceField); JLabel formatLabel = new JLabel(I18nManager.getText("dialog.gpsload.format")); formatLabel.setHorizontalAlignment(SwingConstants.RIGHT); gridPanel.add(formatLabel); _formatField = new JTextField(Config.getConfigString(Config.KEY_GPS_FORMAT), 12); _formatField.addKeyListener(escapeListener); gridPanel.add(_formatField); gridPanel.setAlignmentX(Component.CENTER_ALIGNMENT); gridPanel.setBorder(BorderFactory.createEmptyBorder(10, 5, 5, 20)); mainPanel.add(gridPanel); // checkboxes ChangeListener checkboxListener = new ChangeListener() { public void stateChanged(ChangeEvent e) { enableOkButton(); } }; _waypointCheckbox = new JCheckBox(I18nManager.getText("dialog.gpsload.getwaypoints"), true); _waypointCheckbox.addChangeListener(checkboxListener); _waypointCheckbox.setAlignmentX(Component.CENTER_ALIGNMENT); mainPanel.add(_waypointCheckbox); _trackCheckbox = new JCheckBox(I18nManager.getText("dialog.gpsload.gettracks"), true); _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); // Filter panel _filterPanel = new BabelFilterPanel(_parentFrame); // Give filter panel the contents of the config String filter = Config.getConfigString(Config.KEY_GPSBABEL_FILTER); if (filter != null) { _filterPanel.setFilterString(filter); } mainPanel.add(_filterPanel); // progress bar (initially invisible) _progressBar = new JProgressBar(0, 10); mainPanel.add(_progressBar); outerPanel.add(mainPanel, BorderLayout.NORTH); // Lower panel with ok and cancel buttons JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new FlowLayout(FlowLayout.RIGHT)); _okButton = new JButton(I18nManager.getText("button.ok")); ActionListener okListener = new ActionListener() { public void actionPerformed(ActionEvent e) { // start thread to call gpsbabel _cancelled = false; new Thread(BabelLoadFromGps.this).start(); } }; _okButton.addActionListener(okListener); _deviceField.addActionListener(okListener); _formatField.addActionListener(okListener); buttonPanel.add(_okButton); JButton cancelButton = new JButton(I18nManager.getText("button.cancel")); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { _cancelled = true; _dialog.dispose(); } }); buttonPanel.add(cancelButton); outerPanel.add(buttonPanel, BorderLayout.SOUTH); return outerPanel; } /** * Save GPS settings in config */ protected void saveConfigValues() { final String device = _deviceField.getText().trim(); final String format = _formatField.getText().trim(); final String filter = _filterPanel.getFilterString(); Config.setConfigString(Config.KEY_GPS_DEVICE, device); Config.setConfigString(Config.KEY_GPS_FORMAT, format); Config.setConfigString(Config.KEY_GPSBABEL_FILTER, filter); } }