]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/ComponentTypeScriptDocumentProvider.java
Added some enforcement of immutability to structural user component UI's.
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / componentTypeEditor / ComponentTypeScriptDocumentProvider.java
1 package org.simantics.modeling.ui.componentTypeEditor;\r
2 \r
3 import java.io.PrintWriter;\r
4 import java.io.StringWriter;\r
5 \r
6 import org.eclipse.core.runtime.CoreException;\r
7 import org.eclipse.core.runtime.IProgressMonitor;\r
8 import org.eclipse.jface.operation.IRunnableContext;\r
9 import org.eclipse.jface.text.Document;\r
10 import org.eclipse.jface.text.IDocument;\r
11 import org.eclipse.jface.text.Position;\r
12 import org.eclipse.jface.text.source.Annotation;\r
13 import org.eclipse.jface.text.source.AnnotationModel;\r
14 import org.eclipse.jface.text.source.IAnnotationModel;\r
15 import org.eclipse.ui.texteditor.AbstractDocumentProvider;\r
16 import org.simantics.Simantics;\r
17 import org.simantics.databoard.Bindings;\r
18 import org.simantics.db.ReadGraph;\r
19 import org.simantics.db.Resource;\r
20 import org.simantics.db.WriteGraph;\r
21 import org.simantics.db.common.request.UniqueRead;\r
22 import org.simantics.db.common.request.WriteRequest;\r
23 import org.simantics.db.exception.DatabaseException;\r
24 import org.simantics.db.procedure.Listener;\r
25 import org.simantics.db.request.Read;\r
26 import org.simantics.modeling.ComponentTypeScriptRequest;\r
27 import org.simantics.modeling.ComponentTypeScriptResult;\r
28 import org.simantics.scl.compiler.errors.CompilationError;\r
29 import org.simantics.scl.compiler.errors.Locations;\r
30 import org.simantics.structural.stubs.StructuralResource2;\r
31 import org.simantics.structural2.utils.StructuralUtils;\r
32 import org.simantics.ui.workbench.ResourceEditorInput;\r
33 import org.simantics.utils.logging.TimeLogger;\r
34 \r
35 public class ComponentTypeScriptDocumentProvider extends AbstractDocumentProvider {\r
36 \r
37     protected ComponentTypeScriptEditor editor;\r
38     \r
39     protected Resource resource;\r
40     protected String currentText;\r
41     protected boolean immutable;\r
42     protected boolean errorHappened;\r
43     \r
44     protected AnnotationModel annotationModel = new AnnotationModel();\r
45     \r
46     protected boolean annotationsInitialized = false;\r
47     \r
48     public ComponentTypeScriptDocumentProvider(ComponentTypeScriptEditor editor) {\r
49         this.editor = editor;\r
50     }\r
51 \r
52     @Override\r
53     protected IDocument createDocument(Object element) throws CoreException {\r
54         ResourceEditorInput input = (ResourceEditorInput)element;\r
55         resource = input.getResource();\r
56         try {\r
57             return Simantics.getSession().syncRequest(new UniqueRead<Document>() {\r
58                 @Override\r
59                 public Document perform(ReadGraph graph) throws DatabaseException {\r
60                     StructuralResource2 STR = StructuralResource2.getInstance(graph);\r
61                     currentText = graph.getRelatedValue(resource, STR.ComponentTypeScript_code, Bindings.STRING);\r
62                     Resource owner = graph.getPossibleObject(resource, STR.ComponentType_hasScript_Inverse);\r
63                     immutable = owner != null && StructuralUtils.isImmutable(graph, owner);\r
64                     errorHappened = false;\r
65                     return new Document(currentText != null ? currentText : "");\r
66                 }\r
67             });\r
68         } catch (DatabaseException e) {\r
69             StringWriter sw = new StringWriter();\r
70             PrintWriter pw = new PrintWriter(sw);\r
71             e.printStackTrace(pw);\r
72             errorHappened = true;\r
73             return new Document(sw.toString());\r
74         }\r
75     }\r
76     \r
77     protected void updateAnnotations() {\r
78         Simantics.getSession().asyncRequest(new Read<ComponentTypeScriptResult>() {\r
79             @Override\r
80             public ComponentTypeScriptResult perform(ReadGraph graph) throws DatabaseException {\r
81                 // is this the correct way to obtain the parent?\r
82                 StructuralResource2 str = StructuralResource2.getInstance(graph);\r
83                 Resource componentType = graph.getSingleObject(resource, str.ComponentType_hasScript_Inverse);\r
84                 \r
85                 return graph.syncRequest(new ComponentTypeScriptRequest(resource, componentType));\r
86             }\r
87         }, new Listener<ComponentTypeScriptResult>() {\r
88 \r
89             @Override\r
90             public void execute(ComponentTypeScriptResult result) {\r
91                 synchronized(annotationModel.getLockObject()) {\r
92                     annotationModel.removeAllAnnotations();\r
93                     for(CompilationError error : result.getErrors()) {\r
94                         Annotation annotation = new Annotation("org.eclipse.ui.workbench.texteditor.error", true, error.description);\r
95                         int begin = Locations.beginOf(error.location);\r
96                         int end = Locations.endOf(error.location);\r
97                         Position position = new Position(begin, end - begin);\r
98                         annotationModel.addAnnotation(annotation, position);\r
99                     }\r
100                 }\r
101             }\r
102 \r
103             @Override\r
104             public void exception(Throwable t) {\r
105                 t.printStackTrace();\r
106             }\r
107 \r
108             @Override\r
109             public boolean isDisposed() {\r
110                 return editor.isDisposed();\r
111             }\r
112         });\r
113     }\r
114     \r
115     @Override\r
116     protected void doSaveDocument(IProgressMonitor monitor, Object element,\r
117             IDocument document, boolean overwrite) throws CoreException {\r
118         TimeLogger.resetTimeAndLog(getClass(), "doSaveDocument");\r
119         currentText = document.get();\r
120         Simantics.getSession().asyncRequest(new WriteRequest() {\r
121             @Override\r
122             public void perform(WriteGraph graph) throws DatabaseException {\r
123                 graph.markUndoPoint();\r
124                 StructuralResource2 STR = StructuralResource2.getInstance(graph);\r
125                 graph.claimLiteral(resource, STR.ComponentTypeScript_code, currentText, Bindings.STRING);\r
126             }\r
127         });\r
128     }\r
129 \r
130     @Override\r
131     protected IAnnotationModel createAnnotationModel(Object element) throws CoreException {\r
132         if(!annotationsInitialized) {\r
133             updateAnnotations();\r
134             annotationsInitialized = true;\r
135         }\r
136         return annotationModel;\r
137     }\r
138 \r
139     @Override\r
140     protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {\r
141         return null;\r
142     }\r
143     \r
144     @Override\r
145     public boolean isModifiable(Object element) {\r
146         return !errorHappened && !immutable;\r
147     }\r
148 \r
149     @Override\r
150     public boolean isReadOnly(Object element) {\r
151         return errorHappened || immutable;\r
152     }\r
153 \r
154 }\r