Cherrypick r11347 into the 2.5 branch
Ensures UiField(provided=true) takes precedent...

Review by: rdayal@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/2.5@11348 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/uibinder/rebind/AbstractFieldWriter.java b/user/src/com/google/gwt/uibinder/rebind/AbstractFieldWriter.java
index 929dd55..a98a249 100644
--- a/user/src/com/google/gwt/uibinder/rebind/AbstractFieldWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/AbstractFieldWriter.java
@@ -213,22 +213,20 @@
         && getAssignableType() != null
         && getAssignableType().isAssignableTo(renderablePanelType);
 
-    // Check initializer.
-    if (initializer == null) {
-      if (ownerField != null && ownerField.isProvided()) {
-        initializer = String.format("owner.%s", name);
-      } else {
-        JClassType type = getInstantiableType();
-        if (type != null) {
-          if ((type.isInterface() == null)
-              && (type.findConstructor(new JType[0]) == null)) {
-            logger.die(NO_DEFAULT_CTOR_ERROR, type.getQualifiedSourceName(),
-                type.getName());
-          }
+    // Check initializer. Provided value takes precedence over initializer.
+    if (ownerField != null && ownerField.isProvided()) {
+      initializer = String.format("owner.%s", name);
+    } else if (initializer == null) {
+      JClassType type = getInstantiableType();
+      if (type != null) {
+        if ((type.isInterface() == null)
+            && (type.findConstructor(new JType[0]) == null)) {
+          logger.die(NO_DEFAULT_CTOR_ERROR, type.getQualifiedSourceName(),
+              type.getName());
         }
-        initializer = String.format("(%1$s) GWT.create(%1$s.class)",
-            getQualifiedSourceName());
       }
+      initializer = String.format("(%1$s) GWT.create(%1$s.class)",
+          getQualifiedSourceName());
     }
 
     w.newline();
diff --git a/user/test/com/google/gwt/uibinder/test/client/UiBinderTest.java b/user/test/com/google/gwt/uibinder/test/client/UiBinderTest.java
index d598652..758bb69 100644
--- a/user/test/com/google/gwt/uibinder/test/client/UiBinderTest.java
+++ b/user/test/com/google/gwt/uibinder/test/client/UiBinderTest.java
@@ -65,6 +65,28 @@
     root = widgetUi.root;
   }
 
+  /**
+   * Tests that the provided value takes precedence over a custom parser,
+   * {@code UiFactory} or {@code UiConstructor}.
+   * <p>
+   * The fields are {@code final} and we test that they've correctly been
+   * modified by the template.
+   * 
+   * @see http://code.google.com/p/google-web-toolkit/issues/detail?id=7740
+   */
+  public void testProvidedWidgetWithCustomInitializer() {
+    // Custom parser: should use the provided header, as the one from the
+    // template is passed to the (ignored) custom initializer. But the child
+    // widget should have been set.
+    assertEquals("Provided header text", widgetUi.myProvidedDisclosurePanel.getHeaderTextAccessor().getText());
+    assertNotNull(widgetUi.myProvidedDisclosurePanelItem);
+    assertSame(widgetUi.myProvidedDisclosurePanelItem, widgetUi.myProvidedDisclosurePanel.getContent());
+    // UiConstructor
+    assertEquals("ditto", widgetUi.providedAnnotatedStrictLabel.getText());
+    // UiFactory
+    assertEquals("from template", widgetUi.providedStrictLabel.getText());
+  }
+
   public void testTableWithColumns() {
     assertEquals("col", domUi.narrowColumn.getTagName().toLowerCase());
     assertEquals("tr", domUi.tr.getTagName().toLowerCase());
diff --git a/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.java b/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.java
index e1c676f..a07e0b0 100644
--- a/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.java
+++ b/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.java
@@ -116,6 +116,9 @@
   @UiField Widget myStackPanelItem;
   @UiField DisclosurePanel myDisclosurePanel;
   @UiField Widget myDisclosurePanelItem;
+  @UiField(provided = true)
+  final DisclosurePanel myProvidedDisclosurePanel = new DisclosurePanel("Provided header text");
+  @UiField Widget myProvidedDisclosurePanelItem;
   @UiField Tree myTree;
   @UiField TreeItem myTreeItemA;
   @UiField Widget myTreeWidgetB;
@@ -133,11 +136,12 @@
   @UiField NeedlesslyAnnotatedLabel needlessLabel;
   @UiField AnnotatedStrictLabel strictLabel;
   @UiField(provided = true)
-  AnnotatedStrictLabel providedStrictLabel = new AnnotatedStrictLabel(
+  final AnnotatedStrictLabel providedAnnotatedStrictLabel = new AnnotatedStrictLabel(
       "likewise");
   @UiField AnnotatedStrictLabel translatedStrictLabel;
   @UiField StrictLabel veryStrictLabel;
   @UiField StrictLabel translatedVeryStrictLabel;
+  @UiField(provided = true) final StrictLabel providedStrictLabel = new StrictLabel("provided");
   @UiField FooLabel theFoo;
   @UiField MenuBar dropdownMenuBar;
   @UiField MenuItem menuItemMop;
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 1365691..7a97528 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
@@ -451,6 +451,20 @@
 
       </gwt:DisclosurePanel>
 
+      <p> ... a provided DisclosurePanel with a text header ... </p>
+
+      <gwt:DisclosurePanel ui:field='myProvidedDisclosurePanel' animationEnabled='true'>
+        <gwt:header>
+          <ui:msg description="Label for Disclosure One">I just have a text header</ui:msg>
+        </gwt:header>
+
+
+          <gwt:Label ui:field='myProvidedDisclosurePanelItem'>
+            <ui:msg  description="Content for Disclosure One Text">Disclosure Text</ui:msg>
+          </gwt:Label>
+
+      </gwt:DisclosurePanel>
+
       <h2>Stylish</h2>
       <p>
        Templates work with ClientBundle. For example,
@@ -551,7 +565,8 @@
       </demo:StrictLabel></p>
       <p><demo:NeedlesslyAnnotatedLabel ui:field="needlessLabel"
         text="Sometimes people do things they don't need to do. Don't punish them."/></p>
-      <demo:AnnotatedStrictLabel ui:field="providedStrictLabel">ditto</demo:AnnotatedStrictLabel>
+      <demo:AnnotatedStrictLabel ui:field="providedAnnotatedStrictLabel">ditto</demo:AnnotatedStrictLabel>
+      <demo:StrictLabel ui:field="providedStrictLabel" text="from template" />
 
       <demo:FooLabel ui:field='theFoo' pojo="{values.pojo}"/>