]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.imports.ui/src/org/simantics/district/imports/ui/ComponentMappingPage.java
Make it possible to import CSV data via SCL & create models
[simantics/district.git] / org.simantics.district.imports.ui / src / org / simantics / district / imports / ui / ComponentMappingPage.java
1 package org.simantics.district.imports.ui;
2
3 import java.io.IOException;
4 import java.util.Collection;
5 import java.util.Map;
6
7 import org.eclipse.jface.dialogs.IPageChangeProvider;
8 import org.eclipse.jface.dialogs.IPageChangedListener;
9 import org.eclipse.jface.dialogs.PageChangedEvent;
10 import org.eclipse.jface.layout.GridDataFactory;
11 import org.eclipse.jface.wizard.IWizardContainer;
12 import org.eclipse.jface.wizard.WizardPage;
13 import org.eclipse.swt.SWT;
14 import org.eclipse.swt.events.SelectionEvent;
15 import org.eclipse.swt.events.SelectionListener;
16 import org.eclipse.swt.layout.GridLayout;
17 import org.eclipse.swt.widgets.Combo;
18 import org.eclipse.swt.widgets.Composite;
19 import org.eclipse.swt.widgets.Label;
20 import org.simantics.Simantics;
21 import org.simantics.db.ReadGraph;
22 import org.simantics.db.Resource;
23 import org.simantics.db.common.request.IndexRoot;
24 import org.simantics.db.common.request.ReadRequest;
25 import org.simantics.db.exception.DatabaseException;
26 import org.simantics.district.imports.CSVImportModel;
27 import org.simantics.district.imports.DistrictImportUtils;
28 import org.simantics.district.network.ui.function.Functions;
29
30 public class ComponentMappingPage extends WizardPage {
31     
32     private CSVImportModel model;
33     private Composite composite;
34     private Composite childComposite;
35     protected Map<String, Resource> componentMappings;
36     private Collection<String> distinctMappingIndexColumnValues;
37
38     public ComponentMappingPage(CSVImportModel model) {
39         super("Select component mappings");
40         this.model = model;
41         setMessage("Select component mappings");
42     }
43
44     @Override
45     public void createControl(Composite parent) {
46         composite = new Composite(parent, SWT.NONE);
47         composite.setLayout(new GridLayout(1,false));
48         GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(composite);
49         
50         setControl(composite);
51         
52         validatePageComplete();
53         
54         IWizardContainer container = getContainer();
55         if (container instanceof IPageChangeProvider) {
56             ((IPageChangeProvider) container).addPageChangedListener(new IPageChangedListener() {
57
58                 @Override
59                 public void pageChanged(PageChangedEvent event) {
60                     if (container.getCurrentPage().equals(ComponentMappingPage.this)) {
61                         ComponentMappingPage.this.updateComponentMappings();
62                     }
63                 }
64             });
65         }
66     }
67     
68     private void updateComponentMappings() {
69         try {
70             int mappingIndex = model.getComponentMappingIndex();
71             distinctMappingIndexColumnValues = DistrictImportUtils.readDistinctValuesOfColumn(model.getSource(), model.getDelimiter(), mappingIndex);
72             
73             try {
74                 Simantics.getSession().sync(new ReadRequest() {
75                     
76                     @Override
77                     public void run(ReadGraph graph) throws DatabaseException {
78                         Resource indexRoot = graph.sync(new IndexRoot(model.getParentDiagram()));
79                         if (model.isVertexImport())
80                             componentMappings = Functions.getVertexMappings(graph, indexRoot);
81                         else
82                             componentMappings = Functions.getEdgeMappings(graph, indexRoot);
83                     }
84                 });
85             } catch (DatabaseException e) {
86                 e.printStackTrace();
87             }
88             
89             System.out.println(distinctMappingIndexColumnValues);
90             if (childComposite != null)
91                 childComposite.dispose();
92             childComposite = new Composite(composite, SWT.NONE);
93             childComposite.setLayout(new GridLayout(1,false));
94             GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(childComposite);
95             
96             for (String value : distinctMappingIndexColumnValues) {
97                 
98                 Composite newCompo = new Composite(childComposite, SWT.NONE);
99                 newCompo.setLayout(new GridLayout(2,false));
100                 GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).applyTo(newCompo);
101                 
102                 Label t = new Label(newCompo, SWT.NONE);
103                 t.setText(value);
104                 
105                 Combo c = new Combo(newCompo, SWT.READ_ONLY);
106                 c.setItems(componentMappings.keySet().toArray(new String[componentMappings.size()]));
107                 c.addSelectionListener(new SelectionListener() {
108                     
109                     @Override
110                     public void widgetSelected(SelectionEvent e) {
111                         model.setComponentMappings(value, componentMappings.get(c.getItem(c.getSelectionIndex())));
112                         validatePageComplete();
113                     }
114                     
115                     @Override
116                     public void widgetDefaultSelected(SelectionEvent e) {
117                         widgetSelected(e);
118                     }
119                 });
120             }
121             composite.layout(true, true);
122         } catch (IOException e) {
123             e.printStackTrace();
124         }
125     }
126
127     private void validatePageComplete() {
128         Map<String, Resource> currentMappings = model.getComponentMappings();
129         if (currentMappings != null && distinctMappingIndexColumnValues != null && currentMappings.keySet().containsAll(distinctMappingIndexColumnValues))
130             setPageComplete(true);
131         else 
132             setPageComplete(false);
133     }
134
135 }