[common.ui] import hyperlink applicable to complete line
Change-Id: Icd79b675b45cacc24bd45fe2b4f06d2f0017b561
diff --git a/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/linking/ImportAwareHyperlinkHelper.java b/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/linking/ImportAwareHyperlinkHelper.java
index 2d193b1..e228c4d 100644
--- a/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/linking/ImportAwareHyperlinkHelper.java
+++ b/plugins/org.eclipse.etrice.core.common.ui/src/org/eclipse/etrice/core/common/ui/linking/ImportAwareHyperlinkHelper.java
@@ -7,6 +7,7 @@
*
* CONTRIBUTORS:
* Henrik Rentz-Reichert (initial contribution)
+ * Juergen Haug
*
*******************************************************************************/
@@ -14,13 +15,16 @@
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.etrice.core.common.base.Import;
import org.eclipse.etrice.core.common.scoping.ModelLocatorUriResolver;
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.INode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.parser.IParseResult;
+import org.eclipse.xtext.resource.EObjectAtOffsetHelper;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.ui.editor.hyperlinking.HyperlinkHelper;
import org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkAcceptor;
@@ -40,16 +44,57 @@
@Inject
protected ModelLocatorUriResolver uriResolver;
-
- public ImportAwareHyperlinkHelper() {
- super();
- }
- /* (non-Javadoc)
- * @see org.eclipse.xtext.ui.editor.hyperlinking.HyperlinkHelper#createHyperlinksByOffset(org.eclipse.xtext.resource.XtextResource, int, org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkAcceptor)
+
+ @Inject
+ protected EObjectAtOffsetHelper eObjectAtOffsetHelper;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.xtext.ui.editor.hyperlinking.HyperlinkHelper#
+ * createHyperlinksByOffset(org.eclipse.xtext.resource.XtextResource, int,
+ * org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkAcceptor)
*/
@Override
public void createHyperlinksByOffset(XtextResource resource, int offset, IHyperlinkAcceptor acceptor) {
+ XtextHyperlink link = createByImportObject(resource, offset);
+ if (link == null)
+ link = createByImportNode(resource, offset);
+ if (link != null)
+ acceptor.accept(link);
+ super.createHyperlinksByOffset(resource, offset, acceptor);
+ }
+
+ private XtextHyperlink createByImportObject(XtextResource resource, int offset) {
+ EObject eObject = eObjectAtOffsetHelper.resolveElementAt(resource, offset);
+ if (eObject == null || !(eObject instanceof Import))
+ return null;
+
+ Import importObj = (Import) eObject;
+ if (importObj.getImportURI() == null)
+ return null;
+
+ String uritext = uriResolver.resolve(importObj.getImportURI(), resource);
+ if (uritext == null)
+ return null;
+
+ XtextHyperlink result = hyperlinkProvider.get();
+ result.setHyperlinkText(uritext); // ?
+ try {
+ result.setURI(URI.createURI(uritext));
+ }
+ catch (IllegalArgumentException e) {
+ return null;
+ }
+
+ INode node = NodeModelUtils.getNode(importObj);
+ result.setHyperlinkRegion(new Region(node.getOffset(), node.getLength())); // whole import statement
+
+ return result;
+ }
+
+ private XtextHyperlink createByImportNode(XtextResource resource, int offset) {
IParseResult parseResult = resource.getParseResult();
if (parseResult != null && parseResult.getRootNode() != null) {
ILeafNode leaf = NodeModelUtils.findLeafNodeAtOffset(parseResult.getRootNode(), offset);
@@ -58,19 +103,26 @@
RuleCall rc = (RuleCall) grammarElement;
AbstractRule rule = rc.getRule();
if (rule.getName().equals("Import")) {
- String text = leaf.getText().substring(1, leaf.getText().length()-1);
-
- XtextHyperlink result = hyperlinkProvider.get();
- result.setHyperlinkRegion(new Region(leaf.getOffset()+1, leaf.getLength()-2)); // omit ""
+ String text = leaf.getText().substring(1, leaf.getText().length() - 1);
+
String uritext = uriResolver.resolve(text, resource);
- URI uri = URI.createURI(uritext);
- result.setURI(uri);
+ if (uritext == null)
+ return null;
+
+ XtextHyperlink result = hyperlinkProvider.get();
result.setHyperlinkText(uritext);
- acceptor.accept(result);
+ result.setHyperlinkRegion(new Region(leaf.getOffset() + 1, leaf.getLength() - 2)); // omit ""
+ try {
+ result.setURI(URI.createURI(uritext));
+
+ return result;
+ }
+ catch (IllegalArgumentException e) {
+ }
}
}
}
-
- super.createHyperlinksByOffset(resource, offset, acceptor);
+
+ return null;
}
}