]> source.dussan.org Git - gwtquery.git/commitdiff
- correct live implementation to accept an array of Function
authorJulien Dramaix <julien.dramaix@gmail.com>
Sun, 10 Apr 2011 07:10:31 +0000 (07:10 +0000)
committerJulien Dramaix <julien.dramaix@gmail.com>
Sun, 10 Apr 2011 07:10:31 +0000 (07:10 +0000)
- method live(String, Object, Function) loop on itself

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/main/java/com/google/gwt/query/client/plugins/events/EventsListener.java
gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryEventsTest.java

index 787963366ccc8da25a82cfd4cb56d831088c29c4..f16abc8d1a176f189300fd728e9638d76678091f 100644 (file)
@@ -2105,8 +2105,8 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
    * </ul>\r
    * </p>\r
    */\r
-  public GQuery live(String eventName, Object data, Function func) {\r
-    return as(Events).live(eventName, data, func);\r
+  public GQuery live(String eventName, Object data, Function... funcs) {\r
+    return as(Events).live(eventName, data, funcs);\r
   }\r
 \r
   /**\r
index edf79fbba195237137aee31103f7ac4e89610293..820013eac508194192ddf70e8649ce5ceae14281 100644 (file)
@@ -351,6 +351,19 @@ public interface LazyGQuery<T> extends LazyBase<T>{
    */
   LazyGQuery<T> bind(int eventbits, Object data, Function... funcs);
 
+  /**
+   * Binds a set of handlers to a particular Event for each matched element.
+   * 
+   * The event handlers are passed as Functions that you can use to prevent
+   * default behavior. To stop both default action and event bubbling, the
+   * function event handler has to return false.
+   * 
+   * You can pass an additional Object data to your Function as the second
+   * parameter
+   * 
+   */
+  LazyGQuery<T> bind(String eventType, Object data, Function... funcs);
+
   /**
    * Bind a set of functions to the blur event of each matched element. Or
    * trigger the event if no functions are provided.
@@ -1124,7 +1137,7 @@ public interface LazyGQuery<T> extends LazyBase<T>{
    * </ul>
    * </p>
    */
-  LazyGQuery<T> live(String eventName, Object data, Function func);
+  LazyGQuery<T> live(String eventName, Object data, Function... funcs);
 
   /**
    * Bind a function to the load event of each matched element.
index 501d2cb5b5bba9357a3355aa91bd708c17e7169c..07dc9c8f924cef2ff6bc8d1c82e85fd5125956e7 100644 (file)
@@ -26,6 +26,7 @@ import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.EventListener;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -90,19 +91,25 @@ public class EventsListener implements EventListener {
   private static class LiveBindFunction extends BindFunction {
 
     // TODO can be a list of BindFunction
-    Map<String, BindFunction> bindFunctionBySelector;
+    Map<String, List<BindFunction>> bindFunctionBySelector;
 
     LiveBindFunction(int type, String namespace) {
 
       super(type, namespace, null, null, -1);
-      bindFunctionBySelector = new HashMap<String, BindFunction>();
+      bindFunctionBySelector = new HashMap<String, List<BindFunction>>();
     }
 
     /**
      * Add a {@link BindFunction} for a specific css selector
      */
     public void addBindFunctionForSelector(String cssSelector, BindFunction f) {
-      bindFunctionBySelector.put(cssSelector, f);
+      List<BindFunction> bindFunctions = bindFunctionBySelector.get(cssSelector);
+      if (bindFunctions == null) {
+        bindFunctions = new ArrayList<BindFunction>();
+        bindFunctionBySelector.put(cssSelector, bindFunctions);
+      }
+
+      bindFunctions.add(f);
     }
 
     @Override
@@ -137,14 +144,21 @@ public class EventsListener implements EventListener {
       com.google.gwt.query.client.plugins.events.Event gqEvent = com.google.gwt.query.client.plugins.events.Event.create(event);
 
       for (String cssSelector : realCurrentTargetBySelector.keySet()) {
-        BindFunction f = bindFunctionBySelector.get(cssSelector);
-        for (Element element : realCurrentTargetBySelector.get(cssSelector)) {
-          gqEvent.setCurrentElementTarget(element);
-          boolean subResult = f.fire(gqEvent);
-          result &= subResult;
-          if (!subResult) {
-            // Event should not continue to be bubbled, break the second for
-            break;
+        List<BindFunction> bindFunctions = bindFunctionBySelector.get(cssSelector);
+        
+        if (bindFunctions == null){
+          continue;
+        }
+        
+        for (BindFunction f : bindFunctions) {
+          for (Element element : realCurrentTargetBySelector.get(cssSelector)) {
+            gqEvent.setCurrentElementTarget(element);
+            boolean subResult = f.fire(gqEvent);
+            result &= subResult;
+            if (!subResult) {
+              // Event should not continue to be bubbled, break the second for
+              break;
+            }
           }
         }
       }
@@ -159,8 +173,8 @@ public class EventsListener implements EventListener {
     /**
      * Remove the BindFunction associated to this cssSelector
      */
-    public BindFunction removeBindFunctionForSelector(String cssSelector) {
-      return bindFunctionBySelector.remove(cssSelector);
+    public void removeBindFunctionForSelector(String cssSelector) {
+       bindFunctionBySelector.remove(cssSelector);
     }
 
     /**
@@ -328,7 +342,7 @@ public class EventsListener implements EventListener {
       bind(b, nameSpace, data, function, -1);
     }
   }
-  
+
   public void die(String eventName, String cssSelector) {
     int eventType = "submit".equals(eventName) ? eventType = ONSUBMIT
         : Event.getTypeInt(eventName);
@@ -370,13 +384,15 @@ public class EventsListener implements EventListener {
     return getGwtEventListener(element);
   }
 
-  public void live(String eventName, String cssSelector, Object data, Function... f) {
+  public void live(String eventName, String cssSelector, Object data,
+      Function... f) {
     int eventType = "submit".equals(eventName) ? eventType = ONSUBMIT
         : Event.getTypeInt(eventName);
     live(eventType, cssSelector, data, f);
   }
-  
-  public void live(int eventbits, String cssSelector, Object data, Function... funcs) {
+
+  public void live(int eventbits, String cssSelector, Object data,
+      Function... funcs) {
 
     // is a LiveBindFunction already attached for this kind of event
     LiveBindFunction liveBindFunction = liveBindFunctionByEventType.get(eventbits);
@@ -388,9 +404,9 @@ public class EventsListener implements EventListener {
       liveBindFunctionByEventType.put(eventbits, liveBindFunction);
     }
 
-    for (Function f: funcs) {
-      liveBindFunction.addBindFunctionForSelector(cssSelector, new BindFunction(
-          eventbits, "live", f, data));
+    for (Function f : funcs) {
+      liveBindFunction.addBindFunctionForSelector(cssSelector,
+          new BindFunction(eventbits, "live", f, data));
     }
 
   }
@@ -398,8 +414,7 @@ public class EventsListener implements EventListener {
   public void onBrowserEvent(Event event) {
     double now = Duration.currentTimeMillis();
     // Workaround for Issue_20
-    if (lastType == event.getTypeInt()
-        && now - lastEvnt < 10
+    if (lastType == event.getTypeInt() && now - lastEvnt < 10
         && "body".equalsIgnoreCase(element.getTagName())) {
       return;
     }
index 99515ec3b91bd33a07a946d3ff6796120f3cfa3e..af3f24654e6894998ede747668c4010ff166626e 100644 (file)
@@ -363,6 +363,54 @@ public class GQueryEventsTest extends GWTTestCase {
     
     
   }
+  
+public void testLiveWithMultipleFunction() {
+    
+    $(e).html("<div id='div1'><div id='div2'>Content 1<span id='span1'> blop</span></div></div>");
+    
+    $(".clickable", e).live("click", new Function(){
+      public void f(Element e) {
+        $(e).css(CSS.COLOR.with(RGBColor.RED));
+      }
+    }, new Function(){
+      public void f(Element e) {
+        $(e).css(CSS.BACKGROUND_COLOR.with(RGBColor.YELLOW));
+      }
+    });
+    
+    $("#div1", e).addClass("clickable");
+    
+    $("#span1", e).click();
+    
+    assertEquals("red", $("#div1", e).css(CSS.COLOR));
+    assertNotSame("yellow", $("#div1", e).css(CSS.BACKGROUND_COLOR));
+    
+    
+  }
+
+public void testLiveWithMultipleEvent() {
+  
+  $(e).html("<div id='div1'><div id='div2'>Content 1<span id='span1'> blop</span></div></div>");
+  
+  $(".clickable", e).live(Event.ONCLICK | Event.ONMOUSEMOVE, new Function(){
+    public void f(Element e) {
+      $(e).css(CSS.COLOR.with(RGBColor.RED));
+    }
+  });
+  
+  $("#div1", e).addClass("clickable");
+  
+  $("#span1", e).click();
+  
+  assertEquals("red", $("#div1", e).css(CSS.COLOR));
+  //reset
+  $("#div1", e).css(CSS.COLOR.with(RGBColor.BLACK));
+  
+  
+  
+}
+
 
   public void testNamedBinding() {
     $(e).html("<p>Content</p>");
@@ -475,30 +523,7 @@ public class GQueryEventsTest extends GWTTestCase {
     assertEquals($("#test").attr("tabIndex"), "2");
   }
   
-  public void testUnbindMultipleEvents() {
-    String content = "<p>content</p>";
-    $(e).html(content);
-    $(document).bind(Event.ONMOUSEMOVE, null, new Function() {
-      public void f(Element e){
-        $("p").css(CSS.COLOR.with(RGBColor.RED));
-      }
-    });
-    $(document).bind(Event.ONMOUSEUP, null, new Function(){
-      public void f(Element e){
-        $("p").css(CSS.COLOR.with(RGBColor.YELLOW));
-      }
-    });
-    $(document).trigger(Event.ONMOUSEMOVE);
-    assertEquals("red", $("p").css("color"));
-    $(document).trigger(Event.ONMOUSEUP);
-    assertEquals("yellow", $("p").css("color"));
-    $("p").css(CSS.COLOR.with(RGBColor.BLACK));
-    $(document).unbind(Event.ONMOUSEUP|Event.ONMOUSEMOVE);
-    $(document).trigger(Event.ONMOUSEMOVE);
-    assertEquals("black", $("p").css("color"));
-    $(document).trigger(Event.ONMOUSEUP);
-    assertEquals("black", $("p").css("color"));
-  }
+  
 
   public void testWidgetEvents() {
     final Button b = new Button("click-me");