1 package org.simantics.district.imports.ui;
3 import java.io.IOException;
4 import java.nio.file.Files;
5 import java.nio.file.Path;
6 import java.nio.file.Paths;
9 import org.apache.commons.csv.CSVRecord;
10 import org.eclipse.jface.layout.GridDataFactory;
11 import org.eclipse.jface.layout.TableColumnLayout;
12 import org.eclipse.jface.viewers.ColumnWeightData;
13 import org.eclipse.jface.viewers.TableViewer;
14 import org.eclipse.jface.wizard.WizardPage;
15 import org.eclipse.swt.SWT;
16 import org.eclipse.swt.events.SelectionEvent;
17 import org.eclipse.swt.events.SelectionListener;
18 import org.eclipse.swt.layout.GridLayout;
19 import org.eclipse.swt.widgets.Button;
20 import org.eclipse.swt.widgets.Combo;
21 import org.eclipse.swt.widgets.Composite;
22 import org.eclipse.swt.widgets.Table;
23 import org.eclipse.swt.widgets.TableColumn;
24 import org.eclipse.swt.widgets.TableItem;
25 import org.simantics.district.network.ui.function.Functions;
26 import org.simantics.utils.ui.widgets.FileOrDirectorySelectionWidget;
27 import org.simantics.utils.ui.widgets.FileSelectionListener;
28 import org.simantics.utils.ui.widgets.FileSelectionWidget;
31 public class CSVImportWizardPage extends WizardPage implements FileSelectionListener {
33 private CSVImportModel model;
34 private FileSelectionWidget csvSelection;
35 private Table headerTable;
36 private Button firstAsHeader;
38 private Combo diagramCombo;
41 private Combo delimiterCombo;
42 private Combo delimiterdCombo;
43 private TableColumnLayout tableColumnLayout;
44 private TableViewer tableViewer;
45 private Composite tableComposite;
46 private FileSelectionWidget wktFileSelection;
50 protected CSVImportWizardPage(CSVImportModel model) {
51 super("Import CSV Data");
53 setMessage("Select CSV file to import");
57 public void createControl(Composite parent) {
58 Composite composite = new Composite(parent, SWT.NONE);
59 composite.setLayout(new GridLayout(1,false));
60 GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(composite);
62 diagramCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
63 diagramCombo.setItems(getDistrictDiagrams());
66 csvSelection = new FileSelectionWidget(composite, "CSV file", SWT.OPEN);
67 csvSelection.addListener(this);
69 delimiterCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
70 delimiterCombo.setItems(model.getDelimiterFormats());
71 delimiterCombo.addSelectionListener(new SelectionListener() {
74 public void widgetSelected(SelectionEvent e) {
75 model.setDelimiterByLabel(delimiterCombo.getItem(delimiterCombo.getSelectionIndex()));
80 public void widgetDefaultSelected(SelectionEvent e) {
85 firstAsHeader = new Button(composite, SWT.CHECK);
86 firstAsHeader.setText("Read first row as header");
87 firstAsHeader.setSelection(model.getReadFirstAsHeader());
88 firstAsHeader.addSelectionListener(new SelectionListener() {
91 public void widgetSelected(SelectionEvent e) {
92 model.setReadFirstAsHeader(firstAsHeader.getSelection());
97 public void widgetDefaultSelected(SelectionEvent e) {
103 tableComposite = new Composite(composite, SWT.BORDER);
104 tableColumnLayout = new TableColumnLayout();
105 tableComposite.setLayout(tableColumnLayout);
109 wktFileSelection = new FileSelectionWidget(composite, "WKT file", SWT.OPEN);
110 wktFileSelection.addListener(new FileSelectionListener() {
113 public void fileSelected(FileOrDirectorySelectionWidget source, String[] filename) {
114 String[] selection = wktFileSelection.getFilename();
115 if (selection != null && selection.length > 0) {
116 Path wktFilee = Paths.get(selection[0]);
117 if (!Files.exists(wktFilee)) {
118 setErrorMessage("File " + wktFilee.toAbsolutePath() + " does not exist");
121 setPageComplete(true);
124 setPageComplete(false);
133 setControl(composite);
137 setPageComplete(false);
140 private String[] getDistrictDiagrams() {
141 Functions.getDistrictDiagrams(null);
146 public void fileSelected(FileOrDirectorySelectionWidget source, String[] filename) {
147 String[] selection = csvSelection.getFilename();
148 if (selection != null && selection.length > 0) {
149 Path csvFile = Paths.get(selection[0]);
150 if (!Files.exists(csvFile)) {
151 setErrorMessage("File " + csvFile.toAbsolutePath() + " does not exist");
153 model.setSource(csvFile);
155 setPageComplete(true);
158 setPageComplete(false);
162 private void updateHeaders() {
163 if (headerTable != null)
164 headerTable.dispose();
165 headerTable = new Table(tableComposite, SWT.NONE);
166 headerTable.setHeaderVisible(true);
167 headerTable.setLinesVisible(true);
168 GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(tableComposite);
169 for (int i = 0; i < headerTable.getColumns().length; i++) {
170 TableColumn column = headerTable.getColumns()[i];
173 for (int i = 0; i < headerTable.getItemCount(); i++) {
174 TableItem item = headerTable.getItem(i);
178 List<CSVRecord> rows = model.getRows(5);
180 for (int k = 0; k < rows.size(); k++) {
181 CSVRecord row = rows.get(k);
183 int columnCount = row.size();
184 for (int i = 0; i < columnCount; i++) {
185 String value = row.get(i);
187 TableColumn headerCol = new TableColumn(headerTable, SWT.NONE);
188 headerCol.setText(value);
190 tableColumnLayout.setColumnData(headerCol, new ColumnWeightData(10));
195 int itemCount = headerTable.getItemCount();
196 if (actualK >= itemCount) {
197 item = new TableItem(headerTable, SWT.NONE);
199 item = headerTable.getItem(actualK);
201 item.setText(i, value);
206 // Map<CSVHeader, List<String>> headerAndValues = model.getHeaderAndRows(5);
208 // int coo = headerTable.getColumns().length;
209 // int count = headerTable.getColumnCount();
211 // for (Map.Entry<CSVHeader, List<String>> entr : headerAndValues.entrySet()) {
212 // CSVHeader he = entr.getKey();
213 // int index = he.getIndex();
214 // TableColumn headerCol = new TableColumn(headerTable, SWT.NONE);
215 // headerCol.setText(he.getHeader());
217 // tableColumnLayout.setColumnData(headerCol, new ColumnWeightData(10));
220 // for (String val : entr.getValue()) {
221 // TableItem item = new TableItem(headerTable, SWT.NONE);
222 // item.setText(val);
225 } catch (IOException e) {
226 setErrorMessage(e.getMessage());