]> source.dussan.org Git - gwtquery.git/commitdiff
Fix issue 57
authorJulien Dramaix <julien.dramaix@gmail.com>
Tue, 11 Jan 2011 17:37:29 +0000 (17:37 +0000)
committerJulien Dramaix <julien.dramaix@gmail.com>
Tue, 11 Jan 2011 17:37:29 +0000 (17:37 +0000)
gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java
gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTest.java

index a14216d6eb6213ef589a991296dd22bd42d69dcd..b9cea84d966f0bffa077f95939828795bf86fe09 100644 (file)
@@ -19,11 +19,6 @@ import static com.google.gwt.query.client.plugins.Effects.Effects;
 import static com.google.gwt.query.client.plugins.Events.Events;\r
 import static com.google.gwt.query.client.plugins.Widgets.Widgets;\r
 \r
-import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.HashMap;\r
-import java.util.List;\r
-\r
 import com.google.gwt.core.client.GWT;\r
 import com.google.gwt.core.client.JavaScriptObject;\r
 import com.google.gwt.core.client.JsArray;\r
@@ -38,8 +33,8 @@ import com.google.gwt.dom.client.Node;
 import com.google.gwt.dom.client.NodeList;\r
 import com.google.gwt.dom.client.OptionElement;\r
 import com.google.gwt.dom.client.SelectElement;\r
-import com.google.gwt.dom.client.Style.Display;\r
 import com.google.gwt.dom.client.TextAreaElement;\r
+import com.google.gwt.dom.client.Style.Display;\r
 import com.google.gwt.query.client.css.CssProperty;\r
 import com.google.gwt.query.client.css.Length;\r
 import com.google.gwt.query.client.css.Percentage;\r
@@ -53,6 +48,11 @@ import com.google.gwt.user.client.EventListener;
 import com.google.gwt.user.client.Window;\r
 import com.google.gwt.user.client.ui.Widget;\r
 \r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+\r
 /**\r
  * Gwt Query is a GWT clone of the popular jQuery library.\r
  */\r
@@ -1720,8 +1720,45 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * accurate calculations make sure to use pixel values for margins, borders\r
    * and padding. This method only works with visible elements.\r
    */\r
-  public com.google.gwt.query.client.GQuery.Offset position() {\r
-    return new Offset(get(0).getOffsetLeft(), get(0).getOffsetTop());\r
+  public Offset position() {\r
+    Element element = get(0);\r
+    if (element == null) {\r
+      return null;\r
+    }\r
+    // Get *real* offsetParent\r
+    Element offsetParent = element.getOffsetParent();\r
+    // Get correct offsets\r
+    Offset offset = offset();\r
+    Offset parentOffset = null;\r
+    if ("body".equalsIgnoreCase(offsetParent.getNodeName())\r
+        || "html".equalsIgnoreCase(offsetParent.getNodeName())) {\r
+      parentOffset = new Offset(0, 0);\r
+    } else {\r
+      parentOffset = $(offsetParent).offset();\r
+    }\r
+\r
+    // Subtract element margins\r
+    int topMargin = (int) GQUtils.cur(element, "marginTop", true);\r
+    // When margin-left = auto, Safari and chrome return a value while IE and\r
+    // Firefox return 0\r
+    // force the margin-left to 0 if margin-left = auto.\r
+    int leftMargin = 0;\r
+    if (!"auto".equals(element.getStyle().getMarginLeft())) {\r
+      leftMargin = (int) GQUtils.cur(element, "marginLeft", true);\r
+    }\r
+\r
+    offset = offset.add(-leftMargin, -topMargin);\r
+\r
+    // Add offsetParent borders\r
+    int parentOffsetBorderTop = (int) GQUtils.cur(offsetParent,\r
+        "borderTopWidth", true);\r
+    int parentOffsetBorderLeft = (int) GQUtils.cur(offsetParent,\r
+        "borderLeftWidth", true);\r
+    parentOffset = parentOffset.add(parentOffsetBorderLeft,\r
+        parentOffsetBorderTop);\r
+\r
+    // Subtract the two offsets\r
+    return offset.add(-parentOffset.left, -parentOffset.top);\r
   }\r
 \r
   /**\r
index fd9d7dcc6702bef630c2b7fbc1eadbdc52996fa8..e287f29481d6e1cd3b1d2f2fb9cdb2fa1754ed4f 100644 (file)
@@ -460,6 +460,20 @@ public class GQueryCoreTest extends GWTTestCase {
     assertEquals("0.4", g.css("opacity", true));
   }
   
+  public void testPosition(){
+    $(e).html("<div style='top:25px; left:25px; padding:20px; position:relative;'><div id='child' style='margin:30px'>test</div></div> ");
+    GQuery g = $("#child");
+    assertEquals(20, g.position().left);
+    assertEquals(20, g.position().top);
+    
+    $(e).html("<div style='top:25px; left:25px; position:relative;'><div id='child' style='position:relative; top:15px; left:35px;'>test</div></div> ");
+    g = $("#child");
+    assertEquals(35, g.position().left);
+    assertEquals(15, g.position().top);
+    
+
+  }
+  
   public void testProperties() {
     Properties p = $$("border:'1px solid black'");
     assertEquals(1, p.keys().length);