X-Git-Url: https://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Fload%2FTextFileLoader.java;h=440a56f7411a177beaa31e2b63353146d5a09c5a;hb=140e9d165f85c3d4f0435a311e091209313faa2a;hp=b6926311a60f1f79ff0ec024c3808ca247e4370f;hpb=5625a1abadb5f2ca5f017fe7dbda1d5141cb637b;p=GpsPrune.git diff --git a/tim/prune/load/TextFileLoader.java b/tim/prune/load/TextFileLoader.java index b692631..440a56f 100644 --- a/tim/prune/load/TextFileLoader.java +++ b/tim/prune/load/TextFileLoader.java @@ -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 @@ -364,7 +380,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 +443,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 +483,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 +493,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