--- /dev/null
+package org.simantics.scl.ui.editor2;\r
+\r
+import java.util.Arrays;\r
+import java.util.Collections;\r
+import java.util.List;\r
+\r
+import org.eclipse.jface.text.IDocument;\r
+import org.eclipse.jface.text.Position;\r
+import org.eclipse.jface.text.source.Annotation;\r
+import org.eclipse.jface.text.source.AnnotationModel;\r
+import org.simantics.scl.compiler.errors.CompilationError;\r
+import org.simantics.scl.compiler.errors.Failable;\r
+import org.simantics.scl.compiler.errors.Failure;\r
+import org.simantics.scl.compiler.errors.Locations;\r
+import org.simantics.scl.compiler.module.Module;\r
+import org.simantics.scl.compiler.module.repository.ModuleRepository;\r
+import org.simantics.scl.compiler.module.repository.UpdateListener;\r
+\r
+public class SCLAnnotationModel extends AnnotationModel {\r
+ private final SCLModuleEditorInput input;\r
+ private final ModuleRepository repository;\r
+ private volatile boolean connected = false;\r
+ \r
+ public SCLAnnotationModel(SCLModuleEditorInput input,\r
+ ModuleRepository repository) {\r
+ this.input = input;\r
+ this.repository = repository;\r
+ }\r
+ \r
+ UpdateListener updateListener = new UpdateListener() {\r
+ @Override\r
+ public void notifyAboutUpdate() {\r
+ if(connected)\r
+ updateAnnotations();\r
+ }\r
+ };\r
+ \r
+ private void updateAnnotations() {\r
+ Failable<Module> result = repository.getModule(input.getModuleName(), updateListener);\r
+ if(result instanceof Failure) {\r
+ Failure failure = (Failure)result;\r
+ setAnnotations(Arrays.asList(failure.errors));\r
+ }\r
+ else {\r
+ setAnnotations(Collections.<CompilationError>emptyList());\r
+ }\r
+ }\r
+ \r
+ protected void setAnnotations(List<CompilationError> errors) {\r
+ synchronized(getLockObject()) {\r
+ removeAllAnnotations();\r
+ for(CompilationError error : errors) {\r
+ Annotation annotation = new Annotation("org.eclipse.ui.workbench.texteditor.error", true,\r
+ error.description);\r
+ int begin = Locations.beginOf(error.location);\r
+ int end = Locations.endOf(error.location);\r
+ Position position = new Position(begin, end - begin);\r
+ addAnnotation(annotation, position);\r
+ }\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void connect(IDocument document) {\r
+ super.connect(document);\r
+ connected = true;\r
+ updateAnnotations();\r
+ }\r
+ \r
+ @Override\r
+ public void disconnect(IDocument document) {\r
+ connected = false;\r
+ super.disconnect(document);\r
+ }\r
+}\r