]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizardPage.java
71017b321b90d9486974021f75d01ca4a764b517
[simantics/district.git] / org.simantics.district.imports.ui / src / org / simantics / district / imports / ui / CSVImportWizardPage.java
1 package org.simantics.district.imports.ui;\r
2 \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
10 \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
37 \r
38 public class CSVImportWizardPage extends WizardPage implements FileSelectionListener {\r
39 \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
48 \r
49     protected CSVImportWizardPage(CSVImportModel model) {\r
50         super("Import CSV Data");\r
51         this.model = model;\r
52         setMessage("Select CSV file to import");\r
53     }\r
54 \r
55     @Override\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
60         \r
61         csvSelection = new FileSelectionWidget(composite, "CSV file", SWT.OPEN);\r
62         csvSelection.addListener(this);\r
63         \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
67             \r
68             @Override\r
69             public void widgetSelected(SelectionEvent e) {\r
70                 model.setDelimiterByLabel(delimiterCombo.getItem(delimiterCombo.getSelectionIndex()));\r
71                 updateHeaders();\r
72             }\r
73             \r
74             @Override\r
75             public void widgetDefaultSelected(SelectionEvent e) {\r
76                 \r
77             }\r
78         });\r
79         \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
84             \r
85             @Override\r
86             public void widgetSelected(SelectionEvent e) {\r
87                 model.setReadFirstAsHeader(firstAsHeader.getSelection());\r
88                 updateHeaders();\r
89             }\r
90             \r
91             @Override\r
92             public void widgetDefaultSelected(SelectionEvent e) {\r
93                 \r
94             }\r
95         });\r
96         \r
97         \r
98         tableComposite = new Composite(composite, SWT.BORDER);\r
99         tableColumnLayout = new TableColumnLayout();\r
100         tableComposite.setLayout(tableColumnLayout);\r
101 \r
102         updateHeaders();\r
103         \r
104         setControl(composite);\r
105         \r
106         \r
107         \r
108         setPageComplete(false);\r
109     }\r
110 \r
111     @Override\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
118             } else {\r
119                 model.setSource(csvFile);\r
120                 updateHeaders();\r
121                 setPageComplete(true);\r
122             }\r
123         } else {\r
124             setPageComplete(false);\r
125         }\r
126     }\r
127 \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
137             column.dispose();\r
138         }\r
139         for (int i = 0; i < headerTable.getItemCount(); i++) {\r
140             TableItem item = headerTable.getItem(i);\r
141             item.dispose();\r
142         }\r
143         try {\r
144             Map<CSVHeader, List<String>> headerAndValues = model.getHeaderAndRows(5);\r
145             \r
146             int coo = headerTable.getColumns().length;\r
147             int count = headerTable.getColumnCount();\r
148             \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
154                 \r
155                 tableColumnLayout.setColumnData(headerCol, new ColumnWeightData(10));\r
156                 headerCol.pack();\r
157                 \r
158                 for (String val : entr.getValue()) {\r
159                     TableItem item = new TableItem(headerTable, SWT.NONE);\r
160                     item.setText(val);\r
161                 }\r
162             }\r
163         } catch (IOException e) {\r
164             setErrorMessage(e.getMessage());\r
165         }\r
166     }\r
167 \r
168 }\r