Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
Copyright (c) 2010 Christoph Kulla 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: Christoph Kulla - Initial API and implementation /
 
 package org.eclipse.xtext.ui.editor.hover;
 
 import  org.eclipse.core.runtime.OperationCanceledException;
 import  org.eclipse.jface.text.IRegion;
 import  org.eclipse.jface.text.ITextViewer;
 import  org.eclipse.jface.text.Region;
 import  org.eclipse.jface.text.TextUtilities;
 
A hover which determines the EObject at the hover region. Subclasses have to implement getHoverInfo2 (final EObject eObject, final ITextViewer textViewer, final IRegion hoverRegion).

Author(s):
Christoph Kulla - Initial contribution and API
 
 public abstract class AbstractEObjectHover extends AbstractHover implements IEObjectHover {
 
 
 
 	public IRegion getHoverRegion(final ITextViewer textViewerfinal int offset) {
 		IXtextDocument xtextDocument = XtextDocumentUtil.get(textViewer);
 		if(xtextDocument == null
 			return null;
 		//TODO this is being called on change in the UI-thread. Not a good idea to do such expensive stuff.
 		// returning the region on a per token basis would be better.
 		try {
 			return xtextDocument.readOnly(new IUnitOfWork<IRegion, XtextResource>() {
 				public IRegion exec(XtextResource statethrows Exception {
 					// resource can be null e.g. read only zip/jar entry
 					if (state == null) {
 						return null;
 					}
 					Pair<EObject, IRegion> element = getXtextElementAt(stateoffset);
 					if (element != null) {
 						return element.getSecond();
 					} else {
 						return null;
 					}
 				}
 			});
 		} catch (OperationCanceledException e) {
 			return null;
 		} catch (OperationCanceledError e) {
 			return null;
 		}
 	}
 
 	public Object getHoverInfo2(final ITextViewer textViewerfinal IRegion hoverRegion) {
 		if (hoverRegion == null)
 			return null;
 		IXtextDocument xtextDocument = XtextDocumentUtil.get(textViewer);
 		if(xtextDocument == null
 			return null;
 		try {
 			return xtextDocument.readOnly(new IUnitOfWork<ObjectXtextResource>() {
 				public Object exec(XtextResource statethrows Exception {
 					// resource can be null e.g. read only zip/jar entry
 					if (state == null) {
 						return null;
 					}
 					Pair<EObject, IRegion> element = getXtextElementAt(statehoverRegion.getOffset());
 					if (element != null && element.getFirst() != null) {
 						return getHoverInfo(element.getFirst(), textViewerhoverRegion);
 					}
 					return null;
 				}
			});
catch (OperationCanceledException e) {
			return null;
catch (OperationCanceledError e) {
			return null;
		}
	}
	public abstract Object getHoverInfo(final EObject eObjectfinal ITextViewer textViewer,
			final IRegion hoverRegion);

Call this method only from within an IUnitOfWork
	protected Pair<EObject, IRegion> getXtextElementAt(XtextResource resourcefinal IRegion hoverRegion) {
		return getXtextElementAt(resourcehoverRegion.getOffset());
	}

Call this method only from within an IUnitOfWork
	protected Pair<EObject, IRegion> getXtextElementAt(XtextResource resourcefinal int offset) {
		// check for cross reference
		EObject crossLinkedEObject = .resolveCrossReferencedElementAt(resourceoffset);
		if (crossLinkedEObject != null) {
			if (!crossLinkedEObject.eIsProxy()) {
				IParseResult parseResult = resource.getParseResult();
				if (parseResult != null) {
					ILeafNode leafNode = NodeModelUtils.findLeafNodeAtOffset(parseResult.getRootNode(), offset);
					if(leafNode != null && leafNode.isHidden() && leafNode.getOffset() == offset) {
						leafNode = NodeModelUtils.findLeafNodeAtOffset(parseResult.getRootNode(), offset - 1);
					}
					if (leafNode != null) {
						ITextRegion leafRegion = leafNode.getTextRegion();
						return Tuples.create(crossLinkedEObject, (IRegion) new Region(leafRegion.getOffset(), leafRegion.getLength()));
					}
				}
			}
else {
			if (o != null) {
				final IRegion region2 = new Region(region.getOffset(), region.getLength());
				if (TextUtilities.overlaps(region2new Region(offset, 0)))
					return Tuples.create(oregion2);
			}
		}
		return null;
	}
New to GrepCode? Check out our FAQ X