/** * <copyright> * </copyright> * * */ package org.dresdenocl.language.ocl.resource.ocl.ui; import java.util.List; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.jface.text.hyperlink.IHyperlinkDetector; /** * A hyperlink detector returns hyperlink if the token, where the mouse cursor * hovers, is a proxy. */ public class OclHyperlinkDetector implements IHyperlinkDetector { private org.dresdenocl.language.ocl.resource.ocl.IOclTextResource textResource; /** * <p> * Creates a hyperlink detector. * </p> * * @param resource the resource to use for calculating the locations. */ public OclHyperlinkDetector(Resource resource) { textResource = (org.dresdenocl.language.ocl.resource.ocl.IOclTextResource) resource; } public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { org.dresdenocl.language.ocl.resource.ocl.IOclLocationMap locationMap = textResource.getLocationMap(); List<EObject> elementsAtOffset = locationMap.getElementsAt(region.getOffset()); EObject resolvedEObject = null; for (EObject eObject : elementsAtOffset) { if (eObject.eIsProxy()) { resolvedEObject = EcoreUtil.resolve(eObject, textResource); if (resolvedEObject == eObject) { continue; } int offset = locationMap.getCharStart(eObject); int length = locationMap.getCharEnd(eObject) - offset + 1; String text = null; try { text = textViewer.getDocument().get(offset, length); } catch (BadLocationException e) { } // we skip elements that are not contained in a resource, because we cannot jump // to them anyway if (resolvedEObject.eResource() != null) { IHyperlink hyperlink = new org.dresdenocl.language.ocl.resource.ocl.ui.OclHyperlink(new Region(offset, length), resolvedEObject, text); return new IHyperlink[] {hyperlink}; } } } return null; } }