]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/ComponentTypeScriptEditor.java
Added two new user component SCL script simulation stages
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / componentTypeEditor / ComponentTypeScriptEditor.java
1 /*******************************************************************************
2  * Copyright (c) 2013, 2015 Association for Decentralized Information Management in
3  * Industry THTH ry.
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
8  *
9  * Contributors:
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;
14
15 import java.util.function.Supplier;
16
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;
46
47 /**
48  * @author Hannu Niemistö
49  * @author Tuukka Lehtonen (extended from SCLModuleEditor)
50  */
51 public class ComponentTypeScriptEditor extends SCLModuleEditor {
52
53     public ComponentTypeScriptEditor() {
54         super();
55     }
56
57     @Override
58     protected void preInitialize() {
59         setDocumentProvider(new ComponentTypeScriptDocumentProvider(this));
60         Display display = PlatformUI.getWorkbench().getDisplay();
61         SCLSourceViewerConfigurationNew sourceViewerConfiguration = new SCLSourceViewerConfigurationNew(resourceManager);
62         setSourceViewerConfiguration(sourceViewerConfiguration);
63         
64     }
65     
66     protected ParametrizedRead<IResourceEditorInput, Boolean> getInputValidator() {
67         return new ParametrizedRead<IResourceEditorInput, Boolean>() {
68             @Override
69             public Read<Boolean> get(IResourceEditorInput parameter) {
70                 return Combinators.constant(Boolean.TRUE);
71             }
72         };
73     }
74     
75     @Override
76     protected void updatePartName() {
77         setPartName(getEditorInput().getName());
78
79         Session session = Simantics.peekSession();
80         if (session != null) {
81             Supplier<Boolean> disposedCallback = this::isDisposed;
82             session.asyncRequest(
83                     new UniqueRead<String>() {
84                         @Override
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;
94                         }
95                         
96                     },
97                     new TitleUpdater(getSite().getShell().getDisplay(), this::setPartName, disposedCallback));
98             session.asyncRequest(
99                     new ToolTipRequest(getSite().getId(), getResourceInput()),
100                     new TitleUpdater(getSite().getShell().getDisplay(), this::setTitleToolTip, disposedCallback));
101         }
102     }
103     
104     private static final String[] EXECUTION_PHASES = new String[] {
105         "pre-step",
106         "step",
107         "post-step",
108         "analogAutomation",
109         "binaryAutomation",
110         "preparation"
111     };
112     
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"
120     };
121     
122     @Override
123     public void createPartControl(Composite parent) {
124         GridLayoutFactory.fillDefaults().applyTo(parent);
125         
126         final CCombo combo = new CCombo(parent, SWT.READ_ONLY | SWT.BORDER);
127         for(String label : EXECUTION_PHASE_LABELS)
128             combo.add(label);
129         Session session = Simantics.peekSession();
130         final Resource script = getResourceInput().getResource();
131         if(session != null) {
132             session.asyncRequest(new ReadRequest() {
133                 @Override
134                 public void run(ReadGraph graph) throws DatabaseException {
135                     StructuralResource2 STR = StructuralResource2.getInstance(graph);
136                     final String type = graph.getPossibleRelatedValue(script, STR.ComponentTypeScript_type);
137                     if(type != null)
138                         combo.getDisplay().asyncExec(new Runnable() {
139                             @Override
140                             public void run() {
141                                 for(int i=0;i<EXECUTION_PHASES.length;++i)
142                                     if(EXECUTION_PHASES[i].equals(type)) {
143                                         combo.select(i);
144                                         return;
145                                     }
146                             }
147                         });
148                 }
149             });
150         }
151         combo.addSelectionListener(new SelectionAdapter() {
152             @Override
153             public void widgetSelected(SelectionEvent e) {
154                 final int id = combo.getSelectionIndex();
155                 Simantics.getSession().asyncRequest(new WriteRequest() {
156                     @Override
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);
164                     }
165                 });
166             }
167         });
168         GridDataFactory.fillDefaults().grab(true, false).applyTo(combo);
169         
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);
174     }
175
176 }