]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizardPage.java
Additions to district features
[simantics/district.git] / org.simantics.district.imports.ui / src / org / simantics / district / imports / ui / CSVImportWizardPage.java
1 package org.simantics.district.imports.ui;
2
3 import java.io.IOException;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.Map.Entry;
8 import java.util.Set;
9
10 import org.apache.commons.csv.CSVRecord;
11 import org.eclipse.jface.dialogs.IPageChangeProvider;
12 import org.eclipse.jface.dialogs.IPageChangedListener;
13 import org.eclipse.jface.dialogs.PageChangedEvent;
14 import org.eclipse.jface.layout.GridDataFactory;
15 import org.eclipse.jface.layout.TableColumnLayout;
16 import org.eclipse.jface.viewers.ColumnWeightData;
17 import org.eclipse.jface.wizard.IWizardContainer;
18 import org.eclipse.jface.wizard.WizardPage;
19 import org.eclipse.swt.SWT;
20 import org.eclipse.swt.events.ModifyEvent;
21 import org.eclipse.swt.events.ModifyListener;
22 import org.eclipse.swt.events.SelectionAdapter;
23 import org.eclipse.swt.events.SelectionEvent;
24 import org.eclipse.swt.events.SelectionListener;
25 import org.eclipse.swt.layout.GridLayout;
26 import org.eclipse.swt.widgets.Button;
27 import org.eclipse.swt.widgets.Combo;
28 import org.eclipse.swt.widgets.Composite;
29 import org.eclipse.swt.widgets.Group;
30 import org.eclipse.swt.widgets.Label;
31 import org.eclipse.swt.widgets.Table;
32 import org.eclipse.swt.widgets.TableColumn;
33 import org.eclipse.swt.widgets.TableItem;
34 import org.geotools.referencing.CRS;
35 import org.simantics.district.imports.ui.controls.DynamicComboFieldEditor;
36
37 public class CSVImportWizardPage extends WizardPage {
38
39     private CSVImportModel model;
40
41     private Map<Integer, String> headerIndexAndValues = new HashMap<>();
42
43     private Table headerTable;
44 //    private Button firstAsHeader;
45
46     private Combo delimiterCombo;
47     private TableColumnLayout tableColumnLayout;
48     private Composite tableComposite;
49 //    private FileSelectionWidget wktFileSelection;
50
51     // Common for vertex and edge
52     private DynamicComboFieldEditor componentMappingSelector;
53     private DynamicComboFieldEditor labelSelector;
54     
55     // For vertex import
56     private DynamicComboFieldEditor xCoordSelector;
57     private DynamicComboFieldEditor yCoordSelector;
58     private DynamicComboFieldEditor zValueSelector;
59
60     // For edge import
61     private DynamicComboFieldEditor startXCoordSelector;
62     private DynamicComboFieldEditor startYCoordSelector;
63     private DynamicComboFieldEditor startZValueSelector;
64     private DynamicComboFieldEditor endXCoordSelector;
65     private DynamicComboFieldEditor endYCoordSelector;
66     private DynamicComboFieldEditor endZValueSelector;
67     private DynamicComboFieldEditor tempValueSelector;
68     private DynamicComboFieldEditor pressureValueSelector;
69     
70     private DynamicComboFieldEditor outerDiameterSelector;
71     private DynamicComboFieldEditor diameterSelector;
72     private DynamicComboFieldEditor nominalMassFlowSelector;
73
74     private Group indexMappingGroup;
75
76     private Composite composite;
77
78     private Button isVertexImport;
79
80     private Combo sourceCRSCombo;
81     
82     protected CSVImportWizardPage(CSVImportModel model) {
83         super("Import CSV Data");
84         this.model = model;
85         setMessage("Select column index mappings");
86     }
87
88     @Override
89     public void createControl(Composite parent) {
90         composite = new Composite(parent, SWT.NONE);
91         composite.setLayout(new GridLayout(1, false));
92         GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(composite);
93
94         Label label = new Label(composite, SWT.NONE);
95         label.setText("Select delimiter");
96         
97         delimiterCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
98         delimiterCombo.setToolTipText("Select the delimiter that is used to separate elements in the CSV file");
99         delimiterCombo.setItems(model.getDelimiterFormats());
100         delimiterCombo.addSelectionListener(new SelectionListener() {
101
102             @Override
103             public void widgetSelected(SelectionEvent e) {
104                 model.setDelimiterByLabel(delimiterCombo.getItem(delimiterCombo.getSelectionIndex()));
105                 updateHeaders();
106                 updateCombos();
107             }
108
109             @Override
110             public void widgetDefaultSelected(SelectionEvent e) {
111                 widgetSelected(e);
112             }
113         });
114
115 //        firstAsHeader = new Button(composite, SWT.CHECK);
116 //        firstAsHeader.setText("Read first row as header");
117 //        firstAsHeader.setSelection(model.getReadFirstAsHeader());
118 //        firstAsHeader.addSelectionListener(new SelectionListener() {
119 //
120 //            @Override
121 //            public void widgetSelected(SelectionEvent e) {
122 //                model.setReadFirstAsHeader(firstAsHeader.getSelection());
123 //                updateHeaders();
124 //                updateCombos();
125 //            }
126 //
127 //            @Override
128 //            public void widgetDefaultSelected(SelectionEvent e) {
129 //                widgetSelected(e);
130 //            }
131 //        });
132
133         tableComposite = new Composite(composite, SWT.BORDER);
134         tableColumnLayout = new TableColumnLayout();
135         tableComposite.setLayout(tableColumnLayout);
136
137         label = new Label(composite, SWT.NONE);
138         label.setText("Select source Coordinate Reference System");
139         
140         sourceCRSCombo = new Combo(composite, SWT.NONE);
141         sourceCRSCombo.setToolTipText("Select the coordinate reference system that is used in the source material for possible transformation to target coordinate reference system (EPSG:4326)");
142         Set<String> codes = CRS.getSupportedCodes("EPSG");
143         sourceCRSCombo.setItems(codes.toArray(new String[codes.size()]));
144         sourceCRSCombo.addSelectionListener(new SelectionAdapter() {
145             
146             @Override
147             public void widgetSelected(SelectionEvent e) {
148                 String current = sourceCRSCombo.getItem(sourceCRSCombo.getSelectionIndex());
149                 model.setSourceCRS("EPSG:" + current);
150             }
151         });
152         
153         sourceCRSCombo.addModifyListener(new ModifyListener() {
154             
155             @Override
156             public void modifyText(ModifyEvent e) {
157                 String currentText = sourceCRSCombo.getText();
158                 if (codes.contains(currentText)) {
159                     // Select this
160                     String[] items = sourceCRSCombo.getItems();
161                     int i;
162                     for (i = 0; i < items.length; i++) {
163                         String item = items[i];
164                         if (currentText.equals(item)) {
165                             break;
166                         }
167                     }
168                     if (i != 0) {
169                         sourceCRSCombo.select(i);
170                         model.setSourceCRS("EPSG:" + currentText);
171                     } else {
172                         System.err.println("this should not happen");
173                     }
174                 }
175             }
176         });
177         
178 //        wktFileSelection = new FileSelectionWidget(composite, "WKT file", SWT.OPEN);
179 //        wktFileSelection.addListener(new FileSelectionListener() {
180 //
181 //            @Override
182 //            public void fileSelected(FileOrDirectorySelectionWidget source, String[] filename) {
183 //                String[] selection = wktFileSelection.getFilename();
184 //                if (selection != null && selection.length > 0) {
185 //                    Path wktFile = Paths.get(selection[0]);
186 //                    if (!Files.exists(wktFile)) {
187 //                        setErrorMessage("File " + wktFile.toAbsolutePath() + " does not exist");
188 //                    } else {
189 //                        model.setWKTFile(wktFile);
190 //                        validatePageComplete();
191 //                    }
192 //                }
193 //            }
194 //        });
195
196         isVertexImport = new Button(composite, SWT.CHECK);
197         isVertexImport.setText("File contains vertices");
198         isVertexImport.setToolTipText("Enable this if the file contains vertices, i.e. points");
199         isVertexImport.setSelection(model.isVertexImport());
200         isVertexImport.addSelectionListener(new SelectionListener() {
201
202             @Override
203             public void widgetSelected(SelectionEvent e) {
204                 model.setVertexImport(isVertexImport.getSelection());
205                 updateControls(false);
206             }
207
208             @Override
209             public void widgetDefaultSelected(SelectionEvent e) {
210                 widgetSelected(e);
211             }
212         });
213         
214         updateControls(true);
215         updateHeaders();
216         setControl(composite);
217
218         final IWizardContainer container = getContainer();
219         
220         if (container instanceof IPageChangeProvider) {
221             ((IPageChangeProvider) container).addPageChangedListener(new IPageChangedListener() {
222
223                 @Override
224                 public void pageChanged(PageChangedEvent event) {
225                     if (isCurrentPage())
226                         CSVImportWizardPage.this.updateControls(false);
227                 }
228             });
229         }
230
231         validatePageComplete();
232     }
233     
234     private void updateControls(boolean initial) {
235         createIndexMappingGroup();
236         updateCombos();
237         if (!initial)
238             composite.layout(true, true);
239     }
240     
241     private void createIndexMappingGroup() {
242         if (indexMappingGroup != null)
243             indexMappingGroup.dispose();
244         
245         indexMappingGroup = new Group(composite, SWT.NONE);
246         indexMappingGroup.setText("Column index mapping");
247         GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(indexMappingGroup);
248         
249         if (model.isVertexImport())
250             createVertexIndexMappingField(indexMappingGroup);
251         else
252             createEdgeIndexMappingField(indexMappingGroup);
253         
254         createCommonIndexMappingField(indexMappingGroup);
255     }
256
257     private void createCommonIndexMappingField(Group parent) {
258         
259         componentMappingSelector = new DynamicComboFieldEditor("componentMapping", "Apros component mapping", parent);
260         componentMappingSelector.addComboListener(new SelectionListener() {
261
262             @Override
263             public void widgetSelected(SelectionEvent e) {
264                 widgetDefaultSelected(e);
265             }
266
267             @Override
268             public void widgetDefaultSelected(SelectionEvent e) {
269                 model.setComponentMappingIndex(Integer.parseInt(componentMappingSelector.getValue()));
270                 validatePageComplete();
271             }
272         });
273         
274     }
275
276     private void createVertexIndexMappingField(Group parent) {
277         xCoordSelector = new DynamicComboFieldEditor("xCoord", "X Coordinate", parent);
278         xCoordSelector.addComboListener(new SelectionListener() {
279
280             @Override
281             public void widgetSelected(SelectionEvent e) {
282                 widgetDefaultSelected(e);
283             }
284
285             @Override
286             public void widgetDefaultSelected(SelectionEvent e) {
287                 model.setXCoordIndex(Integer.parseInt(xCoordSelector.getValue()));
288                 validatePageComplete();
289             }
290         });
291
292         yCoordSelector = new DynamicComboFieldEditor("yCoord", "Y Coordinate", parent);
293         yCoordSelector.addComboListener(new SelectionListener() {
294
295             @Override
296             public void widgetSelected(SelectionEvent e) {
297                 widgetDefaultSelected(e);
298             }
299
300             @Override
301             public void widgetDefaultSelected(SelectionEvent e) {
302                 model.setYCoordIndex(Integer.parseInt(yCoordSelector.getValue()));
303                 validatePageComplete();
304             }
305         });
306         zValueSelector = new DynamicComboFieldEditor("zValue", "Z Value", parent);
307         zValueSelector.addComboListener(new SelectionListener() {
308
309             @Override
310             public void widgetSelected(SelectionEvent e) {
311                 widgetDefaultSelected(e);
312             }
313
314             @Override
315             public void widgetDefaultSelected(SelectionEvent e) {
316                 model.setZCoordIndex(Integer.parseInt(zValueSelector.getValue()));
317                 validatePageComplete();
318             }
319         });
320         tempValueSelector = new DynamicComboFieldEditor("tempValue", "Temperature value", parent);
321         tempValueSelector.addComboListener(new SelectionListener() {
322
323             @Override
324             public void widgetSelected(SelectionEvent e) {
325                 widgetDefaultSelected(e);
326             }
327
328             @Override
329             public void widgetDefaultSelected(SelectionEvent e) {
330                 model.setTempIndex(Integer.parseInt(tempValueSelector.getValue()));
331                 validatePageComplete();
332             }
333         });
334         pressureValueSelector = new DynamicComboFieldEditor("pressureValue", "Pressure value", parent);
335         pressureValueSelector.addComboListener(new SelectionListener() {
336
337             @Override
338             public void widgetSelected(SelectionEvent e) {
339                 widgetDefaultSelected(e);
340             }
341
342             @Override
343             public void widgetDefaultSelected(SelectionEvent e) {
344                 model.setPressureIndex(Integer.parseInt(pressureValueSelector.getValue()));
345                 validatePageComplete();
346             }
347         });
348     }
349
350     private void createEdgeIndexMappingField(Group parent) {
351         startXCoordSelector = new DynamicComboFieldEditor("startxCoord", "Start X Coordinate", parent);
352         startXCoordSelector.addComboListener(new SelectionListener() {
353
354             @Override
355             public void widgetSelected(SelectionEvent e) {
356                 widgetDefaultSelected(e);
357             }
358
359             @Override
360             public void widgetDefaultSelected(SelectionEvent e) {
361                 model.setStartXCoordIndex(Integer.parseInt(startXCoordSelector.getValue()));
362                 validatePageComplete();
363             }
364         });
365
366         startYCoordSelector = new DynamicComboFieldEditor("startyCoord", "Start Y Coordinate", parent);
367         startYCoordSelector.addComboListener(new SelectionListener() {
368
369             @Override
370             public void widgetSelected(SelectionEvent e) {
371                 widgetDefaultSelected(e);
372             }
373
374             @Override
375             public void widgetDefaultSelected(SelectionEvent e) {
376                 model.setStartYCoordIndex(Integer.parseInt(startYCoordSelector.getValue()));
377                 validatePageComplete();
378             }
379         });
380         startZValueSelector = new DynamicComboFieldEditor("startzValue", "Start Z Value", parent);
381         startZValueSelector.addComboListener(new SelectionListener() {
382
383             @Override
384             public void widgetSelected(SelectionEvent e) {
385                 widgetDefaultSelected(e);
386             }
387
388             @Override
389             public void widgetDefaultSelected(SelectionEvent e) {
390                 model.setStartZCoordIndex(Integer.parseInt(startZValueSelector.getValue()));
391                 validatePageComplete();
392             }
393         });
394         
395         endXCoordSelector = new DynamicComboFieldEditor("endxCoord", "End X Coordinate", parent);
396         endXCoordSelector.addComboListener(new SelectionListener() {
397
398             @Override
399             public void widgetSelected(SelectionEvent e) {
400                 widgetDefaultSelected(e);
401             }
402
403             @Override
404             public void widgetDefaultSelected(SelectionEvent e) {
405                 model.setEndXCoordIndex(Integer.parseInt(endXCoordSelector.getValue()));
406                 validatePageComplete();
407             }
408         });
409
410         endYCoordSelector = new DynamicComboFieldEditor("endyCoord", "End Y Coordinate", parent);
411         endYCoordSelector.addComboListener(new SelectionListener() {
412
413             @Override
414             public void widgetSelected(SelectionEvent e) {
415                 widgetDefaultSelected(e);
416             }
417
418             @Override
419             public void widgetDefaultSelected(SelectionEvent e) {
420                 model.setEndYCoordIndex(Integer.parseInt(endYCoordSelector.getValue()));
421                 validatePageComplete();
422             }
423         });
424         endZValueSelector = new DynamicComboFieldEditor("endzValue", "End Z Value", parent);
425         endZValueSelector.addComboListener(new SelectionListener() {
426
427             @Override
428             public void widgetSelected(SelectionEvent e) {
429                 widgetDefaultSelected(e);
430             }
431
432             @Override
433             public void widgetDefaultSelected(SelectionEvent e) {
434                 model.setEndZCoordIndex(Integer.parseInt(endZValueSelector.getValue()));
435                 validatePageComplete();
436             }
437         });
438         diameterSelector = new DynamicComboFieldEditor("diameterValue", "Diameter value", parent);
439         diameterSelector.addComboListener(new SelectionListener() {
440
441             @Override
442             public void widgetSelected(SelectionEvent e) {
443                 widgetDefaultSelected(e);
444             }
445
446             @Override
447             public void widgetDefaultSelected(SelectionEvent e) {
448                 model.setDiameterIndex(Integer.parseInt(diameterSelector.getValue()));
449                 validatePageComplete();
450             }
451         });
452         outerDiameterSelector = new DynamicComboFieldEditor("outerDiameterValue", "Outer Diameter value", parent);
453         outerDiameterSelector.addComboListener(new SelectionListener() {
454
455             @Override
456             public void widgetSelected(SelectionEvent e) {
457                 widgetDefaultSelected(e);
458             }
459
460             @Override
461             public void widgetDefaultSelected(SelectionEvent e) {
462                 model.setOuterDiameterIndex(Integer.parseInt(outerDiameterSelector.getValue()));
463                 validatePageComplete();
464             }
465         });
466         nominalMassFlowSelector = new DynamicComboFieldEditor("nominalMassFlowValue", "Nominal Mass Flow", parent);
467         nominalMassFlowSelector.addComboListener(new SelectionListener() {
468
469             @Override
470             public void widgetSelected(SelectionEvent e) {
471                 widgetDefaultSelected(e);
472             }
473
474             @Override
475             public void widgetDefaultSelected(SelectionEvent e) {
476                 model.setNominalMassFlowIndex(Integer.parseInt(nominalMassFlowSelector.getValue()));
477                 validatePageComplete();
478             }
479         });
480     }
481
482     private void updateCombos() {
483         String[][] namesAndValues = new String[headerIndexAndValues.size()][];
484
485         int i = 0;
486         for (Entry<Integer, String> entry : headerIndexAndValues.entrySet()) {
487             int key = entry.getKey();
488             String value = entry.getValue();
489
490             String[] nameAndValue = new String[2];
491             nameAndValue[0] = value;
492             nameAndValue[1] = Integer.toString(key);
493             namesAndValues[i++] = nameAndValue;
494         }
495
496         if (model.isVertexImport())
497             updateVertexCombos(namesAndValues);
498         else
499             updateEdgeCombos(namesAndValues);
500
501         componentMappingSelector.updateCombo(namesAndValues);
502     }
503
504     private void updateEdgeCombos(String[][] namesAndValues) {
505         startXCoordSelector.updateCombo(namesAndValues);
506         endXCoordSelector.updateCombo(namesAndValues);
507         startYCoordSelector.updateCombo(namesAndValues);
508         endYCoordSelector.updateCombo(namesAndValues);
509         startZValueSelector.updateCombo(namesAndValues);
510         endZValueSelector.updateCombo(namesAndValues);
511         diameterSelector.updateCombo(namesAndValues);
512         outerDiameterSelector.updateCombo(namesAndValues);
513         nominalMassFlowSelector.updateCombo(namesAndValues);
514     }
515
516     private void updateVertexCombos(String[][] namesAndValues) {
517         xCoordSelector.updateCombo(namesAndValues);
518         yCoordSelector.updateCombo(namesAndValues);
519         zValueSelector.updateCombo(namesAndValues);
520         pressureValueSelector.updateCombo(namesAndValues);
521         tempValueSelector.updateCombo(namesAndValues);
522     }
523
524     private void updateHeaders() {
525         if (headerTable != null)
526             headerTable.dispose();
527         headerTable = new Table(tableComposite, SWT.NONE);
528         headerTable.setHeaderVisible(true);
529         headerTable.setLinesVisible(true);
530         GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(tableComposite);
531         for (int i = 0; i < headerTable.getColumns().length; i++) {
532             TableColumn column = headerTable.getColumns()[i];
533             column.dispose();
534         }
535         for (int i = 0; i < headerTable.getItemCount(); i++) {
536             TableItem item = headerTable.getItem(i);
537             item.dispose();
538         }
539
540         headerIndexAndValues.clear();
541
542         try {
543             List<CSVRecord> rows = model.getRows(5);
544
545             for (int k = 0; k < rows.size(); k++) {
546                 CSVRecord row = rows.get(k);
547
548                 int columnCount = row.size();
549                 for (int i = 0; i < columnCount; i++) {
550                     String value = row.get(i);
551                     if (k == 0) {
552                         TableColumn headerCol = new TableColumn(headerTable, SWT.NONE);
553                         headerCol.setText(value);
554
555                         tableColumnLayout.setColumnData(headerCol, new ColumnWeightData(10));
556                         headerCol.pack();
557
558                         headerIndexAndValues.put(i, value);
559                     } else {
560                         int actualK = k - 1;
561                         TableItem item;
562                         int itemCount = headerTable.getItemCount();
563                         if (actualK >= itemCount) {
564                             item = new TableItem(headerTable, SWT.NONE);
565                         } else {
566                             item = headerTable.getItem(actualK);
567                         }
568                         item.setText(i, value);
569                     }
570                 }
571             }
572
573         } catch (IOException e) {
574             setErrorMessage(e.getMessage());
575         }
576     }
577
578     protected void validatePageComplete() {
579         if (model.isVertexImport())
580             setPageComplete(model.getXCoordIndex() != -1 && model.getYCoordIndex() != -1 && model.getComponentMappingIndex() != -1);
581         else
582             setPageComplete(model.getStartXCoordIndex() != 1 && model.getStartYCoordIndex() != -1 && model.getEndXCoordIndex() != -1 && model.getEndYCoordIndex() != -1 && model.getComponentMappingIndex() != -1);
583     }
584
585 }