]> gerrit.simantics Code Review - simantics/platform.git/blob - 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
1 package org.simantics.scl.ui.editor2;\r
2 \r
3 import java.util.Arrays;\r
4 import java.util.Collections;\r
5 import java.util.List;\r
6 \r
7 import org.eclipse.jface.text.IDocument;\r
8 import org.eclipse.jface.text.Position;\r
9 import org.eclipse.jface.text.source.Annotation;\r
10 import org.eclipse.jface.text.source.AnnotationModel;\r
11 import org.simantics.scl.compiler.errors.CompilationError;\r
12 import org.simantics.scl.compiler.errors.Failable;\r
13 import org.simantics.scl.compiler.errors.Failure;\r
14 import org.simantics.scl.compiler.errors.Locations;\r
15 import org.simantics.scl.compiler.module.Module;\r
16 import org.simantics.scl.compiler.module.repository.ModuleRepository;\r
17 import org.simantics.scl.compiler.module.repository.UpdateListener;\r
18 \r
19 public class SCLAnnotationModel extends AnnotationModel {\r
20     private final SCLModuleEditorInput input;\r
21     private final ModuleRepository repository;\r
22     private volatile boolean connected = false;\r
23     \r
24     public SCLAnnotationModel(SCLModuleEditorInput input,\r
25             ModuleRepository repository) {\r
26         this.input = input;\r
27         this.repository = repository;\r
28     }\r
29     \r
30     UpdateListener updateListener = new UpdateListener() {\r
31         @Override\r
32         public void notifyAboutUpdate() {\r
33             if(connected)\r
34                 updateAnnotations();\r
35         }\r
36     };\r
37     \r
38     private void updateAnnotations() {\r
39         Failable<Module> result = repository.getModule(input.getModuleName(), updateListener);\r
40         if(result instanceof Failure) {\r
41             Failure failure = (Failure)result;\r
42             setAnnotations(Arrays.asList(failure.errors));\r
43         }\r
44         else {\r
45             setAnnotations(Collections.<CompilationError>emptyList());\r
46         }\r
47     }\r
48     \r
49     protected void setAnnotations(List<CompilationError> errors) {\r
50         synchronized(getLockObject()) {\r
51             removeAllAnnotations();\r
52             for(CompilationError error : errors) {\r
53                 Annotation annotation = new Annotation("org.eclipse.ui.workbench.texteditor.error", true,\r
54                         error.description);\r
55                 int begin = Locations.beginOf(error.location);\r
56                 int end = Locations.endOf(error.location);\r
57                 Position position = new Position(begin, end - begin);\r
58                 addAnnotation(annotation, position);\r
59             }\r
60         }\r
61     }\r
62 \r
63     @Override\r
64     public void connect(IDocument document) {\r
65         super.connect(document);\r
66         connected = true;\r
67         updateAnnotations();\r
68     }\r
69     \r
70     @Override\r
71     public void disconnect(IDocument document) {\r
72         connected = false;\r
73         super.disconnect(document);\r
74     }\r
75 }\r