]> gerrit.simantics Code Review - simantics/district.git/blobdiff - org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizardPage.java
Adding basic import utilities - WIP!
[simantics/district.git] / org.simantics.district.imports.ui / src / org / simantics / district / imports / ui / CSVImportWizardPage.java
diff --git a/org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizardPage.java b/org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/CSVImportWizardPage.java
new file mode 100644 (file)
index 0000000..85eeb94
--- /dev/null
@@ -0,0 +1,185 @@
+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