]> gitweb.fperrin.net Git - GpsPrune.git/blobdiff - tim/prune/load/TextFileLoader.java
Version 14, October 2012
[GpsPrune.git] / tim / prune / load / TextFileLoader.java
index b6926311a60f1f79ff0ec024c3808ca247e4370f..1f88012807485d8010f387947bb00d9621375a03 100644 (file)
@@ -8,6 +8,9 @@ import java.awt.FlowLayout;
 import java.awt.GridLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
 import javax.swing.*;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
@@ -21,6 +24,7 @@ import tim.prune.App;
 import tim.prune.I18nManager;
 import tim.prune.data.Altitude;
 import tim.prune.data.Field;
+import tim.prune.data.SourceInfo;
 
 
 /**
@@ -54,7 +58,7 @@ public class TextFileLoader
        // previously selected values
        private char _lastUsedDelimiter = ',';
        private Field[] _lastSelectedFields = null;
-       private int _lastAltitudeFormat = Altitude.FORMAT_NONE;
+       private Altitude.Format _lastAltitudeFormat = Altitude.Format.NO_FORMAT;
 
        // constants
        private static final int SNIPPET_SIZE = 6;
@@ -99,8 +103,8 @@ public class TextFileLoader
 
 
        /**
-        * Open the selected file and show the GUI dialog
-        * to select load options
+        * Open the selected file and show the GUI dialog to select load options
+        * @param inFile file to open
         */
        public void openFile(File inFile)
        {
@@ -109,7 +113,14 @@ public class TextFileLoader
                {
                        _dialog = new JDialog(_parentFrame, I18nManager.getText("dialog.openoptions.title"), true);
                        _dialog.setLocationRelativeTo(_parentFrame);
-                       _dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+                       _dialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
+                       // add closing listener
+                       _dialog.addWindowListener(new WindowAdapter() {
+                               public void windowClosing(WindowEvent e) {
+                                       _dialog.dispose();
+                                       _app.informNoDataLoaded();
+                               }
+                       });
                        _dialog.getContentPane().add(makeDialogComponents());
 
                        // select best separator according to row counts (more is better)
@@ -122,12 +133,12 @@ public class TextFileLoader
                                _delimiterRadios[_delimiterRadios.length-1].setSelected(true);
                        informDelimiterSelected();
                        _dialog.pack();
-                       _dialog.show();
+                       _dialog.setVisible(true);
                }
-               else
-               {
-                       JOptionPane.showMessageDialog(_parentFrame, I18nManager.getText("error.load.noread"),
-                               I18nManager.getText("error.load.dialogtitle"), JOptionPane.ERROR_MESSAGE);
+               else {
+                       // Didn't pass pre-check
+                       _app.showErrorMessage("error.load.dialogtitle", "error.load.noread");
+                       _app.informNoDataLoaded();
                }
        }
 
@@ -256,6 +267,7 @@ public class TextFileLoader
                        public void actionPerformed(ActionEvent e)
                        {
                                _dialog.dispose();
+                               _app.informNoDataLoaded();
                        }
                });
                buttonPanel.add(cancelButton);
@@ -267,6 +279,7 @@ public class TextFileLoader
                _cardPanel.setLayout(_layout);
                JPanel firstCard = new JPanel();
                firstCard.setLayout(new BorderLayout());
+               firstCard.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 15));
 
                JPanel delimsPanel = new JPanel();
                delimsPanel.setLayout(new GridLayout(0, 2));
@@ -310,15 +323,18 @@ public class TextFileLoader
                // Second screen, for field order selection
                JPanel secondCard = new JPanel();
                secondCard.setLayout(new BorderLayout());
+               secondCard.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 15));
                // table for file contents
                _fileExtractTableModel = new FileExtractTableModel();
                JTable extractTable = new JTable(_fileExtractTableModel);
                JScrollPane tableScrollPane = new JScrollPane(extractTable);
                extractTable.setPreferredScrollableViewportSize(new Dimension(350, 80));
                extractTable.getTableHeader().setReorderingAllowed(false);
-               secondCard.add(makeLabelledPanel("dialog.openoptions.tabledesc", tableScrollPane), BorderLayout.NORTH);
+               secondCard.add(makeLabelledPanel("dialog.openoptions.filesnippet", tableScrollPane), BorderLayout.NORTH);
                JPanel innerPanel2 = new JPanel();
                innerPanel2.setLayout(new BorderLayout());
+               innerPanel2.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
+
                _fieldTable = new JTable(new FieldSelectionTableModel());
                _fieldTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                // add listener for selected table row
@@ -334,11 +350,9 @@ public class TextFileLoader
                                        }
                                }
                        });
-               JPanel tablePanel = new JPanel();
-               tablePanel.setLayout(new BorderLayout());
-               tablePanel.add(_fieldTable.getTableHeader(), BorderLayout.NORTH);
-               tablePanel.add(_fieldTable, BorderLayout.CENTER);
-               innerPanel2.add(tablePanel, BorderLayout.CENTER);
+               JScrollPane lowerTablePane = new JScrollPane(_fieldTable);
+               lowerTablePane.setPreferredSize(new Dimension(300, 100));
+               innerPanel2.add(lowerTablePane, BorderLayout.CENTER);
 
                JPanel innerPanel3 = new JPanel();
                innerPanel3.setLayout(new BoxLayout(innerPanel3, BoxLayout.Y_AXIS));
@@ -364,7 +378,16 @@ public class TextFileLoader
                        }
                });
                innerPanel3.add(_moveDownButton);
-               innerPanel3.add(Box.createVerticalStrut(70));
+               innerPanel3.add(Box.createVerticalStrut(60));
+               JButton guessButton = new JButton(I18nManager.getText("button.guessfields"));
+               guessButton.addActionListener(new ActionListener() {
+                       public void actionPerformed(ActionEvent e)
+                       {
+                               _lastSelectedFields = null;
+                               prepareSecondPanel();
+                       }
+               });
+               innerPanel3.add(guessButton);
 
                innerPanel2.add(innerPanel3, BorderLayout.EAST);
                secondCard.add(innerPanel2, BorderLayout.CENTER);
@@ -418,7 +441,7 @@ public class TextFileLoader
                                {
                                        fields = _delimiterInfos[i].getMaxFields();
                                        _statusLabel.setText("" + numRecords + " " + I18nManager.getText("dialog.openoptions.deliminfo.records")
-                                               + fields + " " + I18nManager.getText("dialog.openoptions.deliminfo.fields"));
+                                               + " " + fields + " " + I18nManager.getText("dialog.openoptions.deliminfo.fields"));
                                }
                        }
                }
@@ -458,11 +481,8 @@ public class TextFileLoader
                FileSplitter splitter = new FileSplitter(_fileCacher);
                // Check info makes sense - num fields > 0, num records > 0
                // set "Finished" button to disabled if not ok
-               // TODO: Work out if there are header rows or not, save?
-               // Try to match header rows with fields
-               // Try to match data with fields
                // Add data to GUI elements
-               Object[][] tableData = splitter.splitFieldData(info.getDelimiter());
+               String[][] tableData = splitter.splitFieldData(info.getDelimiter());
                // possible to ignore blank columns here
                _currentDelimiter = info.getDelimiter();
                _fileExtractTableModel.updateData(tableData);
@@ -471,23 +491,30 @@ public class TextFileLoader
                // Check number of fields and use last ones if count matches
                Field[] startFieldArray = null;
                if (_lastSelectedFields != null && splitter.getNumColumns() == _lastSelectedFields.length)
+               {
                        startFieldArray = _lastSelectedFields;
+               }
                else
-                       startFieldArray = splitter.makeDefaultFields();
+               {
+                       // Take first full row of file and use it to guess fields
+                       startFieldArray = FieldGuesser.guessFields(splitter.getFirstFullRow());
+               }
+
                _fieldTableModel.updateData(startFieldArray);
                _fieldTable.setModel(_fieldTableModel);
                // add dropdowns to second column
                JComboBox fieldTypesBox = new JComboBox();
-               for (int i=0; i<Field.ALL_AVAILABLE_FIELDS.length; i++)
+               String[] fieldNames = Field.getFieldNames();
+               for (int i=0; i<fieldNames.length; i++)
                {
-                       fieldTypesBox.addItem(Field.ALL_AVAILABLE_FIELDS[i].getName());
+                       fieldTypesBox.addItem(fieldNames[i]);
                }
                _fieldTable.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(fieldTypesBox));
 
                // Set altitude format to same as last time if available
-               if (_lastAltitudeFormat == Altitude.FORMAT_METRES)
+               if (_lastAltitudeFormat == Altitude.Format.METRES)
                        _unitsDropDown.setSelectedIndex(0);
-               else if (_lastAltitudeFormat == Altitude.FORMAT_FEET)
+               else if (_lastAltitudeFormat == Altitude.Format.FEET)
                        _unitsDropDown.setSelectedIndex(1);
                // no selection on field list
                selectField(-1);
@@ -502,16 +529,16 @@ public class TextFileLoader
                // Save delimiter, field array and altitude format for later use
                _lastUsedDelimiter = _currentDelimiter;
                _lastSelectedFields = _fieldTableModel.getFieldArray();
-               int altitudeFormat = Altitude.FORMAT_METRES;
+               Altitude.Format altitudeFormat = Altitude.Format.METRES;
                if (_unitsDropDown.getSelectedIndex() == 1)
                {
-                       altitudeFormat = Altitude.FORMAT_FEET;
+                       altitudeFormat = Altitude.Format.FEET;
                }
                _lastAltitudeFormat = altitudeFormat;
                // give data to App
+               SourceInfo sourceInfo = new SourceInfo(_file, SourceInfo.FILE_TYPE.TEXT);
                _app.informDataLoaded(_fieldTableModel.getFieldArray(),
-                       _fileExtractTableModel.getData(), altitudeFormat,
-                       _file.getName());
+                       _fileExtractTableModel.getData(), altitudeFormat, sourceInfo, null);
                // clear up file cacher
                _fileCacher.clear();
                // dispose of dialog