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