/** * Aptana Studio * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions). * Please see the license.html included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package com.aptana.editor.ruby.hyperlink; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.eclipse.jface.text.IDocument; 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.jrubyparser.ast.Node; import org.jrubyparser.lexer.SyntaxException; import com.aptana.core.logging.IdeLog; import com.aptana.editor.common.text.hyperlink.IndexQueryingHyperlinkDetector; import com.aptana.editor.ruby.RubyEditorPlugin; import com.aptana.ruby.core.RubyCorePlugin; import com.aptana.ruby.core.codeassist.CodeResolver; import com.aptana.ruby.core.codeassist.ResolutionTarget; import com.aptana.ruby.core.codeassist.ResolveContext; public class RubyHyperlinkDetector extends IndexQueryingHyperlinkDetector { private IRegion srcRegion; public RubyHyperlinkDetector() { super(); } public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { List<IHyperlink> hyperlinks = new ArrayList<IHyperlink>(); try { IDocument doc = textViewer.getDocument(); ResolveContext context = new ResolveContext(getURI(), doc.get(), region.getOffset()); Node atOffset = context.getSelectedNode(); if (atOffset == null) { return null; } // Expand hyperlink region to the node bounds srcRegion = new Region(atOffset.getPosition().getStartOffset(), atOffset.getPosition().getEndOffset() - atOffset.getPosition().getStartOffset()); CodeResolver resolver = RubyCorePlugin.getDefault().getCodeResolver(); resolver.resolve(context); List<ResolutionTarget> resolved = context.getResolved(); if (resolved != null) { for (ResolutionTarget target : resolved) { hyperlinks.add(new ResolutionTargetHyperlink(srcRegion, target)); } } } catch (SyntaxException se) // $codepro.audit.disable emptyCatchClause { // ignore } catch (Exception e) { IdeLog.logError(RubyEditorPlugin.getDefault(), e); } try { if (hyperlinks.isEmpty()) { return null; } // Remove duplicates! Set<IHyperlink> uniques = new LinkedHashSet<IHyperlink>(hyperlinks); return uniques.toArray(new IHyperlink[uniques.size()]); } finally { srcRegion = null; } } }