]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizardPage.java
Adding basic import utilities - WIP!
[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 \r
48     protected CSVImportWizardPage(CSVImportModel model) {\r
49         super("Import CSV Data");\r
50         this.model = model;\r
51         setMessage("Select CSV file to import");\r
52     }\r
53 \r
54     @Override\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
59         \r
60         csvSelection = new FileSelectionWidget(composite, "CSV file", SWT.OPEN);\r
61         csvSelection.addListener(this);\r
62         \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
66             \r
67             @Override\r
68             public void widgetSelected(SelectionEvent e) {\r
69                 model.setDelimiterByLabel(delimiterCombo.getItem(delimiterCombo.getSelectionIndex()));\r
70                 updateHeaders();\r
71             }\r
72             \r
73             @Override\r
74             public void widgetDefaultSelected(SelectionEvent e) {\r
75                 \r
76             }\r
77         });\r
78         \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
83             \r
84             @Override\r
85             public void widgetSelected(SelectionEvent e) {\r
86                 model.setReadFirstAsHeader(firstAsHeader.getSelection());\r
87                 updateHeaders();\r
88             }\r
89             \r
90             @Override\r
91             public void widgetDefaultSelected(SelectionEvent e) {\r
92                 \r
93             }\r
94         });\r
95         \r
96         \r
97         Composite tableComposite = new Composite(composite, SWT.BORDER);\r
98         TreeColumnLayout treeColumnLayout = new TreeColumnLayout();\r
99         tableComposite.setLayout(treeColumnLayout);\r
100         \r
101         tableViewer = new TableViewer(tableComposite, SWT.V_SCROLL | SWT.H_SCROLL);\r
102         ColumnViewerToolTipSupport.enableFor(tableViewer);\r
103         tableViewer.setContentProvider(new IContentProvider() {\r
104             \r
105             @Override\r
106             public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
107                 \r
108             }\r
109             \r
110             @Override\r
111             public void dispose() {\r
112                 \r
113             }\r
114         });\r
115         \r
116         Table table = tableViewer.getTable();\r
117         table.setHeaderVisible(true);\r
118         table.setLinesVisible(true);\r
119         \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
124         \r
125         setControl(composite);\r
126         \r
127         updateHeaders();\r
128         \r
129         setPageComplete(false);\r
130     }\r
131 \r
132     @Override\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
139             } else {\r
140                 model.setSource(csvFile);\r
141                 updateHeaders();\r
142                 setPageComplete(true);\r
143             }\r
144         } else {\r
145             setPageComplete(false);\r
146         }\r
147     }\r
148 \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
153             column.dispose();\r
154         }\r
155         for (int i = 0; i < headerTable.getItemCount(); i++) {\r
156             TableItem item = headerTable.getItem(i);\r
157             item.dispose();\r
158         }\r
159         try {\r
160             Map<CSVHeader, List<String>> headerAndValues = model.getHeaderAndRows(5);\r
161             \r
162             int coo = headerTable.getColumns().length;\r
163             int count = headerTable.getColumnCount();\r
164             \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
170                 \r
171                 tableColumnLayout.setColumnData(headerCol, new ColumnWeightData(10));\r
172                 headerCol.pack();\r
173                 \r
174                 for (String val : entr.getValue()) {\r
175                     TableItem item = new TableItem(headerTable, SWT.NONE);\r
176                     item.setText(val);\r
177                 }\r
178             }\r
179         } catch (IOException e) {\r
180             setErrorMessage(e.getMessage());\r
181         }\r
182         headerTable.setRedraw(true);\r
183     }\r
184 \r
185 }\r