]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizardPage.java
Add support for importing regions to district models
[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.eclipse.swt.widgets.Text;
35 import org.geotools.referencing.CRS;
36 import org.simantics.district.imports.CSVImportModel;
37 import org.simantics.district.imports.ui.controls.DynamicComboFieldEditor;
38
39 public class CSVImportWizardPage extends WizardPage {
40
41     private CSVImportModel model;
42
43     private Map<Integer, String> headerIndexAndValues = new HashMap<>();
44
45     private Table headerTable;
46 //    private Button firstAsHeader;
47
48     private Combo delimiterCombo;
49     private TableColumnLayout tableColumnLayout;
50     private Composite tableComposite;
51 //    private FileSelectionWidget wktFileSelection;
52
53     // Common for vertex and edge
54     private DynamicComboFieldEditor componentMappingSelector;
55     private DynamicComboFieldEditor idSelector;
56     
57     // For vertex import
58     private DynamicComboFieldEditor xCoordSelector;
59     private DynamicComboFieldEditor yCoordSelector;
60     private DynamicComboFieldEditor zValueSelector;
61     private DynamicComboFieldEditor altElevationValueSelector;
62
63     private DynamicComboFieldEditor supplyTempValueSelector;
64     private DynamicComboFieldEditor returnTempValueSelector;
65     private DynamicComboFieldEditor supplyPressureValueSelector;
66     private DynamicComboFieldEditor returnPressureValueSelector;
67     private DynamicComboFieldEditor dpSelector;
68     private DynamicComboFieldEditor dtSelector;
69     private DynamicComboFieldEditor heatPowerSelector;
70     private DynamicComboFieldEditor peakPowerSelector;
71     private DynamicComboFieldEditor regionSelector;
72     private DynamicComboFieldEditor nominalHeadMSelector;
73     private DynamicComboFieldEditor nominalHeadBSelector;
74     private DynamicComboFieldEditor nominalFlowSelector;
75     private DynamicComboFieldEditor maximumHeadMSelector;
76     private DynamicComboFieldEditor heatLoadDsSelector;
77     private DynamicComboFieldEditor massFlowSelector;
78     private DynamicComboFieldEditor volFlowSelector;
79     private DynamicComboFieldEditor velocitySelector;
80     private DynamicComboFieldEditor flowAreaSelector;
81     private DynamicComboFieldEditor nominalPressureLossSelector;
82     private DynamicComboFieldEditor valvePositionSelector;
83     private DynamicComboFieldEditor addressSelector;
84     private DynamicComboFieldEditor lengthSelector;
85
86     // For edge import
87     private DynamicComboFieldEditor startXCoordSelector;
88     private DynamicComboFieldEditor startYCoordSelector;
89     private DynamicComboFieldEditor startZValueSelector;
90     private DynamicComboFieldEditor endXCoordSelector;
91     private DynamicComboFieldEditor endYCoordSelector;
92     private DynamicComboFieldEditor endZValueSelector;
93     private DynamicComboFieldEditor detailedGeometrySelector;
94
95     private Text edgeConnectionPadding;
96     
97     private DynamicComboFieldEditor outerDiameterSelector;
98     private DynamicComboFieldEditor diameterSelector;
99     private DynamicComboFieldEditor nominalMassFlowSelector;
100
101     private Group indexMappingGroup;
102
103     private Composite composite;
104
105     private Button isVertexImport;
106
107     private Combo sourceCRSCombo;
108
109     private DynamicComboFieldEditor edgeFlowAreaSelector;
110
111     private DynamicComboFieldEditor kReturnSelector;
112
113     private DynamicComboFieldEditor kSupplySelector;
114
115     private DynamicComboFieldEditor tGroundSelector;
116     
117     protected CSVImportWizardPage(CSVImportModel model) {
118         super("Import CSV Data");
119         this.model = model;
120         setMessage("Select column index mappings");
121     }
122
123     @Override
124     public void createControl(Composite parent) {
125         composite = new Composite(parent, SWT.NONE);
126         composite.setLayout(new GridLayout(1, false));
127         GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(composite);
128
129         Label label = new Label(composite, SWT.NONE);
130         label.setText("Select delimiter");
131         
132         delimiterCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
133         delimiterCombo.setToolTipText("Select the delimiter that is used to separate elements in the CSV file");
134         String[] formats = model.getDelimiterFormats();
135         delimiterCombo.setItems(formats);
136         if (formats.length > 0)
137             delimiterCombo.select(0);
138         delimiterCombo.addSelectionListener(new SelectionListener() {
139
140             @Override
141             public void widgetSelected(SelectionEvent e) {
142                 model.setDelimiterByLabel(delimiterCombo.getItem(delimiterCombo.getSelectionIndex()));
143                 updateHeaders();
144                 updateCombos();
145             }
146
147             @Override
148             public void widgetDefaultSelected(SelectionEvent e) {
149                 widgetSelected(e);
150             }
151         });
152
153 //        firstAsHeader = new Button(composite, SWT.CHECK);
154 //        firstAsHeader.setText("Read first row as header");
155 //        firstAsHeader.setSelection(model.getReadFirstAsHeader());
156 //        firstAsHeader.addSelectionListener(new SelectionListener() {
157 //
158 //            @Override
159 //            public void widgetSelected(SelectionEvent e) {
160 //                model.setReadFirstAsHeader(firstAsHeader.getSelection());
161 //                updateHeaders();
162 //                updateCombos();
163 //            }
164 //
165 //            @Override
166 //            public void widgetDefaultSelected(SelectionEvent e) {
167 //                widgetSelected(e);
168 //            }
169 //        });
170
171         tableComposite = new Composite(composite, SWT.BORDER);
172         tableColumnLayout = new TableColumnLayout();
173         tableComposite.setLayout(tableColumnLayout);
174
175         label = new Label(composite, SWT.NONE);
176         label.setText("Select source Coordinate Reference System");
177         
178         sourceCRSCombo = new Combo(composite, SWT.NONE);
179         sourceCRSCombo.setToolTipText("Select the coordinate reference system that is used in the source material for possible transformation to target coordinate reference system (EPSG:4326)");
180         Set<String> codes = CRS.getSupportedCodes("EPSG");
181         sourceCRSCombo.setItems(codes.toArray(new String[codes.size()]));
182         sourceCRSCombo.addSelectionListener(new SelectionAdapter() {
183             
184             @Override
185             public void widgetSelected(SelectionEvent e) {
186                 String current = sourceCRSCombo.getItem(sourceCRSCombo.getSelectionIndex());
187                 model.setSourceCRS("EPSG:" + current);
188             }
189         });
190         
191         sourceCRSCombo.addModifyListener(new ModifyListener() {
192             
193             @Override
194             public void modifyText(ModifyEvent e) {
195                 String currentText = sourceCRSCombo.getText();
196                 if (codes.contains(currentText)) {
197                     // Select this
198                     String[] items = sourceCRSCombo.getItems();
199                     int i;
200                     for (i = 0; i < items.length; i++) {
201                         String item = items[i];
202                         if (currentText.equals(item)) {
203                             break;
204                         }
205                     }
206                     if (i != 0) {
207                         sourceCRSCombo.select(i);
208                         model.setSourceCRS("EPSG:" + currentText);
209                     } else {
210                         System.err.println("this should not happen");
211                     }
212                 }
213             }
214         });
215         
216 //        wktFileSelection = new FileSelectionWidget(composite, "WKT file", SWT.OPEN);
217 //        wktFileSelection.addListener(new FileSelectionListener() {
218 //
219 //            @Override
220 //            public void fileSelected(FileOrDirectorySelectionWidget source, String[] filename) {
221 //                String[] selection = wktFileSelection.getFilename();
222 //                if (selection != null && selection.length > 0) {
223 //                    Path wktFile = Paths.get(selection[0]);
224 //                    if (!Files.exists(wktFile)) {
225 //                        setErrorMessage("File " + wktFile.toAbsolutePath() + " does not exist");
226 //                    } else {
227 //                        model.setWKTFile(wktFile);
228 //                        validatePageComplete();
229 //                    }
230 //                }
231 //            }
232 //        });
233
234         isVertexImport = new Button(composite, SWT.CHECK);
235         isVertexImport.setText("File contains vertices");
236         isVertexImport.setToolTipText("Enable this if the file contains vertices, i.e. points");
237         isVertexImport.setSelection(model.isVertexImport());
238         isVertexImport.addSelectionListener(new SelectionListener() {
239
240             @Override
241             public void widgetSelected(SelectionEvent e) {
242                 model.setVertexImport(isVertexImport.getSelection());
243                 updateControls(false);
244             }
245
246             @Override
247             public void widgetDefaultSelected(SelectionEvent e) {
248                 widgetSelected(e);
249             }
250         });
251         
252         updateControls(true);
253         updateHeaders();
254         setControl(composite);
255
256         final IWizardContainer container = getContainer();
257         
258         if (container instanceof IPageChangeProvider) {
259             ((IPageChangeProvider) container).addPageChangedListener(new IPageChangedListener() {
260
261                 @Override
262                 public void pageChanged(PageChangedEvent event) {
263                     if (isCurrentPage())
264                         CSVImportWizardPage.this.updateControls(false);
265                 }
266             });
267         }
268
269         validatePageComplete();
270     }
271     
272     private void updateControls(boolean initial) {
273         createIndexMappingGroup();
274         updateCombos();
275         if (!initial)
276             composite.layout(true, true);
277     }
278     
279     private void createIndexMappingGroup() {
280         if (indexMappingGroup != null)
281             indexMappingGroup.dispose();
282         
283         indexMappingGroup = new Group(composite, SWT.NONE);
284         indexMappingGroup.setText("Column index mapping");
285         GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(indexMappingGroup);
286         
287         if (model.isVertexImport())
288             createVertexIndexMappingField(indexMappingGroup);
289         else
290             createEdgeIndexMappingField(indexMappingGroup);
291         
292         createCommonIndexMappingField(indexMappingGroup);
293         
294         if (!model.isVertexImport()) {
295             Label label = new Label(indexMappingGroup, SWT.NONE);
296             label.setText("Connection point padding");
297             GridDataFactory.fillDefaults().applyTo(label);
298             edgeConnectionPadding = new Text(indexMappingGroup, SWT.BORDER);
299             GridDataFactory.fillDefaults().applyTo(edgeConnectionPadding);
300             edgeConnectionPadding.setText("0.0001"); // default
301             edgeConnectionPadding.addModifyListener(new ModifyListener() {
302                 
303                 @Override
304                 public void modifyText(ModifyEvent e) {
305                     try {
306                         double padding = Double.parseDouble(edgeConnectionPadding.getText());
307                         model.setEdgePadding(padding);
308                     } catch (NumberFormatException ee) {
309                         // ignore
310                     }
311                 }
312             });
313         }
314     }
315
316     private void createCommonIndexMappingField(Group parent) {
317         
318         componentMappingSelector = new DynamicComboFieldEditor("componentMapping", "Apros component mapping", parent);
319         componentMappingSelector.addComboListener(new SelectionListener() {
320
321             @Override
322             public void widgetSelected(SelectionEvent e) {
323                 widgetDefaultSelected(e);
324             }
325
326             @Override
327             public void widgetDefaultSelected(SelectionEvent e) {
328                 model.setComponentMappingIndex(Integer.parseInt(componentMappingSelector.getValue()));
329                 validatePageComplete();
330             }
331         });
332         
333         idSelector = new DynamicComboFieldEditor("id", "ID", parent);
334         idSelector.addComboListener(new SelectionListener() {
335
336             @Override
337             public void widgetSelected(SelectionEvent e) {
338                 widgetDefaultSelected(e);
339             }
340
341             @Override
342             public void widgetDefaultSelected(SelectionEvent e) {
343                 model.setIdIndex(Integer.parseInt(idSelector.getValue()));
344                 validatePageComplete();
345             }
346         });
347         regionSelector = new DynamicComboFieldEditor("regionValue", "Region", parent);
348         regionSelector.addComboListener(new SelectionListener() {
349
350             @Override
351             public void widgetSelected(SelectionEvent e) {
352                 widgetDefaultSelected(e);
353             }
354
355             @Override
356             public void widgetDefaultSelected(SelectionEvent e) {
357                 model.setRegionIndex(Integer.parseInt(regionSelector.getValue()));
358                 validatePageComplete();
359             }
360         });
361     }
362
363     private void createVertexIndexMappingField(Group parent) {
364         xCoordSelector = new DynamicComboFieldEditor("xCoord", "X Coordinate", parent);
365         xCoordSelector.addComboListener(new SelectionListener() {
366
367             @Override
368             public void widgetSelected(SelectionEvent e) {
369                 widgetDefaultSelected(e);
370             }
371
372             @Override
373             public void widgetDefaultSelected(SelectionEvent e) {
374                 model.setXCoordIndex(Integer.parseInt(xCoordSelector.getValue()));
375                 validatePageComplete();
376             }
377         });
378
379         yCoordSelector = new DynamicComboFieldEditor("yCoord", "Y Coordinate", parent);
380         yCoordSelector.addComboListener(new SelectionListener() {
381
382             @Override
383             public void widgetSelected(SelectionEvent e) {
384                 widgetDefaultSelected(e);
385             }
386
387             @Override
388             public void widgetDefaultSelected(SelectionEvent e) {
389                 model.setYCoordIndex(Integer.parseInt(yCoordSelector.getValue()));
390                 validatePageComplete();
391             }
392         });
393         zValueSelector = new DynamicComboFieldEditor("zValue", "Z Value", parent);
394         zValueSelector.addComboListener(new SelectionListener() {
395
396             @Override
397             public void widgetSelected(SelectionEvent e) {
398                 widgetDefaultSelected(e);
399             }
400
401             @Override
402             public void widgetDefaultSelected(SelectionEvent e) {
403                 model.setZCoordIndex(Integer.parseInt(zValueSelector.getValue()));
404                 validatePageComplete();
405             }
406         });
407
408         altElevationValueSelector = new DynamicComboFieldEditor("altElevation", "Alternative Elevation", parent);
409         altElevationValueSelector.addComboListener(new SelectionListener() {
410
411             @Override
412             public void widgetSelected(SelectionEvent e) {
413                 widgetDefaultSelected(e);
414             }
415
416             @Override
417             public void widgetDefaultSelected(SelectionEvent e) {
418                 model.setAltElevationIndex(Integer.parseInt(altElevationValueSelector.getValue()));
419                 validatePageComplete();
420             }
421         });
422         
423         supplyTempValueSelector = new DynamicComboFieldEditor("tempValue", "Supply Temperature value", parent);
424         supplyTempValueSelector.addComboListener(new SelectionListener() {
425
426             @Override
427             public void widgetSelected(SelectionEvent e) {
428                 widgetDefaultSelected(e);
429             }
430
431             @Override
432             public void widgetDefaultSelected(SelectionEvent e) {
433                 model.setSupplyTempIndex(Integer.parseInt(supplyTempValueSelector.getValue()));
434                 validatePageComplete();
435             }
436         });
437         returnTempValueSelector = new DynamicComboFieldEditor("returnTempValue", "Return Temperature value", parent);
438         returnTempValueSelector.addComboListener(new SelectionListener() {
439
440             @Override
441             public void widgetSelected(SelectionEvent e) {
442                 widgetDefaultSelected(e);
443             }
444
445             @Override
446             public void widgetDefaultSelected(SelectionEvent e) {
447                 model.setReturnTempIndex(Integer.parseInt(returnTempValueSelector.getValue()));
448                 validatePageComplete();
449             }
450         });
451         supplyPressureValueSelector = new DynamicComboFieldEditor("pressureValue", "Supply Pressure value", parent);
452         supplyPressureValueSelector.addComboListener(new SelectionListener() {
453
454             @Override
455             public void widgetSelected(SelectionEvent e) {
456                 widgetDefaultSelected(e);
457             }
458
459             @Override
460             public void widgetDefaultSelected(SelectionEvent e) {
461                 model.setSupplyPressureIndex(Integer.parseInt(supplyPressureValueSelector.getValue()));
462                 validatePageComplete();
463             }
464         });
465         returnPressureValueSelector = new DynamicComboFieldEditor("returnPressureValue", "Return Pressure value", parent);
466         returnPressureValueSelector.addComboListener(new SelectionListener() {
467
468             @Override
469             public void widgetSelected(SelectionEvent e) {
470                 widgetDefaultSelected(e);
471             }
472
473             @Override
474             public void widgetDefaultSelected(SelectionEvent e) {
475                 model.setReturnPressureIndex(Integer.parseInt(returnPressureValueSelector.getValue()));
476                 validatePageComplete();
477             }
478         });
479         dpSelector = new DynamicComboFieldEditor("dpValue", "Delta pressure ", parent);
480         dpSelector.addComboListener(new SelectionListener() {
481
482             @Override
483             public void widgetSelected(SelectionEvent e) {
484                 widgetDefaultSelected(e);
485             }
486
487             @Override
488             public void widgetDefaultSelected(SelectionEvent e) {
489                 model.setDeltaPressureIndex(Integer.parseInt(dpSelector.getValue()));
490                 validatePageComplete();
491             }
492         });
493         dtSelector = new DynamicComboFieldEditor("dtValue", "Delta temperature ", parent);
494         dtSelector.addComboListener(new SelectionListener() {
495
496             @Override
497             public void widgetSelected(SelectionEvent e) {
498                 widgetDefaultSelected(e);
499             }
500
501             @Override
502             public void widgetDefaultSelected(SelectionEvent e) {
503                 model.setDeltaTemperatureIndex(Integer.parseInt(dtSelector.getValue()));
504                 validatePageComplete();
505             }
506         });
507         heatPowerSelector = new DynamicComboFieldEditor("heatPowerValue", "Heat Power", parent);
508         heatPowerSelector.addComboListener(new SelectionListener() {
509
510             @Override
511             public void widgetSelected(SelectionEvent e) {
512                 widgetDefaultSelected(e);
513             }
514
515             @Override
516             public void widgetDefaultSelected(SelectionEvent e) {
517                 model.setHeatPowerIndex(Integer.parseInt(heatPowerSelector.getValue()));
518                 validatePageComplete();
519             }
520         });
521         peakPowerSelector = new DynamicComboFieldEditor("peakPowerValue", "Peak Power", parent);
522         peakPowerSelector.addComboListener(new SelectionListener() {
523
524             @Override
525             public void widgetSelected(SelectionEvent e) {
526                 widgetDefaultSelected(e);
527             }
528
529             @Override
530             public void widgetDefaultSelected(SelectionEvent e) {
531                 model.setPeakPowerIndex(Integer.parseInt(peakPowerSelector.getValue()));
532                 validatePageComplete();
533             }
534         });
535         
536         nominalHeadMSelector = new DynamicComboFieldEditor("nominalHeadMValue", "nominalHeadM", parent);
537         nominalHeadMSelector.addComboListener(new SelectionListener() {
538
539             @Override
540             public void widgetSelected(SelectionEvent e) {
541                 widgetDefaultSelected(e);
542             }
543
544             @Override
545             public void widgetDefaultSelected(SelectionEvent e) {
546                 model.setNominalHeadMIndex(Integer.parseInt(nominalHeadMSelector.getValue()));
547                 validatePageComplete();
548             }
549         });
550         nominalHeadBSelector = new DynamicComboFieldEditor("nominalHeadBValue", "nominalHeadB", parent);
551         nominalHeadBSelector.addComboListener(new SelectionListener() {
552
553             @Override
554             public void widgetSelected(SelectionEvent e) {
555                 widgetDefaultSelected(e);
556             }
557
558             @Override
559             public void widgetDefaultSelected(SelectionEvent e) {
560                 model.setNominalHeadBIndex(Integer.parseInt(nominalHeadBSelector.getValue()));
561                 validatePageComplete();
562             }
563         });
564         nominalFlowSelector = new DynamicComboFieldEditor("nominalFlowValue", "nominalFlow", parent);
565         nominalFlowSelector.addComboListener(new SelectionListener() {
566
567             @Override
568             public void widgetSelected(SelectionEvent e) {
569                 widgetDefaultSelected(e);
570             }
571
572             @Override
573             public void widgetDefaultSelected(SelectionEvent e) {
574                 model.setNominalFlowIndex(Integer.parseInt(nominalFlowSelector.getValue()));
575                 validatePageComplete();
576             }
577         });
578
579         maximumHeadMSelector = new DynamicComboFieldEditor("maximumHeadMValue", "maximumHeadM", parent);
580         maximumHeadMSelector.addComboListener(new SelectionListener() {
581
582             @Override
583             public void widgetSelected(SelectionEvent e) {
584                 widgetDefaultSelected(e);
585             }
586
587             @Override
588             public void widgetDefaultSelected(SelectionEvent e) {
589                 model.setMaximumHeadMIndex(Integer.parseInt(maximumHeadMSelector.getValue()));
590                 validatePageComplete();
591             }
592         });
593         heatLoadDsSelector = new DynamicComboFieldEditor("heatLoadDsValue", "heatLoadDs", parent);
594         heatLoadDsSelector.addComboListener(new SelectionListener() {
595
596             @Override
597             public void widgetSelected(SelectionEvent e) {
598                 widgetDefaultSelected(e);
599             }
600
601             @Override
602             public void widgetDefaultSelected(SelectionEvent e) {
603                 model.setHeatLoadDsIndex(Integer.parseInt(heatLoadDsSelector.getValue()));
604                 validatePageComplete();
605             }
606         });
607         massFlowSelector = new DynamicComboFieldEditor("massFlowValue", "massFlow", parent);
608         massFlowSelector.addComboListener(new SelectionListener() {
609
610             @Override
611             public void widgetSelected(SelectionEvent e) {
612                 widgetDefaultSelected(e);
613             }
614
615             @Override
616             public void widgetDefaultSelected(SelectionEvent e) {
617                 model.setMassFlowIndex(Integer.parseInt(massFlowSelector.getValue()));
618                 validatePageComplete();
619             }
620         });
621         volFlowSelector = new DynamicComboFieldEditor("volFlowValue", "volFlow", parent);
622         volFlowSelector.addComboListener(new SelectionListener() {
623
624             @Override
625             public void widgetSelected(SelectionEvent e) {
626                 widgetDefaultSelected(e);
627             }
628
629             @Override
630             public void widgetDefaultSelected(SelectionEvent e) {
631                 model.setVolFlowIndex(Integer.parseInt(volFlowSelector.getValue()));
632                 validatePageComplete();
633             }
634         });
635         velocitySelector = new DynamicComboFieldEditor("velocityValue", "velocity", parent);
636         velocitySelector.addComboListener(new SelectionListener() {
637
638             @Override
639             public void widgetSelected(SelectionEvent e) {
640                 widgetDefaultSelected(e);
641             }
642
643             @Override
644             public void widgetDefaultSelected(SelectionEvent e) {
645                 model.setVelocityIndex(Integer.parseInt(velocitySelector.getValue()));
646                 validatePageComplete();
647             }
648         });
649         flowAreaSelector = new DynamicComboFieldEditor("flowAreaValue", "flowArea", parent);
650         flowAreaSelector.addComboListener(new SelectionListener() {
651
652             @Override
653             public void widgetSelected(SelectionEvent e) {
654                 widgetDefaultSelected(e);
655             }
656
657             @Override
658             public void widgetDefaultSelected(SelectionEvent e) {
659                 model.setFlowAreaIndex(Integer.parseInt(flowAreaSelector.getValue()));
660                 validatePageComplete();
661             }
662         });
663         nominalPressureLossSelector = new DynamicComboFieldEditor("nominalPressureLossValue", "nominalPressureLoss", parent);
664         nominalPressureLossSelector.addComboListener(new SelectionListener() {
665
666             @Override
667             public void widgetSelected(SelectionEvent e) {
668                 widgetDefaultSelected(e);
669             }
670
671             @Override
672             public void widgetDefaultSelected(SelectionEvent e) {
673                 model.setNominalPressureLossIndex(Integer.parseInt(nominalPressureLossSelector.getValue()));
674                 validatePageComplete();
675             }
676         });
677         valvePositionSelector = new DynamicComboFieldEditor("valvePositionSelectorValue", "valvePositionSelector", parent);
678         valvePositionSelector.addComboListener(new SelectionListener() {
679
680             @Override
681             public void widgetSelected(SelectionEvent e) {
682                 widgetDefaultSelected(e);
683             }
684
685             @Override
686             public void widgetDefaultSelected(SelectionEvent e) {
687                 model.setValvePositionIndex(Integer.parseInt(valvePositionSelector.getValue()));
688                 validatePageComplete();
689             }
690         });
691         addressSelector = new DynamicComboFieldEditor("addressValue", "addressSelector", parent);
692         addressSelector.addComboListener(new SelectionListener() {
693
694             @Override
695             public void widgetSelected(SelectionEvent e) {
696                 widgetDefaultSelected(e);
697             }
698
699             @Override
700             public void widgetDefaultSelected(SelectionEvent e) {
701                 model.setAddressIndex(Integer.parseInt(addressSelector.getValue()));
702                 validatePageComplete();
703             }
704         });
705         
706
707     }
708
709     private void createEdgeIndexMappingField(Group parent) {
710         
711 //        Composite paddingComposite = new Composite(parent, SWT.NONE);
712 //        GridLayoutFactory.fillDefaults().numColumns(2).applyTo(paddingComposite);
713         
714         startXCoordSelector = new DynamicComboFieldEditor("startxCoord", "Start X Coordinate", parent);
715         startXCoordSelector.addComboListener(new SelectionListener() {
716
717             @Override
718             public void widgetSelected(SelectionEvent e) {
719                 widgetDefaultSelected(e);
720             }
721
722             @Override
723             public void widgetDefaultSelected(SelectionEvent e) {
724                 model.setStartXCoordIndex(Integer.parseInt(startXCoordSelector.getValue()));
725                 validatePageComplete();
726             }
727         });
728
729         startYCoordSelector = new DynamicComboFieldEditor("startyCoord", "Start Y Coordinate", parent);
730         startYCoordSelector.addComboListener(new SelectionListener() {
731
732             @Override
733             public void widgetSelected(SelectionEvent e) {
734                 widgetDefaultSelected(e);
735             }
736
737             @Override
738             public void widgetDefaultSelected(SelectionEvent e) {
739                 model.setStartYCoordIndex(Integer.parseInt(startYCoordSelector.getValue()));
740                 validatePageComplete();
741             }
742         });
743         startZValueSelector = new DynamicComboFieldEditor("startzValue", "Start Z Value", parent);
744         startZValueSelector.addComboListener(new SelectionListener() {
745
746             @Override
747             public void widgetSelected(SelectionEvent e) {
748                 widgetDefaultSelected(e);
749             }
750
751             @Override
752             public void widgetDefaultSelected(SelectionEvent e) {
753                 model.setStartZCoordIndex(Integer.parseInt(startZValueSelector.getValue()));
754                 validatePageComplete();
755             }
756         });
757         
758         endXCoordSelector = new DynamicComboFieldEditor("endxCoord", "End X Coordinate", parent);
759         endXCoordSelector.addComboListener(new SelectionListener() {
760
761             @Override
762             public void widgetSelected(SelectionEvent e) {
763                 widgetDefaultSelected(e);
764             }
765
766             @Override
767             public void widgetDefaultSelected(SelectionEvent e) {
768                 model.setEndXCoordIndex(Integer.parseInt(endXCoordSelector.getValue()));
769                 validatePageComplete();
770             }
771         });
772
773         endYCoordSelector = new DynamicComboFieldEditor("endyCoord", "End Y Coordinate", parent);
774         endYCoordSelector.addComboListener(new SelectionListener() {
775
776             @Override
777             public void widgetSelected(SelectionEvent e) {
778                 widgetDefaultSelected(e);
779             }
780
781             @Override
782             public void widgetDefaultSelected(SelectionEvent e) {
783                 model.setEndYCoordIndex(Integer.parseInt(endYCoordSelector.getValue()));
784                 validatePageComplete();
785             }
786         });
787         endZValueSelector = new DynamicComboFieldEditor("endzValue", "End Z Value", parent);
788         endZValueSelector.addComboListener(new SelectionListener() {
789
790             @Override
791             public void widgetSelected(SelectionEvent e) {
792                 widgetDefaultSelected(e);
793             }
794
795             @Override
796             public void widgetDefaultSelected(SelectionEvent e) {
797                 model.setEndZCoordIndex(Integer.parseInt(endZValueSelector.getValue()));
798                 validatePageComplete();
799             }
800         });
801         detailedGeometrySelector = new DynamicComboFieldEditor("detailedGeometryValue", "Geometry", parent);
802         detailedGeometrySelector.addComboListener(new SelectionListener() {
803
804             @Override
805             public void widgetSelected(SelectionEvent e) {
806                 widgetDefaultSelected(e);
807             }
808
809             @Override
810             public void widgetDefaultSelected(SelectionEvent e) {
811                 model.detailedGeometryIndex(Integer.parseInt(detailedGeometrySelector.getValue()));
812                 validatePageComplete();
813             }
814         });
815         diameterSelector = new DynamicComboFieldEditor("diameterValue", "Diameter value", parent);
816         diameterSelector.addComboListener(new SelectionListener() {
817
818             @Override
819             public void widgetSelected(SelectionEvent e) {
820                 widgetDefaultSelected(e);
821             }
822
823             @Override
824             public void widgetDefaultSelected(SelectionEvent e) {
825                 model.setDiameterIndex(Integer.parseInt(diameterSelector.getValue()));
826                 validatePageComplete();
827             }
828         });
829         outerDiameterSelector = new DynamicComboFieldEditor("outerDiameterValue", "Outer Diameter value", parent);
830         outerDiameterSelector.addComboListener(new SelectionListener() {
831
832             @Override
833             public void widgetSelected(SelectionEvent e) {
834                 widgetDefaultSelected(e);
835             }
836
837             @Override
838             public void widgetDefaultSelected(SelectionEvent e) {
839                 model.setOuterDiameterIndex(Integer.parseInt(outerDiameterSelector.getValue()));
840                 validatePageComplete();
841             }
842         });
843         nominalMassFlowSelector = new DynamicComboFieldEditor("nominalMassFlowValue", "Nominal Mass Flow", parent);
844         nominalMassFlowSelector.addComboListener(new SelectionListener() {
845
846             @Override
847             public void widgetSelected(SelectionEvent e) {
848                 widgetDefaultSelected(e);
849             }
850
851             @Override
852             public void widgetDefaultSelected(SelectionEvent e) {
853                 model.setNominalMassFlowIndex(Integer.parseInt(nominalMassFlowSelector.getValue()));
854                 validatePageComplete();
855             }
856         });
857         edgeFlowAreaSelector = new DynamicComboFieldEditor("edgeFlowAreaValue", "Flow Area", parent);
858         edgeFlowAreaSelector.addComboListener(new SelectionListener() {
859
860             @Override
861             public void widgetSelected(SelectionEvent e) {
862                 widgetDefaultSelected(e);
863             }
864
865             @Override
866             public void widgetDefaultSelected(SelectionEvent e) {
867                 model.setEdgeFlowAreaIndex(Integer.parseInt(edgeFlowAreaSelector.getValue()));
868                 validatePageComplete();
869             }
870         });
871         kReturnSelector = new DynamicComboFieldEditor("kReturnValue", "K Return", parent);
872         kReturnSelector.addComboListener(new SelectionListener() {
873
874             @Override
875             public void widgetSelected(SelectionEvent e) {
876                 widgetDefaultSelected(e);
877             }
878
879             @Override
880             public void widgetDefaultSelected(SelectionEvent e) {
881                 model.setKReturnIndex(Integer.parseInt(kReturnSelector.getValue()));
882                 validatePageComplete();
883             }
884         });
885         kSupplySelector = new DynamicComboFieldEditor("kSupplyValue", "K Supply", parent);
886         kSupplySelector.addComboListener(new SelectionListener() {
887
888             @Override
889             public void widgetSelected(SelectionEvent e) {
890                 widgetDefaultSelected(e);
891             }
892
893             @Override
894             public void widgetDefaultSelected(SelectionEvent e) {
895                 model.setKSupplyIndex(Integer.parseInt(kSupplySelector.getValue()));
896                 validatePageComplete();
897             }
898         });
899         tGroundSelector = new DynamicComboFieldEditor("tGroundValue", "Temperature Ground", parent);
900         tGroundSelector.addComboListener(new SelectionListener() {
901
902             @Override
903             public void widgetSelected(SelectionEvent e) {
904                 widgetDefaultSelected(e);
905             }
906
907             @Override
908             public void widgetDefaultSelected(SelectionEvent e) {
909                 model.setTGroundIndex(Integer.parseInt(tGroundSelector.getValue()));
910                 validatePageComplete();
911             }
912         });
913         lengthSelector = new DynamicComboFieldEditor("lengthValue", "lengthSelector", parent);
914         lengthSelector.addComboListener(new SelectionListener() {
915
916             @Override
917             public void widgetSelected(SelectionEvent e) {
918                 widgetDefaultSelected(e);
919             }
920
921             @Override
922             public void widgetDefaultSelected(SelectionEvent e) {
923                 model.setLengthIndex(Integer.parseInt(lengthSelector.getValue()));
924                 validatePageComplete();
925             }
926         });
927     }
928
929     private void updateCombos() {
930         String[][] namesAndValues = new String[headerIndexAndValues.size() + 1][];
931
932         namesAndValues[0] = new String[] {"", "-1"};
933         int i = 1;
934         for (Entry<Integer, String> entry : headerIndexAndValues.entrySet()) {
935             int key = entry.getKey();
936             String value = entry.getValue();
937
938             String[] nameAndValue = new String[2];
939             nameAndValue[0] = value;
940             nameAndValue[1] = Integer.toString(key);
941             namesAndValues[i++] = nameAndValue;
942         }
943
944         if (model.isVertexImport())
945             updateVertexCombos(namesAndValues);
946         else
947             updateEdgeCombos(namesAndValues);
948
949         componentMappingSelector.updateCombo(namesAndValues);
950         idSelector.updateCombo(namesAndValues);
951     }
952
953     private void updateEdgeCombos(String[][] namesAndValues) {
954         startXCoordSelector.updateCombo(namesAndValues);
955         endXCoordSelector.updateCombo(namesAndValues);
956         startYCoordSelector.updateCombo(namesAndValues);
957         endYCoordSelector.updateCombo(namesAndValues);
958         startZValueSelector.updateCombo(namesAndValues);
959         endZValueSelector.updateCombo(namesAndValues);
960         detailedGeometrySelector.updateCombo(namesAndValues);
961         diameterSelector.updateCombo(namesAndValues);
962         outerDiameterSelector.updateCombo(namesAndValues);
963         nominalMassFlowSelector.updateCombo(namesAndValues);
964         edgeFlowAreaSelector.updateCombo(namesAndValues);
965         kReturnSelector.updateCombo(namesAndValues);
966         kSupplySelector.updateCombo(namesAndValues);
967         tGroundSelector.updateCombo(namesAndValues);
968         lengthSelector.updateCombo(namesAndValues);
969     }
970
971     private void updateVertexCombos(String[][] namesAndValues) {
972         xCoordSelector.updateCombo(namesAndValues);
973         yCoordSelector.updateCombo(namesAndValues);
974         zValueSelector.updateCombo(namesAndValues);
975         altElevationValueSelector.updateCombo(namesAndValues);
976         supplyTempValueSelector.updateCombo(namesAndValues);       
977         returnTempValueSelector.updateCombo(namesAndValues);       
978         supplyPressureValueSelector.updateCombo(namesAndValues);   
979         returnPressureValueSelector.updateCombo(namesAndValues);   
980         dpSelector.updateCombo(namesAndValues);                    
981         dtSelector.updateCombo(namesAndValues);                    
982         heatPowerSelector.updateCombo(namesAndValues);             
983         valvePositionSelector.updateCombo(namesAndValues);             
984         nominalHeadMSelector.updateCombo(namesAndValues);          
985         nominalHeadBSelector.updateCombo(namesAndValues);          
986         nominalFlowSelector.updateCombo(namesAndValues);           
987         maximumHeadMSelector.updateCombo(namesAndValues);          
988         heatLoadDsSelector.updateCombo(namesAndValues);            
989         massFlowSelector.updateCombo(namesAndValues);              
990         volFlowSelector.updateCombo(namesAndValues);               
991         velocitySelector.updateCombo(namesAndValues);              
992         flowAreaSelector.updateCombo(namesAndValues);              
993         nominalPressureLossSelector.updateCombo(namesAndValues);   
994         addressSelector.updateCombo(namesAndValues);
995     }
996     
997     
998
999     private void updateHeaders() {
1000         if (headerTable != null)
1001             headerTable.dispose();
1002         headerTable = new Table(tableComposite, SWT.NONE);
1003         headerTable.setHeaderVisible(true);
1004         headerTable.setLinesVisible(true);
1005         GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(tableComposite);
1006         for (int i = 0; i < headerTable.getColumns().length; i++) {
1007             TableColumn column = headerTable.getColumns()[i];
1008             column.dispose();
1009         }
1010         for (int i = 0; i < headerTable.getItemCount(); i++) {
1011             TableItem item = headerTable.getItem(i);
1012             item.dispose();
1013         }
1014
1015         headerIndexAndValues.clear();
1016
1017         try {
1018             List<CSVRecord> rows = model.getRows(5, false);
1019
1020             for (int k = 0; k < rows.size(); k++) {
1021                 CSVRecord row = rows.get(k);
1022
1023                 int columnCount = row.size();
1024                 for (int i = 0; i < columnCount; i++) {
1025                     String value = row.get(i);
1026                     if (k == 0) {
1027                         TableColumn headerCol = new TableColumn(headerTable, SWT.NONE);
1028                         headerCol.setText(value);
1029
1030                         tableColumnLayout.setColumnData(headerCol, new ColumnWeightData(10));
1031                         headerCol.pack();
1032
1033                         headerIndexAndValues.put(i, value);
1034                     } else {
1035                         int actualK = k - 1;
1036                         TableItem item;
1037                         int itemCount = headerTable.getItemCount();
1038                         if (actualK >= itemCount) {
1039                             item = new TableItem(headerTable, SWT.NONE);
1040                         } else {
1041                             item = headerTable.getItem(actualK);
1042                         }
1043                         item.setText(i, value);
1044                     }
1045                 }
1046             }
1047
1048         } catch (IOException e) {
1049             setErrorMessage(e.getMessage());
1050         }
1051     }
1052
1053     protected void validatePageComplete() {
1054         if (model.isVertexImport())
1055             setPageComplete(model.getXCoordIndex() != -1 && model.getYCoordIndex() != -1 && model.getComponentMappingIndex() != -1);
1056         else
1057             setPageComplete(model.getStartXCoordIndex() != -1 && model.getStartYCoordIndex() != -1 && model.getEndXCoordIndex() != -1 && model.getEndYCoordIndex() != -1 && model.getComponentMappingIndex() != -1);
1058     }
1059
1060 }