package org.objectstyle.wolips.wodclipse.editor;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.ITextHover;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.jface.text.Position;
import org.eclipse.jface.text.Region;
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.jface.text.source.IAnnotationHover;
import org.eclipse.jface.text.source.IAnnotationModel;
import org.eclipse.jface.text.source.ISourceViewer;
public class WodAnnotationHover implements IAnnotationHover, ITextHover {
private IAnnotationModel myAnnotationModel;
public WodAnnotationHover(IAnnotationModel _annotationModel) {
myAnnotationModel = _annotationModel;
}
public String getHoverInfo(ISourceViewer _sourceViewer, int _lineNumber) {
String hoverInfo = null;
List annotationsList = getAnnotationsForLine(_sourceViewer, _lineNumber);
if (annotationsList != null) {
List<String> messagesList = new ArrayList<String>();
Iterator annotationsIter = annotationsList.iterator();
while (annotationsIter.hasNext()) {
Annotation annotation = (Annotation) annotationsIter.next();
String message = annotation.getText();
if (message != null) {
message = message.trim();
if (message.length() > 0) {
messagesList.add(message);
}
}
}
if (messagesList.size() == 1) {
hoverInfo = messagesList.get(0);
} else if (messagesList.size() > 1) {
hoverInfo = formatMessages(messagesList);
}
}
return hoverInfo;
}
public String getHoverInfo(ITextViewer _textViewer, IRegion _hoverRegion) {
Iterator annotationsIter = myAnnotationModel.getAnnotationIterator();
while (annotationsIter.hasNext()) {
Annotation annotation = (Annotation) annotationsIter.next();
Position position = myAnnotationModel.getPosition(annotation);
if (position.overlapsWith(_hoverRegion.getOffset(), _hoverRegion.getLength())) {
String text = annotation.getText();
if (text != null && text.trim().length() > 0) {
return text;
}
}
}
return null;
}
public IRegion getHoverRegion(ITextViewer _textViewer, int _offset) {
// TODO If this is too slow then we might return new Region(offset, 0)
Iterator annotationsIter = myAnnotationModel.getAnnotationIterator();
while (annotationsIter.hasNext()) {
Annotation annotation = (Annotation) annotationsIter.next();
Position position = myAnnotationModel.getPosition(annotation);
if (position.overlapsWith(_offset, 0)) {
String text = annotation.getText();
if (text != null && text.trim().length() > 0) {
return new Region(position.offset, position.length);
}
}
}
return null;
}
private String formatMessages(List _messages) {
StringBuffer buffer = new StringBuffer();
Iterator e = _messages.iterator();
while (e.hasNext()) {
buffer.append("- "); //$NON-NLS-1$
buffer.append(e.next());
buffer.append('\n');
}
return buffer.toString();
}
private List<Annotation> getAnnotationsForLine(ISourceViewer _viewer, int _line) {
List<Annotation> annotationsList = new ArrayList<Annotation>();
IDocument document = _viewer.getDocument();
IAnnotationModel model = _viewer.getAnnotationModel();
if (model != null) {
Iterator annotationsIter = model.getAnnotationIterator();
while (annotationsIter.hasNext()) {
Annotation annotation = (Annotation) annotationsIter.next();
Position position = model.getPosition(annotation);
if (position != null) {
try {
int annotationLine = document.getLineOfOffset(position.getOffset());
if (annotationLine == _line) {
annotationsList.add(annotation);
}
} catch (BadLocationException e1) {
// ignore
}
}
}
}
return annotationsList;
}
}