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)