/******************************************************************************* * Copyright (c) 2007, 2009 Borland Software Corporation 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 * * Contributors: * Borland Software Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.m2m.internal.qvt.oml.editor.ui.hyperlinks; import org.eclipse.emf.common.util.URI; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.Region; import org.eclipse.jface.text.hyperlink.IHyperlink; import org.eclipse.m2m.internal.qvt.oml.ast.binding.ASTBindingHelper; import org.eclipse.m2m.internal.qvt.oml.cst.MappingDeclarationCS; import org.eclipse.m2m.internal.qvt.oml.cst.MappingRuleCS; import org.eclipse.m2m.internal.qvt.oml.cst.ResolveInExpCS; import org.eclipse.m2m.internal.qvt.oml.editor.ui.CSTHelper; import org.eclipse.m2m.internal.qvt.oml.expressions.MappingOperation; import org.eclipse.m2m.internal.qvt.oml.expressions.ResolveInExp; import org.eclipse.ocl.cst.CSTNode; import org.eclipse.ocl.cst.SimpleNameCS; import org.eclipse.ocl.cst.TypeCS; /** * @author vrepeshko */ public class ResolveInHyperlinkDetector implements IHyperlinkDetectorHelper { public IHyperlink detectHyperlink(IDetectionContext context) { CSTNode element = context.getSyntaxElement(); if (element instanceof ResolveInExpCS) { ResolveInExpCS resolveInExpCS = (ResolveInExpCS) element; TypeCS type = resolveInExpCS.getInMappingType(); SimpleNameCS inMappingNameCS = resolveInExpCS.getInMappingName(); if(type != null && inMappingNameCS != null) { String mappingName = inMappingNameCS.getValue(); int mappingNameStartOffset = inMappingNameCS.getStartOffset(); int length = inMappingNameCS.getEndOffset() - inMappingNameCS.getStartOffset() + 1; if(HyperlinkUtil.isOffsetInRange(context.getRegion().getOffset(), mappingNameStartOffset, mappingNameStartOffset + mappingName.length())) { MappingDeclarationCS mappingDeclCS = findReferencedDefinitionCS(resolveInExpCS); if(mappingDeclCS != null) { URI sourceURI = CSTHelper.getSourceFile(mappingDeclCS); if(sourceURI == null) { return null; } IRegion destReg = HyperlinkUtil.createRegion(getLinkDestinationNode(mappingDeclCS)); return new QvtFileHyperlink(new Region(mappingNameStartOffset, length), sourceURI, destReg, destReg); } } } } return null; } public static MappingOperation findReferencedDefinition(ResolveInExpCS resolveInExpCS) { ResolveInExp resolveInAST = ASTBindingHelper.resolveASTNode(resolveInExpCS, ResolveInExp.class); if(resolveInAST != null) { return resolveInAST.getInMapping(); } return null; } private static MappingDeclarationCS findReferencedDefinitionCS(ResolveInExpCS resolveInExpCS) { MappingOperation mappingOperation = findReferencedDefinition(resolveInExpCS); if(mappingOperation != null) { MappingRuleCS mappingRuleCS = ASTBindingHelper.resolveCSTNode(mappingOperation, MappingRuleCS.class); if(mappingRuleCS != null) { return mappingRuleCS.getMappingDeclarationCS(); } } return null; } private static CSTNode getLinkDestinationNode(MappingDeclarationCS mappingDeclCS) { CSTNode linkDestCS = mappingDeclCS.getSimpleNameCS(); if(linkDestCS == null) { linkDestCS = mappingDeclCS; } return linkDestCS; } }