1 /*******************************************************************************
2 * Copyright (c) 2013, 2015 Association for Decentralized Information Management in
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License v1.0
6 * which accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * VTT Technical Research Centre of Finland - initial API and implementation
11 * Semantum Oy - adaption to SCLModuleEditor/TextEditor
12 *******************************************************************************/
13 package org.simantics.modeling.ui.componentTypeEditor;
15 import java.util.function.Supplier;
17 import org.eclipse.jface.layout.GridDataFactory;
18 import org.eclipse.jface.layout.GridLayoutFactory;
19 import org.eclipse.swt.SWT;
20 import org.eclipse.swt.custom.CCombo;
21 import org.eclipse.swt.events.SelectionAdapter;
22 import org.eclipse.swt.events.SelectionEvent;
23 import org.eclipse.swt.layout.FillLayout;
24 import org.eclipse.swt.widgets.Composite;
25 import org.eclipse.swt.widgets.Display;
26 import org.eclipse.ui.PlatformUI;
27 import org.simantics.Simantics;
28 import org.simantics.databoard.Bindings;
29 import org.simantics.db.ReadGraph;
30 import org.simantics.db.Resource;
31 import org.simantics.db.Session;
32 import org.simantics.db.WriteGraph;
33 import org.simantics.db.common.request.ParametrizedRead;
34 import org.simantics.db.common.request.ReadRequest;
35 import org.simantics.db.common.request.UniqueRead;
36 import org.simantics.db.common.request.WriteRequest;
37 import org.simantics.db.exception.DatabaseException;
38 import org.simantics.db.layer0.request.combinations.Combinators;
39 import org.simantics.db.request.Read;
40 import org.simantics.layer0.Layer0;
41 import org.simantics.scl.ui.editor.SCLSourceViewerConfigurationNew;
42 import org.simantics.structural.stubs.StructuralResource2;
43 import org.simantics.ui.workbench.IResourceEditorInput;
44 import org.simantics.ui.workbench.TitleUpdater;
45 import org.simantics.ui.workbench.ToolTipRequest;
48 * @author Hannu Niemistö
49 * @author Tuukka Lehtonen (extended from SCLModuleEditor)
51 public class ComponentTypeScriptEditor extends SCLModuleEditor {
53 public ComponentTypeScriptEditor() {
58 protected void preInitialize() {
59 setDocumentProvider(new ComponentTypeScriptDocumentProvider(this));
60 Display display = PlatformUI.getWorkbench().getDisplay();
61 SCLSourceViewerConfigurationNew sourceViewerConfiguration = new SCLSourceViewerConfigurationNew(resourceManager);
62 setSourceViewerConfiguration(sourceViewerConfiguration);
66 protected ParametrizedRead<IResourceEditorInput, Boolean> getInputValidator() {
67 return new ParametrizedRead<IResourceEditorInput, Boolean>() {
69 public Read<Boolean> get(IResourceEditorInput parameter) {
70 return Combinators.constant(Boolean.TRUE);
76 protected void updatePartName() {
77 setPartName(getEditorInput().getName());
79 Session session = Simantics.peekSession();
80 if (session != null) {
81 Supplier<Boolean> disposedCallback = this::isDisposed;
83 new UniqueRead<String>() {
85 public String perform(ReadGraph graph)
86 throws DatabaseException {
87 Layer0 L0 = Layer0.getInstance(graph);
88 StructuralResource2 STR = StructuralResource2.getInstance(graph);
89 Resource script = getResourceInput().getResource();
90 String name = graph.getRelatedValue(script, L0.HasName);
91 Resource componentType = graph.getSingleObject(script, STR.ComponentType_hasScript_Inverse);
92 String ctName = graph.getRelatedValue(componentType, L0.HasName);
93 return ctName + " " + name;
97 new TitleUpdater(getSite().getShell().getDisplay(), this::setPartName, disposedCallback));
99 new ToolTipRequest(getSite().getId(), getResourceInput()),
100 new TitleUpdater(getSite().getShell().getDisplay(), this::setTitleToolTip, disposedCallback));
104 private static final String[] EXECUTION_PHASES = new String[] {
113 private static final String[] EXECUTION_PHASE_LABELS = new String[] {
114 "Execute before each step",
115 "Execute at each step",
116 "Execute after each step",
117 "Execute together with analog automation",
118 "Execute together with binary automation",
119 "Execute during preparation"
123 public void createPartControl(Composite parent) {
124 GridLayoutFactory.fillDefaults().applyTo(parent);
126 final CCombo combo = new CCombo(parent, SWT.READ_ONLY | SWT.BORDER);
127 for(String label : EXECUTION_PHASE_LABELS)
129 Session session = Simantics.peekSession();
130 final Resource script = getResourceInput().getResource();
131 if(session != null) {
132 session.asyncRequest(new ReadRequest() {
134 public void run(ReadGraph graph) throws DatabaseException {
135 StructuralResource2 STR = StructuralResource2.getInstance(graph);
136 final String type = graph.getPossibleRelatedValue(script, STR.ComponentTypeScript_type);
138 combo.getDisplay().asyncExec(new Runnable() {
141 for(int i=0;i<EXECUTION_PHASES.length;++i)
142 if(EXECUTION_PHASES[i].equals(type)) {
151 combo.addSelectionListener(new SelectionAdapter() {
153 public void widgetSelected(SelectionEvent e) {
154 final int id = combo.getSelectionIndex();
155 Simantics.getSession().asyncRequest(new WriteRequest() {
157 public void perform(WriteGraph graph)
158 throws DatabaseException {
159 StructuralResource2 STR = StructuralResource2.getInstance(graph);
160 String currentType = graph.getPossibleRelatedValue(script, STR.ComponentTypeScript_type);
161 String newType = EXECUTION_PHASES[id];
162 if(!newType.equals(currentType))
163 graph.claimLiteral(script, STR.ComponentTypeScript_type, newType, Bindings.STRING);
168 GridDataFactory.fillDefaults().grab(true, false).applyTo(combo);
170 Composite editorComposite = new Composite(parent, SWT.NONE);
171 GridDataFactory.fillDefaults().grab(true, true).applyTo(editorComposite);
172 editorComposite.setLayout(new FillLayout());
173 super.createPartControl(editorComposite);