/** * Evaluates the page * * <p>This checks whether the current settings on the page make any sense. If everything is fine, * the settings are being put into the appropriate data container {@link ImportWizardModel} and * the current page is marked as complete by invoking {@link #setPageComplete(boolean)}. Otherwise * an error message is set, which will make sure the user is informed about the reason for the * error. */ private void evaluatePage() { setPageComplete(false); setErrorMessage(null); tablePreview.setVisible(false); if (comboLocation.getText().equals("")) { // $NON-NLS-1$ return; } try { if (!customLinebreak) { detectLinebreak(); comboLinebreak.select(selectedLinebreak); } if (!customDelimiter) { detectDelimiter(); comboDelimiter.select(selectedDelimiter); } readPreview(); } catch (IOException | IllegalArgumentException e) { setErrorMessage(e.getMessage()); return; } catch (TextParsingException e) { setErrorMessage(Resources.getMessage("ImportWizardPageCSV.16")); // $NON-NLS-1$ return; } catch (RuntimeException e) { if (e.getCause() != null) { setErrorMessage(e.getCause().getMessage()); } else { setErrorMessage(e.getMessage()); } return; } /* Put data into container */ ImportWizardModel data = wizardImport.getData(); data.setWizardColumns(wizardColumns); data.setPreviewData(previewData); data.setFirstRowContainsHeader(btnContainsHeader.getSelection()); data.setFileLocation(comboLocation.getText()); data.setCsvDelimiter(delimiters[selectedDelimiter]); data.setCsvQuote(quotes[selectedQuote]); data.setCsvEscape(escapes[selectedEscape]); data.setCharset( Charsets.getCharsetForName(Charsets.getNamesOfAvailableCharsets()[selectedCharset])); data.setCsvLinebreak( CSVSyntax.getLinebreakForLabel(CSVSyntax.getAvailableLinebreaks()[selectedLinebreak])); /* Mark page as completed */ setPageComplete(true); }
/** * Reads in preview data * * <p>This goes through up to {@link ImportWizardModel#PREVIEW_MAX_LINES} lines within the * appropriate file and reads them in. It uses {@link ImportAdapter} in combination with {@link * ImportConfigurationCSV} to actually read in the data. * * @throws IOException Signals that an I/O exception has occurred. */ private void readPreview() throws IOException { /* Reset preview data */ previewData.clear(); /* Parameters from the user interface */ final String location = comboLocation.getText(); final char delimiter = delimiters[selectedDelimiter]; final char[] linebreak = CSVSyntax.getLinebreakForLabel(CSVSyntax.getAvailableLinebreaks()[selectedLinebreak]); final char quote = quotes[selectedQuote]; final char escape = escapes[selectedEscape]; final boolean containsHeader = btnContainsHeader.getSelection(); final Charset charset = Charsets.getCharsetForName(Charsets.getNamesOfAvailableCharsets()[selectedCharset]); /* Variables needed for processing */ final CSVDataInput in = new CSVDataInput(location, charset, delimiter, quote, escape, linebreak); final Iterator<String[]> it = in.iterator(); final String[] firstLine; wizardColumns = new ArrayList<ImportWizardModelColumn>(); ImportConfigurationCSV config = new ImportConfigurationCSV( location, charset, delimiter, quote, escape, linebreak, containsHeader); /* Check whether there is at least one line in file and retrieve it */ if (it.hasNext()) { firstLine = it.next(); } else { in.close(); throw new IOException(Resources.getMessage("ImportWizardPageCSV.17")); // $NON-NLS-1$ } /* Iterate over columns and add it to {@link #allColumns} */ for (int i = 0; i < firstLine.length; i++) { ImportColumn column = new ImportColumnCSV(i, DataType.STRING); ImportWizardModelColumn wizardColumn = new ImportWizardModelColumn(column); wizardColumns.add(wizardColumn); config.addColumn(column); } /* Create adapter to import data with given configuration */ ImportAdapter importAdapter = ImportAdapter.create(config); /* Get up to {ImportData#previewDataMaxLines} lines for previewing */ int count = 0; while (importAdapter.hasNext() && (count <= ImportWizardModel.PREVIEW_MAX_LINES)) { previewData.add(importAdapter.next()); count++; } in.close(); /* Remove first entry as it always contains name of columns */ previewData.remove(0); /* Check whether there is actual any data */ if (previewData.size() == 0) { throw new IOException(Resources.getMessage("ImportWizardPageCSV.18")); // $NON-NLS-1$ } /* * Show preview in appropriate table */ /* Disable redrawing once redesign is finished */ tablePreview.setRedraw(false); /* Remove all of the old columns */ while (tablePreview.getColumnCount() > 0) { tablePreview.getColumns()[0].dispose(); } /* Add new columns */ for (ImportWizardModelColumn column : wizardColumns) { TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewerPreview, SWT.NONE); tableViewerColumn.setLabelProvider( new CSVColumnLabelProvider(((ImportColumnCSV) column.getColumn()).getIndex())); TableColumn tableColumn = tableViewerColumn.getColumn(); tableColumn.setWidth(100); if (btnContainsHeader.getSelection()) { tableColumn.setText(column.getColumn().getAliasName()); tableColumn.setToolTipText( Resources.getMessage("ImportWizardPageCSV.19") + ((ImportColumnCSV) column.getColumn()).getIndex()); // $NON-NLS-1$ } ColumnViewerToolTipSupport.enableFor(tableViewerPreview, ToolTip.NO_RECREATE); } /* Setup preview table */ tableViewerPreview.setInput(previewData); tablePreview.setHeaderVisible(btnContainsHeader.getSelection()); tablePreview.setVisible(true); tablePreview.layout(); tablePreview.setRedraw(true); }
/** * Creates the design of this page * * <p>This adds all the controls to the page along with their listeners. * * @param parent the parent * @note {@link #tablePreview} is not visible until a file is loaded. */ public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NULL); setControl(container); container.setLayout(new GridLayout(3, false)); /* Location label */ lblLocation = new Label(container, SWT.NONE); lblLocation.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblLocation.setText(Resources.getMessage("ImportWizardPageCSV.7")); // $NON-NLS-1$ /* Combo box for selection of file */ comboLocation = new Combo(container, SWT.READ_ONLY); comboLocation.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); comboLocation.addSelectionListener( new SelectionAdapter() { /** Resets {@link customSeparator} and evaluates page */ @Override public void widgetSelected(SelectionEvent arg0) { /* Make widgets visible */ lblDelimiter.setVisible(true); comboDelimiter.setVisible(true); lblQuote.setVisible(true); comboQuote.setVisible(true); lblLinebreak.setVisible(true); comboLinebreak.setVisible(true); lblEscape.setVisible(true); lblCharset.setVisible(true); comboCharset.setVisible(true); comboEscape.setVisible(true); btnContainsHeader.setVisible(true); customDelimiter = false; customLinebreak = false; evaluatePage(); } }); /* Button to open file selection dialog */ btnChoose = new Button(container, SWT.NONE); btnChoose.setText(Resources.getMessage("ImportWizardPageCSV.8")); // $NON-NLS-1$ btnChoose.addSelectionListener( new SelectionAdapter() { /** * Opens a file selection dialog for CSV files * * <p>If a valid CSV file was selected, it is added to {@link #comboLocation} when it * wasn't already there. It is then preselected within {@link #comboLocation} and the page * is evaluated {@see #evaluatePage}. */ @Override public void widgetSelected(SelectionEvent arg0) { /* Open file dialog */ final String path = wizardImport .getController() .actionShowOpenFileDialog(getShell(), "*.csv"); // $NON-NLS-1$ if (path == null) { return; } /* Check whether path was already added */ if (comboLocation.indexOf(path) == -1) { comboLocation.add(path, 0); } /* Select path and notify comboLocation about change */ comboLocation.select(comboLocation.indexOf(path)); comboLocation.notifyListeners(SWT.Selection, null); } }); /* Delimiter label */ lblCharset = new Label(container, SWT.NONE); lblCharset.setVisible(false); lblCharset.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblCharset.setText(Resources.getMessage("ImportWizardPageCSV.20")); // $NON-NLS-1$ /* Delimiter combobox */ comboCharset = new Combo(container, SWT.READ_ONLY); comboCharset.setVisible(false); /* Add labels */ int index = 0; for (final String s : Charsets.getNamesOfAvailableCharsets()) { comboCharset.add(s); if (s.equals(Charsets.getNameOfDefaultCharset())) { selectedCharset = index; } index++; } comboCharset.select(selectedCharset); comboCharset.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); comboCharset.addSelectionListener( new SelectionAdapter() { /** Set selection index and customDelimiter and (re-)evaluates page */ @Override public void widgetSelected(final SelectionEvent arg0) { selectedCharset = comboCharset.getSelectionIndex(); evaluatePage(); } }); /* Place holder */ new Label(container, SWT.NONE); /* Delimiter label */ lblDelimiter = new Label(container, SWT.NONE); lblDelimiter.setVisible(false); lblDelimiter.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblDelimiter.setText(Resources.getMessage("ImportWizardPageCSV.10")); // $NON-NLS-1$ /* Delimiter combobox */ comboDelimiter = new Combo(container, SWT.READ_ONLY); comboDelimiter.setVisible(false); /* Add labels */ for (final String s : labels) { comboDelimiter.add(s); } comboDelimiter.select(selectedDelimiter); comboDelimiter.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); comboDelimiter.addSelectionListener( new SelectionAdapter() { /** Set selection index and customDelimiter and (re-)evaluates page */ @Override public void widgetSelected(final SelectionEvent arg0) { selectedDelimiter = comboDelimiter.getSelectionIndex(); customDelimiter = true; evaluatePage(); } }); /* Place holder */ new Label(container, SWT.NONE); /* Quote label */ lblQuote = new Label(container, SWT.NONE); lblQuote.setVisible(false); lblQuote.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblQuote.setText(Resources.getMessage("ImportWizardPageCSV.11")); // $NON-NLS-1$ /* Quote combobox */ comboQuote = new Combo(container, SWT.READ_ONLY); comboQuote.setVisible(false); /* Add labels */ for (final char c : quotes) { comboQuote.add(String.valueOf(c)); } comboQuote.select(selectedQuote); comboQuote.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); comboQuote.addSelectionListener( new SelectionAdapter() { /** Set selection index and custom quote and (re-)evaluates page */ @Override public void widgetSelected(final SelectionEvent arg0) { selectedQuote = comboQuote.getSelectionIndex(); evaluatePage(); } }); /* Place holder */ new Label(container, SWT.NONE); /* Escape label */ lblEscape = new Label(container, SWT.NONE); lblEscape.setVisible(false); lblEscape.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblEscape.setText(Resources.getMessage("ImportWizardPageCSV.12")); // $NON-NLS-1$ /* Escape combobox */ comboEscape = new Combo(container, SWT.READ_ONLY); comboEscape.setVisible(false); /* Add labels */ for (final char c : escapes) { comboEscape.add(String.valueOf(c)); } comboEscape.select(selectedEscape); comboEscape.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); comboEscape.addSelectionListener( new SelectionAdapter() { /** Set selection index and custom escape and (re-)evaluates page */ @Override public void widgetSelected(final SelectionEvent arg0) { selectedEscape = comboEscape.getSelectionIndex(); evaluatePage(); } }); /* Place holder */ new Label(container, SWT.NONE); /* Line break label */ lblLinebreak = new Label(container, SWT.NONE); lblLinebreak.setVisible(false); lblLinebreak.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); lblLinebreak.setText(Resources.getMessage("ImportWizardPageCSV.13")); // $NON-NLS-1$ /* Line break combobox */ comboLinebreak = new Combo(container, SWT.READ_ONLY); comboLinebreak.setVisible(false); /* Add labels */ for (final String c : CSVSyntax.getAvailableLinebreaks()) { comboLinebreak.add(String.valueOf(c)); } comboLinebreak.select(selectedLinebreak); comboLinebreak.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); comboLinebreak.addSelectionListener( new SelectionAdapter() { /** Set selection index and custom line break and (re-)evaluates page */ @Override public void widgetSelected(final SelectionEvent arg0) { selectedLinebreak = comboLinebreak.getSelectionIndex(); customLinebreak = true; evaluatePage(); } }); /* Place holders */ new Label(container, SWT.NONE); new Label(container, SWT.NONE); /* Contains header button */ btnContainsHeader = new Button(container, SWT.CHECK); btnContainsHeader.setVisible(false); btnContainsHeader.setText(Resources.getMessage("ImportWizardPageCSV.14")); // $NON-NLS-1$ btnContainsHeader.setSelection(true); btnContainsHeader.addSelectionListener( new SelectionAdapter() { /** (Re-)Evaluate page */ @Override public void widgetSelected(SelectionEvent arg0) { evaluatePage(); } }); /* Place holder */ new Label(container, SWT.NONE); /* Place holders */ new Label(container, SWT.NONE); new Label(container, SWT.NONE); new Label(container, SWT.NONE); /* Preview table viewer */ tableViewerPreview = SWTUtil.createTableViewer(container, SWT.BORDER | SWT.FULL_SELECTION); tableViewerPreview.setContentProvider(new ArrayContentProvider()); /* Actual table for {@link #tableViewerPreview} */ tablePreview = tableViewerPreview.getTable(); GridData gd_tablePreview = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1); gd_tablePreview.heightHint = 150; tablePreview.setLayoutData(gd_tablePreview); tablePreview.setLinesVisible(true); tablePreview.setVisible(false); /* Set page to incomplete by default */ setPageComplete(false); }