1 package org.simantics.district.imports.ui;
\r
3 import java.io.IOException;
\r
4 import java.nio.file.Files;
\r
5 import java.nio.file.Path;
\r
6 import java.nio.file.Paths;
\r
7 import java.util.Collections;
\r
8 import java.util.List;
\r
9 import java.util.Map;
\r
11 import org.eclipse.jface.layout.GridDataFactory;
\r
12 import org.eclipse.jface.layout.TableColumnLayout;
\r
13 import org.eclipse.jface.layout.TreeColumnLayout;
\r
14 import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
\r
15 import org.eclipse.jface.viewers.ColumnWeightData;
\r
16 import org.eclipse.jface.viewers.IContentProvider;
\r
17 import org.eclipse.jface.viewers.TableViewer;
\r
18 import org.eclipse.jface.viewers.TreeViewer;
\r
19 import org.eclipse.jface.viewers.Viewer;
\r
20 import org.eclipse.jface.wizard.WizardPage;
\r
21 import org.eclipse.swt.SWT;
\r
22 import org.eclipse.swt.events.SelectionEvent;
\r
23 import org.eclipse.swt.events.SelectionListener;
\r
24 import org.eclipse.swt.layout.GridData;
\r
25 import org.eclipse.swt.layout.GridLayout;
\r
26 import org.eclipse.swt.widgets.Button;
\r
27 import org.eclipse.swt.widgets.Combo;
\r
28 import org.eclipse.swt.widgets.Composite;
\r
29 import org.eclipse.swt.widgets.Layout;
\r
30 import org.eclipse.swt.widgets.Table;
\r
31 import org.eclipse.swt.widgets.TableColumn;
\r
32 import org.eclipse.swt.widgets.TableItem;
\r
33 import org.simantics.district.imports.DistrictImportUtils.CSVHeader;
\r
34 import org.simantics.utils.ui.widgets.FileOrDirectorySelectionWidget;
\r
35 import org.simantics.utils.ui.widgets.FileSelectionListener;
\r
36 import org.simantics.utils.ui.widgets.FileSelectionWidget;
\r
38 public class CSVImportWizardPage extends WizardPage implements FileSelectionListener {
\r
40 private CSVImportModel model;
\r
41 private FileSelectionWidget csvSelection;
\r
42 private Table headerTable;
\r
43 private Button firstAsHeader;
\r
44 private Combo delimiterCombo;
\r
45 private TableColumnLayout tableColumnLayout;
\r
46 private TableViewer tableViewer;
\r
47 private Composite tableComposite;
\r
49 protected CSVImportWizardPage(CSVImportModel model) {
\r
50 super("Import CSV Data");
\r
52 setMessage("Select CSV file to import");
\r
56 public void createControl(Composite parent) {
\r
57 Composite composite = new Composite(parent, SWT.NONE);
\r
58 composite.setLayout(new GridLayout(1,false));
\r
59 GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(composite);
\r
61 csvSelection = new FileSelectionWidget(composite, "CSV file", SWT.OPEN);
\r
62 csvSelection.addListener(this);
\r
64 delimiterCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
\r
65 delimiterCombo.setItems(model.getDelimiterFormats());
\r
66 delimiterCombo.addSelectionListener(new SelectionListener() {
\r
69 public void widgetSelected(SelectionEvent e) {
\r
70 model.setDelimiterByLabel(delimiterCombo.getItem(delimiterCombo.getSelectionIndex()));
\r
75 public void widgetDefaultSelected(SelectionEvent e) {
\r
80 firstAsHeader = new Button(composite, SWT.CHECK);
\r
81 firstAsHeader.setText("Read first row as header");
\r
82 firstAsHeader.setSelection(model.getReadFirstAsHeader());
\r
83 firstAsHeader.addSelectionListener(new SelectionListener() {
\r
86 public void widgetSelected(SelectionEvent e) {
\r
87 model.setReadFirstAsHeader(firstAsHeader.getSelection());
\r
92 public void widgetDefaultSelected(SelectionEvent e) {
\r
98 tableComposite = new Composite(composite, SWT.BORDER);
\r
99 tableColumnLayout = new TableColumnLayout();
\r
100 tableComposite.setLayout(tableColumnLayout);
\r
104 setControl(composite);
\r
108 setPageComplete(false);
\r
112 public void fileSelected(FileOrDirectorySelectionWidget source, String[] filename) {
\r
113 String[] selection = csvSelection.getFilename();
\r
114 if (selection != null && selection.length > 0) {
\r
115 Path csvFile = Paths.get(selection[0]);
\r
116 if (!Files.exists(csvFile)) {
\r
117 setErrorMessage("File " + csvFile.toAbsolutePath() + " does not exist");
\r
119 model.setSource(csvFile);
\r
121 setPageComplete(true);
\r
124 setPageComplete(false);
\r
128 private void updateHeaders() {
\r
129 if (headerTable != null)
\r
130 headerTable.dispose();
\r
131 headerTable = new Table(tableComposite, SWT.NONE);
\r
132 headerTable.setHeaderVisible(true);
\r
133 headerTable.setLinesVisible(true);
\r
134 GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(tableComposite);
\r
135 for (int i = 0; i < headerTable.getColumns().length; i++) {
\r
136 TableColumn column = headerTable.getColumns()[i];
\r
139 for (int i = 0; i < headerTable.getItemCount(); i++) {
\r
140 TableItem item = headerTable.getItem(i);
\r
144 Map<CSVHeader, List<String>> headerAndValues = model.getHeaderAndRows(5);
\r
146 int coo = headerTable.getColumns().length;
\r
147 int count = headerTable.getColumnCount();
\r
149 for (Map.Entry<CSVHeader, List<String>> entr : headerAndValues.entrySet()) {
\r
150 CSVHeader he = entr.getKey();
\r
151 int index = he.getIndex();
\r
152 TableColumn headerCol = new TableColumn(headerTable, SWT.NONE);
\r
153 headerCol.setText(he.getHeader());
\r
155 tableColumnLayout.setColumnData(headerCol, new ColumnWeightData(10));
\r
158 for (String val : entr.getValue()) {
\r
159 TableItem item = new TableItem(headerTable, SWT.NONE);
\r
163 } catch (IOException e) {
\r
164 setErrorMessage(e.getMessage());
\r