Bug 82031 - Project attributes not able to be code completed
diff --git a/ant/org.eclipse.ant.tests.ui/Ant Editor Tests/org/eclipse/ant/tests/ui/editor/CodeCompletionTest.java b/ant/org.eclipse.ant.tests.ui/Ant Editor Tests/org/eclipse/ant/tests/ui/editor/CodeCompletionTest.java
index 7b35805..6a4065f 100644
--- a/ant/org.eclipse.ant.tests.ui/Ant Editor Tests/org/eclipse/ant/tests/ui/editor/CodeCompletionTest.java
+++ b/ant/org.eclipse.ant.tests.ui/Ant Editor Tests/org/eclipse/ant/tests/ui/editor/CodeCompletionTest.java
@@ -931,4 +931,33 @@
     	assertContains("main", proposals);
     	assertContains("testUnless", proposals);
     }
+    
+    /**
+     * Tests the code completion for project attributes (bug 82031)
+     */
+    public void testProjectAttributeProposals() throws BadLocationException {
+		TestTextCompletionProcessor processor = new TestTextCompletionProcessor(getAntModel("buildtest1.xml"));
+
+		int lineNumber= 1;
+    	int columnNumber= 9;
+    	int lineOffset= getCurrentDocument().getLineOffset(lineNumber);
+    	processor.setLineNumber(lineNumber);
+    	processor.setColumnNumber(columnNumber);
+    	processor.setCursorPosition(lineOffset + columnNumber);
+    	ICompletionProposal[] proposals = processor.getProposalsFromDocument(getCurrentDocument(), "");
+    	//includes all the project attributes
+    	assertTrue(proposals.length == 3);
+    	assertContains("name", proposals);
+    	assertContains("default", proposals);
+    	assertContains("basedir", proposals);
+    	
+    	columnNumber= 10;
+    	lineOffset= getCurrentDocument().getLineOffset(lineNumber);
+    	processor.setLineNumber(lineNumber);
+    	processor.setColumnNumber(columnNumber);
+    	processor.setCursorPosition(lineOffset + columnNumber);
+    	proposals = processor.getProposalsFromDocument(getCurrentDocument(), "n");
+    	assertTrue(proposals.length == 1);
+    	assertContains("name", proposals);
+    }
 }
\ No newline at end of file
diff --git a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditorCompletionProcessor.java b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditorCompletionProcessor.java
index 53bc1a0..c1a68b3 100644
--- a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditorCompletionProcessor.java
+++ b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditorCompletionProcessor.java
@@ -1204,22 +1204,26 @@
     	if (currentProposalMode != -1) {
     		return currentProposalMode;
     	}
-    	if (antModel != null && antModel.getProjectNode() == null) {
-    		return PROPOSAL_MODE_BUILDFILE;
-    	}
     	if (document.getLength() == 0 || (document.getLength() == 1 && document.get().equals("<"))) { //$NON-NLS-1$
     		return PROPOSAL_MODE_BUILDFILE;
     	}
     	
-        // String from beginning of document to the beginning of the prefix
+    	//String from beginning of document to the beginning of the prefix
     	String text= document.get();
         String stringToPrefix = text.substring(0, aCursorPosition - aPrefix.length());
         if (stringToPrefix.length() == 0) {
         	return PROPOSAL_MODE_BUILDFILE;
         }
-        
-        // Is trimmable from behind
+        //Is trimmable from behind
         String trimmedString = stringToPrefix.trim();
+    	if (antModel != null && antModel.getProjectNode() == null) {
+    		currentTaskString= getTaskStringFromDocumentStringToPrefix(trimmedString);
+    		if ("project".equals(currentTaskString)) { //$NON-NLS-1$
+    			return PROPOSAL_MODE_ATTRIBUTE_PROPOSAL;
+    		}
+    		return PROPOSAL_MODE_BUILDFILE;
+    	}
+    	
         char lastChar = 0;
         if(trimmedString.length() > 0) {
 	        lastChar = trimmedString.charAt(trimmedString.length()-1);