--- /dev/null
+package tim.prune.load;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+
+import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JProgressBar;
+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.gui.GuiGridLayout;
+import tim.prune.load.babel.BabelFilterPanel;
+
+
+/**
+ * Class to manage the loading of data from a file using GpsBabel.
+ * This allows the use of Gpsbabel's importing functions to convert to gpx.
+ */
+public class BabelLoadFromFile extends BabelLoader
+{
+ // file chooser
+ private JFileChooser _fileChooser = null;
+ // Input file
+ private File _inputFile = null;
+ // Label for filename
+ private JLabel _inputFileLabel = null;
+ // Dropdown for format of file
+ private JComboBox<String> _formatDropdown = null;
+ // Last used file suffix
+ private String _lastSuffix = null;
+
+ /**
+ * Constructor
+ * @param inApp Application object to inform of data load
+ */
+ public BabelLoadFromFile(App inApp) {
+ super(inApp);
+ }
+
+ /** Get the name key */
+ public String getNameKey() {
+ return "function.importwithgpsbabel";
+ }
+
+ /** @return complete input file path for gpsbabel call */
+ protected String getFilePath() {
+ return _inputFile.getAbsolutePath();
+ }
+
+ /** @return Source info */
+ protected SourceInfo getSourceInfo() {
+ return new SourceInfo(_inputFile, FILE_TYPE.GPSBABEL);
+ }
+
+ /** @return input format */
+ protected String getInputFormat() {
+ return BabelFileFormats.getFormat(_formatDropdown.getSelectedIndex());
+ }
+
+ /** @return true if function can be run */
+ protected boolean isInputOk() {
+ return _inputFile.exists() && _inputFile.canRead();
+ }
+
+ /**
+ * Override the begin method to specify input file first
+ */
+ public void begin()
+ {
+ // Construct file chooser if necessary
+ if (_fileChooser == null)
+ {
+ _fileChooser = new JFileChooser();
+ // start from directory in config if already set
+ String configDir = Config.getConfigString(Config.KEY_TRACK_DIR);
+ if (configDir == null) {configDir = Config.getConfigString(Config.KEY_PHOTO_DIR);}
+ if (configDir != null) {_fileChooser.setCurrentDirectory(new File(configDir));}
+ _fileChooser.setMultiSelectionEnabled(false); // Single files only
+ }
+ // Show the open dialog
+ if (_fileChooser.showOpenDialog(_parentFrame) == JFileChooser.APPROVE_OPTION)
+ {
+ _inputFile = _fileChooser.getSelectedFile();
+ if (_inputFile != null && isInputOk()) {
+ super.begin();
+ }
+ }
+ }
+
+ /**
+ * Begin the load function with a previously-specified file
+ * @param inFile file to load
+ */
+ public void beginWithFile(File inFile)
+ {
+ _inputFile = inFile;
+ super.begin();
+ }
+
+ /**
+ * @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();
+ GuiGridLayout grid = new GuiGridLayout(gridPanel);
+ JLabel nameLabel = new JLabel(I18nManager.getText("details.track.file"));
+ grid.add(nameLabel);
+ _inputFileLabel = new JLabel("------------");
+ grid.add(_inputFileLabel);
+ JLabel formatLabel = new JLabel(I18nManager.getText("dialog.gpsload.format"));
+ grid.add(formatLabel);
+ _formatDropdown = new JComboBox<String>(BabelFileFormats.getDescriptions());
+ grid.add(_formatDropdown);
+ 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(BabelLoadFromFile.this).start();
+ }
+ };
+ _okButton.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;
+ }
+
+ /**
+ * @return the suffix of the selected filename
+ */
+ private String getSelectedSuffix()
+ {
+ String filename = _inputFile.getName();
+ if (filename == null) {return "";}
+ int dotPos = filename.lastIndexOf('.');
+ return (dotPos > 0 ? filename.substring(dotPos) : "");
+ }
+
+ /**
+ * Initialise dialog
+ */
+ protected void initDialog()
+ {
+ _inputFileLabel.setText(_inputFile.getName());
+ // Get suffix of filename and compare with previous one
+ String suffix = getSelectedSuffix();
+ if (_lastSuffix == null || !suffix.equalsIgnoreCase(_lastSuffix))
+ {
+ // New suffix has been chosen, so select first appropriate format (if any)
+ int selIndex = BabelFileFormats.getIndexForFileSuffix(suffix);
+ if (selIndex < 0)
+ {
+ // Use the previous one from the Config (if any)
+ selIndex = Config.getConfigInt(Config.KEY_IMPORT_FILE_FORMAT);
+ }
+ if (selIndex >= 0) {
+ _formatDropdown.setSelectedIndex(selIndex);
+ }
+ }
+ _lastSuffix = suffix;
+ }
+
+ /**
+ * Save settings in config
+ */
+ protected void saveConfigValues()
+ {
+ // Save the filter string, clear it if it's now blank
+ final String filter = _filterPanel.getFilterString();
+ Config.setConfigString(Config.KEY_GPSBABEL_FILTER, filter);
+
+ // Check if there is a standard file type for the selected suffix
+ int selIndex = BabelFileFormats.getIndexForFileSuffix(getSelectedSuffix());
+ // If there is none, then get the index which the user chose and set in the Config
+ if (selIndex < 0) {
+ Config.setConfigInt(Config.KEY_IMPORT_FILE_FORMAT, _formatDropdown.getSelectedIndex());
+ }
+ }
+}