]> source.dussan.org Git - gwtquery.git/commitdiff
add nextUntil, prevUntil, parentsUntil methods + tests
authorJulien Dramaix <julien.dramaix@gmail.com>
Thu, 14 Apr 2011 19:26:07 +0000 (19:26 +0000)
committerJulien Dramaix <julien.dramaix@gmail.com>
Thu, 14 Apr 2011 19:26:07 +0000 (19:26 +0000)
gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java
gwtquery-core/src/main/java/com/google/gwt/query/client/LazyGQuery.java
gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryCoreTest.java

index 86127f6f9a44a6ceff1652b1737778bb15489f04..be82dd73a3039f1d790af26175b16223ce663793 100644 (file)
@@ -918,7 +918,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
   public GQuery children() {\r
     JsNodeArray result = JsNodeArray.create();\r
     for (Element e : elements()) {\r
-      allNextSiblingElements(e.getFirstChildElement(), result, null);\r
+      allNextSiblingElements(e.getFirstChildElement(), result, null, null);\r
     }\r
     return new GQuery(unique(result));\r
   }\r
@@ -2387,16 +2387,32 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
     return pushStack(result, "next", selectors[0]).filter(selectors);\r
   }\r
 \r
+  \r
   /**\r
    * Find all sibling elements after the current element.\r
    */\r
   public GQuery nextAll() {\r
     JsNodeArray result = JsNodeArray.create();\r
     for (Element e : elements()) {\r
-      allNextSiblingElements(e.getNextSiblingElement(), result, null);\r
+      allNextSiblingElements(e.getNextSiblingElement(), result, null, null);\r
     }\r
     return pushStack(unique(result), "nextAll", getSelector());\r
   }\r
+  \r
+  /**\r
+   * Get all following siblings of each element up to but not including the\r
+   * element matched by the selector.\r
+   * \r
+   * @param selector\r
+   * @return\r
+   */\r
+  public GQuery nextUntil(String selector) {\r
+    JsNodeArray result = JsNodeArray.create();\r
+    for (Element e : elements()) {\r
+      allNextSiblingElements(e.getNextSiblingElement(), result, null, selector);\r
+    }\r
+    return pushStack(unique(result), "nextUntil", getSelector());\r
+  }\r
 \r
   /**\r
    * Removes the specified Element from the set of matched elements. This method\r
@@ -2558,15 +2574,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * elements (except for the root element).\r
    */\r
   public GQuery parents() {\r
-    JsNodeArray result = JsNodeArray.create();\r
-    for (Element e : elements()) {\r
-      Node par = e.getParentNode();\r
-      while (par != null && par != document) {\r
-        result.addNode(par);\r
-        par = par.getParentNode();\r
-      }\r
-    }\r
-    return new GQuery(unique(result));\r
+    return parentsUntil(null);\r
   }\r
 \r
   /**\r
@@ -2577,6 +2585,27 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
   public GQuery parents(String... filters) {\r
     return parents().filter(filters);\r
   }\r
+  \r
+  /**\r
+   * Get the ancestors of each element in the current set of matched elements,\r
+   * up to but not including the element matched by the selector.\r
+   *\r
+   */\r
+  public GQuery parentsUntil(String selector) {\r
+    JsNodeArray result = JsNodeArray.create();\r
+    for (Element e : elements()) {\r
+      Node par = e.getParentNode();\r
+      while (par != null && par != document) {\r
+        if (selector != null && $(par).is(selector)) {\r
+          break;\r
+        }\r
+        result.addNode(par);\r
+        par = par.getParentNode();\r
+      }\r
+    }\r
+    return new GQuery(unique(result));\r
+  }\r
\r
 \r
   /**\r
    * Gets the top and left position of an element relative to its offset parent.\r
@@ -2729,10 +2758,21 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
   public GQuery prevAll() {\r
     JsNodeArray result = JsNodeArray.create();\r
     for (Element e : elements()) {\r
-      allPreviousSiblingElements(getPreviousSiblingElement(e), result);\r
+      allPreviousSiblingElements(getPreviousSiblingElement(e), result, null);\r
     }\r
     return pushStack(unique(result), "prevAll", getSelector());\r
   }\r
+  \r
+  /**\r
+   * Find all sibling elements in front of the current element.\r
+   */\r
+  public GQuery prevUntil(String selector) {\r
+    JsNodeArray result = JsNodeArray.create();\r
+    for (Element e : elements()) {\r
+      allPreviousSiblingElements(getPreviousSiblingElement(e), result, selector);\r
+    }\r
+    return pushStack(unique(result), "prevUntil", getSelector());\r
+  }\r
 \r
   /**\r
    * Put a {@link Function} at the end of the Effects queue.\r
@@ -3126,7 +3166,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
     JsNodeArray result = JsNodeArray.create();\r
     for (Element e : elements()) {\r
       allNextSiblingElements(e.getParentElement().getFirstChildElement(),\r
-          result, e);\r
+          result, e, null);\r
     }\r
     return new GQuery(unique(result));\r
   }\r
@@ -3819,8 +3859,13 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
   }\r
 \r
   private void allNextSiblingElements(Element firstChildElement,\r
-      JsNodeArray result, Element elem) {\r
+      JsNodeArray result, Element elem, String untilSelector) {\r
     while (firstChildElement != null) {\r
+      \r
+      if (untilSelector != null && $(firstChildElement).is(untilSelector)){\r
+        return;\r
+      }\r
+      \r
       if (firstChildElement != elem) {\r
         result.addNode(firstChildElement);\r
       }\r
@@ -3829,8 +3874,11 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
   }\r
 \r
   private void allPreviousSiblingElements(Element firstChildElement,\r
-      JsNodeArray result) {\r
+      JsNodeArray result, String untilSelector) {\r
     while (firstChildElement != null) {\r
+      if (untilSelector != null && $(firstChildElement).is(untilSelector)){\r
+        return;\r
+      }\r
       result.addNode(firstChildElement);\r
       firstChildElement = getPreviousSiblingElement(firstChildElement);\r
     }\r
index db127353f591a5e3266c44f51e87aa4d92c75e27..fc7e5d7bb2740ebcf026522c796d248dae8a3b6f 100644 (file)
@@ -1367,6 +1367,15 @@ public interface LazyGQuery<T> extends LazyBase<T>{
    */
   LazyGQuery<T> nextAll();
 
+  /**
+   * Get all following siblings of each element up to but not including the
+   * element matched by the selector.
+   * 
+   * @param selector
+   * @return
+   */
+  LazyGQuery<T> nextUntil(String selector);
+
   /**
    * Removes the specified Element from the set of matched elements. This method
    * is used to remove a single Element from a jQuery object.
@@ -1462,6 +1471,13 @@ public interface LazyGQuery<T> extends LazyBase<T>{
    */
   LazyGQuery<T> parents(String... filters);
 
+  /**
+   * Get the ancestors of each element in the current set of matched elements,
+   * up to but not including the element matched by the selector.
+   *
+   */
+  LazyGQuery<T> parentsUntil(String selector);
+
   /**
    * Gets the top and left position of an element relative to its offset parent.
    * The returned object contains two Integer properties, top and left. For
@@ -1540,6 +1556,11 @@ public interface LazyGQuery<T> extends LazyBase<T>{
    */
   LazyGQuery<T> prevAll();
 
+  /**
+   * Find all sibling elements in front of the current element.
+   */
+  LazyGQuery<T> prevUntil(String selector);
+
   /**
    * Put a {@link Function} at the end of the Effects queue.
    * 
index 6308403072dfab8893ee74e231ec96af34cded26..865554155e33bf6add357d22d7c4439fea8ba6fc 100644 (file)
@@ -546,6 +546,22 @@ public class GQueryCoreTest extends GWTTestCase {
     assertEquals(1, $("span", e).parents().filter("body").size());
     $("span", e).parents().filter("body").toString().trim().toLowerCase().contains(
         content.toLowerCase());
+    
+    //parentsUntil()
+    content = "<div id='mainDiv'><div id='subDiv1' class='subDiv'><div id='subSubDiv1'><p id='p1'>child1</p></div></div><div id='subDiv2' class='subDiv'><div id='subSubDiv2'><p id='p2'>child2</p></div></div></div>";
+    $(e).html(content);
+    $("p",e).parentsUntil("#mainDiv").css(CSS.COLOR.with(RGBColor.RED));
+    assertEquals("red", $("#subDiv1", e).css(CSS.COLOR));
+    assertEquals("red", $("#subSubDiv1", e).css(CSS.COLOR));
+    assertEquals("red", $("#subDiv2", e).css(CSS.COLOR));
+    assertEquals("red", $("#subSubDiv2", e).css(CSS.COLOR));
+    assertEquals("", $("#mainDiv", e).css(CSS.COLOR));
+    assertEquals("", $("#p1", e).css(CSS.COLOR));
+    assertEquals("", $("#p2", e).css(CSS.COLOR));
+    
+    $("#p1",e).parentsUntil(".subDiv").css(CSS.COLOR.with(RGBColor.YELLOW));
+    assertEquals("red", $("#subDiv1", e).css(CSS.COLOR));
+    assertEquals("yellow", $("#subSubDiv1", e).css(CSS.COLOR));
 
     // is()
     content = "<form><input type=\"checkbox\"></form>";
@@ -580,6 +596,14 @@ public class GQueryCoreTest extends GWTTestCase {
     assertEquals(2, $("li.third-item", e).nextAll().size());
     assertHtmlEquals(expected, $("li.third-item", e).nextAll());
 
+    // nextUntil()
+    content = "<ul><li>i1</li><li>i2</li><li class='third-item'>i3</li><li>i4</li><li class='five-item'>i5</li></ul>";
+    expected = "<li>i4</li>";
+    $(e).html(content);
+    assertEquals(1, $("li.third-item", e).nextUntil(".five-item").size());
+    assertHtmlEquals(expected, $("li.third-item", e).nextUntil(".five-item"));
+
+    
     // andSelf()
     content = "<ul><li>i1</li><li>i2</li><li class=\"third-item\">i3</li><li>i4</li><li>i5</li></ul>";
     expected = "<li>i4</li><li>i5</li><li class=\"third-item\">i3</li>";
@@ -601,6 +625,21 @@ public class GQueryCoreTest extends GWTTestCase {
     assertEquals(2, $("p", e).prev().size());
     assertEquals(1, $("p", e).prev(".selected").size());
     assertHtmlEquals(expected, $("p", e).prev(".selected").get(0).getString());
+    
+    // prevAll()
+    content = "<ul><li>i1</li><li>i2</li><li class='third-item'>i3</li><li>i4</li><li class='five-item'>i5</li></ul>";
+    expected = "<li>i4</li><li class='third-item'>i3</li><li>i2</li><li>i1</li>";
+    $(e).html(content);
+    assertEquals(4, $("li.five-item", e).prevAll().size());
+    assertHtmlEquals(expected, $("li.five-item", e).prevAll());
+
+    
+    // prevUntil()
+    content = "<ul><li>i1</li><li>i2</li><li class='third-item'>i3</li><li>i4</li><li class='five-item'>i5</li></ul>";
+    expected = "<li>i4</li>";
+    $(e).html(content);
+    assertEquals(1, $("li.five-item", e).prevUntil(".third-item").size());
+    assertHtmlEquals(expected, $("li.five-item", e).prevUntil(".third-item"));
 
     // siblings()
     content = "<p>Hello</p><div id='mdiv'><span>Hello Again</span></div><p>And Again</p>";