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