Revision: 6252
Author: [email protected]
Date: Tue Sep 29 13:58:28 2009
Log: Add CssResource.ensureInjected().

Patch by: bobv
Review by: rjrjr
http://code.google.com/p/google-web-toolkit/source/detail?r=6252

Added:
  /trunk/user/test/com/google/gwt/resources/client/empty.css
Modified:
  /trunk/user/src/com/google/gwt/resources/Resources.gwt.xml
  /trunk/user/src/com/google/gwt/resources/client/CssResource.java
  /trunk/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java
  /trunk/user/test/com/google/gwt/resources/client/CSSResourceTest.java

=======================================
--- /trunk/user/src/com/google/gwt/resources/Resources.gwt.xml  Wed May 27  
06:48:54 2009
+++ /trunk/user/src/com/google/gwt/resources/Resources.gwt.xml  Tue Sep 29  
13:58:28 2009
@@ -16,6 +16,8 @@
  <module>
    <!-- Pull in the necessary base support, including user.agent detection  
-->
    <inherits name="com.google.gwt.core.Core" />
+  <!-- Pull in StyleInjector for CssResource -->
+  <inherits name="com.google.gwt.dom.DOM" />
    <!-- Used by ExternalTextResource -->
    <inherits name="com.google.gwt.http.HTTP" />

=======================================
--- /trunk/user/src/com/google/gwt/resources/client/CssResource.java    Thu  
Aug 20 05:44:21 2009
+++ /trunk/user/src/com/google/gwt/resources/client/CssResource.java    Tue  
Sep 29 13:58:28 2009
@@ -283,6 +283,16 @@
    @Target(ElementType.METHOD)
    public @interface Strict {
    }
+
+  /**
+   * Calls
+   * {...@link  
com.google.gwt.dom.client.StyleInjector#injectStylesheet(String)} to
+   * inject the contents of the CssResource into the DOM. Repeated calls  
to this
+   * method on an instance of a CssResources will have no effect.
+   *
+   * @return <code>true</code> if this method mutated the DOM.
+   */
+  boolean ensureInjected();

    /**
     * Provides the contents of the CssResource.
=======================================
--- /trunk/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java       
 
Tue Sep 29 13:58:11 2009
+++ /trunk/user/src/com/google/gwt/resources/rg/CssResourceGenerator.java       
 
Tue Sep 29 13:58:28 2009
@@ -30,6 +30,7 @@
  import com.google.gwt.dev.util.DefaultTextOutput;
  import com.google.gwt.dev.util.Util;
  import com.google.gwt.dom.client.Element;
+import com.google.gwt.dom.client.StyleInjector;
  import com.google.gwt.i18n.client.LocaleInfo;
  import com.google.gwt.resources.client.CssResource;
  import com.google.gwt.resources.client.CssResource.ClassName;
@@ -404,6 +405,10 @@
          throw new UnableToCompleteException();
        }
      }
+
+    // Methods defined by CssResource interface
+    writeEnsureInjected(sw);
+    writeGetName(method, sw);

      sw.println("public String getText() {");
      sw.indent();
@@ -416,12 +421,6 @@
      sw.outdent();
      sw.println("}");

-    sw.println("public String getName() {");
-    sw.indent();
-    sw.println("return \"" + method.getName() + "\";");
-    sw.outdent();
-    sw.println("}");
-
      /*
       * getOverridableMethods is used to handle CssResources extending
       * non-CssResource types. See the discussion in  
computeReplacementsForType.
@@ -911,6 +910,28 @@
      sw.outdent();
      sw.println("}");
    }
+
+  private void writeEnsureInjected(SourceWriter sw) {
+    sw.println("private boolean injected;");
+    sw.println("public boolean ensureInjected() {");
+    sw.indent();
+    sw.println("if (!injected) {");
+    sw.indentln("injected = true;");
+    sw.indentln(StyleInjector.class.getName()  
+ ".injectStylesheet(getText());");
+    sw.indentln("return true;");
+    sw.println("}");
+    sw.println("return false;");
+    sw.outdent();
+    sw.println("}");
+  }
+
+  private void writeGetName(JMethod method, SourceWriter sw) {
+    sw.println("public String getName() {");
+    sw.indent();
+    sw.println("return \"" + method.getName() + "\";");
+    sw.outdent();
+    sw.println("}");
+  }

    /**
     * Write all of the user-defined methods in the CssResource subtype.
@@ -927,7 +948,8 @@

      for (JMethod toImplement : methods) {
        String name = toImplement.getName();
-      if ("getName".equals(name) || "getText".equals(name)) {
+      if ("getName".equals(name) || "getText".equals(name)
+          || "ensureInjected".equals(name)) {
          continue;
        }

=======================================
--- /trunk/user/test/com/google/gwt/resources/client/CSSResourceTest.java       
 
Mon Jul  6 08:09:11 2009
+++ /trunk/user/test/com/google/gwt/resources/client/CSSResourceTest.java       
 
Tue Sep 29 13:58:28 2009
@@ -135,6 +135,10 @@
      @Strict
      HasDescendants descendants();

+    // Make sure an empty, no-op CssResource works
+    @Strict
+    CssResource empty();
+
      @Source("16x16.png")
      ImageResource spriteMethod();
    }
@@ -291,6 +295,17 @@
      assertFalse("10px".equals(defines.overrideIntClass()));
      assertFalse("10".equals(defines.overrideIntClass()));
    }
+
+  public void testEnsureInjected() {
+    Resources r = GWT.create(Resources.class);
+    assertTrue(r.empty().ensureInjected());
+
+    r = GWT.create(Resources.class);
+    assertFalse(r.empty().ensureInjected());
+
+    r = GWT.create(ChildResources.class);
+    assertTrue(r.empty().ensureInjected());
+  }

    public void testMultipleBundles() {
      Resources r1 = GWT.create(Resources.class);

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

Reply via email to