1 package org.simantics.scl.ui.editor2;
3 import java.util.Arrays;
4 import java.util.Collections;
7 import org.eclipse.jface.text.IDocument;
8 import org.eclipse.jface.text.Position;
9 import org.eclipse.jface.text.source.Annotation;
10 import org.eclipse.jface.text.source.AnnotationModel;
11 import org.simantics.scl.compiler.errors.CompilationError;
12 import org.simantics.scl.compiler.errors.DoesNotExist;
13 import org.simantics.scl.compiler.errors.ErrorSeverity;
14 import org.simantics.scl.compiler.errors.Failable;
15 import org.simantics.scl.compiler.errors.Failure;
16 import org.simantics.scl.compiler.errors.Locations;
17 import org.simantics.scl.compiler.module.Module;
18 import org.simantics.scl.compiler.module.repository.ModuleRepository;
19 import org.simantics.scl.compiler.module.repository.UpdateListener;
21 public class SCLAnnotationModel extends AnnotationModel {
22 private final SCLModuleEditorInput input;
23 private final ModuleRepository repository;
24 private volatile boolean connected = false;
26 public SCLAnnotationModel(SCLModuleEditorInput input,
27 ModuleRepository repository) {
29 this.repository = repository;
32 UpdateListener updateListener = new UpdateListener() {
34 public void notifyAboutUpdate() {
40 private void updateAnnotations() {
41 Failable<Module> result = repository.getModule(input.getModuleName(), updateListener);
42 if(result instanceof Failure) {
43 Failure failure = (Failure)result;
44 setAnnotations(Arrays.asList(failure.errors));
46 else if(result == DoesNotExist.INSTANCE)
47 setAnnotations(Collections.<CompilationError>emptyList());
49 setAnnotations(Arrays.asList(result.getResult().getWarnings()));
52 protected void setAnnotations(List<CompilationError> errors) {
53 synchronized(getLockObject()) {
54 removeAllAnnotations();
55 for(CompilationError error : errors) {
56 Annotation annotation = new Annotation(
57 error.severity == ErrorSeverity.ERROR || error.severity == ErrorSeverity.IMPORT_ERROR ?
58 "org.eclipse.ui.workbench.texteditor.error" :
59 "org.eclipse.ui.workbench.texteditor.warning",
60 true, error.description);
61 int begin = Locations.beginOf(error.location);
62 int end = Locations.endOf(error.location);
63 if(begin < 0 || end < begin) {
67 Position position = new Position(begin, end - begin);
68 addAnnotation(annotation, position);
74 public void connect(IDocument document) {
75 super.connect(document);
81 public void disconnect(IDocument document) {
83 updateListener.stopListening();
84 super.disconnect(document);