package com.laboki.eclipse.plugin.smartsave.contexts;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.SourceViewer;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.texteditor.DefaultMarkerAnnotationAccess;
import com.google.common.base.Optional;
import com.google.common.collect.Lists;
public enum AnnotationContext {
INSTANCE;
private static final String WARNING =
"org.eclipse.ui.workbench.texteditor.warning";
private static final String ERROR =
"org.eclipse.ui.workbench.texteditor.error";
private static final List<String> LINKS =
Lists.newArrayList("org.eclipse.ui.internal.workbench.texteditor.link.slave",
"org.eclipse.ui.internal.workbench.texteditor.link.master",
"org.eclipse.ui.internal.workbench.texteditor.link.target",
"org.eclipse.ui.internal.workbench.texteditor.link.exit");
private static final DefaultMarkerAnnotationAccess ACCESS =
new DefaultMarkerAnnotationAccess();
public static boolean
isInLinkMode(final Optional<IEditorPart> editor) {
return AnnotationContext.hasLinkAnnotations(editor);
}
private static boolean
hasLinkAnnotations(final Optional<IEditorPart> editor) {
final Optional<SourceViewer> view = EditorContext.getView(editor);
if (!view.isPresent()) return false;
final Iterator<Annotation> iterator = AnnotationContext.getIterator(view);
while (iterator.hasNext())
if (AnnotationContext.isLinkModeAnnotation(iterator)) return true;
return false;
}
private static boolean
isLinkModeAnnotation(final Iterator<Annotation> iterator) {
if (AnnotationContext.LINKS.contains(iterator.next().getType())) return true;
return false;
}
public static boolean
hasErrors(final Optional<IEditorPart> editor) {
return AnnotationContext.getAnnotationSeverity(AnnotationContext.ERROR,
editor);
}
public static boolean
hasWarnings(final Optional<IEditorPart> editor) {
return AnnotationContext.getAnnotationSeverity(AnnotationContext.WARNING,
editor);
}
private static boolean
getAnnotationSeverity(final String problemSeverity,
final Optional<IEditorPart> editor) {
final Optional<SourceViewer> view = EditorContext.getView(editor);
if (!view.isPresent()) return false;
final Iterator<Annotation> iterator = AnnotationContext.getIterator(view);
while (iterator.hasNext())
if (AnnotationContext.hasProblems(problemSeverity, iterator)) return true;
return false;
}
private static Iterator<Annotation>
getIterator(final Optional<SourceViewer> view) {
return view.get().getAnnotationModel().getAnnotationIterator();
}
private static boolean
hasProblems(final String problemSeverity, final Iterator<Annotation> iterator) {
final Annotation annotation = iterator.next();
if (annotation.isMarkedDeleted()) return false;
return AnnotationContext.ACCESS.isSubtype(annotation.getType(),
problemSeverity);
}
}