Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/linking/RoomHyperlinkHelper.java')
-rw-r--r--plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/linking/RoomHyperlinkHelper.java79
1 files changed, 79 insertions, 0 deletions
diff --git a/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/linking/RoomHyperlinkHelper.java b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/linking/RoomHyperlinkHelper.java
new file mode 100644
index 000000000..3f459fddc
--- /dev/null
+++ b/plugins/org.eclipse.etrice.core.room.ui/src/org/eclipse/etrice/core/ui/linking/RoomHyperlinkHelper.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * 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 v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * CONTRIBUTORS:
+ * Henrik Rentz-Reichert (initial contribution)
+ *
+ *******************************************************************************/
+
+package org.eclipse.etrice.core.ui.linking;
+
+import org.eclipse.emf.ecore.EObject;
+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.util.RoomHelpers;
+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;
+
+/**
+ * @author Henrik Rentz-Reichert
+ *
+ */
+public class RoomHyperlinkHelper extends ImportAwareHyperlinkHelper {
+
+ @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);
+ }
+ }
+ }
+
+ super.createHyperlinksByOffset(resource, offset, acceptor);
+ }
+
+ private EObject getCrossLinkedEObject(ActorInstanceMapping aim) {
+ ActorContainerClass lastAcContainer = RoomHelpers.getParentContainer(aim);
+ ActorRef lastRef = null;
+ for (String ref : aim.getPath().getRefs()) {
+ for (ActorRef r : lastAcContainer.getActorRefs())
+ if (r.getName().equals(ref)) {
+ lastRef = r;
+ lastAcContainer = lastRef.getType();
+ break;
+ }
+ }
+
+ return lastRef;
+ }
+
+}

Back to the top