]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.document.ui/src/org/simantics/document/ui/CSSModuleEditorDocumentProvider.java
Several Wiki documentation view improvements.
[simantics/platform.git] / bundles / org.simantics.document.ui / src / org / simantics / document / ui / CSSModuleEditorDocumentProvider.java
1 package org.simantics.document.ui;\r
2 \r
3 import java.io.PrintWriter;\r
4 import java.io.StringWriter;\r
5 import java.util.Collections;\r
6 import java.util.List;\r
7 \r
8 import org.eclipse.core.runtime.CoreException;\r
9 import org.eclipse.core.runtime.IProgressMonitor;\r
10 import org.eclipse.jface.operation.IRunnableContext;\r
11 import org.eclipse.jface.text.Document;\r
12 import org.eclipse.jface.text.IDocument;\r
13 import org.eclipse.jface.text.Position;\r
14 import org.eclipse.jface.text.source.Annotation;\r
15 import org.eclipse.jface.text.source.AnnotationModel;\r
16 import org.eclipse.jface.text.source.IAnnotationModel;\r
17 import org.eclipse.ui.texteditor.AbstractDocumentProvider;\r
18 import org.simantics.Simantics;\r
19 import org.simantics.databoard.Bindings;\r
20 import org.simantics.db.ReadGraph;\r
21 import org.simantics.db.Resource;\r
22 import org.simantics.db.WriteGraph;\r
23 import org.simantics.db.common.request.ReadRequest;\r
24 import org.simantics.db.common.request.UniqueRead;\r
25 import org.simantics.db.common.request.WriteRequest;\r
26 import org.simantics.db.exception.DatabaseException;\r
27 import org.simantics.db.layer0.util.Layer0Utils;\r
28 import org.simantics.document.DocumentResource;\r
29 import org.simantics.layer0.Layer0;\r
30 import org.simantics.scl.compiler.errors.CompilationError;\r
31 import org.simantics.scl.compiler.errors.Locations;\r
32 import org.simantics.ui.workbench.ResourceEditorInput2;\r
33 import org.simantics.utils.logging.TimeLogger;\r
34 \r
35 public class CSSModuleEditorDocumentProvider extends AbstractDocumentProvider {\r
36 \r
37     protected Resource resource;\r
38     protected String currentText;\r
39     protected boolean errorHappened;\r
40 \r
41     protected AnnotationModel annotationModel = new AnnotationModel();\r
42     private final CSSSourceViewerConfiguration sourceViewer;\r
43 \r
44     public CSSModuleEditorDocumentProvider(CSSSourceViewerConfiguration sourceViewer) {\r
45         this.sourceViewer = sourceViewer;\r
46     }\r
47 \r
48     @Override\r
49     protected IDocument createDocument(Object element) throws CoreException {\r
50         ResourceEditorInput2 input = (ResourceEditorInput2)element;\r
51         resource = input.getResource();\r
52         try {\r
53             return Simantics.getSession().syncRequest(new UniqueRead<Document>() {\r
54                 @Override\r
55                 public Document perform(ReadGraph graph) throws DatabaseException {\r
56                         DocumentResource DOC = DocumentResource.getInstance(graph);\r
57                     currentText = graph.getPossibleRelatedValue(resource, DOC.cssDocument, Bindings.STRING);\r
58                     errorHappened = false;\r
59                     return new Document(currentText != null ? currentText : "");\r
60                 }\r
61             });\r
62         } catch (DatabaseException e) {\r
63             StringWriter sw = new StringWriter();\r
64             PrintWriter pw = new PrintWriter(sw);\r
65             e.printStackTrace(pw);\r
66             errorHappened = true;\r
67             return new Document(sw.toString());\r
68         }\r
69     }\r
70 \r
71     protected void updateAnnotations() {\r
72         Simantics.getSession().asyncRequest(new ReadRequest() {\r
73             @Override\r
74             public void run(ReadGraph graph) throws DatabaseException {\r
75                 if (!graph.hasStatement(resource))\r
76                     return;\r
77                 setAnnotations(Collections.<CompilationError>emptyList());\r
78             }\r
79         });\r
80     }\r
81 \r
82     protected void setAnnotations(List<CompilationError> errors) {\r
83         synchronized(annotationModel.getLockObject()) {\r
84             annotationModel.removeAllAnnotations();\r
85             for(CompilationError error : errors) {\r
86                 Annotation annotation = new Annotation("org.eclipse.ui.workbench.texteditor.error", true,\r
87                         error.description);\r
88                 int begin = Locations.beginOf(error.location);\r
89                 int end = Locations.endOf(error.location);\r
90                 Position position = new Position(begin, end - begin);\r
91                 annotationModel.addAnnotation(annotation, position);\r
92             }\r
93         }\r
94     }\r
95 \r
96     boolean annotationsInitialized = false;\r
97 \r
98     @Override\r
99     protected IAnnotationModel createAnnotationModel(Object element)\r
100             throws CoreException {\r
101         if(!annotationsInitialized) {\r
102             updateAnnotations();\r
103             annotationsInitialized = true;\r
104         }\r
105         return annotationModel;\r
106     }\r
107 \r
108     @Override\r
109     protected void doSaveDocument(IProgressMonitor monitor, Object element,\r
110             IDocument document, boolean overwrite) throws CoreException {\r
111         TimeLogger.resetTimeAndLog("SCLModuleEditorDocumentProvider.doSaveDocument");\r
112         currentText = document.get();\r
113         Simantics.getSession().asyncRequest(new WriteRequest() {\r
114             @Override\r
115             public void perform(WriteGraph graph) throws DatabaseException {\r
116                 graph.markUndoPoint();\r
117                 DocumentResource DOC = DocumentResource.getInstance(graph);\r
118                 graph.claimLiteral(resource, DOC.cssDocument, currentText, Bindings.STRING);\r
119                 Layer0Utils.addCommentMetadata(graph, "Saved CSS " + graph.getRelatedValue2(resource, Layer0.getInstance(graph).HasName, Bindings.STRING));\r
120             }\r
121         });\r
122     }\r
123 \r
124     @Override\r
125     protected IRunnableContext getOperationRunner(IProgressMonitor monitor) {\r
126         return null;\r
127     }\r
128 \r
129     @Override\r
130     public boolean isModifiable(Object element) {\r
131         return !errorHappened;\r
132     }\r
133 \r
134     @Override\r
135     public boolean isReadOnly(Object element) {\r
136         return errorHappened;\r
137     }\r
138 \r
139 }\r