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.List; import org.apache.commons.csv.CSVRecord; import org.eclipse.jface.layout.GridDataFactory; import org.eclipse.jface.layout.TableColumnLayout; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.TableViewer; 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.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.simantics.district.network.ui.function.Functions; 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 diagramCombo; private Combo delimiterCombo; private Combo delimiterdCombo; private TableColumnLayout tableColumnLayout; private TableViewer tableViewer; private Composite tableComposite; private FileSelectionWidget wktFileSelection; private Path wktFile; 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); diagramCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY); diagramCombo.setItems(getDistrictDiagrams()); 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); wktFileSelection = new FileSelectionWidget(composite, "WKT file", SWT.OPEN); wktFileSelection.addListener(new FileSelectionListener() { @Override public void fileSelected(FileOrDirectorySelectionWidget source, String[] filename) { String[] selection = wktFileSelection.getFilename(); if (selection != null && selection.length > 0) { Path wktFilee = Paths.get(selection[0]); if (!Files.exists(wktFilee)) { setErrorMessage("File " + wktFilee.toAbsolutePath() + " does not exist"); } else { wktFile = wktFilee; setPageComplete(true); } } else { setPageComplete(false); } } }); updateHeaders(); setControl(composite); setPageComplete(false); } private String[] getDistrictDiagrams() { Functions.getDistrictDiagrams(null); return null; } @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 { List rows = model.getRows(5); for (int k = 0; k < rows.size(); k++) { CSVRecord row = rows.get(k); int columnCount = row.size(); for (int i = 0; i < columnCount; i++) { String value = row.get(i); if (k == 0) { TableColumn headerCol = new TableColumn(headerTable, SWT.NONE); headerCol.setText(value); tableColumnLayout.setColumnData(headerCol, new ColumnWeightData(10)); headerCol.pack(); } else { int actualK = k - 1; TableItem item; int itemCount = headerTable.getItemCount(); if (actualK >= itemCount) { item = new TableItem(headerTable, SWT.NONE); } else { item = headerTable.getItem(actualK); } item.setText(i, value); } } } // 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()); } } }