Revision: 7878
Author: [email protected]
Date: Mon Apr  5 13:03:21 2010
Log: Cherry picks revision 7859 from trunk, which fixes a UiBinder
problem with custom subclasses of Image.  Merge command:

svn merge --ignore-ancestry -r7858:7859 https://google-web-toolkit.googlecode.com/svn/trunk

http://code.google.com/p/google-web-toolkit/source/detail?r=7878

Added:
/branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/test/client/FooImage.java
Modified:
/branches/snapshot-2010.03.29-r7809/user/src/com/google/gwt/uibinder/elementparsers/ImageParser.java /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/elementparsers/ImageParserTest.java /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/test/UiJavaResources.java /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/test/client/UiBinderTest.java /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.java /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.ui.xml

=======================================
--- /dev/null
+++ /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/test/client/FooImage.java Mon Apr 5 13:03:21 2010
@@ -0,0 +1,27 @@
+/*
+ * 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.test.client;
+
+import com.google.gwt.user.client.ui.Image;
+
+/**
+ * Tests that custom Image subclasses work
+ */
+public class FooImage extends Image {
+  public FooImage() {
+    super();
+  }
+}
=======================================
--- /branches/snapshot-2010.03.29-r7809/user/src/com/google/gwt/uibinder/elementparsers/ImageParser.java Fri Jan 15 10:57:55 2010 +++ /branches/snapshot-2010.03.29-r7809/user/src/com/google/gwt/uibinder/elementparsers/ImageParser.java Mon Apr 5 13:03:21 2010
@@ -17,9 +17,11 @@

 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.core.ext.typeinfo.JType;
+import com.google.gwt.core.ext.typeinfo.TypeOracle;
+import com.google.gwt.resources.client.ImageResource;
 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
@@ -29,11 +31,17 @@

   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);
+    if (hasImageResourceConstructor(writer.getOracle(), type)) {
+      String resource = elem.consumeImageResourceAttribute("resource");
+      if (null != resource) {
+        writer.setFieldInitializerAsConstructor(fieldName, type, resource);
+      }
     }
   }
-}
+
+  private boolean hasImageResourceConstructor(TypeOracle typeOracle,
+      JClassType type) {
+ JType imageResourceType = typeOracle.findType(ImageResource.class.getName());
+    return type.findConstructor(new JType[] {imageResourceType}) != null;
+  }
+}
=======================================
--- /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/elementparsers/ImageParserTest.java Fri Jan 15 10:57:55 2010 +++ /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/elementparsers/ImageParserTest.java Mon Apr 5 13:03:21 2010
@@ -16,6 +16,7 @@
 package com.google.gwt.uibinder.elementparsers;

 import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.dev.javac.impl.MockJavaResource;
 import com.google.gwt.uibinder.rebind.FieldWriter;

 import junit.framework.TestCase;
@@ -30,6 +31,32 @@
 public class ImageParserTest extends TestCase {
private static final String PARSED_TYPE = "com.google.gwt.user.client.ui.Image";

+ private static final MockJavaResource IMAGE_SUBCLASS_NO_CONSTRUCTOR = new MockJavaResource(
+      "my.MyImage") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package my;\n");
+      code.append("import com.google.gwt.user.client.ui.Image;\n");
+      code.append("public class MyImage extends Image {\n");
+      code.append("}\n");
+      return code;
+    }
+  };
+ private static final MockJavaResource IMAGE_SUBCLASS_RESOURCE_CONSTRUCTOR = new MockJavaResource(
+      "my.MyConstructedImage") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package my;\n");
+      code.append("import com.google.gwt.user.client.ui.Image;\n");
+ code.append("import com.google.gwt.resources.client.ImageResource;\n");
+      code.append("public class MyConstructedImage extends Image {\n");
+ code.append(" public MyConstructedImage(ImageResource r) { super(r); }");
+      code.append("}\n");
+      return code;
+    }
+  };
   private ElementParserTester tester;

   @Override
@@ -37,6 +64,52 @@
     super.setUp();
     tester = new ElementParserTester(PARSED_TYPE, new ImageParser());
   }
+
+  public void testHappyWithDefaultInstantiableSubclass()
+      throws UnableToCompleteException, SAXException, IOException {
+    tester = new ElementParserTester("my.MyImage", new ImageParser(),
+ IMAGE_SUBCLASS_NO_CONSTRUCTOR, IMAGE_SUBCLASS_RESOURCE_CONSTRUCTOR);
+    ImageParser parser = new ImageParser();
+    StringBuffer b = new StringBuffer();
+
+ b.append("<ui:UiBinder xmlns:ui='" + ElementParserTester.BINDER_URI + "'");
+    b.append("    xmlns:my='urn:import:my'");
+    b.append("    xmlns:g='urn:import:com.google.gwt.user.client.ui'>");
+    b.append("  <my:MyImage resource='{someImageResource}'/> ");
+    b.append("</ui:UiBinder>");
+
+    parser.parse(tester.getElem(b.toString(), "my:MyImage"), "fieldName",
+        tester.parsedType, tester.writer);
+    FieldWriter w = tester.fieldManager.lookup("fieldName");
+    assertNull(w.getInitializer());
+
+    assertTrue(tester.writer.statements.isEmpty());
+    assertNull(tester.logger.died);
+  }
+
+  public void testHappyWithSubclassWithImageResourceConstructor()
+      throws UnableToCompleteException, SAXException, IOException {
+    ImageParser parser = new ImageParser();
+ tester = new ElementParserTester("my.MyConstructedImage", new ImageParser(), + IMAGE_SUBCLASS_NO_CONSTRUCTOR, IMAGE_SUBCLASS_RESOURCE_CONSTRUCTOR);
+
+    StringBuffer b = new StringBuffer();
+
+ b.append("<ui:UiBinder xmlns:ui='" + ElementParserTester.BINDER_URI + "'");
+    b.append("    xmlns:my='urn:import:my'");
+    b.append("    xmlns:g='urn:import:com.google.gwt.user.client.ui'>");
+    b.append("  <my:MyConstructedImage resource='{someImageResource}'/> ");
+    b.append("</ui:UiBinder>");
+
+ parser.parse(tester.getElem(b.toString(), "my:MyConstructedImage"), "fieldName",
+        tester.parsedType, tester.writer);
+    FieldWriter w = tester.fieldManager.lookup("fieldName");
+    assertEquals("new my.MyConstructedImage(someImageResource)",
+        w.getInitializer());
+
+    assertTrue(tester.writer.statements.isEmpty());
+    assertNull(tester.logger.died);
+  }

   public void testHappyWithResource() throws UnableToCompleteException,
       SAXException, IOException {
=======================================
--- /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/test/UiJavaResources.java Thu Feb 25 12:09:02 2010 +++ /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/test/UiJavaResources.java Mon Apr 5 13:03:21 2010
@@ -174,8 +174,10 @@
     protected CharSequence getContent() {
       StringBuffer code = new StringBuffer();
       code.append("package com.google.gwt.user.client.ui;\n");
+ code.append("import com.google.gwt.resources.client.ImageResource;\n");
       code.append("public class Image extends Widget {\n");
       code.append("  public Image() {} ");
+      code.append("  public Image(ImageResource r) {} ");
       code.append("}\n");
       return code;
     }
@@ -222,7 +224,7 @@
     }
   };
   public static final MockJavaResource LIST_BOX = new MockJavaResource(
-    "com.google.gwt.user.client.ui.ListBox") {
+      "com.google.gwt.user.client.ui.ListBox") {
     @Override
     protected CharSequence getContent() {
       StringBuffer code = new StringBuffer();
=======================================
--- /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/test/client/UiBinderTest.java Thu Mar 25 10:46:07 2010 +++ /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/test/client/UiBinderTest.java Mon Apr 5 13:03:21 2010
@@ -445,6 +445,15 @@
     assertEquals("funny characters \" ' ' & < > > { }", t);
   }

+  public void testCustomImageClass() {
+    ImageResource resource = widgetUi.prettyImage;
+    Image widget = widgetUi.fooImage;
+    assertEquals(resource.getWidth(), widget.getOffsetWidth());
+    assertEquals(resource.getHeight(), widget.getOffsetHeight());
+    assertEquals(resource.getTop(), widget.getOriginTop());
+    assertEquals(resource.getLeft(), widget.getOriginLeft());
+  }
+
   public void testImageResourceInImageWidget() {
     ImageResource resource = widgetUi.prettyImage;
     Image widget = widgetUi.babyWidget;
=======================================
--- /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.java Thu Feb 25 12:09:02 2010 +++ /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.java Mon Apr 5 13:03:21 2010
@@ -126,6 +126,7 @@
   @UiField SpanElement totallyPrivateStyleSpan;
   @UiField ImageResource prettyImage;
   @UiField ImageResource prettyTilingImage;
+  @UiField FooImage fooImage;
   @UiField Image babyWidget;
   @UiField ParagraphElement simpleSpriteParagraph;
   @UiField DataResource heartCursorResource;
=======================================
--- /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.ui.xml Tue Mar 2 05:17:34 2010 +++ /branches/snapshot-2010.03.29-r7809/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.ui.xml Mon Apr 5 13:03:21 2010
@@ -198,6 +198,9 @@
       <gwt:Image ui:field='babyWidget' resource='{prettyImage}'
           altText='expected alt text' styleName='expected style name'
       />
+      <demo:FooImage ui:field='fooImage' resource='{prettyImage}'
+          altText='expected alt text' styleName='expected style name'
+      />
       </div>

       <p ui:field='simpleSpriteParagraph'

--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

To unsubscribe, reply using "remove me" as the subject.

Reply via email to