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
48 protected CSVImportWizardPage(CSVImportModel model) {
\r
49 super("Import CSV Data");
\r
51 setMessage("Select CSV file to import");
\r
55 public void createControl(Composite parent) {
\r
56 Composite composite = new Composite(parent, SWT.NONE);
\r
57 composite.setLayout(new GridLayout(1,false));
\r
58 GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(composite);
\r
60 csvSelection = new FileSelectionWidget(composite, "CSV file", SWT.OPEN);
\r
61 csvSelection.addListener(this);
\r
63 delimiterCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
\r
64 delimiterCombo.setItems(model.getDelimiterFormats());
\r
65 delimiterCombo.addSelectionListener(new SelectionListener() {
\r
68 public void widgetSelected(SelectionEvent e) {
\r
69 model.setDelimiterByLabel(delimiterCombo.getItem(delimiterCombo.getSelectionIndex()));
\r
74 public void widgetDefaultSelected(SelectionEvent e) {
\r
79 firstAsHeader = new Button(composite, SWT.CHECK);
\r
80 firstAsHeader.setText("Read first row as header");
\r
81 firstAsHeader.setSelection(model.getReadFirstAsHeader());
\r
82 firstAsHeader.addSelectionListener(new SelectionListener() {
\r
85 public void widgetSelected(SelectionEvent e) {
\r
86 model.setReadFirstAsHeader(firstAsHeader.getSelection());
\r
91 public void widgetDefaultSelected(SelectionEvent e) {
\r
97 Composite tableComposite = new Composite(composite, SWT.BORDER);
\r
98 TreeColumnLayout treeColumnLayout = new TreeColumnLayout();
\r
99 tableComposite.setLayout(treeColumnLayout);
\r
101 tableViewer = new TableViewer(tableComposite, SWT.V_SCROLL | SWT.H_SCROLL);
\r
102 ColumnViewerToolTipSupport.enableFor(tableViewer);
\r
103 tableViewer.setContentProvider(new IContentProvider() {
\r
106 public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
\r
111 public void dispose() {
\r
116 Table table = tableViewer.getTable();
\r
117 table.setHeaderVisible(true);
\r
118 table.setLinesVisible(true);
\r
120 headerTable = new Table(tableComposite, SWT.NONE);
\r
121 headerTable.setHeaderVisible(true);
\r
122 headerTable.setLinesVisible(true);
\r
123 GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(tableComposite);
\r
125 setControl(composite);
\r
129 setPageComplete(false);
\r
133 public void fileSelected(FileOrDirectorySelectionWidget source, String[] filename) {
\r
134 String[] selection = csvSelection.getFilename();
\r
135 if (selection != null && selection.length > 0) {
\r
136 Path csvFile = Paths.get(selection[0]);
\r
137 if (!Files.exists(csvFile)) {
\r
138 setErrorMessage("File " + csvFile.toAbsolutePath() + " does not exist");
\r
140 model.setSource(csvFile);
\r
142 setPageComplete(true);
\r
145 setPageComplete(false);
\r
149 private void updateHeaders() {
\r
150 headerTable.setRedraw(false);
\r
151 for (int i = 0; i < headerTable.getColumns().length; i++) {
\r
152 TableColumn column = headerTable.getColumns()[i];
\r
155 for (int i = 0; i < headerTable.getItemCount(); i++) {
\r
156 TableItem item = headerTable.getItem(i);
\r
160 Map<CSVHeader, List<String>> headerAndValues = model.getHeaderAndRows(5);
\r
162 int coo = headerTable.getColumns().length;
\r
163 int count = headerTable.getColumnCount();
\r
165 for (Map.Entry<CSVHeader, List<String>> entr : headerAndValues.entrySet()) {
\r
166 CSVHeader he = entr.getKey();
\r
167 int index = he.getIndex();
\r
168 TableColumn headerCol = new TableColumn(headerTable, SWT.NONE);
\r
169 headerCol.setText(he.getHeader());
\r
171 tableColumnLayout.setColumnData(headerCol, new ColumnWeightData(10));
\r
174 for (String val : entr.getValue()) {
\r
175 TableItem item = new TableItem(headerTable, SWT.NONE);
\r
179 } catch (IOException e) {
\r
180 setErrorMessage(e.getMessage());
\r
182 headerTable.setRedraw(true);
\r