use of org.eclipse.ui.texteditor.spelling.SpellingAnnotation 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);
}
Aggregations