1 /*******************************************************************************
\r
2 * Copyright (c) 2010, 2012 Association for Decentralized Information Management in
\r
4 * All rights reserved. This program and the accompanying materials
\r
5 * are made available under the terms of the Eclipse Public License v1.0
\r
6 * which accompanies this distribution, and is available at
\r
7 * http://www.eclipse.org/legal/epl-v10.html
\r
10 * VTT Technical Research Centre of Finland - initial API and implementation
\r
11 *******************************************************************************/
\r
12 package org.simantics.sysdyn.ui.properties.widgets.modules;
\r
14 import java.util.HashMap;
\r
16 import org.eclipse.jface.viewers.CellEditor;
\r
17 import org.eclipse.jface.viewers.ComboBoxCellEditor;
\r
18 import org.eclipse.jface.viewers.EditingSupport;
\r
19 import org.eclipse.jface.viewers.TableViewer;
\r
20 import org.eclipse.jface.viewers.TextCellEditor;
\r
21 import org.eclipse.swt.SWT;
\r
22 import org.simantics.db.ReadGraph;
\r
23 import org.simantics.db.Resource;
\r
24 import org.simantics.db.common.request.ObjectsWithType;
\r
25 import org.simantics.db.exception.DatabaseException;
\r
26 import org.simantics.db.request.Read;
\r
27 import org.simantics.layer0.Layer0;
\r
28 import org.simantics.sysdyn.SysdynResource;
\r
29 import org.simantics.ui.SimanticsUI;
\r
31 public class ModuleInputEditingSupport extends EditingSupport {
\r
32 private CellEditor editor;
\r
34 private HashMap<String, Resource> optionResources;
\r
35 private String[] options;
\r
36 private TableViewer tableViewer;
\r
38 public ModuleInputEditingSupport(TableViewer viewer, int column) {
\r
40 this.tableViewer = (TableViewer)viewer;
\r
41 this.column = column;
\r
45 protected boolean canEdit(Object element) {
\r
46 switch (this.column) {
\r
47 case 0: return false;
\r
48 default: return true;
\r
54 protected CellEditor getCellEditor(Object element) {
\r
55 // Create the correct editor based on the column index
\r
58 editor = new TextCellEditor(this.tableViewer.getTable());
\r
60 ReferenceRow row = (ReferenceRow)element;
\r
61 final Resource module = row.getModule();
\r
62 final Resource inputVariable = row.getVariable();
\r
64 optionResources = new HashMap<String, Resource>();
\r
66 optionResources = SimanticsUI.getSession().syncRequest(new Read<HashMap<String, Resource>>() {
\r
69 public HashMap<String, Resource> perform(ReadGraph graph) throws DatabaseException {
\r
70 Layer0 l0 = Layer0.getInstance(graph);
\r
71 SysdynResource sr = SysdynResource.getInstance(graph);
\r
72 HashMap<String, Resource> result = new HashMap<String, Resource>();
\r
73 for(Resource dependency : graph.syncRequest(new ObjectsWithType(module, sr.Variable_isHeadOf, sr.Dependency))) {
\r
74 if(graph.getPossibleObject(dependency, sr.Dependency_refersTo) == null ||
\r
75 graph.getPossibleObject(dependency, sr.Dependency_refersTo).equals(inputVariable)) {
\r
76 Resource output = graph.getSingleObject(dependency, sr.Variable_HasTail);
\r
78 if(graph.isInstanceOf(output, sr.Shadow)) {
\r
79 output = graph.getPossibleObject(output, sr.Shadow_original);
\r
83 result.put((String)graph.getRelatedValue(output, l0.HasName), dependency);
\r
89 } catch (DatabaseException e) {
\r
90 e.printStackTrace();
\r
93 options = optionResources.keySet().toArray(new String[optionResources.keySet().size() + 1]);
\r
94 options[optionResources.keySet().size()] = "";
\r
95 ComboBoxCellEditor ceditor = new ComboBoxCellEditor(this.tableViewer.getTable(), options, SWT.READ_ONLY);
\r
96 ceditor.setActivationStyle(1);
\r
107 protected Object getValue(Object element) {
\r
108 ReferenceRow referenceRow = (ReferenceRow) element;
\r
110 switch (this.column) {
\r
112 return referenceRow.getName();
\r
114 String refersToName = referenceRow.getValue();
\r
115 if (refersToName == null) return options.length - 1;
\r
116 for(int i = 0; i < options.length ; i++) {
\r
117 if(refersToName.equals(options[i])) return i;
\r
119 return options[options.length - 1];
\r
127 protected void setValue(Object element, Object value) {
\r
128 ReferenceRow referenceRow = (ReferenceRow) element;
\r
129 String valueString = String.valueOf(value);
\r
130 switch (this.column) {
\r
134 referenceRow.setRefersTo(optionResources.get(options[Integer.parseInt(valueString)]));
\r
140 getViewer().update(element, null);
\r