Adds parser for TextAlignConstant, which accepts both "friendly" names
and the UGLY_ONES used in code. Horiz and Vert constant parsers
retrofitted with the same friendliness.

Patch by konstantin.scheglov@gmail.com
Review by rjrjr@google.com

http://gwt-code-reviews.appspot.com/612803

Review by: jgw@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@8347 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/uibinder/attributeparsers/AttributeParsers.java b/user/src/com/google/gwt/uibinder/attributeparsers/AttributeParsers.java
index 5b0c9c3..fceb458 100644
--- a/user/src/com/google/gwt/uibinder/attributeparsers/AttributeParsers.java
+++ b/user/src/com/google/gwt/uibinder/attributeparsers/AttributeParsers.java
@@ -19,8 +19,12 @@
 import com.google.gwt.core.ext.typeinfo.JType;
 import com.google.gwt.core.ext.typeinfo.TypeOracle;
 import com.google.gwt.core.ext.typeinfo.TypeOracleException;
+import com.google.gwt.dom.client.Style.Unit;
 import com.google.gwt.uibinder.rebind.FieldManager;
 import com.google.gwt.uibinder.rebind.MortalLogger;
+import com.google.gwt.user.client.ui.HasHorizontalAlignment.HorizontalAlignmentConstant;
+import com.google.gwt.user.client.ui.HasVerticalAlignment.VerticalAlignmentConstant;
+import com.google.gwt.user.client.ui.TextBoxBase.TextAlignConstant;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -29,15 +33,14 @@
  * Managers access to all implementations of {@link AttributeParser}.
  */
 public class AttributeParsers {
-  private static final String VERT_CONSTANT = "com.google.gwt.user.client.ui.HasVerticalAlignment."
-      + "VerticalAlignmentConstant";
-  private static final String HORIZ_CONSTANT = "com.google.gwt.user.client.ui.HasHorizontalAlignment."
-      + "HorizontalAlignmentConstant";
+  private static final String HORIZ_CONSTANT = HorizontalAlignmentConstant.class.getCanonicalName();
+  private static final String VERT_CONSTANT = VerticalAlignmentConstant.class.getCanonicalName();
+  private static final String TEXT_ALIGN_CONSTANT = TextAlignConstant.class.getCanonicalName();
   private static final String INT = "int";
   private static final String STRING = String.class.getCanonicalName();
   private static final String DOUBLE = "double";
   private static final String BOOLEAN = "boolean";
-  private static final String UNIT = "com.google.gwt.dom.client.Style.Unit";
+  private static final String UNIT = Unit.class.getCanonicalName();
 
   private final MortalLogger logger;
   private final FieldReferenceConverter converter;
@@ -58,26 +61,29 @@
           types.parse(BOOLEAN), logger);
       addAttributeParser(BOOLEAN, boolParser);
       addAttributeParser(Boolean.class.getCanonicalName(), boolParser);
-      
+
       IntAttributeParser intParser = new IntAttributeParser(converter,
           types.parse(INT), logger);
       addAttributeParser(INT, intParser);
       addAttributeParser(Integer.class.getCanonicalName(), intParser);
-      
+
       DoubleAttributeParser doubleParser = new DoubleAttributeParser(converter,
           types.parse(DOUBLE), logger);
       addAttributeParser(DOUBLE, doubleParser);
       addAttributeParser(Double.class.getCanonicalName(), doubleParser);
-      
-      addAttributeParser("int,int", new IntPairAttributeParser(intParser, logger));
-      
+
+      addAttributeParser("int,int", new IntPairAttributeParser(intParser,
+          logger));
+
       addAttributeParser(HORIZ_CONSTANT, new HorizontalAlignmentConstantParser(
           converter, types.parse(HORIZ_CONSTANT), logger));
       addAttributeParser(VERT_CONSTANT, new VerticalAlignmentConstantParser(
           converter, types.parse(VERT_CONSTANT), logger));
-      
-      addAttributeParser(STRING, new StringAttributeParser(converter,
-          types.parse(STRING)));
+      addAttributeParser(TEXT_ALIGN_CONSTANT, new TextAlignConstantParser(
+          converter, types.parse(TEXT_ALIGN_CONSTANT), logger));
+
+      addAttributeParser(STRING,
+          new StringAttributeParser(converter, types.parse(STRING)));
 
       EnumAttributeParser unitParser = new EnumAttributeParser(converter,
           (JEnumType) types.parse(UNIT), logger);
diff --git a/user/src/com/google/gwt/uibinder/attributeparsers/HorizontalAlignmentConstantParser.java b/user/src/com/google/gwt/uibinder/attributeparsers/HorizontalAlignmentConstantParser.java
index dfa8a80..82b7056 100644
--- a/user/src/com/google/gwt/uibinder/attributeparsers/HorizontalAlignmentConstantParser.java
+++ b/user/src/com/google/gwt/uibinder/attributeparsers/HorizontalAlignmentConstantParser.java
@@ -18,6 +18,7 @@
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JType;
 import com.google.gwt.uibinder.rebind.MortalLogger;
+import com.google.gwt.user.client.ui.HasHorizontalAlignment;
 
 import java.util.HashMap;
 
@@ -28,15 +29,17 @@
  */
 class HorizontalAlignmentConstantParser extends StrictAttributeParser {
 
+  private static final String PREFIX = HasHorizontalAlignment.class.getCanonicalName()
+      + ".ALIGN_";
   private static final HashMap<String, String> values = new HashMap<String, String>();
 
   static {
-    values.put("ALIGN_LEFT",
-        "com.google.gwt.user.client.ui.HasHorizontalAlignment.ALIGN_LEFT");
-    values.put("ALIGN_RIGHT",
-        "com.google.gwt.user.client.ui.HasHorizontalAlignment.ALIGN_RIGHT");
-    values.put("ALIGN_CENTER",
-        "com.google.gwt.user.client.ui.HasHorizontalAlignment.ALIGN_CENTER");
+    values.put("LEFT", PREFIX + "LEFT");
+    values.put("CENTER", PREFIX + "CENTER");
+    values.put("RIGHT", PREFIX + "RIGHT");
+    values.put("ALIGN_LEFT", PREFIX + "LEFT");
+    values.put("ALIGN_CENTER", PREFIX + "CENTER");
+    values.put("ALIGN_RIGHT", PREFIX + "RIGHT");
   }
 
   HorizontalAlignmentConstantParser(FieldReferenceConverter converter,
@@ -44,8 +47,9 @@
     super(converter, type, logger);
   }
 
+  @Override
   public String parse(String value) throws UnableToCompleteException {
-    String translated = values.get(value);
+    String translated = values.get(value.toUpperCase());
     if (translated != null) {
       return translated;
     }
diff --git a/user/src/com/google/gwt/uibinder/attributeparsers/LengthAttributeParser.java b/user/src/com/google/gwt/uibinder/attributeparsers/LengthAttributeParser.java
index 21743df..2e788dd 100644
--- a/user/src/com/google/gwt/uibinder/attributeparsers/LengthAttributeParser.java
+++ b/user/src/com/google/gwt/uibinder/attributeparsers/LengthAttributeParser.java
@@ -16,6 +16,7 @@
 package com.google.gwt.uibinder.attributeparsers;
 
 import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.dom.client.Style.Unit;
 import com.google.gwt.uibinder.rebind.MortalLogger;
 
 import java.util.regex.Matcher;
@@ -27,13 +28,12 @@
  */
 public class LengthAttributeParser implements AttributeParser {
 
-  static final String UNIT = "com.google.gwt.dom.client.Style.Unit";
+  static final String UNIT = Unit.class.getCanonicalName();
 
   // This regular expression matches CSS length patterns of the form
   // (value)(unit), where the two may be separated by whitespace. Either part
   // can be a {class.method} expression.
-  private static final Pattern pattern = Pattern.compile(
-      "((?:\\{[\\w\\.]+\\})|[\\d\\.]+)\\s*(\\{?[\\w\\.\\%]*\\}?)?");
+  private static final Pattern pattern = Pattern.compile("((?:\\{[\\w\\.]+\\})|[\\d\\.]+)\\s*(\\{?[\\w\\.\\%]*\\}?)?");
 
   private final MortalLogger logger;
   private final DoubleAttributeParser doubleParser;
diff --git a/user/src/com/google/gwt/uibinder/attributeparsers/TextAlignConstantParser.java b/user/src/com/google/gwt/uibinder/attributeparsers/TextAlignConstantParser.java
new file mode 100644
index 0000000..735ef74
--- /dev/null
+++ b/user/src/com/google/gwt/uibinder/attributeparsers/TextAlignConstantParser.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2007 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.uibinder.attributeparsers;
+
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.typeinfo.JType;
+import com.google.gwt.uibinder.rebind.MortalLogger;
+import com.google.gwt.user.client.ui.TextBoxBase;
+
+import java.util.HashMap;
+
+/**
+ * Parses a {@link com.google.gwt.user.client.ui.TextBoxBase.TextAlignConstant}.
+ */
+class TextAlignConstantParser extends StrictAttributeParser {
+
+  private static final String PREFIX = TextBoxBase.class.getCanonicalName()
+      + ".ALIGN_";
+  private static final HashMap<String, String> values = new HashMap<String, String>();
+
+  static {
+    values.put("LEFT", PREFIX + "LEFT");
+    values.put("CENTER", PREFIX + "CENTER");
+    values.put("RIGHT", PREFIX + "RIGHT");
+    values.put("JUSTIFY", PREFIX + "JUSTIFY");
+    values.put("ALIGN_LEFT", PREFIX + "LEFT");
+    values.put("ALIGN_CENTER", PREFIX + "CENTER");
+    values.put("ALIGN_RIGHT", PREFIX + "RIGHT");
+    values.put("ALIGN_JUSTIFY", PREFIX + "JUSTIFY");
+  }
+
+  TextAlignConstantParser(FieldReferenceConverter converter, JType type,
+      MortalLogger logger) {
+    super(converter, type, logger);
+  }
+
+  @Override
+  public String parse(String value) throws UnableToCompleteException {
+    String translated = values.get(value.toUpperCase());
+    if (translated != null) {
+      return translated;
+    }
+    return super.parse(value);
+  }
+}
diff --git a/user/src/com/google/gwt/uibinder/attributeparsers/VerticalAlignmentConstantParser.java b/user/src/com/google/gwt/uibinder/attributeparsers/VerticalAlignmentConstantParser.java
index 1beb2a6..66c3a21 100644
--- a/user/src/com/google/gwt/uibinder/attributeparsers/VerticalAlignmentConstantParser.java
+++ b/user/src/com/google/gwt/uibinder/attributeparsers/VerticalAlignmentConstantParser.java
@@ -18,6 +18,7 @@
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JType;
 import com.google.gwt.uibinder.rebind.MortalLogger;
+import com.google.gwt.user.client.ui.HasVerticalAlignment;
 
 import java.util.HashMap;
 
@@ -28,15 +29,17 @@
  */
 class VerticalAlignmentConstantParser extends StrictAttributeParser {
 
+  private static final String PREFIX = HasVerticalAlignment.class.getCanonicalName()
+      + ".ALIGN_";
   private static final HashMap<String, String> values = new HashMap<String, String>();
 
   static {
-    values.put("ALIGN_TOP",
-        "com.google.gwt.user.client.ui.HasVerticalAlignment.ALIGN_TOP");
-    values.put("ALIGN_MIDDLE",
-        "com.google.gwt.user.client.ui.HasVerticalAlignment.ALIGN_MIDDLE");
-    values.put("ALIGN_BOTTOM",
-        "com.google.gwt.user.client.ui.HasVerticalAlignment.ALIGN_BOTTOM");
+    values.put("TOP", PREFIX + "TOP");
+    values.put("MIDDLE", PREFIX + "MIDDLE");
+    values.put("BOTTOM", PREFIX + "BOTTOM");
+    values.put("ALIGN_TOP", PREFIX + "TOP");
+    values.put("ALIGN_MIDDLE", PREFIX + "MIDDLE");
+    values.put("ALIGN_BOTTOM", PREFIX + "BOTTOM");
   }
 
   VerticalAlignmentConstantParser(FieldReferenceConverter converter,
@@ -44,8 +47,9 @@
     super(converter, type, logger);
   }
 
+  @Override
   public String parse(String value) throws UnableToCompleteException {
-    String translated = values.get(value);
+    String translated = values.get(value.toUpperCase());
     if (translated != null) {
       return translated;
     }
diff --git a/user/src/com/google/gwt/user/client/ui/HasHorizontalAlignment.java b/user/src/com/google/gwt/user/client/ui/HasHorizontalAlignment.java
index 04f3ba4..f0f54b3 100644
--- a/user/src/com/google/gwt/user/client/ui/HasHorizontalAlignment.java
+++ b/user/src/com/google/gwt/user/client/ui/HasHorizontalAlignment.java
@@ -25,13 +25,18 @@
  * <h3>Use in UiBinder Templates</h3>
  * 
  * <p>
- * The names of the static members of {@link HorizontalAlignmentConstant}
- * can be used as values for a <code>horizontalAlignment</code> attribute
- * of any widget that implements this interface. (In fact, this will work 
- * for any widget method that takes a single  HorizontalAlignmentConstant value.)
+ * The names of the static members of {@link HorizontalAlignmentConstant}, as
+ * well as simple alignment names (<code>left</code>, <code>center</code>,
+ * <code>right</code>), can be used as values for a
+ * <code>horizontalAlignment</code> attribute of any widget that implements this
+ * interface. (In fact, this will work for any widget method that takes a single
+ * HorizontalAlignmentConstant value.)
  * <p>
- * For example,<pre>
+ * For example,
+ * 
+ * <pre>
  * &lt;g:Label horizontalAlignment='ALIGN_RIGHT'>Hi there.&lt;/g:Label>
+ * &lt;g:Label horizontalAlignment='right'>Hi there.&lt;/g:Label>
  * </pre>
  */
 public interface HasHorizontalAlignment {
@@ -40,7 +45,7 @@
    * Horizontal alignment constant.
    */
   public static class HorizontalAlignmentConstant {
-    private String textAlignString;
+    private final String textAlignString;
 
     private HorizontalAlignmentConstant(String textAlignString) {
       this.textAlignString = textAlignString;
@@ -75,14 +80,13 @@
       "right");
 
   /**
-   * In a RTL layout, specifies that the widget's contents should be aligned
-   * to the right. In a LTR layout, specifies that the widget's constants 
-   * should be aligned to the left.
+   * In a RTL layout, specifies that the widget's contents should be aligned to
+   * the right. In a LTR layout, specifies that the widget's constants should be
+   * aligned to the left.
    */
-  HorizontalAlignmentConstant ALIGN_DEFAULT = 
-      (GWT.isClient() && (LocaleInfo.getCurrentLocale().isRTL()))
-        ? ALIGN_RIGHT : ALIGN_LEFT;
-      
+  HorizontalAlignmentConstant ALIGN_DEFAULT = GWT.isClient()
+      && LocaleInfo.getCurrentLocale().isRTL() ? ALIGN_RIGHT : ALIGN_LEFT;
+
   /**
    * Gets the horizontal alignment.
    * 
diff --git a/user/src/com/google/gwt/user/client/ui/HasVerticalAlignment.java b/user/src/com/google/gwt/user/client/ui/HasVerticalAlignment.java
index 430c393..5bc1545 100644
--- a/user/src/com/google/gwt/user/client/ui/HasVerticalAlignment.java
+++ b/user/src/com/google/gwt/user/client/ui/HasVerticalAlignment.java
@@ -22,15 +22,18 @@
  * <h3>Use in UiBinder Templates</h3>
  * 
  * <p>
- * The names of the static members of {@link VerticalAlignmentConstant} can
- * be used as values for a <code>verticalAlignment</code> attribute of any
- * widget that implements this interface. (In fact, this will work for any
- * widget method that takes a single VerticalAlignmentConstant value.)
+ * The names of the static members of {@link VerticalAlignmentConstant}, as well
+ * as simple alignment names (<code>top</code>, <code>middle</code>,
+ * <code>bottom</code>), can be used as values for a
+ * <code>verticalAlignment</code> attribute of any widget that implements this
+ * interface. (In fact, this will work for any widget method that takes a single
+ * VerticalAlignmentConstant value.)
  * <p>
  * For example,
  * 
  * <pre>
  * &lt;g:VerticalPanel verticalAlignment='ALIGN_BOTTOM' />
+ * &lt;g:VerticalPanel verticalAlignment='bottom' />
  * </pre>
  */
 public interface HasVerticalAlignment {
@@ -39,7 +42,7 @@
    * Horizontal alignment constant.
    */
   public static class VerticalAlignmentConstant {
-    private String verticalAlignString;
+    private final String verticalAlignString;
 
     private VerticalAlignmentConstant(String verticalAlignString) {
       this.verticalAlignString = verticalAlignString;
@@ -59,19 +62,18 @@
    * Specifies that the widget's contents should be aligned to the bottom.
    */
   VerticalAlignmentConstant ALIGN_BOTTOM = new VerticalAlignmentConstant(
-    "bottom");
+      "bottom");
 
   /**
    * Specifies that the widget's contents should be aligned in the middle.
    */
   VerticalAlignmentConstant ALIGN_MIDDLE = new VerticalAlignmentConstant(
-    "middle");
+      "middle");
 
   /**
    * Specifies that the widget's contents should be aligned to the top.
    */
-  VerticalAlignmentConstant ALIGN_TOP = new VerticalAlignmentConstant(
-    "top");
+  VerticalAlignmentConstant ALIGN_TOP = new VerticalAlignmentConstant("top");
 
   /**
    * Gets the vertical alignment.
diff --git a/user/src/com/google/gwt/user/client/ui/ValueBoxBase.java b/user/src/com/google/gwt/user/client/ui/ValueBoxBase.java
index a3445fd..413601c 100644
--- a/user/src/com/google/gwt/user/client/ui/ValueBoxBase.java
+++ b/user/src/com/google/gwt/user/client/ui/ValueBoxBase.java
@@ -45,6 +45,21 @@
  * <p>
  * Abstract base class for all text entry widgets.
  * 
+ * <h3>Use in UiBinder Templates</h3>
+ * 
+ * <p>
+ * The names of the static members of {@link TextBoxBase}, as well as simple
+ * alignment names (<code>left</code>, <code>center</code>, <code>right</code>,
+ * <code>justify</code>), can be used as values for a <code>textAlignment</code>
+ * attribute.
+ * <p>
+ * For example,
+ * 
+ * <pre>
+ * &lt;g:TextBox textAlignment='ALIGN_RIGHT'/&gt;
+ * &lt;g:TextBox textAlignment='right'/&gt;
+ * </pre>
+ * 
  * @param <T> the value type
  */
 @SuppressWarnings("deprecation")
@@ -54,7 +69,7 @@
 
   private static TextBoxImpl impl = GWT.create(TextBoxImpl.class);
 
-  private AutoDirectionHandler autoDirHandler;
+  private final AutoDirectionHandler autoDirHandler;
 
   private final Parser<T> parser;
   private final Renderer<T> renderer;
@@ -125,14 +140,14 @@
   public Direction getDirection() {
     return BidiUtils.getDirectionOnElement(getElement());
   }
-  
+
   /**
    * Gets the direction estimation model of the auto-dir handler.
    */
   public DirectionEstimator getDirectionEstimator() {
     return autoDirHandler.getDirectionEstimator();
   }
-  
+
   public String getName() {
     return DOM.getElementProperty(getElement(), "name");
   }
@@ -182,7 +197,7 @@
    */
   public T getValueOrThrow() throws ParseException {
     String text = getText().trim();
-    
+
     if ("".equals(text)) {
       return null;
     }
@@ -254,21 +269,21 @@
   public void setDirection(Direction direction) {
     BidiUtils.setDirectionOnElement(getElement(), direction);
   }
-  
+
   /**
    * Toggles on / off direction estimation.
    */
   public void setDirectionEstimator(boolean enabled) {
     autoDirHandler.setDirectionEstimator(enabled);
   }
-  
+
   /**
    * Sets the direction estimation model of the auto-dir handler.
    */
   public void setDirectionEstimator(DirectionEstimator directionEstimator) {
     autoDirHandler.setDirectionEstimator(directionEstimator);
   }
-  
+
   /**
    * If a keyboard event is currently being handled by the text box, this method
    * replaces the unicode character or key code associated with it. This allows
@@ -324,7 +339,7 @@
       throw new IndexOutOfBoundsException(
           "Length must be a positive integer. Length: " + length);
     }
-    if ((pos < 0) || (length + pos > getText().length())) {
+    if (pos < 0 || length + pos > getText().length()) {
       throw new IndexOutOfBoundsException("From Index: " + pos + "  To Index: "
           + (pos + length) + "  Text Length: " + getText().length());
     }
@@ -371,7 +386,7 @@
   protected TextBoxImpl getImpl() {
     return impl;
   }
-  
+
   @Override
   protected void onLoad() {
     super.onLoad();
diff --git a/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java b/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java
index 9058362..38e8cfd 100644
--- a/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java
+++ b/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java
@@ -17,13 +17,14 @@
 
 import com.google.gwt.uibinder.attributeparsers.CssNameConverterTest;
 import com.google.gwt.uibinder.attributeparsers.FieldReferenceConverterTest;
-import com.google.gwt.uibinder.attributeparsers.HorizontalAlignmentConstantParser_Test;
+import com.google.gwt.uibinder.attributeparsers.HorizontalAlignmentConstantParserTest;
 import com.google.gwt.uibinder.attributeparsers.IntAttributeParserTest;
 import com.google.gwt.uibinder.attributeparsers.IntPairAttributeParserTest;
 import com.google.gwt.uibinder.attributeparsers.LengthAttributeParserTest;
 import com.google.gwt.uibinder.attributeparsers.StrictAttributeParserTest;
 import com.google.gwt.uibinder.attributeparsers.StringAttributeParserTest;
-import com.google.gwt.uibinder.attributeparsers.VerticalAlignmentConstantParser_Test;
+import com.google.gwt.uibinder.attributeparsers.TextAlignConstantParserTest;
+import com.google.gwt.uibinder.attributeparsers.VerticalAlignmentConstantParserTest;
 import com.google.gwt.uibinder.elementparsers.DialogBoxParserTest;
 import com.google.gwt.uibinder.elementparsers.DockLayoutPanelParserTest;
 import com.google.gwt.uibinder.elementparsers.ImageParserTest;
@@ -72,8 +73,9 @@
     suite.addTestSuite(StrictAttributeParserTest.class);
     suite.addTestSuite(StringAttributeParserTest.class);
     suite.addTestSuite(LengthAttributeParserTest.class);
-    suite.addTestSuite(HorizontalAlignmentConstantParser_Test.class);
-    suite.addTestSuite(VerticalAlignmentConstantParser_Test.class);
+    suite.addTestSuite(HorizontalAlignmentConstantParserTest.class);
+    suite.addTestSuite(VerticalAlignmentConstantParserTest.class);
+    suite.addTestSuite(TextAlignConstantParserTest.class);
 
     // elementparsers
     suite.addTestSuite(DialogBoxParserTest.class);
diff --git a/user/test/com/google/gwt/uibinder/attributeparsers/HorizontalAlignmentConstantParserTest.java b/user/test/com/google/gwt/uibinder/attributeparsers/HorizontalAlignmentConstantParserTest.java
new file mode 100644
index 0000000..005c5cc
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/attributeparsers/HorizontalAlignmentConstantParserTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2009 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.uibinder.attributeparsers;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.typeinfo.TypeOracle;
+import com.google.gwt.dev.javac.CompilationState;
+import com.google.gwt.dev.javac.CompilationStateBuilder;
+import com.google.gwt.uibinder.rebind.MortalLogger;
+import com.google.gwt.uibinder.test.UiJavaResources;
+import com.google.gwt.user.client.ui.HasHorizontalAlignment;
+import com.google.gwt.user.client.ui.HasHorizontalAlignment.HorizontalAlignmentConstant;
+
+import junit.framework.TestCase;
+
+/**
+ * Test for {@link HorizontalAlignmentConstantParser}.
+ */
+public class HorizontalAlignmentConstantParserTest extends TestCase {
+  private static final String HHA = HasHorizontalAlignment.class.getCanonicalName();
+  private static final String HAC = HorizontalAlignmentConstant.class.getCanonicalName();
+  private HorizontalAlignmentConstantParser parser;
+
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+    CompilationState state = CompilationStateBuilder.buildFrom(TreeLogger.NULL,
+        UiJavaResources.getUiResources());
+    TypeOracle types = state.getTypeOracle();
+    parser = new HorizontalAlignmentConstantParser(new FieldReferenceConverter(
+        null), types.parse(HAC), MortalLogger.NULL);
+  }
+
+  public void testFriendlyNames() throws UnableToCompleteException {
+    assertEquals(HHA + ".ALIGN_LEFT", parser.parse("left"));
+    assertEquals(HHA + ".ALIGN_CENTER", parser.parse("center"));
+    assertEquals(HHA + ".ALIGN_RIGHT", parser.parse("right"));
+    // capitalized
+    assertEquals(HHA + ".ALIGN_LEFT", parser.parse("Left"));
+    assertEquals(HHA + ".ALIGN_CENTER", parser.parse("Center"));
+    assertEquals(HHA + ".ALIGN_RIGHT", parser.parse("Right"));
+  }
+
+  public void testUglyNames() throws UnableToCompleteException {
+    assertEquals(HHA + ".ALIGN_LEFT", parser.parse("ALIGN_LEFT"));
+    assertEquals(HHA + ".ALIGN_CENTER", parser.parse("ALIGN_CENTER"));
+    assertEquals(HHA + ".ALIGN_RIGHT", parser.parse("ALIGN_RIGHT"));
+  }
+
+  public void testBad() {
+    try {
+      parser.parse("fnord");
+      fail("Expected UnableToCompleteException");
+    } catch (UnableToCompleteException e) {
+      /* pass */
+    }
+  }
+
+  public void testFieldRef() throws UnableToCompleteException {
+    assertEquals("foo.bar().baz()", parser.parse("{foo.bar.baz}"));
+  }
+}
diff --git a/user/test/com/google/gwt/uibinder/attributeparsers/TextAlignConstantParserTest.java b/user/test/com/google/gwt/uibinder/attributeparsers/TextAlignConstantParserTest.java
new file mode 100644
index 0000000..a2b0d4a
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/attributeparsers/TextAlignConstantParserTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2009 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.uibinder.attributeparsers;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.typeinfo.TypeOracle;
+import com.google.gwt.dev.javac.CompilationState;
+import com.google.gwt.dev.javac.CompilationStateBuilder;
+import com.google.gwt.uibinder.rebind.MortalLogger;
+import com.google.gwt.uibinder.test.UiJavaResources;
+import com.google.gwt.user.client.ui.TextBoxBase;
+import com.google.gwt.user.client.ui.TextBoxBase.TextAlignConstant;
+
+import junit.framework.TestCase;
+
+/**
+ * Test for {@link TextAlignConstantParser}.
+ */
+public class TextAlignConstantParserTest extends TestCase {
+  private static final String TBB = TextBoxBase.class.getCanonicalName();
+  private static final String TAC = TextAlignConstant.class.getCanonicalName();
+  private TextAlignConstantParser parser;
+
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+    CompilationState state = CompilationStateBuilder.buildFrom(TreeLogger.NULL,
+        UiJavaResources.getUiResources());
+    TypeOracle types = state.getTypeOracle();
+    parser = new TextAlignConstantParser(new FieldReferenceConverter(null),
+        types.parse(TAC), MortalLogger.NULL);
+  }
+
+  public void testFriendlyNames() throws UnableToCompleteException {
+    assertEquals(TBB + ".ALIGN_LEFT", parser.parse("left"));
+    assertEquals(TBB + ".ALIGN_CENTER", parser.parse("center"));
+    assertEquals(TBB + ".ALIGN_RIGHT", parser.parse("right"));
+    assertEquals(TBB + ".ALIGN_JUSTIFY", parser.parse("justify"));
+    // capitalized
+    assertEquals(TBB + ".ALIGN_LEFT", parser.parse("Left"));
+    assertEquals(TBB + ".ALIGN_CENTER", parser.parse("Center"));
+    assertEquals(TBB + ".ALIGN_RIGHT", parser.parse("Right"));
+    assertEquals(TBB + ".ALIGN_JUSTIFY", parser.parse("Justify"));
+  }
+
+  public void testUglyNames() throws UnableToCompleteException {
+    assertEquals(TBB + ".ALIGN_LEFT", parser.parse("ALIGN_LEFT"));
+    assertEquals(TBB + ".ALIGN_CENTER", parser.parse("ALIGN_CENTER"));
+    assertEquals(TBB + ".ALIGN_RIGHT", parser.parse("ALIGN_RIGHT"));
+    assertEquals(TBB + ".ALIGN_JUSTIFY", parser.parse("ALIGN_JUSTIFY"));
+  }
+
+  public void testBad() {
+    try {
+      parser.parse("fnord");
+      fail("Expected UnableToCompleteException");
+    } catch (UnableToCompleteException e) {
+      /* pass */
+    }
+  }
+
+  public void testFieldRef() throws UnableToCompleteException {
+    assertEquals("foo.bar().baz()", parser.parse("{foo.bar.baz}"));
+  }
+}
diff --git a/user/test/com/google/gwt/uibinder/attributeparsers/VerticalAlignmentConstantParserTest.java b/user/test/com/google/gwt/uibinder/attributeparsers/VerticalAlignmentConstantParserTest.java
new file mode 100644
index 0000000..f4e9402
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/attributeparsers/VerticalAlignmentConstantParserTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.uibinder.attributeparsers;
+
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.typeinfo.TypeOracle;
+import com.google.gwt.dev.javac.CompilationState;
+import com.google.gwt.dev.javac.CompilationStateBuilder;
+import com.google.gwt.uibinder.rebind.MortalLogger;
+import com.google.gwt.uibinder.test.UiJavaResources;
+import com.google.gwt.user.client.ui.HasVerticalAlignment;
+import com.google.gwt.user.client.ui.HasVerticalAlignment.VerticalAlignmentConstant;
+
+import junit.framework.TestCase;
+
+/**
+ * Test for {@link VerticalAlignmentConstantParser}.
+ */
+public class VerticalAlignmentConstantParserTest extends TestCase {
+  private static final String HVA = HasVerticalAlignment.class.getCanonicalName();
+  private static final String VAC = VerticalAlignmentConstant.class.getCanonicalName();
+  private VerticalAlignmentConstantParser parser;
+
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+    CompilationState state = CompilationStateBuilder.buildFrom(TreeLogger.NULL,
+        UiJavaResources.getUiResources());
+    TypeOracle types = state.getTypeOracle();
+    parser = new VerticalAlignmentConstantParser(new FieldReferenceConverter(
+        null), types.parse(VAC), MortalLogger.NULL);
+  }
+
+  public void testFriendlyNames() throws UnableToCompleteException {
+    assertEquals(HVA + ".ALIGN_TOP", parser.parse("top"));
+    assertEquals(HVA + ".ALIGN_MIDDLE", parser.parse("middle"));
+    assertEquals(HVA + ".ALIGN_BOTTOM", parser.parse("bottom"));
+    // capitalized
+    assertEquals(HVA + ".ALIGN_TOP", parser.parse("Top"));
+    assertEquals(HVA + ".ALIGN_MIDDLE", parser.parse("Middle"));
+    assertEquals(HVA + ".ALIGN_BOTTOM", parser.parse("Bottom"));
+  }
+
+  public void testUglyNames() throws UnableToCompleteException {
+    assertEquals(HVA + ".ALIGN_TOP", parser.parse("ALIGN_TOP"));
+    assertEquals(HVA + ".ALIGN_MIDDLE", parser.parse("ALIGN_MIDDLE"));
+    assertEquals(HVA + ".ALIGN_BOTTOM", parser.parse("ALIGN_BOTTOM"));
+  }
+
+  public void testBad() {
+    try {
+      parser.parse("fnord");
+      fail("Expected UnableToCompleteException");
+    } catch (UnableToCompleteException e) {
+      /* pass */
+    }
+  }
+
+  public void testFieldRef() throws UnableToCompleteException {
+    assertEquals("foo.bar().baz()", parser.parse("{foo.bar.baz}"));
+  }
+}
diff --git a/user/test/com/google/gwt/uibinder/test/UiJavaResources.java b/user/test/com/google/gwt/uibinder/test/UiJavaResources.java
index c9e5c0e..c832935 100644
--- a/user/test/com/google/gwt/uibinder/test/UiJavaResources.java
+++ b/user/test/com/google/gwt/uibinder/test/UiJavaResources.java
@@ -304,6 +304,19 @@
       return code;
     }
   };
+  public static final MockJavaResource TEXT_BOX_BASE = new MockJavaResource(
+      "com.google.gwt.user.client.ui.TextBoxBase") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.user.client.ui;\n");
+      code.append("public class TextBoxBase {\n");
+      code.append("  public static class TextAlignConstant {\n");
+      code.append("  }\n");
+      code.append("}\n");
+      return code;
+    }
+  };
   public static final MockJavaResource UI_BINDER = new MockJavaResource(
       "com.google.gwt.uibinder.client.UiBinder") {
     @Override
@@ -380,6 +393,7 @@
     rtn.add(STACK_LAYOUT_PANEL);
     rtn.add(STYLE);
     rtn.add(TAB_LAYOUT_PANEL);
+    rtn.add(TEXT_BOX_BASE);
     rtn.add(UI_OBJECT);
     rtn.add(UI_BINDER);
     rtn.add(UI_FACTORY);