/** * Copyright (c) 2013-2016 Angelo ZERR. * 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: * Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation */ package tern.eclipse.ide.ui.hyperlink; import org.eclipse.core.filebuffers.FileBuffers; import org.eclipse.core.filebuffers.ITextFileBuffer; import org.eclipse.core.filebuffers.ITextFileBufferManager; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.ui.texteditor.ITextEditor; import tern.eclipse.ide.core.IIDETernProject; import tern.eclipse.ide.core.TernCorePlugin; import tern.eclipse.ide.internal.ui.Trace; import tern.eclipse.ide.internal.ui.hyperlink.TernHyperlink; import tern.eclipse.ide.ui.JavaWordFinder; import tern.eclipse.ide.ui.utils.EditorUtils; /** * Tern Hyperlink detector. * */ public class TernHyperLinkDetector extends AbstractHyperlinkDetector { @Override public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { if (region == null || textViewer == null) { return null; } // Get resource from the given text viewer. IResource resource = getResource(textViewer); if (resource == null) { return null; } IProject project = resource.getProject(); if (TernCorePlugin.hasTernNature(project)) { // the project of the resource has tern nature, execute tern // hyperlink. try { IIDETernProject ternProject = TernCorePlugin .getTernProject(project); IDocument document = textViewer.getDocument(); IRegion wordRegion= JavaWordFinder.findWord(document, region.getOffset()); TernHyperlink hyperlink = new TernHyperlink(document, wordRegion, resource, ternProject); if (hyperlink.isValid()) { IHyperlink[] hyperlinks = new IHyperlink[1]; hyperlinks[0] = hyperlink; return hyperlinks; } return null; } catch (CoreException e) { Trace.trace(Trace.WARNING, "Error while tern hyperlink", e); } } return null; } /** * Returns the {@link IResource} from the given text viewer and null * otherwise. * * @param textViewer * @return the {@link IResource} from the given text viewer and null * otherwise. */ protected IResource getResource(ITextViewer textViewer) { ITextEditor textEditor = (ITextEditor) getAdapter(ITextEditor.class); if (textEditor != null) { return EditorUtils.getResource(textEditor); } ITextFileBufferManager bufferManager = FileBuffers .getTextFileBufferManager(); ITextFileBuffer textFileBuffer = bufferManager .getTextFileBuffer(textViewer.getDocument()); if (textFileBuffer != null) { IPath location = textFileBuffer.getLocation(); return ResourcesPlugin.getWorkspace().getRoot() .findMember(location); } return null; } }