use of org.eclipse.jface.text.source.IAnnotationModel in project eclipse.platform.text by eclipse.
the class SpellCheckDocumentListener method documentChanged.
@Override
public void documentChanged(final DocumentEvent event) {
if (this.lastJob != null) {
this.lastJob.cancel();
}
this.lastJob = new Job("Spellcheck") {
@Override
protected IStatus run(IProgressMonitor monitor) {
ITextFileBuffer iTextFileBuffer = ITextFileBufferManager.DEFAULT.getTextFileBuffer(event.getDocument());
if (iTextFileBuffer == null) {
return Status.CANCEL_STATUS;
}
IAnnotationModel model = iTextFileBuffer.getAnnotationModel();
String text = event.getDocument().get();
int commentStart = text.indexOf("<comment>");
if (commentStart < 0) {
return Status.OK_STATUS;
}
commentStart += "<comment>".length();
int commentEnd = text.indexOf("</comment>", commentStart);
if (commentEnd <= commentStart) {
return Status.OK_STATUS;
}
Region region = new Region(commentStart, commentEnd - commentStart);
service.check(event.getDocument(), new Region[] { region }, new SpellingContext(), new ISpellingProblemCollector() {
private Map<SpellingAnnotation, Position> annotations = new HashMap<>();
@Override
public void endCollecting() {
Set<SpellingAnnotation> previous = new HashSet<>();
model.getAnnotationIterator().forEachRemaining(annotation -> {
if (annotation instanceof SpellingAnnotation) {
previous.add((SpellingAnnotation) annotation);
}
});
if (model instanceof IAnnotationModelExtension) {
((IAnnotationModelExtension) model).replaceAnnotations(previous.toArray(new SpellingAnnotation[previous.size()]), annotations);
} else {
previous.forEach(model::removeAnnotation);
annotations.forEach(model::addAnnotation);
}
}
@Override
public void beginCollecting() {
}
@Override
public void accept(SpellingProblem problem) {
this.annotations.put(new SpellingAnnotation(problem), new Position(problem.getOffset(), problem.getLength()));
}
}, monitor);
return Status.OK_STATUS;
}
};
this.lastJob.setUser(false);
this.lastJob.setPriority(Job.DECORATE);
// set a delay before reacting to user action to handle continuous typing
this.lastJob.schedule(500);
}
use of org.eclipse.jface.text.source.IAnnotationModel in project eclipse.platform.text by eclipse.
the class HighlightTest method clearAnnotations.
private void clearAnnotations() {
editor.selectAndReveal(0, 0);
IAnnotationModel annotationModel = getAnnotationModel();
List<Annotation> annotations = getAnnotationsFromAnnotationModel();
for (Annotation annotation : annotations) {
annotationModel.removeAnnotation(annotation);
}
}
use of org.eclipse.jface.text.source.IAnnotationModel in project eclipse.platform.text by eclipse.
the class HighlightTest method getAnnotationModel.
private IAnnotationModel getAnnotationModel() {
IDocumentProvider dp = editor.getDocumentProvider();
IAnnotationModel am = dp.getAnnotationModel(editor.getEditorInput());
return am;
}
use of org.eclipse.jface.text.source.IAnnotationModel in project eclipse.platform.text by eclipse.
the class MarkerAnnotationHover method getHoverRegion.
@Override
public IRegion getHoverRegion(ITextViewer textViewer, int offset) {
if (!(textViewer instanceof ISourceViewerExtension2)) {
return null;
}
ISourceViewerExtension2 viewer = (ISourceViewerExtension2) textViewer;
List<MarkerAnnotation> annotations = findMarkerAnnotations(viewer, new Region(offset, 0));
if (annotations.isEmpty()) {
return null;
}
// find intersection of regions
int highestOffsetStart = 0;
int lowestOffsetEnd = Integer.MAX_VALUE;
IAnnotationModel annotationModel = viewer.getVisualAnnotationModel();
for (Annotation annotation : annotations) {
Position position = annotationModel.getPosition(annotation);
highestOffsetStart = Math.max(highestOffsetStart, position.getOffset());
lowestOffsetEnd = Math.min(lowestOffsetEnd, position.getOffset() + position.getLength());
}
return new Region(highestOffsetStart, Math.max(0, lowestOffsetEnd - highestOffsetStart));
}
use of org.eclipse.jface.text.source.IAnnotationModel in project eclipse.platform.text by eclipse.
the class MarkerAnnotationHover method findMarkerAnnotations.
private static List<MarkerAnnotation> findMarkerAnnotations(ISourceViewerExtension2 viewer, IRegion region) {
List<MarkerAnnotation> res = new ArrayList<>();
IAnnotationModel annotationModel = viewer.getVisualAnnotationModel();
annotationModel.getAnnotationIterator().forEachRemaining(annotation -> {
if (isIncluded(annotation)) {
Position position = annotationModel.getPosition(annotation);
if (region.getOffset() >= position.getOffset() && region.getOffset() + region.getLength() <= position.getOffset() + position.getLength()) {
res.add((MarkerAnnotation) annotation);
}
}
});
return res;
}
Aggregations