/******************************************************************************* * This file is part of the Symfony eclipse plugin. * * (c) Robert Gruendler <r.gruendler@gmail.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. ******************************************************************************/ package com.dubture.symfony.ui.editor.hyperlink; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.core.IType; import org.eclipse.dltk.internal.ui.editor.EditorUtility; import org.eclipse.dltk.internal.ui.editor.ModelElementHyperlink; import org.eclipse.dltk.ui.actions.OpenAction; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.php.internal.ui.editor.PHPStructuredEditor; import com.dubture.symfony.core.log.Logger; import com.dubture.symfony.core.model.EntityAlias; import com.dubture.symfony.core.model.SymfonyModelAccess; /** * Detects EntityHyperlinks such as 'AcmeDemoBundle:SomeEntityClass' * * * @author Robert Gruendler <r.gruendler@gmail.com> * */ @SuppressWarnings("restriction") public class EntityHyperlinkDetector extends StringHyperlinkDetector { private ISourceModule input; private PHPStructuredEditor editor; @Override public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { editor = org.eclipse.php.internal.ui.util.EditorUtility .getPHPEditor(textViewer); if (editor == null || region == null) { return null; } input = EditorUtility.getEditorInputModelElement(editor, false); if (input == null) { return null; } IDocument document = textViewer.getDocument(); int offset = region.getOffset(); try { IRegion wordRegion = findWord(document, offset); if (wordRegion == null) return null; String entity = document.get(wordRegion.getOffset(), wordRegion.getLength()); if (!entity.contains(":")) return null; String[] parts = entity.split(":"); if (parts.length != 2) { return null; } EntityAlias alias = new EntityAlias(entity); if (!alias.hasBundle()) return null; IType type = SymfonyModelAccess.getDefault().findEntity(alias, input.getScriptProject()); if (type == null) return null; IHyperlink link = new ModelElementHyperlink(wordRegion, type, new OpenAction(editor)); return new IHyperlink[] { link }; } catch (Exception e) { Logger.logException(e); } return null; } }