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