Reviewers: rdayal,

Description:
Allows UiRenderer styles before the first call to render()

Fields are initialized both upon construction and on a call to render()

Also ensured that ui:with fields never get optimized as final.


Please review this at http://gwt-code-reviews.appspot.com/1794803/

Affected files:
  M user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
  M user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
  M user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java
  M user/test/com/google/gwt/uibinder/test/client/UiRendererUi.java
  M user/test/com/google/gwt/uibinder/test/client/UiRendererUi.ui.xml


Index: user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
===================================================================
--- user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java (revision 11175) +++ user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java (working copy)
@@ -394,7 +394,7 @@

     fieldWriter = fieldManager.registerField(
FieldWriterType.IMPORTED, matchingResourceType.getErasedType(), resourceName); - fieldWriter.setInitializer(UiBinderWriter.RENDER_PARAM_HOLDER_PREFIX + resourceName);
+    fieldWriter.setInitializer(resourceName);
   }

private void createSingleImport(XMLElement elem, JClassType enclosingType,
Index: user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
===================================================================
--- user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java (revision 11175) +++ user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java (working copy)
@@ -76,8 +76,6 @@
  */
 public class UiBinderWriter implements Statements {

- static final String RENDER_PARAM_HOLDER_PREFIX = "_renderer_param_holder_";
-
   private static final String SAFE_VAR_PREFIX =
     "somethingUnlikelyToCollideWithParamNamesWefio";

@@ -1935,8 +1933,30 @@
     w.newline();

     JParameter[] renderParameters = findRenderParameters(baseClass);
-
-    writeRenderParameterDefinitions(w, renderParameters);
+    for (JParameter param : renderParameters) {
+ // Prevent fields related to parameters from being optimized as having
+      // static values.
+      fieldManager.convertFieldToGetter(param.getName());
+      fieldManager.convertFieldToGetter(param.getName());
+    }
+
+    // public UiRendererImplClass() {
+    w.write("public %s() {", implClassName);
+    w.indent();
+    w.write("build_fields();");
+    w.outdent();
+    // }
+    w.write("}");
+    w.newline();
+
+    // private init_fields() {
+    w.write("private void build_fields() {", implClassName);
+    w.indent();
+    fieldManager.initializeWidgetsInnerClass(w, getOwnerClass());
+    w.outdent();
+    // }
+    w.write("}");
+    w.newline();

String renderParameterDeclarations = renderMethodParameters(renderParameters); w.write("public void render(final %s sb%s%s) {", SafeHtmlBuilder.class.getName(),
@@ -1949,7 +1969,7 @@
w.write("uiId = com.google.gwt.dom.client.Document.get().createUniqueId();");
     w.newline();

-    fieldManager.initializeWidgetsInnerClass(w, getOwnerClass());
+    w.write("build_fields();");
     w.newline();

     String safeHtml = rootField.getSafeHtml();
@@ -2245,20 +2265,13 @@
     }
   }

- private void writeRenderParameterDefinitions(IndentedWriter w, JParameter[] renderParameters) {
-    for (int i = 0; i < renderParameters.length; i++) {
-      JParameter parameter = renderParameters[i];
- w.write("private %s %s%s;", parameter.getType().getQualifiedSourceName(),
-          RENDER_PARAM_HOLDER_PREFIX, parameter.getName());
-      w.newline();
-    }
-  }
-
private void writeRenderParameterInitializers(IndentedWriter w, JParameter[] renderParameters) {
     for (int i = 0; i < renderParameters.length; i++) {
       JParameter parameter = renderParameters[i];
- w.write("%s%s = %s;", RENDER_PARAM_HOLDER_PREFIX, parameter.getName(), parameter.getName());
-      w.newline();
+      if (fieldManager.lookup(parameter.getName()) != null) {
+        w.write("this.%s = %s;", parameter.getName(), parameter.getName());
+        w.newline();
+      }
     }
   }

Index: user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java
===================================================================
--- user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java (revision 11175) +++ user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java (working copy)
@@ -256,6 +256,12 @@
assertEquals(renderer.getUiStyle().disabled(), nameSpan.getClassName());
   }

+  public void testGetStyleBeforeRender() {
+    HtmlRenderer renderer = GWT.create(HtmlRenderer.class);
+    assertNotNull(renderer.getUiStyle().enabled());
+    assertNotNull(renderer.getUiStyle2().ok());
+  }
+
   @Override
   protected void gwtTearDown() {
     docDiv.removeFromParent();
Index: user/test/com/google/gwt/uibinder/test/client/UiRendererUi.java
===================================================================
--- user/test/com/google/gwt/uibinder/test/client/UiRendererUi.java (revision 11175) +++ user/test/com/google/gwt/uibinder/test/client/UiRendererUi.java (working copy)
@@ -86,10 +86,19 @@
   }

   /**
+   * Another style defined within the UiBinder file.
+   */
+  public interface UiStyle2 extends CssResource {
+    String ok();
+    String bad();
+  }
+
+  /**
    * A UiRinder Cell renderer.
    */
   public interface HtmlRenderer extends UiRenderer {
     UiStyle getUiStyle();
+    UiStyle2 getUiStyle2();
     SpanElement getNameSpan(Element owner);
     TableColElement getNarrowColumn(Element owner);
     DivElement getRoot(Element owner);
Index: user/test/com/google/gwt/uibinder/test/client/UiRendererUi.ui.xml
===================================================================
--- user/test/com/google/gwt/uibinder/test/client/UiRendererUi.ui.xml (revision 11175) +++ user/test/com/google/gwt/uibinder/test/client/UiRendererUi.ui.xml (working copy)
@@ -20,6 +20,10 @@
<ui:style field="uiStyle" type="com.google.gwt.uibinder.test.client.UiRendererUi.UiStyle">
     .enabled { color:black; }
     .disabled { color:gray; }
+  </ui:style>
+ <ui:style field="uiStyle2" type="com.google.gwt.uibinder.test.client.UiRendererUi.UiStyle2">
+    .ok { color:blue; }
+    .bad { color:red; }
   </ui:style>

   <div ui:field='root' class="{res.style.bodyColor} {res.style.bodyFont}"


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

Reply via email to