]> source.dussan.org Git - gwtquery.git/commitdiff
Fix width/height methods, fixes ISSUE 145 (thanks to Wanjunfeng)
authorManolo Carrasco <manolo@apache.org>
Mon, 10 Sep 2012 09:04:24 +0000 (09:04 +0000)
committerManolo Carrasco <manolo@apache.org>
Mon, 10 Sep 2012 09:04:24 +0000 (09:04 +0000)
gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java
gwtquery-core/src/main/java/com/google/gwt/query/client/impl/DocumentStyleImpl.java
gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTestGwt.java

index 7bbae11e129036756080a2c92ca260002eace674..b18e3b036f9a2c0cb28a00b0ddc83f7b32c55ab6 100644 (file)
@@ -2363,7 +2363,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * scrollbar height, border, or margin.\r
    */\r
   public int innerHeight() {\r
-    return isEmpty() ? 0 : get(0).getClientHeight();\r
+    return (int) cur("clientHeight", true);\r
   }\r
 \r
   /**\r
@@ -2371,7 +2371,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * scrollbar width, border, or margin.\r
    */\r
   public int innerWidth() {\r
-    return isEmpty() ? 0 : get(0).getClientWidth();\r
+    return (int) cur("clientWidth", true);\r
   }\r
 \r
   /**\r
@@ -2987,7 +2987,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
       return 0;\r
     }\r
     // height including padding and border\r
-    int outerHeight = get(0).getOffsetHeight();\r
+    int outerHeight = (int)cur("offsetHeight", true);\r
     if (includeMargin) {\r
       outerHeight += cur("marginTop", true) + cur("marginBottom", true);\r
     }\r
@@ -3011,7 +3011,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
       return 0;\r
     }\r
     // width including padding and border\r
-    int outerWidth = get(0).getOffsetWidth();\r
+    int outerWidth = (int)cur("offsetWidth", true);\r
     if (includeMargin) {\r
       outerWidth += cur("marginRight", true) + cur("marginLeft", true);\r
     }\r
index ac836e8d68ac38fe9772804aa75ce81732182ecc..39e8ee0992bccb3ff5254a96ecd46c52b86da2bd 100644 (file)
@@ -29,7 +29,9 @@ import com.google.gwt.user.client.DOM;
  */
 public class DocumentStyleImpl {
   
-  private static final JsRegexp cssNumber = new JsRegexp("^(fillOpacity|fontWeight|lineHeight|opacity|orphans|widows|zIndex|zoom)$", "i");
+  private static final JsRegexp cssNumberRegex = new JsRegexp("^(fillOpacity|fontWeight|lineHeight|opacity|orphans|widows|zIndex|zoom)$", "i");
+  private static final JsRegexp sizeRegex = new JsRegexp("^(client|offset|)(width|height)$", "i");
+
 
   /**
    * Returns the numeric value of a css property.
@@ -48,9 +50,13 @@ public class DocumentStyleImpl {
         return getContentDocument(elem).getClientHeight();
       }
       elem = GQuery.body;
-    }
-    if (elem.getPropertyString(prop) != null
+    } 
+    
+    if (force && sizeRegex.test(prop)) {
+      // make curCSS below resolve width and height (issue #145) when force is true
+    } else if (elem.getPropertyString(prop) != null
         && (elem.getStyle() == null || elem.getStyle().getProperty(prop) == null)) {
+      // cases where elem.prop exists instead of elem.style.prop
       return elem.getPropertyDouble(prop);
     }
     String val = curCSS(elem, prop, force);
@@ -65,7 +71,7 @@ public class DocumentStyleImpl {
       val = curCSS(elem, prop, false); 
     }
     val = val.trim().replaceAll("[^\\d\\.\\-]+.*$", "");
-    return val.length() == 0 ? 0 : Double.parseDouble(val);
+    return val.isEmpty() ? 0 : Double.parseDouble(val);
   }
   
   /**
@@ -87,15 +93,12 @@ public class DocumentStyleImpl {
     name = fixPropertyName(name);
     //value defined in the element style
     String ret = elem.getStyle().getProperty(name);
-    
-    if ("height".equalsIgnoreCase(name)) {
-      return force ? String.valueOf(getHeight(elem))+"px" : ret;
+
+    if (force && sizeRegex.test(name)) {
+      return getVisibleSize(elem, name) + "px";
     }
-    if ("width".equalsIgnoreCase(name)) {
-      return force ? String.valueOf(getWidth(elem))+"px" : ret;
-    }    
-    if ("opacity".equalsIgnoreCase(name)) {
-      return force ? String.valueOf(getOpacity(elem)) : ret;
+    if (force && "opacity".equalsIgnoreCase(name)) {
+      return String.valueOf(getOpacity(elem));
     }
     if (force) {
       ret = getComputedStyle(elem, JsUtils.hyphenize(name), name, null);
@@ -114,6 +117,26 @@ public class DocumentStyleImpl {
     }
     return JsUtils.camelize(name);
   }
+  
+  public int getVisibleSize(Element e, String name) {
+    int ret;
+    if (!isVisible(e)) {
+      // jquery returns the size of the element even when the element isn't visible
+      String display = curCSS(e, "display", false);
+      String position = curCSS(e, "position", false);
+      String visibility = curCSS(e, "visibility", false);
+      setStyleProperty(e, "display", "block");
+      setStyleProperty(e, "position", "absolute");
+      setStyleProperty(e, "visibility", "hidden");
+      ret = getSize(e, name);
+      setStyleProperty(e, "display", display);
+      setStyleProperty(e, "position", position);
+      setStyleProperty(e, "visibility", visibility);
+    } else {
+      ret = getSize(e, name);
+    }
+    return ret;
+  }
 
   // inline elements do not have width nor height unless we set it to inline-block
   private void fixInlineElement(Element e) {
@@ -124,6 +147,24 @@ public class DocumentStyleImpl {
     }
   }
   
+  private int getSize(Element e, String name) {
+    int ret = 0;
+    if ("width".equals(name)) {
+      ret = getWidth(e);
+    } else if ("height".equals(name)) {
+      ret = getHeight(e);
+    } else if ("clientWidth".equals(name)) {
+      ret = e.getClientWidth();
+    } else if ("clientHeight".equals(name)) {
+      ret = e.getClientHeight();
+    } else if ("offsetWidth".equals(name)) {
+      ret = e.getOffsetWidth();
+    } else if ("offsetHeight".equals(name)) {
+      ret = e.getOffsetHeight();      
+    }
+    return ret;
+  }
+  
   public int getHeight(Element e) {
     fixInlineElement(e);
     return (int) (e.getClientHeight() - num(curCSS(e, "paddingTop", true)) - num(curCSS(e, "paddingBottom", true)));
@@ -175,7 +216,7 @@ public class DocumentStyleImpl {
     if (val == null || val.trim().length() == 0) {
       removeStyleProperty(e, prop);
     } else {
-      if (val.matches("-?[\\d\\.]+") && !cssNumber.test(prop)) {
+      if (val.matches("-?[\\d\\.]+") && !cssNumberRegex.test(prop)) {
         val += "px";
       }
       e.getStyle().setProperty(prop, val);
index 41b0849ea77221ff2d6da5fd727a2ca0ff83e123..c0843612d1e4d4085de056c53582ec05f3caba89 100644 (file)
@@ -499,7 +499,7 @@ public class GQueryCoreTestGwt extends GWTTestCase {
     assertEquals("0.6", g.css("opacity", true));
     g.css("opacity", "");
     assertEquals("", g.css("opacity", false));
-    assertEquals("1.0", g.css("opacity", true));
+    assertEquals("1", g.css("opacity", true).replaceFirst("\\.0$", ""));
     g.css("opacity", "0.4");
     assertEquals("0.4", g.css("opacity", false));
     assertEquals("0.4", g.css("opacity", true));
@@ -539,7 +539,7 @@ public class GQueryCoreTestGwt extends GWTTestCase {
     
   }
 
-  public void testProperties() {
+  public void aatestProperties() {
     Properties p = $$("border:'1px solid black'");
     assertEquals(1, p.keys().length);
     assertNotNull(p.getStr("border"));
@@ -1146,7 +1146,26 @@ public class GQueryCoreTestGwt extends GWTTestCase {
     assertEquals(122, g.outerWidth());
     assertEquals(142, g.outerHeight(true));
     assertEquals(142, g.outerWidth(true));
-
+    
+    // When hiding the element we should get the same sizes
+    $(e).hide();
+    
+    assertEquals(100, g.width());
+    assertEquals(100, g.height());
+    assertEquals(120, g.innerWidth());
+    assertEquals(120, g.innerHeight());
+    assertEquals(100d, g.cur("width", false));
+    assertEquals(100d, g.cur("height", false));
+    assertEquals(100d, g.cur("width", true));
+    assertEquals(100d, g.cur("height", true));
+    assertEquals("100px", g.css("width"));
+    assertEquals("100px", g.css("height"));
+    assertEquals("100px", g.get(0).getStyle().getProperty("width"));
+    assertEquals("100px", g.get(0).getStyle().getProperty("height"));
+    assertEquals(122, g.outerHeight());
+    assertEquals(122, g.outerWidth());
+    assertEquals(142, g.outerHeight(true));
+    assertEquals(142, g.outerWidth(true));
   }
   
   public void testWidthHeightInlineElement() {