Bug 40255 - Ant formatter
diff --git a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditorSourceViewerConfiguration.java b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditorSourceViewerConfiguration.java
index 927d9c2..1ef1fbd 100644
--- a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditorSourceViewerConfiguration.java
+++ b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/AntEditorSourceViewerConfiguration.java
@@ -17,6 +17,7 @@
 
 import org.eclipse.ant.internal.ui.editor.derived.HTMLTextPresenter;
 import org.eclipse.ant.internal.ui.editor.formatter.ContentFormatter3;
+import org.eclipse.ant.internal.ui.editor.formatter.XmlCommentFormattingStrategy;
 import org.eclipse.ant.internal.ui.editor.formatter.XmlDocumentFormattingStrategy;
 import org.eclipse.ant.internal.ui.editor.formatter.XmlElementFormattingStrategy;
 import org.eclipse.ant.internal.ui.editor.text.AntEditorPartitionScanner;
@@ -266,18 +267,36 @@
     /* (non-Javadoc)
      * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getContentFormatter(org.eclipse.jface.text.source.ISourceViewer)
      */
-    public IContentFormatter getContentFormatter(ISourceViewer sourceViewer) {
-        
+	public IContentFormatter getContentFormatter(ISourceViewer sourceViewer) {
+
         ContentFormatter3 formatter = new ContentFormatter3();
         formatter.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
         
-        IFormattingStrategy indentationStrategy = new XmlDocumentFormattingStrategy(sourceViewer);
-        IFormattingStrategy elementFormattingStrategy = new XmlElementFormattingStrategy(sourceViewer);        
-        
+        IFormattingStrategy indentationStrategy = new XmlDocumentFormattingStrategy(sourceViewer);        
         formatter.setFormattingStrategy(indentationStrategy);
-        formatter.setFormattingStrategy(indentationStrategy,IDocument.DEFAULT_CONTENT_TYPE);
-        formatter.setFormattingStrategy(elementFormattingStrategy,AntEditorPartitionScanner.XML_TAG);
-        
+        formatter.setFormattingStrategy(indentationStrategy,
+                IDocument.DEFAULT_CONTENT_TYPE);
+
+        // TODO This approach would make the formatter run much more quickly
+        // if these options aren't used; however this won't really work
+        // since the content formatter is probably configured only once at
+        // the start up of the editor. In order to make this work I'd need to
+        // listen to further changes from the preferences store and reconfigure
+        // the editor appropriately.
+        //        FormattingPreferences fp = new FormattingPreferences();
+        //        if (fp.formatElements()) {
+        IFormattingStrategy elementFormattingStrategy = new XmlElementFormattingStrategy(
+                sourceViewer);
+        formatter.setFormattingStrategy(elementFormattingStrategy,
+                AntEditorPartitionScanner.XML_TAG);
+        //        }
+        //        if(fp.formatComments()){
+        IFormattingStrategy commentFormattingStrategy = new XmlCommentFormattingStrategy(
+                sourceViewer);
+        formatter.setFormattingStrategy(commentFormattingStrategy,
+                AntEditorPartitionScanner.XML_COMMENT);
+        //        }
+
         return formatter;
     }
 }
diff --git a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/formatter/FormattingPreferences.java b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/formatter/FormattingPreferences.java
index 1894d61..3bc01a7 100644
--- a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/formatter/FormattingPreferences.java
+++ b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/formatter/FormattingPreferences.java
@@ -41,4 +41,25 @@
     public boolean useElementWrapping() {
         return fPrefs.getBoolean(AntEditorPreferenceConstants.FORMATTER_WRAP_LONG);
     }
-}
\ No newline at end of file
+    
+    public boolean alignElementCloseChar() {
+        return fPrefs.getBoolean(AntEditorPreferenceConstants.FORMATTER_ALIGN);        
+    }
+
+    public boolean formatComments() {
+        return fPrefs.getBoolean(AntEditorPreferenceConstants.FORMATTER_COMMENTS);
+    }
+    
+    public boolean stripBlankLines() {
+        return fPrefs.getBoolean(AntEditorPreferenceConstants.FORMATTER_DELETE_BLANK_LINES);
+    }
+
+    public boolean formatElements() {
+        return fPrefs.getBoolean(AntEditorPreferenceConstants.FORMATTER_WRAP_LONG);
+    }
+
+	public int getTabWidth() {
+		return fPrefs.getInt(AntEditorPreferenceConstants.FORMATTER_TAB_SIZE);
+	}
+}
+
diff --git a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/formatter/NonParsingXMLFormatter.java b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/formatter/NonParsingXMLFormatter.java
index 562f001..837a3cb 100644
--- a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/formatter/NonParsingXMLFormatter.java
+++ b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/formatter/NonParsingXMLFormatter.java
@@ -307,7 +307,8 @@
                 char c = (char) intChar;
 
                 node.append(c);
-
+                // TODO logic incorrectly assumes that " is quote character
+                // when it could also be '
                 if (c == '"') {
                     insideQuote = !insideQuote;
                 }
diff --git a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/formatter/XmlCommentFormattingStrategy.java b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/formatter/XmlCommentFormattingStrategy.java
new file mode 100644
index 0000000..9e7aa48
--- /dev/null
+++ b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/formatter/XmlCommentFormattingStrategy.java
@@ -0,0 +1,280 @@
+/*******************************************************************************
+ * Copyright (c) 2004 John-Mason P. Shackelford 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:
+ *     John-Mason P. Shackelford - initial API and implementation
+ * 	   IBM Corporation - bug 40255
+ *******************************************************************************/
+
+package org.eclipse.ant.internal.ui.editor.formatter;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy;
+import org.eclipse.jface.text.formatter.FormattingContext;
+import org.eclipse.jface.text.formatter.FormattingContextProperties;
+import org.eclipse.jface.text.formatter.IFormattingContext;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.util.Assert;
+
+public class XmlCommentFormattingStrategy extends ContextBasedFormattingStrategy {
+
+    private static class CommentPartitionDecorator {
+
+        public static CommentPartitionDecorator decorate(IDocument document,
+                Position partition) {
+            return new CommentPartitionDecorator(document, partition);
+        }
+
+        private IDocument document;
+
+        private Position partition;
+
+        public CommentPartitionDecorator(IDocument document, Position partition) {
+        }
+
+        /**
+         * @param p1
+         *            the partition with the low offset
+         * @param p2
+         *            the partition with the high offset
+         * @return true of both partitions are to be formatted as a single unit
+         */
+        private boolean formatTogether(Position p1, Position p2)
+                throws BadLocationException {
+
+            Assert.isTrue(p1.offset < p2.offset);
+            String interveningText = textBetween(p1, p2);
+
+            if (interveningText.trim().length() == 0
+                    && interveningText.indexOf('\n') == -1
+                    && interveningText.indexOf('\r') == -1) {
+                return true;
+            } else {
+                return false;
+            }
+        }
+
+        public boolean formatWith(Position partition)
+                throws BadLocationException {
+
+            Assert.isNotNull(this.document);
+            Assert.isNotNull(this.partition);
+
+            if (this.partition.offset < partition.offset) {
+                return formatTogether(this.partition, partition);
+            } else if (this.partition.offset > partition.offset) {
+                return formatTogether(partition, this.partition);
+            } else {
+                // I wouldn't expect both partitions to
+                // start at the same spot.
+                return false;
+            }
+        }
+
+        /**
+         * @return {@link Position#getLength()}
+         */
+        public int getLength() {
+            return partition.getLength();
+        }
+
+        /**
+         * @return {@link Position#getOffset()}
+         */
+        public int getOffset() {
+            return partition.getOffset();
+        }
+
+        public String getText() throws BadLocationException {
+            return textOf(this.partition);
+        }
+
+        /**
+         * @param string
+         */
+        public void replaceWith(String text) throws BadLocationException {
+
+            if (text != null && !text.equals(this.getText()))
+                    document.replace(this.getOffset(), this.getLength(), text);
+
+        }
+
+        /**
+         * @param p1
+         *            the partition with the low offset
+         * @param p2
+         *            the partition with the high offset
+         * @return text between the end of the first positions and start of the
+         *         second
+         */
+        private String textBetween(Position p1, Position p2)
+                throws BadLocationException {
+            return document.get(p1.offset + p1.length, p2.offset
+                    - (p1.offset + p1.length));
+        }
+
+        private String textOf(Position partition) throws BadLocationException {
+            return this.document.get(partition.offset, partition.length);
+        }
+    }
+
+    private abstract static class Normalizer {
+
+        abstract protected boolean isApplicableFor(String commentText);
+
+        abstract protected String normalize(String commentText);
+
+        public String safelyNormalize(String commentText) {
+            if (isApplicableFor(commentText))
+                return normalize(commentText);
+            else
+                return commentText;
+        }
+    }
+
+    private static class SeparartorCommentNormalizer extends Normalizer {
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see org.eclipse.ant.internal.ui.editor.format.XmlCommentFormattingStrategy.Normalizer#isApplicableFor(java.lang.String)
+         */
+        protected boolean isApplicableFor(String commentText) {
+            // TODO Auto-generated method stub
+            return false;
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see org.eclipse.ant.internal.ui.editor.format.XmlCommentFormattingStrategy.Normalizer#normalize(java.lang.String)
+         */
+        protected String normalize(String commentText) {
+            // TODO Auto-generated method stub
+            return null;
+        }
+    }
+
+    private class TextCommentNormalizer extends Normalizer {
+
+        private String actualText(String comment) {
+            return comment.substring(4, comment.length() - 3).trim();
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see org.eclipse.ant.internal.ui.editor.format.XmlCommentFormattingStrategy.Normalizer#isApplicableFor(java.lang.String)
+         */
+        protected boolean isApplicableFor(String commentText) {
+
+            return Character.isLetterOrDigit(actualText(commentText).charAt(0))
+                    && commentText.indexOf('\n') == -1
+                    && commentText.indexOf('\r') == -1;
+        }
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see org.eclipse.ant.internal.ui.editor.format.XmlCommentFormattingStrategy.Normalizer#normalize(java.lang.String)
+         */
+        protected String normalize(String comment) {
+
+            String text = comment.substring(4, comment.length() - 3).trim();
+            
+            // TODO assumes text length < fCommentWidth which isn't necessarily the case
+            char[] whitespace = new char[fCommentWidth - (text.length() + 7)];
+            Arrays.fill(whitespace,' ');
+
+            return "<!-- " + actualText(comment) + String.valueOf(whitespace)
+                    + "-->";
+        }
+    }
+
+	private final int fCommentWidth = 40; 
+
+    /** Indentations to use by this strategy */
+    private final LinkedList fIndentations;
+
+    /** Normalizers for handling partition formatting */
+    private final Normalizer[] fNormalizers;
+
+    /** Partitions to be formatted by this strategy */
+    private final LinkedList fPartitions;
+
+    /**
+     * @param viewer
+     */
+    public XmlCommentFormattingStrategy(ISourceViewer viewer) {
+        super(viewer);
+        fIndentations = new LinkedList();
+        fPartitions = new LinkedList();
+        fNormalizers = new Normalizer[] {};
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.eclipse.jface.text.formatter.IFormattingStrategyExtension#format()
+     */
+    public void format() {
+        super.format();
+        Assert.isLegal(fPartitions.size() > 0);
+        Assert.isLegal(fIndentations.size() > 0);
+
+        final String indent = fIndentations.removeFirst().toString();
+        final CommentPartitionDecorator partition = (CommentPartitionDecorator) fPartitions
+                .removeFirst();
+
+        // normalize length
+        // normalize char pattern
+        // format text
+        // normalize
+
+        try {
+
+            for (int i = 0; i < fNormalizers.length; i++) {
+                partition.replaceWith(fNormalizers[i].safelyNormalize(partition
+                        .getText()));
+            }
+
+        } catch (BadLocationException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+    }
+
+    /*
+     * @see org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy#formatterStarts(org.eclipse.jface.text.formatter.IFormattingContext)
+     */
+    public void formatterStarts(IFormattingContext context) {
+        super.formatterStarts(context);
+
+        final FormattingContext current = (FormattingContext) context;
+        fIndentations.addLast(current
+                .getProperty(FormattingContextProperties.CONTEXT_INDENTATION));
+
+        fPartitions.addLast(CommentPartitionDecorator.decorate(this.getViewer()
+                .getDocument(), (Position) current
+                .getProperty(FormattingContextProperties.CONTEXT_PARTITION)));
+    }
+
+    /*
+     * @see org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy#formatterStops()
+     */
+    public void formatterStops() {
+        super.formatterStops();
+        fIndentations.clear();
+        fPartitions.clear();
+    }
+}
diff --git a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/formatter/XmlElementFormattingStrategy.java b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/formatter/XmlElementFormattingStrategy.java
index 446360b..6d366a3 100644
--- a/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/formatter/XmlElementFormattingStrategy.java
+++ b/ant/org.eclipse.ant.ui/Ant Editor/org/eclipse/ant/internal/ui/editor/formatter/XmlElementFormattingStrategy.java
@@ -12,6 +12,7 @@
 
 package org.eclipse.ant.internal.ui.editor.formatter;
 
+import java.text.StringCharacterIterator;
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
@@ -38,6 +39,9 @@
     /** The position sets to keep track of during formatting */
     private final LinkedList fPositions = new LinkedList();
 
+    /** access to the preferences store **/
+    private final FormattingPreferences prefs = new FormattingPreferences();
+    
     public XmlElementFormattingStrategy(ISourceViewer viewer) {
         super(viewer);
     }
@@ -57,7 +61,7 @@
         IDocument document = getViewer().getDocument();
 
         try {
-            FormattingPreferences prefs = new FormattingPreferences();
+
             String formatted = formatElement(document, partition, lineIndent, prefs);
 
             String partitionText = document.get(partition.getOffset(), partition.getLength());
@@ -77,6 +81,18 @@
         StringBuffer formattedElement = null;
 
         // do we even need to think about wrapping?
+        
+		// TODO fix this. If wrapping is all that this strategy does, this is a
+		// very inefficient mechanism for avoiding the element format since this
+        // format method will be called for every tag partition in the document.
+        // What is really needed is for the editor itself to listen for changes 
+        // to the preferences and reconfigure the editor's formatter to ommit 
+        // this strategy.
+        
+        // TODO Always parse and create a model for the element since we may 
+        // want to undo the formatting of a previously formatted element when
+        // the prefences change
+
         if (prefs.useElementWrapping() && !partitionText.startsWith("</")) { //$NON-NLS-1$
 
             IRegion line = document.getLineInformationOfOffset(partition.getOffset());
@@ -84,7 +100,11 @@
             int partitionLineOffset = partition.getOffset() - line.getOffset();
 
             // do we have a good candidate for a wrap?
-            if (line.getLength() > prefs.getMaximumLineWidth()) {
+            // chars need to be expanded using the preferences value           
+            int tabCount = count('\t', document.get(line.getOffset(), line.getLength()));
+                        
+            if ((line.getLength() - tabCount) + (tabCount * prefs.getTabWidth())  
+            		> prefs.getMaximumLineWidth()) {
 
                 List attributes = getAttributes(partitionText);
                 if (attributes.size() > 1) {
@@ -93,23 +113,27 @@
                     formattedElement.append(startTag);
                     formattedElement.append(' ');
                     formattedElement.append(attributes.get(0));
-                    formattedElement.append("\n"); //$NON-NLS-1$
                     
                     for (int i = 1; i < attributes.size(); i++) {
+                    	formattedElement.append("\n"); //$NON-NLS-1$
                         formattedElement.append(indentation);
                         for (int j = 0; j < (partitionLineOffset - indentation
                                 .length())
                                 + startTag.length() + 1; j++) {
                             formattedElement.append(' ');
                         }
-                        formattedElement.append(attributes.get(i));
-                        formattedElement.append("\n"); //$NON-NLS-1$
+                        formattedElement.append(attributes.get(i));                        
                     }
-                    formattedElement.append(indentation);
-                    for (int j = 0; j < (partitionLineOffset - indentation
-                            .length()) + 1; j++) {
-                        formattedElement.append(' ');
-                    }
+                    
+					if (prefs.alignElementCloseChar()) {
+						formattedElement.append("\n"); //$NON-NLS-1$
+						formattedElement.append(indentation);
+						for (int j = 0; j < (partitionLineOffset - indentation
+								.length()) + 1; j++) {
+							formattedElement.append(' ');
+						}			
+					}
+					
                     if (partitionText.endsWith("/>")) { //$NON-NLS-1$
                         formattedElement.append("/>"); //$NON-NLS-1$
                     } else if (partitionText.endsWith(">")) { //$NON-NLS-1$
@@ -128,12 +152,17 @@
         List attributes = new ArrayList();
 
         int start = firstWhitespaceIn(text);
+        if (start == -1) {
+        	return attributes;
+        }
         boolean insideQuotes = false;
 
         boolean haveEquals = false;
         int quotes = 0;
         StringBuffer attributePair = new StringBuffer();
 
+        // TODO logic for inside quotes incorrectly assumes that the quote
+        // character will be " when it could also be '.
         for (int i = start; i < text.length(); i++) {
             char c = text.charAt(i);
             switch (c) {
@@ -209,4 +238,17 @@
         fPartitions.clear();
         fPositions.clear();
     }
+
+	private int count(char searchChar, String inTargetString) {
+		StringCharacterIterator iter = new StringCharacterIterator(
+				inTargetString);
+		int i = 0;
+		if(iter.first() == searchChar) i++;
+		while (iter.getIndex() < iter.getEndIndex()) {			
+			if (iter.next() == searchChar) {
+				i++;
+			}
+		}
+		return i;
+	}
 }
diff --git a/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/AntCodeFormatterPreferencePage.java b/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/AntCodeFormatterPreferencePage.java
index 049237c..a143315 100644
--- a/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/AntCodeFormatterPreferencePage.java
+++ b/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/AntCodeFormatterPreferencePage.java
@@ -81,6 +81,7 @@
 	
 	private OverlayPreferenceStore createOverlayStore() {
 		List overlayKeys= new ArrayList();
+		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AntEditorPreferenceConstants.FORMATTER_WRAP_LONG));
 		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AntEditorPreferenceConstants.FORMATTER_ALIGN));
 		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AntEditorPreferenceConstants.FORMATTER_COMMENTS));
 		overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, AntEditorPreferenceConstants.FORMATTER_DELETE_BLANK_LINES));
@@ -140,15 +141,14 @@
 		labelText= AntPreferencesMessages.getString("AntCodeFormatterPreferencePage.4"); //$NON-NLS-1$
 		addCheckBox(indentationGroup, labelText, AntEditorPreferenceConstants.FORMATTER_TAB_CHAR, 1);
 		
-		labelText= AntPreferencesMessages.getString("AntCodeFormatterPreferencePage.5"); //$NON-NLS-1$
-		addCheckBox(indentationGroup, labelText, AntEditorPreferenceConstants.FORMATTER_ALIGN, 1);
-		
 		Group wrappingGroup= createGroup(numColumns, result, AntPreferencesMessages.getString("AntCodeFormatterPreferencePage.6")); //$NON-NLS-1$
 		labelText= AntPreferencesMessages.getString("AntCodeFormatterPreferencePage.7"); //$NON-NLS-1$
 		errorMessages= new String[]{AntPreferencesMessages.getString("AntCodeFormatterPreferencePage.8"), AntPreferencesMessages.getString("AntCodeFormatterPreferencePage.9")}; //$NON-NLS-1$ //$NON-NLS-2$
 		addTextField(wrappingGroup, labelText, AntEditorPreferenceConstants.FORMATTER_MAX_LINE_LENGTH, 3, 0, errorMessages);
 		labelText= AntPreferencesMessages.getString("AntCodeFormatterPreferencePage.10"); //$NON-NLS-1$
 		addCheckBox(wrappingGroup, labelText, AntEditorPreferenceConstants.FORMATTER_WRAP_LONG, 1);
+		labelText= AntPreferencesMessages.getString("AntCodeFormatterPreferencePage.5"); //$NON-NLS-1$
+		addCheckBox(wrappingGroup, labelText, AntEditorPreferenceConstants.FORMATTER_ALIGN, 1);
 		
 		Group whiteSpaceGroup= createGroup(numColumns, result, AntPreferencesMessages.getString("AntCodeFormatterPreferencePage.11")); //$NON-NLS-1$
 		labelText= AntPreferencesMessages.getString("AntCodeFormatterPreferencePage.12"); //$NON-NLS-1$
@@ -230,9 +230,6 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
 	 */
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
-	 */
 	protected void performDefaults() {
 		
 		fOverlayStore.loadDefaults();
diff --git a/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/AntPreferencesMessages.properties b/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/AntPreferencesMessages.properties
index 2eaa05e..839cabc 100644
--- a/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/AntPreferencesMessages.properties
+++ b/ant/org.eclipse.ant.ui/Ant Tools Support/org/eclipse/ant/internal/ui/preferences/AntPreferencesMessages.properties
@@ -151,7 +151,7 @@
 AntCodeFormatterPreferencePage.1=Tab si&ze:
 AntCodeFormatterPreferencePage.2=No tab size specified
 AntCodeFormatterPreferencePage.3=Invalid tab size specified
-AntCodeFormatterPreferencePage.4=U&se tab charater
+AntCodeFormatterPreferencePage.4=U&se tab charater instead of spaces
 AntCodeFormatterPreferencePage.5=Ali&gn final '>' in multi-line element tags
 AntCodeFormatterPreferencePage.6=Line Wrapping
 AntCodeFormatterPreferencePage.7=Ma&ximum line width:
@@ -159,6 +159,6 @@
 AntCodeFormatterPreferencePage.9=Invalid maximum line width specified
 AntCodeFormatterPreferencePage.10=&Wrap long element tags
 AntCodeFormatterPreferencePage.11=White Space
-AntCodeFormatterPreferencePage.12=Delete &blank lines
+AntCodeFormatterPreferencePage.12=Delete &blank lines (work in progress)
 AntCodeFormatterPreferencePage.13=Comments
-AntCodeFormatterPreferencePage.14=&Format comments
+AntCodeFormatterPreferencePage.14=&Format comments (work in progress)