[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;
 	}
 }