]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizardPage.java
Elimination of compiler warnings.
[simantics/district.git] / org.simantics.district.imports.ui / src / org / simantics / district / imports / ui / CSVImportWizardPage.java
index 85eeb942d13af1dd470deaf9795fc35e710f85ec..3d121e7aca9d3889fad99e64c9db4ac861d4e70f 100644 (file)
-package org.simantics.district.imports.ui;\r
-\r
-import java.io.IOException;\r
-import java.nio.file.Files;\r
-import java.nio.file.Path;\r
-import java.nio.file.Paths;\r
-import java.util.Collections;\r
-import java.util.List;\r
-import java.util.Map;\r
-\r
-import org.eclipse.jface.layout.GridDataFactory;\r
-import org.eclipse.jface.layout.TableColumnLayout;\r
-import org.eclipse.jface.layout.TreeColumnLayout;\r
-import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;\r
-import org.eclipse.jface.viewers.ColumnWeightData;\r
-import org.eclipse.jface.viewers.IContentProvider;\r
-import org.eclipse.jface.viewers.TableViewer;\r
-import org.eclipse.jface.viewers.TreeViewer;\r
-import org.eclipse.jface.viewers.Viewer;\r
-import org.eclipse.jface.wizard.WizardPage;\r
-import org.eclipse.swt.SWT;\r
-import org.eclipse.swt.events.SelectionEvent;\r
-import org.eclipse.swt.events.SelectionListener;\r
-import org.eclipse.swt.layout.GridData;\r
-import org.eclipse.swt.layout.GridLayout;\r
-import org.eclipse.swt.widgets.Button;\r
-import org.eclipse.swt.widgets.Combo;\r
-import org.eclipse.swt.widgets.Composite;\r
-import org.eclipse.swt.widgets.Layout;\r
-import org.eclipse.swt.widgets.Table;\r
-import org.eclipse.swt.widgets.TableColumn;\r
-import org.eclipse.swt.widgets.TableItem;\r
-import org.simantics.district.imports.DistrictImportUtils.CSVHeader;\r
-import org.simantics.utils.ui.widgets.FileOrDirectorySelectionWidget;\r
-import org.simantics.utils.ui.widgets.FileSelectionListener;\r
-import org.simantics.utils.ui.widgets.FileSelectionWidget;\r
-\r
-public class CSVImportWizardPage extends WizardPage implements FileSelectionListener {\r
-\r
-    private CSVImportModel model;\r
-    private FileSelectionWidget csvSelection;\r
-    private Table headerTable;\r
-    private Button firstAsHeader;\r
-    private Combo delimiterCombo;\r
-    private TableColumnLayout tableColumnLayout;\r
-    private TableViewer tableViewer;\r
-\r
-    protected CSVImportWizardPage(CSVImportModel model) {\r
-        super("Import CSV Data");\r
-        this.model = model;\r
-        setMessage("Select CSV file to import");\r
-    }\r
-\r
-    @Override\r
-    public void createControl(Composite parent) {\r
-        Composite composite = new Composite(parent, SWT.NONE);\r
-        composite.setLayout(new GridLayout(1,false));\r
-        GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(composite);\r
-        \r
-        csvSelection = new FileSelectionWidget(composite, "CSV file", SWT.OPEN);\r
-        csvSelection.addListener(this);\r
-        \r
-        delimiterCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);\r
-        delimiterCombo.setItems(model.getDelimiterFormats());\r
-        delimiterCombo.addSelectionListener(new SelectionListener() {\r
-            \r
-            @Override\r
-            public void widgetSelected(SelectionEvent e) {\r
-                model.setDelimiterByLabel(delimiterCombo.getItem(delimiterCombo.getSelectionIndex()));\r
-                updateHeaders();\r
-            }\r
-            \r
-            @Override\r
-            public void widgetDefaultSelected(SelectionEvent e) {\r
-                \r
-            }\r
-        });\r
-        \r
-        firstAsHeader = new Button(composite, SWT.CHECK);\r
-        firstAsHeader.setText("Read first row as header");\r
-        firstAsHeader.setSelection(model.getReadFirstAsHeader());\r
-        firstAsHeader.addSelectionListener(new SelectionListener() {\r
-            \r
-            @Override\r
-            public void widgetSelected(SelectionEvent e) {\r
-                model.setReadFirstAsHeader(firstAsHeader.getSelection());\r
-                updateHeaders();\r
-            }\r
-            \r
-            @Override\r
-            public void widgetDefaultSelected(SelectionEvent e) {\r
-                \r
-            }\r
-        });\r
-        \r
-        \r
-        Composite tableComposite = new Composite(composite, SWT.BORDER);\r
-        TreeColumnLayout treeColumnLayout = new TreeColumnLayout();\r
-        tableComposite.setLayout(treeColumnLayout);\r
-        \r
-        tableViewer = new TableViewer(tableComposite, SWT.V_SCROLL | SWT.H_SCROLL);\r
-        ColumnViewerToolTipSupport.enableFor(tableViewer);\r
-        tableViewer.setContentProvider(new IContentProvider() {\r
-            \r
-            @Override\r
-            public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {\r
-                \r
-            }\r
-            \r
-            @Override\r
-            public void dispose() {\r
-                \r
-            }\r
-        });\r
-        \r
-        Table table = tableViewer.getTable();\r
-        table.setHeaderVisible(true);\r
-        table.setLinesVisible(true);\r
-        \r
-        headerTable = new Table(tableComposite, SWT.NONE);\r
-        headerTable.setHeaderVisible(true);\r
-        headerTable.setLinesVisible(true);\r
-        GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(tableComposite);\r
-        \r
-        setControl(composite);\r
-        \r
-        updateHeaders();\r
-        \r
-        setPageComplete(false);\r
-    }\r
-\r
-    @Override\r
-    public void fileSelected(FileOrDirectorySelectionWidget source, String[] filename) {\r
-        String[] selection = csvSelection.getFilename();\r
-        if (selection != null && selection.length > 0) {\r
-            Path csvFile = Paths.get(selection[0]);\r
-            if (!Files.exists(csvFile)) {\r
-                setErrorMessage("File " + csvFile.toAbsolutePath() + " does not exist");\r
-            } else {\r
-                model.setSource(csvFile);\r
-                updateHeaders();\r
-                setPageComplete(true);\r
-            }\r
-        } else {\r
-            setPageComplete(false);\r
-        }\r
-    }\r
-\r
-    private void updateHeaders() {\r
-        headerTable.setRedraw(false);\r
-        for (int i = 0; i < headerTable.getColumns().length; i++) {\r
-            TableColumn column = headerTable.getColumns()[i];\r
-            column.dispose();\r
-        }\r
-        for (int i = 0; i < headerTable.getItemCount(); i++) {\r
-            TableItem item = headerTable.getItem(i);\r
-            item.dispose();\r
-        }\r
-        try {\r
-            Map<CSVHeader, List<String>> headerAndValues = model.getHeaderAndRows(5);\r
-            \r
-            int coo = headerTable.getColumns().length;\r
-            int count = headerTable.getColumnCount();\r
-            \r
-            for (Map.Entry<CSVHeader, List<String>> entr : headerAndValues.entrySet()) {\r
-                CSVHeader he = entr.getKey();\r
-                int index = he.getIndex();\r
-                TableColumn headerCol = new TableColumn(headerTable, SWT.NONE);\r
-                headerCol.setText(he.getHeader());\r
-                \r
-                tableColumnLayout.setColumnData(headerCol, new ColumnWeightData(10));\r
-                headerCol.pack();\r
-                \r
-                for (String val : entr.getValue()) {\r
-                    TableItem item = new TableItem(headerTable, SWT.NONE);\r
-                    item.setText(val);\r
-                }\r
-            }\r
-        } catch (IOException e) {\r
-            setErrorMessage(e.getMessage());\r
-        }\r
-        headerTable.setRedraw(true);\r
-    }\r
-\r
-}\r
+package org.simantics.district.imports.ui;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.apache.commons.csv.CSVRecord;
+import org.eclipse.jface.dialogs.IPageChangeProvider;
+import org.eclipse.jface.dialogs.IPageChangedListener;
+import org.eclipse.jface.dialogs.PageChangedEvent;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.wizard.IWizardContainer;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.geotools.referencing.CRS;
+import org.simantics.district.imports.ui.controls.DynamicComboFieldEditor;
+
+public class CSVImportWizardPage extends WizardPage {
+
+    private CSVImportModel model;
+
+    private Map<Integer, String> headerIndexAndValues = new HashMap<>();
+
+    private Table headerTable;
+//    private Button firstAsHeader;
+
+    private Combo delimiterCombo;
+    private TableColumnLayout tableColumnLayout;
+    private Composite tableComposite;
+//    private FileSelectionWidget wktFileSelection;
+
+    // Common for vertex and edge
+    private DynamicComboFieldEditor componentMappingSelector;
+    private DynamicComboFieldEditor idSelector;
+    
+    // For vertex import
+    private DynamicComboFieldEditor xCoordSelector;
+    private DynamicComboFieldEditor yCoordSelector;
+    private DynamicComboFieldEditor zValueSelector;
+
+    private DynamicComboFieldEditor supplyTempValueSelector;
+    private DynamicComboFieldEditor returnTempValueSelector;
+    private DynamicComboFieldEditor supplyPressureValueSelector;
+    private DynamicComboFieldEditor returnPressureValueSelector;
+    private DynamicComboFieldEditor dpSelector;
+    private DynamicComboFieldEditor dtSelector;
+    private DynamicComboFieldEditor heatPowerSelector;
+    private DynamicComboFieldEditor nominalHeadMSelector;
+    private DynamicComboFieldEditor nominalHeadBSelector;
+    private DynamicComboFieldEditor nominalFlowSelector;
+    private DynamicComboFieldEditor maximumHeadMSelector;
+    private DynamicComboFieldEditor heatLoadDsSelector;
+    private DynamicComboFieldEditor massFlowSelector;
+    private DynamicComboFieldEditor volFlowSelector;
+    private DynamicComboFieldEditor velocitySelector;
+    private DynamicComboFieldEditor flowAreaSelector;
+    private DynamicComboFieldEditor nominalPressureLossSelector;
+    private DynamicComboFieldEditor valvePositionSelector;
+    private DynamicComboFieldEditor addressSelector;
+    private DynamicComboFieldEditor lengthSelector;
+
+    // For edge import
+    private DynamicComboFieldEditor startXCoordSelector;
+    private DynamicComboFieldEditor startYCoordSelector;
+    private DynamicComboFieldEditor startZValueSelector;
+    private DynamicComboFieldEditor endXCoordSelector;
+    private DynamicComboFieldEditor endYCoordSelector;
+    private DynamicComboFieldEditor endZValueSelector;
+    private DynamicComboFieldEditor detailedGeometrySelector;
+
+    private Text edgeConnectionPadding;
+    
+    private DynamicComboFieldEditor outerDiameterSelector;
+    private DynamicComboFieldEditor diameterSelector;
+    private DynamicComboFieldEditor nominalMassFlowSelector;
+
+    private Group indexMappingGroup;
+
+    private Composite composite;
+
+    private Button isVertexImport;
+
+    private Combo sourceCRSCombo;
+
+    private DynamicComboFieldEditor edgeFlowAreaSelector;
+
+    private DynamicComboFieldEditor kReturnSelector;
+
+    private DynamicComboFieldEditor kSupplySelector;
+
+    private DynamicComboFieldEditor tGroundSelector;
+    
+    protected CSVImportWizardPage(CSVImportModel model) {
+        super("Import CSV Data");
+        this.model = model;
+        setMessage("Select column index mappings");
+    }
+
+    @Override
+    public void createControl(Composite parent) {
+        composite = new Composite(parent, SWT.NONE);
+        composite.setLayout(new GridLayout(1, false));
+        GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(composite);
+
+        Label label = new Label(composite, SWT.NONE);
+        label.setText("Select delimiter");
+        
+        delimiterCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
+        delimiterCombo.setToolTipText("Select the delimiter that is used to separate elements in the CSV file");
+        String[] formats = model.getDelimiterFormats();
+        delimiterCombo.setItems(formats);
+        if (formats.length > 0)
+            delimiterCombo.select(0);
+        delimiterCombo.addSelectionListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                model.setDelimiterByLabel(delimiterCombo.getItem(delimiterCombo.getSelectionIndex()));
+                updateHeaders();
+                updateCombos();
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                widgetSelected(e);
+            }
+        });
+
+//        firstAsHeader = new Button(composite, SWT.CHECK);
+//        firstAsHeader.setText("Read first row as header");
+//        firstAsHeader.setSelection(model.getReadFirstAsHeader());
+//        firstAsHeader.addSelectionListener(new SelectionListener() {
+//
+//            @Override
+//            public void widgetSelected(SelectionEvent e) {
+//                model.setReadFirstAsHeader(firstAsHeader.getSelection());
+//                updateHeaders();
+//                updateCombos();
+//            }
+//
+//            @Override
+//            public void widgetDefaultSelected(SelectionEvent e) {
+//                widgetSelected(e);
+//            }
+//        });
+
+        tableComposite = new Composite(composite, SWT.BORDER);
+        tableColumnLayout = new TableColumnLayout();
+        tableComposite.setLayout(tableColumnLayout);
+
+        label = new Label(composite, SWT.NONE);
+        label.setText("Select source Coordinate Reference System");
+        
+        sourceCRSCombo = new Combo(composite, SWT.NONE);
+        sourceCRSCombo.setToolTipText("Select the coordinate reference system that is used in the source material for possible transformation to target coordinate reference system (EPSG:4326)");
+        Set<String> codes = CRS.getSupportedCodes("EPSG");
+        sourceCRSCombo.setItems(codes.toArray(new String[codes.size()]));
+        sourceCRSCombo.addSelectionListener(new SelectionAdapter() {
+            
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                String current = sourceCRSCombo.getItem(sourceCRSCombo.getSelectionIndex());
+                model.setSourceCRS("EPSG:" + current);
+            }
+        });
+        
+        sourceCRSCombo.addModifyListener(new ModifyListener() {
+            
+            @Override
+            public void modifyText(ModifyEvent e) {
+                String currentText = sourceCRSCombo.getText();
+                if (codes.contains(currentText)) {
+                    // Select this
+                    String[] items = sourceCRSCombo.getItems();
+                    int i;
+                    for (i = 0; i < items.length; i++) {
+                        String item = items[i];
+                        if (currentText.equals(item)) {
+                            break;
+                        }
+                    }
+                    if (i != 0) {
+                        sourceCRSCombo.select(i);
+                        model.setSourceCRS("EPSG:" + currentText);
+                    } else {
+                        System.err.println("this should not happen");
+                    }
+                }
+            }
+        });
+        
+//        wktFileSelection = new FileSelectionWidget(composite, "WKT file", SWT.OPEN);
+//        wktFileSelection.addListener(new FileSelectionListener() {
+//
+//            @Override
+//            public void fileSelected(FileOrDirectorySelectionWidget source, String[] filename) {
+//                String[] selection = wktFileSelection.getFilename();
+//                if (selection != null && selection.length > 0) {
+//                    Path wktFile = Paths.get(selection[0]);
+//                    if (!Files.exists(wktFile)) {
+//                        setErrorMessage("File " + wktFile.toAbsolutePath() + " does not exist");
+//                    } else {
+//                        model.setWKTFile(wktFile);
+//                        validatePageComplete();
+//                    }
+//                }
+//            }
+//        });
+
+        isVertexImport = new Button(composite, SWT.CHECK);
+        isVertexImport.setText("File contains vertices");
+        isVertexImport.setToolTipText("Enable this if the file contains vertices, i.e. points");
+        isVertexImport.setSelection(model.isVertexImport());
+        isVertexImport.addSelectionListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                model.setVertexImport(isVertexImport.getSelection());
+                updateControls(false);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                widgetSelected(e);
+            }
+        });
+        
+        updateControls(true);
+        updateHeaders();
+        setControl(composite);
+
+        final IWizardContainer container = getContainer();
+        
+        if (container instanceof IPageChangeProvider) {
+            ((IPageChangeProvider) container).addPageChangedListener(new IPageChangedListener() {
+
+                @Override
+                public void pageChanged(PageChangedEvent event) {
+                    if (isCurrentPage())
+                        CSVImportWizardPage.this.updateControls(false);
+                }
+            });
+        }
+
+        validatePageComplete();
+    }
+    
+    private void updateControls(boolean initial) {
+        createIndexMappingGroup();
+        updateCombos();
+        if (!initial)
+            composite.layout(true, true);
+    }
+    
+    private void createIndexMappingGroup() {
+        if (indexMappingGroup != null)
+            indexMappingGroup.dispose();
+        
+        indexMappingGroup = new Group(composite, SWT.NONE);
+        indexMappingGroup.setText("Column index mapping");
+        GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(indexMappingGroup);
+        
+        if (model.isVertexImport())
+            createVertexIndexMappingField(indexMappingGroup);
+        else
+            createEdgeIndexMappingField(indexMappingGroup);
+        
+        createCommonIndexMappingField(indexMappingGroup);
+        
+        if (!model.isVertexImport()) {
+            Label label = new Label(indexMappingGroup, SWT.NONE);
+            label.setText("Connection point padding");
+            GridDataFactory.fillDefaults().applyTo(label);
+            edgeConnectionPadding = new Text(indexMappingGroup, SWT.BORDER);
+            GridDataFactory.fillDefaults().applyTo(edgeConnectionPadding);
+            edgeConnectionPadding.setText("0.0001"); // default
+            edgeConnectionPadding.addModifyListener(new ModifyListener() {
+                
+                @Override
+                public void modifyText(ModifyEvent e) {
+                    try {
+                        double padding = Double.parseDouble(edgeConnectionPadding.getText());
+                        model.setEdgePapping(padding);
+                    } catch (NumberFormatException ee) {
+                        // ignore
+                    }
+                }
+            });
+        }
+    }
+
+    private void createCommonIndexMappingField(Group parent) {
+        
+        componentMappingSelector = new DynamicComboFieldEditor("componentMapping", "Apros component mapping", parent);
+        componentMappingSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setComponentMappingIndex(Integer.parseInt(componentMappingSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        
+        idSelector = new DynamicComboFieldEditor("id", "ID", parent);
+        idSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setIdIndex(Integer.parseInt(idSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        
+    }
+
+    private void createVertexIndexMappingField(Group parent) {
+        xCoordSelector = new DynamicComboFieldEditor("xCoord", "X Coordinate", parent);
+        xCoordSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setXCoordIndex(Integer.parseInt(xCoordSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+
+        yCoordSelector = new DynamicComboFieldEditor("yCoord", "Y Coordinate", parent);
+        yCoordSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setYCoordIndex(Integer.parseInt(yCoordSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        zValueSelector = new DynamicComboFieldEditor("zValue", "Z Value", parent);
+        zValueSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setZCoordIndex(Integer.parseInt(zValueSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        supplyTempValueSelector = new DynamicComboFieldEditor("tempValue", "Supply Temperature value", parent);
+        supplyTempValueSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setSupplyTempIndex(Integer.parseInt(supplyTempValueSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        returnTempValueSelector = new DynamicComboFieldEditor("returnTempValue", "Return Temperature value", parent);
+        returnTempValueSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setReturnTempIndex(Integer.parseInt(returnTempValueSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        supplyPressureValueSelector = new DynamicComboFieldEditor("pressureValue", "Supply Pressure value", parent);
+        supplyPressureValueSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setSupplyPressureIndex(Integer.parseInt(supplyPressureValueSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        returnPressureValueSelector = new DynamicComboFieldEditor("returnPressureValue", "Return Pressure value", parent);
+        returnPressureValueSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setReturnPressureIndex(Integer.parseInt(returnPressureValueSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        dpSelector = new DynamicComboFieldEditor("dpValue", "Delta pressure ", parent);
+        dpSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setDeltaPressureIndex(Integer.parseInt(dpSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        dtSelector = new DynamicComboFieldEditor("dtValue", "Delta temperature ", parent);
+        dtSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setDeltaTemperatureIndex(Integer.parseInt(dtSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        heatPowerSelector = new DynamicComboFieldEditor("heatPowerValue", "Heat Power", parent);
+        heatPowerSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setHeatPowerIndex(Integer.parseInt(heatPowerSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        nominalHeadMSelector = new DynamicComboFieldEditor("nominalHeadMValue", "nominalHeadM", parent);
+        nominalHeadMSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setNominalHeadMIndex(Integer.parseInt(nominalHeadMSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        nominalHeadBSelector = new DynamicComboFieldEditor("nominalHeadBValue", "nominalHeadB", parent);
+        nominalHeadBSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setNominalHeadBIndex(Integer.parseInt(nominalHeadBSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        nominalFlowSelector = new DynamicComboFieldEditor("nominalFlowValue", "nominalFlow", parent);
+        nominalFlowSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setNominalFlowIndex(Integer.parseInt(nominalFlowSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+
+        maximumHeadMSelector = new DynamicComboFieldEditor("maximumHeadMValue", "maximumHeadM", parent);
+        maximumHeadMSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setMaximumHeadMIndex(Integer.parseInt(maximumHeadMSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        heatLoadDsSelector = new DynamicComboFieldEditor("heatLoadDsValue", "heatLoadDs", parent);
+        heatLoadDsSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setHeatLoadDsIndex(Integer.parseInt(heatLoadDsSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        massFlowSelector = new DynamicComboFieldEditor("massFlowValue", "massFlow", parent);
+        massFlowSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setMassFlowIndex(Integer.parseInt(massFlowSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        volFlowSelector = new DynamicComboFieldEditor("volFlowValue", "volFlow", parent);
+        volFlowSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setVolFlowIndex(Integer.parseInt(volFlowSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        velocitySelector = new DynamicComboFieldEditor("velocityValue", "velocity", parent);
+        velocitySelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setVelocityIndex(Integer.parseInt(velocitySelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        flowAreaSelector = new DynamicComboFieldEditor("flowAreaValue", "flowArea", parent);
+        flowAreaSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setFlowAreaIndex(Integer.parseInt(flowAreaSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        nominalPressureLossSelector = new DynamicComboFieldEditor("nominalPressureLossValue", "nominalPressureLoss", parent);
+        nominalPressureLossSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setNominalPressureLossIndex(Integer.parseInt(nominalPressureLossSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        valvePositionSelector = new DynamicComboFieldEditor("valvePositionSelectorValue", "valvePositionSelector", parent);
+        valvePositionSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setValvePositionIndex(Integer.parseInt(valvePositionSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        addressSelector = new DynamicComboFieldEditor("addressValue", "addressSelector", parent);
+        addressSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setAddressIndex(Integer.parseInt(addressSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        
+
+    }
+
+    private void createEdgeIndexMappingField(Group parent) {
+        
+//        Composite paddingComposite = new Composite(parent, SWT.NONE);
+//        GridLayoutFactory.fillDefaults().numColumns(2).applyTo(paddingComposite);
+        
+        startXCoordSelector = new DynamicComboFieldEditor("startxCoord", "Start X Coordinate", parent);
+        startXCoordSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setStartXCoordIndex(Integer.parseInt(startXCoordSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+
+        startYCoordSelector = new DynamicComboFieldEditor("startyCoord", "Start Y Coordinate", parent);
+        startYCoordSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setStartYCoordIndex(Integer.parseInt(startYCoordSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        startZValueSelector = new DynamicComboFieldEditor("startzValue", "Start Z Value", parent);
+        startZValueSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setStartZCoordIndex(Integer.parseInt(startZValueSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        
+        endXCoordSelector = new DynamicComboFieldEditor("endxCoord", "End X Coordinate", parent);
+        endXCoordSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setEndXCoordIndex(Integer.parseInt(endXCoordSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+
+        endYCoordSelector = new DynamicComboFieldEditor("endyCoord", "End Y Coordinate", parent);
+        endYCoordSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setEndYCoordIndex(Integer.parseInt(endYCoordSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        endZValueSelector = new DynamicComboFieldEditor("endzValue", "End Z Value", parent);
+        endZValueSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setEndZCoordIndex(Integer.parseInt(endZValueSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        detailedGeometrySelector = new DynamicComboFieldEditor("detailedGeometryValue", "Geometry", parent);
+        detailedGeometrySelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.detailedGeometryIndex(Integer.parseInt(detailedGeometrySelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        diameterSelector = new DynamicComboFieldEditor("diameterValue", "Diameter value", parent);
+        diameterSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setDiameterIndex(Integer.parseInt(diameterSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        outerDiameterSelector = new DynamicComboFieldEditor("outerDiameterValue", "Outer Diameter value", parent);
+        outerDiameterSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setOuterDiameterIndex(Integer.parseInt(outerDiameterSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        nominalMassFlowSelector = new DynamicComboFieldEditor("nominalMassFlowValue", "Nominal Mass Flow", parent);
+        nominalMassFlowSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setNominalMassFlowIndex(Integer.parseInt(nominalMassFlowSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        edgeFlowAreaSelector = new DynamicComboFieldEditor("edgeFlowAreaValue", "Flow Area", parent);
+        edgeFlowAreaSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setEdgeFlowAreaIndex(Integer.parseInt(edgeFlowAreaSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        kReturnSelector = new DynamicComboFieldEditor("kReturnValue", "K Return", parent);
+        kReturnSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setKReturnIndex(Integer.parseInt(kReturnSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        kSupplySelector = new DynamicComboFieldEditor("kSupplyValue", "K Supply", parent);
+        kSupplySelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setKSupplyIndex(Integer.parseInt(kSupplySelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        tGroundSelector = new DynamicComboFieldEditor("tGroundValue", "Temperature Ground", parent);
+        tGroundSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setTGroundIndex(Integer.parseInt(tGroundSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+        lengthSelector = new DynamicComboFieldEditor("lengthValue", "lengthSelector", parent);
+        lengthSelector.addComboListener(new SelectionListener() {
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                widgetDefaultSelected(e);
+            }
+
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                model.setLengthIndex(Integer.parseInt(lengthSelector.getValue()));
+                validatePageComplete();
+            }
+        });
+    }
+
+    private void updateCombos() {
+        String[][] namesAndValues = new String[headerIndexAndValues.size() + 1][];
+
+        namesAndValues[0] = new String[] {"", "-1"};
+        int i = 1;
+        for (Entry<Integer, String> entry : headerIndexAndValues.entrySet()) {
+            int key = entry.getKey();
+            String value = entry.getValue();
+
+            String[] nameAndValue = new String[2];
+            nameAndValue[0] = value;
+            nameAndValue[1] = Integer.toString(key);
+            namesAndValues[i++] = nameAndValue;
+        }
+
+        if (model.isVertexImport())
+            updateVertexCombos(namesAndValues);
+        else
+            updateEdgeCombos(namesAndValues);
+
+        componentMappingSelector.updateCombo(namesAndValues);
+        idSelector.updateCombo(namesAndValues);
+    }
+
+    private void updateEdgeCombos(String[][] namesAndValues) {
+        startXCoordSelector.updateCombo(namesAndValues);
+        endXCoordSelector.updateCombo(namesAndValues);
+        startYCoordSelector.updateCombo(namesAndValues);
+        endYCoordSelector.updateCombo(namesAndValues);
+        startZValueSelector.updateCombo(namesAndValues);
+        endZValueSelector.updateCombo(namesAndValues);
+        detailedGeometrySelector.updateCombo(namesAndValues);
+        diameterSelector.updateCombo(namesAndValues);
+        outerDiameterSelector.updateCombo(namesAndValues);
+        nominalMassFlowSelector.updateCombo(namesAndValues);
+        edgeFlowAreaSelector.updateCombo(namesAndValues);
+        kReturnSelector.updateCombo(namesAndValues);
+        kSupplySelector.updateCombo(namesAndValues);
+        tGroundSelector.updateCombo(namesAndValues);
+        lengthSelector.updateCombo(namesAndValues);
+    }
+
+    private void updateVertexCombos(String[][] namesAndValues) {
+        xCoordSelector.updateCombo(namesAndValues);
+        yCoordSelector.updateCombo(namesAndValues);
+        zValueSelector.updateCombo(namesAndValues);
+        supplyTempValueSelector.updateCombo(namesAndValues);       
+        returnTempValueSelector.updateCombo(namesAndValues);       
+        supplyPressureValueSelector.updateCombo(namesAndValues);   
+        returnPressureValueSelector.updateCombo(namesAndValues);   
+        dpSelector.updateCombo(namesAndValues);                    
+        dtSelector.updateCombo(namesAndValues);                    
+        heatPowerSelector.updateCombo(namesAndValues);             
+        valvePositionSelector.updateCombo(namesAndValues);             
+        nominalHeadMSelector.updateCombo(namesAndValues);          
+        nominalHeadBSelector.updateCombo(namesAndValues);          
+        nominalFlowSelector.updateCombo(namesAndValues);           
+        maximumHeadMSelector.updateCombo(namesAndValues);          
+        heatLoadDsSelector.updateCombo(namesAndValues);            
+        massFlowSelector.updateCombo(namesAndValues);              
+        volFlowSelector.updateCombo(namesAndValues);               
+        velocitySelector.updateCombo(namesAndValues);              
+        flowAreaSelector.updateCombo(namesAndValues);              
+        nominalPressureLossSelector.updateCombo(namesAndValues);   
+        addressSelector.updateCombo(namesAndValues);
+    }
+    
+    
+
+    private void updateHeaders() {
+        if (headerTable != null)
+            headerTable.dispose();
+        headerTable = new Table(tableComposite, SWT.NONE);
+        headerTable.setHeaderVisible(true);
+        headerTable.setLinesVisible(true);
+        GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(tableComposite);
+        for (int i = 0; i < headerTable.getColumns().length; i++) {
+            TableColumn column = headerTable.getColumns()[i];
+            column.dispose();
+        }
+        for (int i = 0; i < headerTable.getItemCount(); i++) {
+            TableItem item = headerTable.getItem(i);
+            item.dispose();
+        }
+
+        headerIndexAndValues.clear();
+
+        try {
+            List<CSVRecord> rows = model.getRows(5, false);
+
+            for (int k = 0; k < rows.size(); k++) {
+                CSVRecord row = rows.get(k);
+
+                int columnCount = row.size();
+                for (int i = 0; i < columnCount; i++) {
+                    String value = row.get(i);
+                    if (k == 0) {
+                        TableColumn headerCol = new TableColumn(headerTable, SWT.NONE);
+                        headerCol.setText(value);
+
+                        tableColumnLayout.setColumnData(headerCol, new ColumnWeightData(10));
+                        headerCol.pack();
+
+                        headerIndexAndValues.put(i, value);
+                    } else {
+                        int actualK = k - 1;
+                        TableItem item;
+                        int itemCount = headerTable.getItemCount();
+                        if (actualK >= itemCount) {
+                            item = new TableItem(headerTable, SWT.NONE);
+                        } else {
+                            item = headerTable.getItem(actualK);
+                        }
+                        item.setText(i, value);
+                    }
+                }
+            }
+
+        } catch (IOException e) {
+            setErrorMessage(e.getMessage());
+        }
+    }
+
+    protected void validatePageComplete() {
+        if (model.isVertexImport())
+            setPageComplete(model.getXCoordIndex() != -1 && model.getYCoordIndex() != -1 && model.getComponentMappingIndex() != -1);
+        else
+            setPageComplete(model.getStartXCoordIndex() != 1 && model.getStartYCoordIndex() != -1 && model.getEndXCoordIndex() != -1 && model.getEndYCoordIndex() != -1 && model.getComponentMappingIndex() != -1);
+    }
+
+}