]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.modeling.ui/src/org/simantics/modeling/ui/componentTypeEditor/SymbolDropHandlerDocumentProvider.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.modeling.ui / src / org / simantics / modeling / ui / componentTypeEditor / SymbolDropHandlerDocumentProvider.java
1 package org.simantics.modeling.ui.componentTypeEditor;\r
2 \r
3 import java.io.PrintWriter;\r
4 import java.io.StringWriter;\r
5 import java.util.Arrays;\r
6 import java.util.Collection;\r
7 import java.util.Collections;\r
8 \r
9 import org.eclipse.core.runtime.CoreException;\r
10 import org.eclipse.core.runtime.IProgressMonitor;\r
11 import org.eclipse.core.runtime.IStatus;\r
12 import org.eclipse.core.runtime.Status;\r
13 import org.eclipse.jface.text.Document;\r
14 import org.eclipse.jface.text.IDocument;\r
15 import org.eclipse.swt.widgets.Display;\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.ResourceRead;\r
22 import org.simantics.db.common.request.UniqueRead;\r
23 import org.simantics.db.common.request.WriteRequest;\r
24 import org.simantics.db.exception.DatabaseException;\r
25 import org.simantics.db.layer0.util.Layer0Utils;\r
26 import org.simantics.db.procedure.Listener;\r
27 import org.simantics.diagram.stubs.DiagramResource;\r
28 import org.simantics.layer0.Layer0;\r
29 import org.simantics.modeling.ModelingResources;\r
30 import org.simantics.modeling.ui.Activator;\r
31 import org.simantics.scl.compiler.errors.CompilationError;\r
32 import org.simantics.scl.ui.editor.SCLSourceViewerConfigurationNew;\r
33 import org.simantics.scl.ui.editor.TextAndErrors;\r
34 import org.simantics.ui.workbench.ResourceEditorInput;\r
35 import org.simantics.utils.logging.TimeLogger;\r
36 import org.simantics.utils.ui.SWTUtils;\r
37 \r
38 public class SymbolDropHandlerDocumentProvider extends SCLModuleEditorDocumentProvider {\r
39 \r
40     Display display;\r
41     SCLModuleEditor editor;\r
42 \r
43     public SymbolDropHandlerDocumentProvider(SCLSourceViewerConfigurationNew sourceViewer, Display display, SCLModuleEditor editor) {\r
44         super(sourceViewer);\r
45         this.display = display;\r
46         this.editor = editor;\r
47     }\r
48 \r
49     @Override\r
50     protected IDocument createDocument(Object element) throws CoreException {\r
51         ResourceEditorInput input = (ResourceEditorInput)element;\r
52         resource = input.getResource();\r
53         try {\r
54             return Simantics.getSession().syncRequest(new UniqueRead<Document>() {\r
55                 @Override\r
56                 public Document perform(ReadGraph graph) throws DatabaseException {\r
57                         return new Document(getText(graph));\r
58                 }\r
59             });\r
60         } catch (DatabaseException e) {\r
61             StringWriter sw = new StringWriter();\r
62             PrintWriter pw = new PrintWriter(sw);\r
63             e.printStackTrace(pw);\r
64             return new Document(sw.toString());\r
65         }\r
66     }\r
67     \r
68     private String getText(ReadGraph graph) throws DatabaseException {\r
69         Layer0 L0 = Layer0.getInstance(graph);\r
70         DiagramResource DIA = DiagramResource.getInstance(graph);\r
71         for(Resource text : graph.getAssertedObjects(resource, DIA.symbolDropHandler)) {\r
72                 errorHappened = false;\r
73                 return graph.getRelatedValue(text, L0.SCLValue_expression, Bindings.STRING);\r
74         }\r
75         throw new DatabaseException("No symbol code was defined.");\r
76     }\r
77 \r
78     protected void updateAnnotations() {\r
79         Simantics.getSession().asyncRequest(new ResourceRead<TextAndErrors>(resource) {\r
80             @Override\r
81             public TextAndErrors perform(ReadGraph graph) throws DatabaseException {\r
82                 return new TextAndErrors(getText(graph), CompilationError.EMPTY_ARRAY);\r
83             }\r
84         }, new Listener<TextAndErrors>() {\r
85             @Override\r
86             public void execute(final TextAndErrors textAndErrors) {\r
87                 if (editor.isDisposed())\r
88                     return;\r
89                 SWTUtils.asyncExec(display, new Runnable() {\r
90                     @Override\r
91                     public void run() {\r
92                         if (editor.isDisposed())\r
93                             return;\r
94                         if(textAndErrors.errors.length > 0) {\r
95                             setAnnotations(Arrays.asList(textAndErrors.errors));\r
96                         } else {\r
97                             setAnnotations(Collections.<CompilationError>emptyList());\r
98                         }\r
99                     }\r
100                 });\r
101             }\r
102 \r
103             @Override\r
104             public void exception(Throwable t) {\r
105                 Activator.getDefault().getLog().log(\r
106                         new Status(IStatus.ERROR, Activator.PLUGIN_ID, "Internal error in procedural user component code compilation.", t));\r
107             }\r
108 \r
109             @Override\r
110             public boolean isDisposed() {\r
111                 return editor.isDisposed();\r
112             }\r
113         });\r
114     }\r
115 \r
116     @Override\r
117     protected void doSaveDocument(IProgressMonitor monitor, Object element,\r
118             IDocument document, boolean overwrite) throws CoreException {\r
119         TimeLogger.resetTimeAndLog(getClass(), "doSaveDocument");\r
120         currentText = document.get();\r
121         Simantics.getSession().asyncRequest(new WriteRequest() {\r
122             @Override\r
123             public void perform(WriteGraph graph) throws DatabaseException {\r
124                 graph.markUndoPoint();\r
125                 Layer0 L0 = Layer0.getInstance(graph);\r
126                 DiagramResource DIA = DiagramResource.getInstance(graph);\r
127                 Collection<Resource> ass = graph.getAssertedObjects(resource, DIA.symbolDropHandler);\r
128                 if(ass.size() == 0) {\r
129                         \r
130                         ModelingResources MOD = ModelingResources.getInstance(graph);\r
131                         Resource newValue = graph.newResource();\r
132                         graph.claim(newValue, L0.InstanceOf, MOD.SCLValue);\r
133                         graph.claimLiteral(newValue, L0.HasValueType, "[WorkbenchSelectionElement] -> <WriteGraph,Proc> ()", Bindings.STRING);\r
134                         graph.claimLiteral(newValue, L0.SCLValue_expression, currentText, Bindings.STRING);\r
135                         \r
136                         Layer0Utils.assert_(graph, resource, DIA.symbolDropHandler, newValue);\r
137                         return;\r
138 \r
139                 }\r
140                 \r
141                 for(Resource text : ass) {\r
142                         graph.claimLiteral(text, L0.SCLValue_expression, currentText, Bindings.STRING);\r
143                         return;\r
144                 }\r
145                 \r
146             }\r
147         });\r
148     }\r
149 \r
150 }\r