-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
+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.DoesNotExist;
+import org.simantics.scl.compiler.errors.ErrorSeverity;
+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<Module> result = repository.getModule(input.getModuleName(), updateListener);
+ if(result instanceof Failure) {
+ Failure failure = (Failure)result;
+ setAnnotations(Arrays.asList(failure.errors));
+ }
+ else if(result == DoesNotExist.INSTANCE)
+ setAnnotations(Collections.<CompilationError>emptyList());
+ else
+ setAnnotations(Arrays.asList(result.getResult().getWarnings()));
+ }
+
+ protected void setAnnotations(List<CompilationError> errors) {
+ synchronized(getLockObject()) {
+ removeAllAnnotations();
+ for(CompilationError error : errors) {
+ Annotation annotation = new Annotation(
+ error.severity == ErrorSeverity.ERROR || error.severity == ErrorSeverity.IMPORT_ERROR ?
+ "org.eclipse.ui.workbench.texteditor.error" :
+ "org.eclipse.ui.workbench.texteditor.warning",
+ true, error.description);
+ int begin = Locations.beginOf(error.location);
+ int end = Locations.endOf(error.location);
+ if(begin < 0 || end < begin) {
+ begin = 0;
+ end = 1;
+ }
+ 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);
+ }
+}