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
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
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
* 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
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);