Made UiBinder class lookup more generous.
Previously <gwt:foo.Bar would look for class foo with inner class Bar.
Now it also looks for package foo containing class Bar.

Review at http://gwt-code-reviews.appspot.com/1386803

Review by: sbrubaker@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9934 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
index 3e292f0..9b6a867 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
@@ -517,19 +517,29 @@
     }
 
     String ns = elem.getNamespaceUri();
+    String packageName = ns;
+    String className = tagName;
 
-    JPackage pkg = parseNamespacePackage(ns);
-    if (pkg == null) {
-      throw new RuntimeException("No such package: " + ns);
+    while (true) {
+      JPackage pkg = parseNamespacePackage(packageName);
+      if (pkg == null) {
+        throw new RuntimeException("No such package: " + packageName);
+      }
+
+      JClassType rtn = pkg.findType(className);
+      if (rtn != null) {
+        return rtn;
+      }
+
+      // Try again: shift one element of the class name onto the package name.
+      // If the class name has only one element left, fail.
+      int index = className.indexOf(".");
+      if (index == -1) {
+        die(elem, "No class matching \"%s\" in %s", tagName, ns);
+      }
+      packageName = packageName + "." + className.substring(0, index);
+      className = className.substring(index + 1);
     }
-
-    JClassType rtn = null;
-    rtn = pkg.findType(tagName);
-    if (rtn == null) {
-      die(elem, "No class matching \"%s\" in %s", tagName, ns);
-    }
-
-    return rtn;
   }
 
   /**
diff --git a/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.ui.xml b/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.ui.xml
index 45de285..14a669c 100644
--- a/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.ui.xml
+++ b/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.ui.xml
@@ -47,6 +47,8 @@
 
 <ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
   xmlns:gwt='urn:import:com.google.gwt.user.client.ui'
+  xmlns:gwt2='urn:import:com.google.gwt.user.client'
+  xmlns:gwt3='urn:import:com'
   xmlns:demo='urn:import:com.google.gwt.uibinder.test.client'
 
   xmlns:legacyValuesForBeans='urn:with:com.google.gwt.uibinder.test.client.WidgetBasedUi.FakeBundle2'
@@ -665,9 +667,9 @@
   <gwt:DateLabel ui:field='myDateLabel2' format='{MY_DATE_FORMAT}' />
 
   <gwt:NumberLabel ui:field='myNumberLabel' predefinedFormat='SCIENTIFIC' />
-  <gwt:NumberLabel ui:field='myNumberLabel2' format='{MY_NUMBER_FORMAT}' />
+  <gwt2:ui.NumberLabel ui:field='myNumberLabel2' format='{MY_NUMBER_FORMAT}' />
 
-  <gwt:ValueLabel ui:field='myValueLabel' renderer='{doubleRenderer}' />
+  <gwt3:google.gwt.user.client.ui.ValueLabel ui:field='myValueLabel' renderer='{doubleRenderer}' />
 
   <img src="{values.aUrl}" ui:field='myImage'/>