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