Bug 38190 - Ant refid and pathid should be hyperlinks
diff --git a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditor.java b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditor.java
index 21a7333..90641a9 100644
--- a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditor.java
+++ b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditor.java
@@ -27,12 +27,14 @@
 import org.eclipse.ant.internal.ui.model.IAntUIHelpContextIds;
 import org.eclipse.ant.internal.ui.preferences.AntEditorPreferenceConstants;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.ITextSelection;
 import org.eclipse.jface.text.source.IAnnotationAccess;
 import org.eclipse.jface.text.source.IOverviewRuler;
 import org.eclipse.jface.text.source.ISourceViewer;
 import org.eclipse.jface.text.source.IVerticalRuler;
 import org.eclipse.jface.text.source.SourceViewer;
 import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
@@ -339,4 +341,19 @@
 		getAntModel().setResolveFully(resolveFully);
 		
 	}
+
+	public void openReferenceElement() {
+		ISelection selection= getSelectionProvider().getSelection();
+		if (selection instanceof ITextSelection) {
+			ITextSelection textSelection= (ITextSelection)selection;
+			String text= textSelection.getText();
+			AntElementNode node= getAntModel().getReferenceNode(text);
+			if (node != null) {
+				setSelection(node, true);
+				return;
+			} 
+		}
+		setStatusLineErrorMessage(AntEditorMessages.getString("AntEditor.3")); //$NON-NLS-1$
+		getSite().getShell().getDisplay().beep();
+	}
 }
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditorActionContributor.java b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditorActionContributor.java
index 5a84739..8f642e1 100644
--- a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditorActionContributor.java
+++ b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditorActionContributor.java
@@ -18,6 +18,7 @@
 
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
 import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IWorkbenchActionConstants;
@@ -32,6 +33,7 @@
 public class AntEditorActionContributor extends TextEditorActionContributor {
 
 	protected RetargetTextEditorAction fContentAssistProposal;
+	private OpenDeclarationAction fOpenDeclarationAction;
 	private ValidateBuildfileAction fValidateAction;
 
 	public AntEditorActionContributor() {
@@ -40,6 +42,10 @@
 		fValidateAction= new ValidateBuildfileAction();
 	}
 	
+	protected void initializeActions(AntEditor editor) {	 
+		fOpenDeclarationAction= new OpenDeclarationAction(editor);
+	}
+	
 	private void doSetActiveEditor(IEditorPart part) {
 		super.setActiveEditor(part);
 
@@ -49,8 +55,35 @@
 		}
 
 		fContentAssistProposal.setAction(getAction(editor, "ContentAssistProposal")); //$NON-NLS-1$
+		
+		if (part instanceof AntEditor) {
+			if (fOpenDeclarationAction == null) {
+				initializeActions((AntEditor) part);
+				contributeToMenu(getActionBars().getMenuManager());
+			}
+		}
+
+		if (fOpenDeclarationAction != null) {
+			fOpenDeclarationAction.setEditor((AntEditor) part);		
+		}
 	}
 	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.part.EditorActionBarContributor#contributeToMenu(org.eclipse.jface.action.IMenuManager)
+	 */
+	public void contributeToMenu(IMenuManager menu) {
+		if (fOpenDeclarationAction == null) {
+			return;
+		}
+		super.contributeToMenu(menu);
+		
+		IMenuManager navigateMenu= menu.findMenuUsingPath(IWorkbenchActionConstants.M_NAVIGATE);
+		if (navigateMenu != null) {
+			navigateMenu.appendToGroup(IWorkbenchActionConstants.OPEN_EXT, fOpenDeclarationAction);
+			navigateMenu.setVisible(true);
+		}
+	}
+
     /* (non-Javadoc)
      * @see org.eclipse.ui.part.EditorActionBarContributor#init(org.eclipse.ui.IActionBars)
      */
@@ -60,10 +93,9 @@
         IMenuManager menuManager= bars.getMenuManager();
         IMenuManager editMenu= menuManager.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);
         if (editMenu != null) {
-            editMenu.add(new org.eclipse.jface.action.Separator());
+            editMenu.add(new Separator());
             editMenu.add(fContentAssistProposal);
-        }   
-        
+        }
     }
     
     /* (non-Javadoc)
diff --git a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/OpenDeclarationAction.java b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/OpenDeclarationAction.java
new file mode 100644
index 0000000..e2a7e2c
--- /dev/null
+++ b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/OpenDeclarationAction.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.ant.internal.ui.editor;
+
+import org.eclipse.jdt.ui.actions.IJavaEditorActionDefinitionIds;
+import org.eclipse.jdt.ui.actions.OpenAction;
+import org.eclipse.jface.text.ITextSelection;
+
+public class OpenDeclarationAction extends OpenAction {
+	
+	private AntEditor fEditor;
+	
+	public OpenDeclarationAction(AntEditor antEditor) {
+		super(antEditor.getSite());
+		fEditor= antEditor;
+		setActionDefinitionId(IJavaEditorActionDefinitionIds.OPEN_EDITOR);
+		antEditor.getSite().getKeyBindingService().registerAction(this);
+
+		setText(AntEditorMessages.getString("OpenDeclarationAction.0"));  //$NON-NLS-1$
+		setDescription(AntEditorMessages.getString("OpenDeclarationAction.1")); //$NON-NLS-1$
+		setToolTipText(AntEditorMessages.getString("OpenDeclarationAction.2")); //$NON-NLS-1$
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.action.IAction#run()
+	 */
+	public void run() {
+		if (fEditor == null) {
+			return;
+		}
+		
+		fEditor.openReferenceElement();		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jdt.ui.actions.SelectionDispatchAction#selectionChanged(org.eclipse.jface.text.ITextSelection)
+	 */
+	public void selectionChanged(ITextSelection selection) {
+		setEnabled(fEditor != null);
+	}
+	
+	public void setEditor(AntEditor editor) {
+		fEditor= editor;
+	}
+}
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/outline/AntModel.java b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/outline/AntModel.java
index 998ad7b..1901f5c 100644
--- a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/outline/AntModel.java
+++ b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/outline/AntModel.java
@@ -25,6 +25,7 @@
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.Target;
 import org.apache.tools.ant.Task;
+import org.apache.tools.ant.UnknownElement;
 import org.eclipse.ant.core.AntCorePlugin;
 import org.eclipse.ant.core.AntCorePreferences;
 import org.eclipse.ant.internal.ui.editor.model.AntElementNode;
@@ -197,7 +198,6 @@
     	} finally {
     		resolveBuildfile();
     		endReporting();
-    		fTaskToNode= new HashMap();
     	}
 	}
 
@@ -757,13 +757,37 @@
 		return null;
 	}
 
-	/**
-	 * @param resolveFully
-	 */
 	public void setResolveFully(boolean resolveFully) {
 		fValidateFully= resolveFully;
 		resolveBuildfile();
 	}
+
+	public AntElementNode getReferenceNode(String text) {
+		Object reference= getReferenceObject(text);
+		if (reference == null) {
+			return null;
+		}
+		
+		Collection nodes= fTaskToNode.keySet();
+		Iterator iter= nodes.iterator();
+		while (iter.hasNext()) {
+			Object original = iter.next();
+			Object object= original;
+			if (object instanceof UnknownElement) {
+				UnknownElement element= (UnknownElement) object;
+				object= element.getRealThing();
+				if (object == null) {
+					//element.maybeConfigure();
+					//object= element.getRealThing();
+					continue;
+				}
+			} 
+			if (object == reference) {
+				return (AntElementNode)fTaskToNode.get(original);
+			}
+		}
+		return null;
+	}
 	
 	private ClassLoader getClassLoader() {
 		AntCorePreferences corePreferences = AntCorePlugin.getPlugin().getPreferences();
diff --git a/ant/org.eclipse.ant.ui/plugin.xml b/ant/org.eclipse.ant.ui/plugin.xml
index 1a6f746..6dc9682 100644
--- a/ant/org.eclipse.ant.ui/plugin.xml
+++ b/ant/org.eclipse.ant.ui/plugin.xml
@@ -28,6 +28,7 @@
       <import plugin="org.eclipse.ui.console"/>
       <import plugin="org.eclipse.debug.core"/>
       <import plugin="org.eclipse.debug.ui"/>
+      <import plugin="org.eclipse.jdt.ui"/>
       <import plugin="org.eclipse.jdt.debug.ui"/>
       <import plugin="org.eclipse.jdt.launching"/>
       <import plugin="org.eclipse.core.runtime.compatibility"/>