package org.simantics.district.imports.ui; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Collections; import java.util.List; import java.util.Map; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.layout.TreeColumnLayout; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.IContentProvider; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Layout; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.simantics.district.imports.DistrictImportUtils.CSVHeader; import org.simantics.utils.ui.widgets.FileOrDirectorySelectionWidget; import org.simantics.utils.ui.widgets.FileSelectionListener; import org.simantics.utils.ui.widgets.FileSelectionWidget; public class CSVImportWizardPage extends WizardPage implements FileSelectionListener { private CSVImportModel model; private FileSelectionWidget csvSelection; private Table headerTable; private Button firstAsHeader; private Combo delimiterCombo; private TableColumnLayout tableColumnLayout; private TableViewer tableViewer; private Composite tableComposite; protected CSVImportWizardPage(CSVImportModel model) { super("Import CSV Data"); this.model = model; setMessage("Select CSV file to import"); } @Override public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(new GridLayout(1,false)); GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(composite); csvSelection = new FileSelectionWidget(composite, "CSV file", SWT.OPEN); csvSelection.addListener(this); delimiterCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY); delimiterCombo.setItems(model.getDelimiterFormats()); delimiterCombo.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { model.setDelimiterByLabel(delimiterCombo.getItem(delimiterCombo.getSelectionIndex())); updateHeaders(); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); firstAsHeader = new Button(composite, SWT.CHECK); firstAsHeader.setText("Read first row as header"); firstAsHeader.setSelection(model.getReadFirstAsHeader()); firstAsHeader.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { model.setReadFirstAsHeader(firstAsHeader.getSelection()); updateHeaders(); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); tableComposite = new Composite(composite, SWT.BORDER); tableColumnLayout = new TableColumnLayout(); tableComposite.setLayout(tableColumnLayout); updateHeaders(); setControl(composite); setPageComplete(false); } @Override public void fileSelected(FileOrDirectorySelectionWidget source, String[] filename) { String[] selection = csvSelection.getFilename(); if (selection != null && selection.length > 0) { Path csvFile = Paths.get(selection[0]); if (!Files.exists(csvFile)) { setErrorMessage("File " + csvFile.toAbsolutePath() + " does not exist"); } else { model.setSource(csvFile); updateHeaders(); setPageComplete(true); } } else { setPageComplete(false); } } private void updateHeaders() { if (headerTable != null) headerTable.dispose(); headerTable = new Table(tableComposite, SWT.NONE); headerTable.setHeaderVisible(true); headerTable.setLinesVisible(true); GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(tableComposite); for (int i = 0; i < headerTable.getColumns().length; i++) { TableColumn column = headerTable.getColumns()[i]; column.dispose(); } for (int i = 0; i < headerTable.getItemCount(); i++) { TableItem item = headerTable.getItem(i); item.dispose(); } try { Map> headerAndValues = model.getHeaderAndRows(5); int coo = headerTable.getColumns().length; int count = headerTable.getColumnCount(); for (Map.Entry> entr : headerAndValues.entrySet()) { CSVHeader he = entr.getKey(); int index = he.getIndex(); TableColumn headerCol = new TableColumn(headerTable, SWT.NONE); headerCol.setText(he.getHeader()); tableColumnLayout.setColumnData(headerCol, new ColumnWeightData(10)); headerCol.pack(); for (String val : entr.getValue()) { TableItem item = new TableItem(headerTable, SWT.NONE); item.setText(val); } } } catch (IOException e) { setErrorMessage(e.getMessage()); } } }