]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/SCLAnnotationModel.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.scl.ui / src / org / simantics / scl / ui / editor2 / SCLAnnotationModel.java
diff --git a/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/SCLAnnotationModel.java b/bundles/org.simantics.scl.ui/src/org/simantics/scl/ui/editor2/SCLAnnotationModel.java
new file mode 100644 (file)
index 0000000..181abf7
--- /dev/null
@@ -0,0 +1,75 @@
+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