1 package org.simantics.spreadsheet.graph;
\r
3 import java.util.ArrayList;
\r
4 import java.util.Collections;
\r
5 import java.util.List;
\r
6 import java.util.Set;
\r
8 import org.eclipse.jface.layout.GridDataFactory;
\r
9 import org.eclipse.swt.SWT;
\r
10 import org.eclipse.swt.events.ModifyEvent;
\r
11 import org.eclipse.swt.events.ModifyListener;
\r
12 import org.eclipse.swt.events.SelectionAdapter;
\r
13 import org.eclipse.swt.events.SelectionEvent;
\r
14 import org.eclipse.swt.layout.GridData;
\r
15 import org.eclipse.swt.layout.GridLayout;
\r
16 import org.eclipse.swt.widgets.Combo;
\r
17 import org.eclipse.swt.widgets.Composite;
\r
18 import org.eclipse.swt.widgets.Label;
\r
19 import org.eclipse.swt.widgets.Text;
\r
20 import org.eclipse.ui.IWorkbenchSite;
\r
21 import org.simantics.Simantics;
\r
22 import org.simantics.browsing.ui.BuiltinKeys;
\r
23 import org.simantics.browsing.ui.NodeContext;
\r
24 import org.simantics.browsing.ui.graph.impl.SessionContextInputSource;
\r
25 import org.simantics.browsing.ui.swt.GraphExplorerDialog2;
\r
26 import org.simantics.browsing.ui.swt.widgets.GraphExplorerComposite;
\r
27 import org.simantics.browsing.ui.swt.widgets.impl.WidgetSupport;
\r
28 import org.simantics.db.ReadGraph;
\r
29 import org.simantics.db.Resource;
\r
30 import org.simantics.db.common.request.PossibleIndexRoot;
\r
31 import org.simantics.db.common.request.UniqueRead;
\r
32 import org.simantics.db.exception.DatabaseException;
\r
33 import org.simantics.db.layer0.request.IsLinkedTo;
\r
34 import org.simantics.db.layer0.util.Layer0Utils;
\r
35 import org.simantics.db.management.ISessionContext;
\r
36 import org.simantics.utils.datastructures.Pair;
\r
38 public class SaveSpreadsheetStateDialog extends GraphExplorerDialog2 {
\r
40 private static final String SELECT_CUSTOM = "Select custom..";
\r
42 private Combo parentSelector;
\r
43 private Pair<String, Resource>[] pairs;
\r
44 private String[] parents;
\r
46 private Text stateName;
\r
48 private String currentItem;
\r
49 private String currentStateName;
\r
51 private List<Resource> result;
\r
53 public SaveSpreadsheetStateDialog(IWorkbenchSite site, String title, Pair<String, Resource>[] pairs) {
\r
57 Resource book = pairs[0].second;
\r
58 Resource context = pairs[1].second;
\r
61 result = Simantics.getSession().syncRequest(new UniqueRead<List<Resource>>() {
\r
64 public List<Resource> perform(ReadGraph graph) throws DatabaseException {
\r
65 Resource bookINdex = graph.syncRequest(new PossibleIndexRoot(book));
\r
66 Resource contextIndex = graph.syncRequest(new PossibleIndexRoot(context));
\r
68 List<Resource> result = new ArrayList<>();
\r
69 Set<Resource> indexRoots = Layer0Utils.listIndexRoots(graph);
\r
70 for (Resource indexRoot : indexRoots) {
\r
71 if (graph.syncRequest(new IsLinkedTo(indexRoot, bookINdex)) && graph.syncRequest(new IsLinkedTo(indexRoot, contextIndex))) {
\r
72 result.add(indexRoot);
\r
78 } catch (DatabaseException e) {
\r
79 e.printStackTrace();
\r
82 String[] newParents = new String[pairs.length + 1];
\r
83 for (int i = 0; i < pairs.length; i++) {
\r
84 newParents[i] = pairs[i].first;
\r
86 newParents[pairs.length] = SELECT_CUSTOM;
\r
87 this.parents = newParents;
\r
91 public Set<String> getBrowseContexts() {
\r
92 return Collections.singleton("http://www.simantics.org/Project-1.2/ProjectBrowseContext");
\r
96 protected SessionContextInputSource getInputSource() {
\r
97 return super.getInputSource();
\r
101 protected void createControls(Composite body, ISessionContext context, WidgetSupport support) {
\r
103 Composite upperComposite = new Composite(body, SWT.NONE);
\r
104 GridLayout layout = new GridLayout(2, false);
\r
105 upperComposite.setLayout(layout);
\r
106 GridDataFactory.fillDefaults().grab(true, true).applyTo(upperComposite);
\r
108 Composite explorerComposite = new Composite(body, SWT.NONE);
\r
109 explorerComposite.setLayout(new GridLayout());
\r
110 GridDataFactory.fillDefaults().grab(true, true).applyTo(explorerComposite);
\r
112 Label parentLabel = new Label(upperComposite, SWT.NONE);
\r
113 parentLabel.setText("Select parent: ");
\r
115 parentSelector = new Combo(upperComposite, SWT.READ_ONLY);
\r
116 parentSelector.setItems(parents);
\r
117 parentSelector.select(0);
\r
119 GridDataFactory.fillDefaults().grab(true, false).applyTo(parentSelector);
\r
121 parentSelector.addSelectionListener(new SelectionAdapter() {
\r
124 public void widgetSelected(SelectionEvent e) {
\r
129 public void widgetDefaultSelected(SelectionEvent e) {
\r
134 Label stateNameLabel = new Label(upperComposite, SWT.NONE);
\r
135 stateNameLabel.setText("Name of the state: ");
\r
136 GridDataFactory.fillDefaults().grab(false, false).applyTo(stateNameLabel);
\r
138 stateName = new Text(upperComposite, SWT.NONE);
\r
140 stateName.addModifyListener(new ModifyListener() {
\r
143 public void modifyText(ModifyEvent e) {
\r
144 currentStateName = stateName.getText();
\r
148 GridDataFactory.fillDefaults().grab(true, false).applyTo(stateName);
\r
150 super.createControls(explorerComposite, context, support);
\r
155 private void hideOrShowGE() {
\r
156 int selection = parentSelector.getSelectionIndex();
\r
157 currentItem = parentSelector.getItem(selection);
\r
159 GraphExplorerComposite composite = getGraphExplorerComposite();
\r
160 GridData data = (GridData) composite.getLayoutData();
\r
162 if (currentItem.equals(SELECT_CUSTOM))
\r
163 data.exclude = false;
\r
165 data.exclude = true;
\r
168 composite.setLayoutData(data);
\r
169 composite.setVisible(!data.exclude);
\r
170 composite.getParent().pack();
\r
171 composite.getParent().layout();
\r
172 composite.getParent().getParent().pack();
\r
173 composite.getParent().getParent().layout();
\r
174 composite.getParent().getParent().getParent().getParent().getParent();
\r
175 composite.getShell().pack();
\r
176 composite.getShell().layout();
\r
177 // explorerComposite.pack();
\r
178 // explorerComposite.getShell().layout(false);
\r
184 public Object[] getSelection() {
\r
185 if (currentItem.equals(SELECT_CUSTOM)) {
\r
186 Object[] selection = super.getSelection();
\r
187 NodeContext context = (NodeContext)selection[0];
\r
188 Object obj = context.getConstant(BuiltinKeys.INPUT);
\r
189 return new Object[] { Pair.make(obj, currentStateName) };
\r
191 for (int i = 0; i < pairs.length; i++) {
\r
192 Pair<String, Resource> p = pairs[i];
\r
193 if (p.first.equals(currentItem)) {
\r
194 return new Object[] {Pair.make(p.second, currentStateName) };
\r