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}"/>