blob: 3639f06fe176ce4aec6fe57ce53325e619eba87c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 protos software gmbh (http://www.protos.de).
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* CONTRIBUTORS:
* Henrik Rentz-Reichert (initial contribution)
*
*******************************************************************************/
package org.eclipse.etrice.core.ui.linking;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.etrice.core.common.ui.linking.ImportAwareHyperlinkHelper;
import org.eclipse.etrice.core.fsm.fSM.DetailCode;
import org.eclipse.etrice.core.room.ActorContainerClass;
import org.eclipse.etrice.core.room.ActorInstanceMapping;
import org.eclipse.etrice.core.room.ActorRef;
import org.eclipse.etrice.core.room.RefSegment;
import org.eclipse.etrice.core.room.util.RoomHelpers;
import org.eclipse.etrice.core.services.RoomGrammarAccess;
import org.eclipse.etrice.core.ui.util.UIExpressionUtil;
import org.eclipse.etrice.expressions.detailcode.IDetailExpressionProvider.ExpressionFeature;
import org.eclipse.jface.text.Region;
import org.eclipse.xtext.AbstractRule;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.nodemodel.ILeafNode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.parser.IParseResult;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkAcceptor;
import com.google.inject.Inject;
/**
* @author Henrik Rentz-Reichert
*
*/
public class RoomHyperlinkHelper extends ImportAwareHyperlinkHelper {
@Inject private RoomGrammarAccess grammar;
@Inject private RoomHelpers roomHelpers;
@Override
public void createHyperlinksByOffset(XtextResource resource, int offset, IHyperlinkAcceptor acceptor) {
IParseResult parseResult = resource.getParseResult();
if (parseResult != null && parseResult.getRootNode() != null) {
ILeafNode leaf = NodeModelUtils.findLeafNodeAtOffset(parseResult.getRootNode(), offset);
EObject grammarElement = leaf.getParent().getGrammarElement();
if (grammarElement instanceof RuleCall) {
RuleCall rc = (RuleCall) grammarElement;
AbstractRule rule = rc.getRule();
EObject crossLinkedEObject = null;
if (rule.getName().equals("RefPath")) {
EObject parent = leaf.getSemanticElement().eContainer();
if (parent instanceof ActorInstanceMapping) {
crossLinkedEObject = getCrossLinkedEObject((ActorInstanceMapping) parent);
}
}
if (crossLinkedEObject != null) {
Region region = new Region(leaf.getOffset(), leaf.getLength());
createHyperlinksTo(resource, region, crossLinkedEObject, acceptor);
}
}
if(leaf.getGrammarElement() instanceof RuleCall) {
if(((RuleCall) leaf.getGrammarElement()).getRule() == grammar.getCC_STRINGRule() && leaf.getSemanticElement() instanceof DetailCode) {
ExpressionFeature exprFeature = UIExpressionUtil.findAtOffset(leaf, offset);
if(exprFeature != null && exprFeature.getData() instanceof EObject) {
Region region = new Region(leaf.getOffset(), leaf.getLength());
createHyperlinksTo(resource, region, (EObject) exprFeature.getData(), acceptor);
}
}
}
}
super.createHyperlinksByOffset(resource, offset, acceptor);
}
private EObject getCrossLinkedEObject(ActorInstanceMapping aim) {
ActorContainerClass lastAcContainer = roomHelpers.getParentContainer(aim);
ActorRef lastRef = null;
for (RefSegment ref : aim.getPath().getRefs()) {
for (ActorRef r : lastAcContainer.getActorRefs())
if (r.getName().equals(ref.getRef())) {
lastRef = r;
lastAcContainer = lastRef.getType();
break;
}
}
return lastRef;
}
}