X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=org.simantics.district.imports.ui%2Fsrc%2Forg%2Fsimantics%2Fdistrict%2Fimports%2Fui%2FCSVImportWizardPage.java;h=9d1d08c422c1627480beb0ae1a71ee4117509b68;hb=02ecca5e61d2eb17de40cc058be678b414aaad00;hp=e4a0612a2358e8b4a6a609d6146cb45ea084f504;hpb=1bc60c2213f9b3fc7b4d935ba9afda2b767290e5;p=simantics%2Fdistrict.git 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 index e4a0612a..9d1d08c4 100644 --- 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 @@ -4,13 +4,19 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; 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.viewers.TableViewer; +import org.eclipse.jface.wizard.IWizardContainer; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; @@ -19,144 +25,371 @@ 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.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; -import org.simantics.district.network.ui.function.Functions; +import org.simantics.district.imports.ui.controls.DynamicComboFieldEditor; import org.simantics.utils.ui.widgets.FileOrDirectorySelectionWidget; import org.simantics.utils.ui.widgets.FileSelectionListener; import org.simantics.utils.ui.widgets.FileSelectionWidget; - -public class CSVImportWizardPage extends WizardPage implements FileSelectionListener { +public class CSVImportWizardPage extends WizardPage { private CSVImportModel model; - private FileSelectionWidget csvSelection; + + private Map headerIndexAndValues = new HashMap<>(); + private Table headerTable; private Button firstAsHeader; - - private Combo diagramCombo; - - + private Combo delimiterCombo; - private Combo delimiterdCombo; private TableColumnLayout tableColumnLayout; - private TableViewer tableViewer; private Composite tableComposite; private FileSelectionWidget wktFileSelection; + + // Common for vertex and edge + private DynamicComboFieldEditor componentMappingSelector; + private DynamicComboFieldEditor labelSelector; - private Path wktFile; + // For vertex import + private DynamicComboFieldEditor xCoordSelector; + private DynamicComboFieldEditor yCoordSelector; + private DynamicComboFieldEditor zValueSelector; + + // For edge import + private DynamicComboFieldEditor startXCoordSelector; + private DynamicComboFieldEditor startYCoordSelector; + private DynamicComboFieldEditor startZValueSelector; + private DynamicComboFieldEditor endXCoordSelector; + private DynamicComboFieldEditor endYCoordSelector; + private DynamicComboFieldEditor endZValueSelector; + + private Group indexMappingGroup; + + private Composite composite; + private Button isVertexImport; + protected CSVImportWizardPage(CSVImportModel model) { super("Import CSV Data"); this.model = model; - setMessage("Select CSV file to import"); + setMessage("Select columng index mappings"); } @Override public void createControl(Composite parent) { - Composite composite = new Composite(parent, SWT.NONE); - composite.setLayout(new GridLayout(1,false)); + composite = new Composite(parent, SWT.NONE); + composite.setLayout(new GridLayout(1, false)); GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(composite); - - diagramCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY); - diagramCombo.setItems(getDistrictDiagrams()); - - - csvSelection = new FileSelectionWidget(composite, "CSV file", SWT.OPEN); - csvSelection.addListener(this); - + delimiterCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY); delimiterCombo.setItems(model.getDelimiterFormats()); 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) { - + } }); - - + tableComposite = new Composite(composite, SWT.BORDER); tableColumnLayout = new TableColumnLayout(); tableComposite.setLayout(tableColumnLayout); - - 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 wktFilee = Paths.get(selection[0]); - if (!Files.exists(wktFilee)) { - setErrorMessage("File " + wktFilee.toAbsolutePath() + " does not exist"); + Path wktFile = Paths.get(selection[0]); + if (!Files.exists(wktFile)) { + setErrorMessage("File " + wktFile.toAbsolutePath() + " does not exist"); } else { - wktFile = wktFilee; - setPageComplete(true); + model.setWKTFile(wktFile); + validatePageComplete(); } - } else { - setPageComplete(false); - } + } + } + }); + + isVertexImport = new Button(composite, SWT.CHECK); + isVertexImport.setText("File contains vertices"); + 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); - setControl(composite); + if (model.isVertexImport()) + createVertexIndexMappingField(indexMappingGroup); + else + createEdgeIndexMappingField(indexMappingGroup); + createCommonIndexMappingField(indexMappingGroup); + } + + 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(); + } + }); - setPageComplete(false); } - private String[] getDistrictDiagrams() { - Functions.getDistrictDiagrams(null); - return null; + 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(); + } + }); } - @Override - public void fileSelected(FileOrDirectorySelectionWidget source, String[] filename) { - String[] selection = csvSelection.getFilename(); - if (selection != null && selection.length > 0) { - Path csvFile = Paths.get(selection[0]); - if (!Files.exists(csvFile)) { - setErrorMessage("File " + csvFile.toAbsolutePath() + " does not exist"); - } else { - model.setSource(csvFile); - updateHeaders(); - setPageComplete(true); + private void createEdgeIndexMappingField(Group parent) { + 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(); } - } else { - setPageComplete(false); + }); + } + + private void updateCombos() { + String[][] namesAndValues = new String[headerIndexAndValues.size()][]; + + int i = 0; + for (Entry 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); + } + + private void updateEdgeCombos(String[][] namesAndValues) { + startXCoordSelector.updateCombo(namesAndValues); + endXCoordSelector.updateCombo(namesAndValues); + startYCoordSelector.updateCombo(namesAndValues); + endYCoordSelector.updateCombo(namesAndValues); + startZValueSelector.updateCombo(namesAndValues); + endZValueSelector.updateCombo(namesAndValues); + } + + private void updateVertexcombos(String[][] namesAndValues) { + xCoordSelector.updateCombo(namesAndValues); + yCoordSelector.updateCombo(namesAndValues); + zValueSelector.updateCombo(namesAndValues); } private void updateHeaders() { @@ -174,21 +407,26 @@ public class CSVImportWizardPage extends WizardPage implements FileSelectionList TableItem item = headerTable.getItem(i); item.dispose(); } + + headerIndexAndValues.clear(); + try { List rows = model.getRows(5); - + 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; @@ -202,29 +440,17 @@ public class CSVImportWizardPage extends WizardPage implements FileSelectionList } } } - -// Map> headerAndValues = model.getHeaderAndRows(5); -// -// int coo = headerTable.getColumns().length; -// int count = headerTable.getColumnCount(); -// -// for (Map.Entry> entr : headerAndValues.entrySet()) { -// CSVHeader he = entr.getKey(); -// int index = he.getIndex(); -// TableColumn headerCol = new TableColumn(headerTable, SWT.NONE); -// headerCol.setText(he.getHeader()); -// -// tableColumnLayout.setColumnData(headerCol, new ColumnWeightData(10)); -// headerCol.pack(); -// -// for (String val : entr.getValue()) { -// TableItem item = new TableItem(headerTable, SWT.NONE); -// item.setText(val); -// } -// } + } 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); + } + }