/* * $Id$ * * Copyright (c) 2006 by the TeXlipse team. * 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 */ package net.sourceforge.texlipse.editor.hover; import net.sourceforge.texlipse.editor.TexEditor; import net.sourceforge.texlipse.texparser.LatexParserUtils; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextHover; import org.eclipse.jface.text.ITextHoverExtension; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; /** * Objects of this class determines the hover region and returns * the text of the hover. * * @author Boris von Loesch * @author Oskar Ojala */ public class TexHover implements ITextHover, ITextHoverExtension { TexEditor editor; TexHoverControlCreator creator; public TexHover(TexEditor editor) { this.editor = editor; } /* (non-Javadoc) * @see org.eclipse.jface.text.ITextHover#getHoverInfo(org.eclipse.jface.text.ITextViewer, org.eclipse.jface.text.IRegion) */ public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) { try { return textViewer.getDocument().get(hoverRegion.getOffset(), hoverRegion.getLength()); } catch (BadLocationException ex) { return ""; } } /* * (non-Javadoc) * * @see org.eclipse.jface.text.ITextHover#getHoverRegion(org.eclipse.jface.text.ITextViewer, * int) */ public IRegion getHoverRegion(ITextViewer textViewer, int offset) { try { // Extract current line int lineNr = textViewer.getDocument().getLineOfOffset(offset); int lOffset = textViewer.getDocument().getLineOffset(lineNr); String line = textViewer.getDocument().get(lOffset, textViewer.getDocument().getLineLength(lineNr)); int start = offset - lOffset; IRegion r = LatexParserUtils.getCommand(line, start); if (r == null) return new Region(offset, 0); IRegion rArg = LatexParserUtils.getCommandArgument(line, r.getOffset()); if (rArg == null) return new Region(lOffset + r.getOffset(), r.getLength()); String command = line.substring(r.getOffset()+1, r.getOffset() + r.getLength()); if (command.indexOf("cite") >= 0 && start > r.getOffset() + r.getLength()) { //Return only the citation entry, not the full command string int cEnd = rArg.getOffset() + rArg.getLength(); int regionStart = line.lastIndexOf(',', start) < line.lastIndexOf('{', start) ? line.lastIndexOf('{', start) + 1 : line.lastIndexOf(',', start) + 1; int lastComma = line.indexOf(',', start); if (lastComma >= 0 && lastComma < cEnd) { return new Region(lOffset + regionStart, lastComma - regionStart); } else { return new Region(lOffset + regionStart, cEnd - regionStart); } } int length = rArg.getOffset() - r.getOffset() + rArg.getLength() + 1; return new Region(lOffset + r.getOffset(), length); } catch (BadLocationException ex) { return new Region(offset, 0); } } /* * (non-Javadoc) * * @see org.eclipse.jface.text.ITextHoverExtension#getHoverControlCreator() */ public IInformationControlCreator getHoverControlCreator() { if (creator == null) { creator = new TexHoverControlCreator(editor); } return creator; } }