blob: ed5e8f7deaccbf1ccdc13e3c486536052d70169f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2018 Red Hat Inc.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Red Hat - initial API and implementation
* Alphonse Van Assche
*******************************************************************************/
package org.eclipse.linuxtools.rpm.ui.editor.markers;
import java.util.Iterator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.quickassist.IQuickFixableAnnotation;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.AnnotationModel;
import org.eclipse.linuxtools.internal.rpm.ui.editor.Activator;
import org.eclipse.linuxtools.internal.rpm.ui.editor.SpecfileEditor;
import org.eclipse.linuxtools.internal.rpm.ui.editor.parser.SpecfileParseException;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.part.FileEditorInput;
public class SpecfileErrorHandler extends SpecfileMarkerHandler {
public static final String SPECFILE_ERROR_MARKER_ID = Activator.PLUGIN_ID + ".specfileerror"; //$NON-NLS-1$
public static final String ANNOTATION_ERROR = "org.eclipse.ui.workbench.texteditor.error"; //$NON-NLS-1$
public static final String ANNOTATION_WARNING = "org.eclipse.ui.workbench.texteditor.warning"; //$NON-NLS-1$
public static final String ANNOTATION_INFO = "org.eclipse.ui.workbench.texteditor.info"; //$NON-NLS-1$
private AnnotationModel fAnnotationModel;
private IEditorInput input;
public SpecfileErrorHandler(IEditorInput input, IDocument document) {
super(null, document);
this.input = input;
fAnnotationModel = getAnnotationModel();
}
private static class SpecfileAnnotation extends Annotation implements IQuickFixableAnnotation {
public SpecfileAnnotation(String annotationType, boolean persist, String message) {
super(annotationType, persist, message);
}
/**
* Tells whether this annotation is quick fixable.
*/
private boolean fIsQuickFixable;
/**
* Tells whether the quick fixable state (<code>fIsQuickFixable</code> has been
* computed.
*/
private boolean fIsQuickFixableStateSet;
/**
* {@inheritDoc}
*
*/
@Override
public void setQuickFixable(boolean state) {
fIsQuickFixable = state;
fIsQuickFixableStateSet = true;
}
/**
* {@inheritDoc}
*
*/
@Override
public boolean isQuickFixableStateSet() {
return fIsQuickFixableStateSet;
}
/**
* {@inheritDoc}
*
*/
@Override
public boolean isQuickFixable() {
Assert.isTrue(isQuickFixableStateSet());
return fIsQuickFixable;
}
}
public void handleError(SpecfileParseException e) {
int lineNumber = e.getLineNumber();
int lineOffset = 0;
try {
lineOffset = document.getLineOffset(lineNumber);
} catch (BadLocationException e2) {
// do nothing
}
int charStart = lineOffset + e.getStartColumn();
int charEnd = lineOffset + e.getEndColumn();
String annotationType = ANNOTATION_INFO;
if (e.getSeverity() == IMarker.SEVERITY_ERROR) {
annotationType = ANNOTATION_ERROR;
} else if (e.getSeverity() == IMarker.SEVERITY_WARNING) {
annotationType = ANNOTATION_WARNING;
}
Annotation annotation = new SpecfileAnnotation(annotationType, true, e.getLocalizedMessage());
Position p = new Position(charStart, charEnd - charStart);
if (fAnnotationModel != null) {
fAnnotationModel.addAnnotation(annotation, p);
}
return;
}
public void removeAllExistingMarkers() {
fAnnotationModel.removeAllAnnotations();
}
@Override
public void removeExistingMarkers() {
removeExistingMarkers(0, document.getLength());
}
private AnnotationModel getAnnotationModel() {
return (AnnotationModel) SpecfileEditor.getSpecfileDocumentProvider().getAnnotationModel(input);
}
public void removeExistingMarkers(int offset, int length) {
if (fAnnotationModel != null) {
Iterator<Annotation> i = fAnnotationModel.getAnnotationIterator();
while (i.hasNext()) {
Annotation annotation = i.next();
Position p = fAnnotationModel.getPosition(annotation);
if (p != null) {
int pStart = p.getOffset();
if (pStart >= offset && pStart < (offset + length)) {
// Remove directly from model instead of using
// iterator so position will be removed from document.
fAnnotationModel.removeAnnotation(annotation);
}
}
}
}
}
public SpecfileErrorHandler(IFile file, IDocument document) {
this(new FileEditorInput(file), document);
}
@Override
public void setFile(IFile file) {
input = new FileEditorInput(file);
}
@Override
String getMarkerID() {
return SPECFILE_ERROR_MARKER_ID;
}
}