/* * <copyright> * * Copyright (c) 2005-2006 Sven Efftinge and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Clemens Kadura - Initial API and implementation * * </copyright> */ package org.eclipse.gmf.internal.xpand.editor; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextHover; import org.eclipse.jface.text.ITextViewer; 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; import org.eclipse.swt.graphics.Point; import org.eclipse.ui.texteditor.MarkerAnnotation; public class OawProblemHover implements IAnnotationHover, ITextHover { private ISourceViewer sourceViewer; public OawProblemHover(final ISourceViewer sourceViewer) { this.sourceViewer = sourceViewer; } // for AnnotationHover public String getHoverInfo(final ISourceViewer sourceViewer, final int lineNumber) { return getHoverInfoInternal(lineNumber, -1); } // for TextHover public String getHoverInfo(final ITextViewer textViewer, final IRegion hoverRegion) { int lineNumber; try { lineNumber = sourceViewer.getDocument().getLineOfOffset(hoverRegion.getOffset()); } catch (final BadLocationException e) { return null; } return getHoverInfoInternal(lineNumber, hoverRegion.getOffset()); } public IRegion getHoverRegion(final ITextViewer textViewer, final int offset) { final Point selection = textViewer.getSelectedRange(); if ((selection.x <= offset) && (offset < selection.x + selection.y)) { return new Region(selection.x, selection.y); } return new Region(offset, 0); } private String getHoverInfoInternal(final int lineNumber, final int offset) { final IAnnotationModel model = sourceViewer.getAnnotationModel(); final List<String> messages = new ArrayList<String>(); final Iterator iterator = model.getAnnotationIterator(); while (iterator.hasNext()) { final Annotation annotation = (Annotation) iterator.next(); if (!(annotation instanceof MarkerAnnotation)) { continue; } final MarkerAnnotation mAnno = (MarkerAnnotation) annotation; final int start = model.getPosition(mAnno).getOffset(); final int end = start + model.getPosition(mAnno).getLength(); if ((offset > 0) && !((start <= offset) && (offset <= end))) { continue; } try { if (lineNumber != sourceViewer.getDocument().getLineOfOffset(start)) { continue; } } catch (final Exception x) { continue; } messages.add(mAnno.getText().trim()); } return formatInfo(messages); } private StringBuffer buffer; private String formatInfo(final List messages) { buffer = new StringBuffer(); if (messages.size() > 1) { buffer.append("Multiple markers at this line\n"); final Iterator e = messages.iterator(); while (e.hasNext()) { splitInfo("- " + e.next() + "\n"); } } else if (messages.size() == 1) { splitInfo((String) messages.get(0)); } return buffer.toString(); } private String splitInfo(String message) { String prefix = ""; int pos; do { pos = message.indexOf(" ", 60); if (pos > -1) { buffer.append(prefix + message.substring(0, pos) + "\n"); message = message.substring(pos); prefix = " "; } else { buffer.append(prefix + message); } } while (pos > -1); return buffer.toString(); } }