/******************************************************************************* * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. 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 * *******************************************************************************/ package com.cisco.yangide.editor.editors; 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.AbstractHyperlinkDetector; import org.eclipse.jface.text.hyperlink.IHyperlink; import com.cisco.yangide.core.dom.ASTNamedNode; import com.cisco.yangide.core.dom.ASTNode; import com.cisco.yangide.core.dom.BaseReference; import com.cisco.yangide.core.dom.Module; import com.cisco.yangide.core.dom.ModuleImport; import com.cisco.yangide.core.dom.QName; import com.cisco.yangide.core.dom.TypeReference; import com.cisco.yangide.core.dom.UsesNode; import com.cisco.yangide.core.indexing.ElementIndexInfo; import com.cisco.yangide.core.indexing.ElementIndexType; import com.cisco.yangide.core.model.YangModelManager; import com.cisco.yangide.core.parser.YangParserUtil; /** * @author Konstantin Zaitsev * @date Jul 4, 2014 */ public class YangElementHyperlinkDetector extends AbstractHyperlinkDetector { @Override public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) { if (region == null || textViewer == null) { return null; } IDocument document = textViewer.getDocument(); int offset = region.getOffset(); if (document == null) { return null; } try { Module module = YangParserUtil.parseYangFile(document.get().toCharArray()); ASTNode node = module.getNodeAtPosition(offset); if (node == null) { return null; } ElementIndexInfo[] searchResult = null; if (node instanceof ModuleImport) { ModuleImport importNode = (ModuleImport) node; searchResult = YangModelManager.search(null, importNode.getRevision(), importNode.getName(), ElementIndexType.MODULE, null, null); } else if (node instanceof TypeReference) { TypeReference ref = (TypeReference) node; QName type = ref.getType(); searchResult = YangModelManager.search(type.getModule(), type.getRevision(), type.getName(), ElementIndexType.TYPE, null, null); if (searchResult.length == 0) { searchResult = YangModelManager.search(type.getModule(), type.getRevision(), type.getName(), ElementIndexType.IDENTITY, null, null); } } else if (node instanceof UsesNode) { UsesNode usesNode = (UsesNode) node; QName ref = usesNode.getGrouping(); searchResult = YangModelManager.search(ref.getModule(), ref.getRevision(), ref.getName(), ElementIndexType.GROUPING, null, null); } else if (node instanceof BaseReference) { BaseReference base = (BaseReference) node; QName ref = base.getType(); searchResult = YangModelManager.search(ref.getModule(), ref.getRevision(), ref.getName(), ElementIndexType.IDENTITY, null, null); } if (searchResult != null && searchResult.length > 0) { IRegion elementRegion = new Region(((ASTNamedNode) node).getNameStartPosition(), ((ASTNamedNode) node).getNameLength()); return new IHyperlink[] { new YangElementHyperlink(elementRegion, searchResult[0]) }; } } catch (Exception e) { return null; } return null; } }