Fixes Issue 4415 "uibinder Image class with resource attribute, removes styles on that image", by adding a custom parser for Image. http://code.google.com/p/google-web-toolkit/issues/detail?id=4415 Review by jgw http://gwt-code-reviews.appspot.com/130811 git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7411 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/ImageParser.java b/user/src/com/google/gwt/uibinder/elementparsers/ImageParser.java new file mode 100644 index 0000000..ea3d122 --- /dev/null +++ b/user/src/com/google/gwt/uibinder/elementparsers/ImageParser.java
@@ -0,0 +1,39 @@ +/* + * 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.elementparsers; + +import com.google.gwt.core.ext.UnableToCompleteException; +import com.google.gwt.core.ext.typeinfo.JClassType; +import com.google.gwt.uibinder.rebind.UiBinderWriter; +import com.google.gwt.uibinder.rebind.XMLElement; +import com.google.gwt.user.client.ui.Image; + +/** + * Custom parsing of Image widgets. Sets ImageResource via constructor, because + * {@link Image#setResource} clobbers most setter values. + */ +public class ImageParser implements ElementParser { + + public void parse(XMLElement elem, String fieldName, JClassType type, + UiBinderWriter writer) throws UnableToCompleteException { + String resource = elem.consumeImageResourceAttribute("resource"); + if (null != resource) { + writer.setFieldInitializerAsConstructor(fieldName, + writer.getOracle().findType(Image.class.getName()), + resource); + } + } +}
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java index 7cdc2b7..118b22d 100644 --- a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java +++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
@@ -626,6 +626,10 @@ /** * Instructs the writer to initialize the field with a specific contructor * invocaction, instead of the default GWT.create call. + * + * @param fieldName the field to intialize + * @param type the type of the field + * @param arguments to the constructor call */ public void setFieldInitializerAsConstructor(String fieldName, JClassType type, String... args) { @@ -944,6 +948,7 @@ addWidgetParser("DockLayoutPanel"); addWidgetParser("StackLayoutPanel"); addWidgetParser("TabLayoutPanel"); + addWidgetParser("Image"); } /**
diff --git a/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java b/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java index d049ad5..f61d522 100644 --- a/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java +++ b/user/test/com/google/gwt/uibinder/UiBinderJreSuite.java
@@ -23,6 +23,7 @@ import com.google.gwt.uibinder.attributeparsers.StringAttributeParserTest; import com.google.gwt.uibinder.elementparsers.DialogBoxParserTest; import com.google.gwt.uibinder.elementparsers.DockLayoutPanelParserTest; +import com.google.gwt.uibinder.elementparsers.ImageParserTest; import com.google.gwt.uibinder.elementparsers.IsEmptyParserTest; import com.google.gwt.uibinder.elementparsers.LayoutPanelParserTest; import com.google.gwt.uibinder.elementparsers.StackLayoutPanelParserTest; @@ -70,6 +71,7 @@ // elementparsers suite.addTestSuite(DialogBoxParserTest.class); suite.addTestSuite(DockLayoutPanelParserTest.class); + suite.addTestSuite(ImageParserTest.class); suite.addTestSuite(IsEmptyParserTest.class); suite.addTestSuite(LayoutPanelParserTest.class); suite.addTestSuite(StackLayoutPanelParserTest.class);
diff --git a/user/test/com/google/gwt/uibinder/elementparsers/ImageParserTest.java b/user/test/com/google/gwt/uibinder/elementparsers/ImageParserTest.java new file mode 100644 index 0000000..d2793ea --- /dev/null +++ b/user/test/com/google/gwt/uibinder/elementparsers/ImageParserTest.java
@@ -0,0 +1,82 @@ +/* + * 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.elementparsers; + +import com.google.gwt.core.ext.UnableToCompleteException; +import com.google.gwt.uibinder.rebind.FieldWriter; + +import junit.framework.TestCase; + +import org.xml.sax.SAXException; + +import java.io.IOException; + +/** + * Eponymous unit test. + */ +public class ImageParserTest extends TestCase { + private static final String PARSED_TYPE = "com.google.gwt.user.client.ui.Image"; + + private ElementParserTester tester; + + @Override + public void setUp() throws Exception { + super.setUp(); + tester = new ElementParserTester(PARSED_TYPE, new ImageParser()); + } + + public void testHappyWithResource() throws UnableToCompleteException, + SAXException, IOException { + StringBuffer b = new StringBuffer(); + b.append("<ui:Image field='someImageResource' />"); + b.append("<g:Image resource='{someImageResource}' >"); + b.append("</g:Image>"); + + FieldWriter w = tester.parse(b.toString()); + assertEquals("new " + PARSED_TYPE + "(someImageResource)", + w.getInitializer()); + + assertTrue(tester.writer.statements.isEmpty()); + assertNull(tester.logger.died); + } + + public void testHappyWithNoResource() throws UnableToCompleteException, + SAXException, IOException { + StringBuffer b = new StringBuffer(); + b.append("<g:Image>"); + b.append("</g:Image>"); + + FieldWriter w = tester.parse(b.toString()); + assertNull(w.getInitializer()); + + assertTrue(tester.writer.statements.isEmpty()); + assertNull(tester.logger.died); + } + + public void testChokeOnNonResource() throws SAXException, IOException { + StringBuffer b = new StringBuffer(); + b.append("<g:Image resource='someString' >"); + b.append("</g:Image>"); + + try { + tester.parse(b.toString()); + fail(); + } catch (UnableToCompleteException e) { + assertTrue("Expect to hear about ImageResource", + tester.logger.died.contains("ImageResource")); + } + } +}
diff --git a/user/test/com/google/gwt/uibinder/test/UiJavaResources.java b/user/test/com/google/gwt/uibinder/test/UiJavaResources.java index 905b914..cb93041 100644 --- a/user/test/com/google/gwt/uibinder/test/UiJavaResources.java +++ b/user/test/com/google/gwt/uibinder/test/UiJavaResources.java
@@ -168,6 +168,30 @@ return code; } }; + public static final MockJavaResource IMAGE = new MockJavaResource( + "com.google.gwt.user.client.ui.Image") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.user.client.ui;\n"); + code.append("public class Image extends Widget {\n"); + code.append(" public Image() {} "); + code.append("}\n"); + return code; + } + }; + public static final MockJavaResource IMAGE_RESOURCE = new MockJavaResource( + "com.google.gwt.resources.client.ImageResource") { + @Override + protected CharSequence getContent() { + StringBuffer code = new StringBuffer(); + code.append("package com.google.gwt.resources.client;\n"); + code.append("public class ImageResource {\n"); + code.append(" public ImageResource() {} "); + code.append("}\n"); + return code; + } + }; public static final MockJavaResource LABEL = new MockJavaResource( "com.google.gwt.user.client.ui.Label") { @Override @@ -328,6 +352,8 @@ rtn.add(DOCK_LAYOUT_PANEL); rtn.add(EVENT_HANDLER); rtn.add(GWT_EVENT); + rtn.add(IMAGE); + rtn.add(IMAGE_RESOURCE); rtn.add(HANDLER_REGISTRATION); rtn.add(HAS_CLICK_HANDLERS); rtn.add(HAS_HORIZONTAL_ALIGNMENT);
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 1072cc3..630137b 100644 --- a/user/test/com/google/gwt/uibinder/test/client/UiBinderTest.java +++ b/user/test/com/google/gwt/uibinder/test/client/UiBinderTest.java
@@ -25,6 +25,7 @@ import com.google.gwt.junit.Platform; import com.google.gwt.junit.client.GWTTestCase; import com.google.gwt.resources.client.ClientBundle; +import com.google.gwt.resources.client.ImageResource; import com.google.gwt.resources.client.CssResource.NotStrict; import com.google.gwt.uibinder.test.client.EnumeratedLabel.Suffix; import com.google.gwt.user.client.DOM; @@ -32,6 +33,7 @@ import com.google.gwt.user.client.ui.DockPanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HTMLPanel; +import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.RadioButton; import com.google.gwt.user.client.ui.RootPanel; @@ -440,14 +442,15 @@ } public void testImageResourceInImageWidget() { - assertEquals(widgetUi.prettyImage.getWidth(), - widgetUi.babyWidget.getOffsetWidth()); - assertEquals(widgetUi.prettyImage.getHeight(), - widgetUi.babyWidget.getOffsetHeight()); - assertEquals(widgetUi.prettyImage.getTop(), - widgetUi.babyWidget.getOriginTop()); - assertEquals(widgetUi.prettyImage.getLeft(), - widgetUi.babyWidget.getOriginLeft()); + ImageResource resource = widgetUi.prettyImage; + Image widget = widgetUi.babyWidget; + assertEquals(resource.getWidth(), widget.getOffsetWidth()); + assertEquals(resource.getHeight(), widget.getOffsetHeight()); + assertEquals(resource.getTop(), widget.getOriginTop()); + assertEquals(resource.getLeft(), widget.getOriginLeft()); + + assertEquals("expected alt text", widget.getAltText()); + assertEquals("expected style name", widget.getStyleName()); } public void testDataResource() {
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 47e9f74..bb063e0 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
@@ -195,7 +195,9 @@ <p>I bet you like babies in your Image widgets.</p> <div class='{cursorifficStyle.cursor}'> - <gwt:Image ui:field='babyWidget' resource='{prettyImage}'/> + <gwt:Image ui:field='babyWidget' resource='{prettyImage}' + altText='expected alt text' styleName='expected style name' + /> </div> <p ui:field='simpleSpriteParagraph'