]> source.dussan.org Git - gwtquery.git/commitdiff
Allow unbinding of certain functions like jquery does
authorManolo Carrasco <manolo@apache.org>
Wed, 14 Mar 2012 13:04:35 +0000 (13:04 +0000)
committerManolo Carrasco <manolo@apache.org>
Wed, 14 Mar 2012 13:04:35 +0000 (13:04 +0000)
gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java
gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/Events.java
gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/MousePlugin.java
gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/ajax/Ajax.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/GQueryEventsTestGwt.java

index 03b50d65aa3eaa15668d7435bf0ab75e4cfab557..9680fdd931c3c13f1539f25f1e6f9825de83788f 100644 (file)
@@ -4092,11 +4092,26 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
     return as(Events).unbind(eventbits);\r
   }\r
   \r
+  /**\r
+   * Removes the function passed from the set of events which match \r
+   * the eventbits.\r
+   */\r
+  public GQuery unbind(int eventbits, Function f) {\r
+    return as(Events).unbind(eventbits, null, f);\r
+  }\r
+  \r
   /**\r
    * Removes all events that match the eventList.\r
    */\r
   public GQuery unbind(String eventList) {\r
-    return as(Events).unbind(eventList);\r
+    return unbind(eventList, null);\r
+  }\r
+  \r
+  /**\r
+   * Removes all events that match the eventList.\r
+   */\r
+  public GQuery unbind(String eventList, Function f) {\r
+    return as(Events).unbind(eventList, f);\r
   }\r
 \r
   /**\r
index 1294feb3ed494c3981a0c24e329030532addad9b..dd677ef301c615dd4143efd63fd4944f4d6662d5 100644 (file)
@@ -273,25 +273,37 @@ public class Events extends GQuery {
    * 
    * Example: unbind(Event.ONCLICK | Event.ONMOUSEOVER, "my.namespace")
    */
-  public Events unbind(int eventbits, String name) {
+  public Events unbind(int eventbits, String name, Function f) {
     for (Element e : elements()) {
       if (isEventCapable(e)){
-        EventsListener.getInstance(e).unbind(eventbits, name);
+        EventsListener.getInstance(e).unbind(eventbits, name, f);
       }
     }
     return this;
   }
 
   /**
-   * Removes all handlers, that matches event name passed. This name could
-   * contain a namespace.
+   * Removes all handlers, that matches the event name passed. 
+   * 
+   * This name could contain a namespace.
    * 
    * Example: unbind("click.my.namespace")
    */
   public Events unbind(String name) {
+    return unbind(name, null);
+  }
+  
+  /**
+   * Removes the function passed as parameter from the event list matching 
+   * the event name passed. 
+   * This name could contain a namespace.
+   * 
+   * Example: unbind("click.my.namespace", myFunction)
+   */
+  public Events unbind(String name, Function f) {
     for (Element e : elements()) {
       if (isEventCapable(e)){
-        EventsListener.getInstance(e).unbind(name);
+        EventsListener.getInstance(e).unbind(name, f);
       }
     }
     return this;
index 14f6aa9c40597cfc49d66bbb03506056bf6d3445..f5573fbabc4c1a5e7f79468de4dd6e9267751451 100755 (executable)
@@ -41,7 +41,7 @@ public abstract class MousePlugin extends UiPlugin {
 \r
   protected void destroyMouseHandler() {\r
     as(Events)\r
-        .unbind(Event.ONMOUSEDOWN | Event.ONCLICK, getPluginName());\r
+        .unbind(Event.ONMOUSEDOWN | Event.ONCLICK, getPluginName(), null);\r
   }\r
 \r
   /**\r
@@ -282,7 +282,7 @@ public abstract class MousePlugin extends UiPlugin {
 \r
   private void unbindOtherMouseEvent() {\r
     $(document).as(Events).unbind((Event.ONMOUSEUP | Event.ONMOUSEMOVE),\r
-        getPluginName());\r
+        getPluginName(), null);\r
   }\r
 \r
 }\r
index 5386951ad7ec61c54ffcec97ba54b08c955d6a08..fe6c41f4fc3d3765910998dae6dcbaf7045be38f 100644 (file)
@@ -342,19 +342,25 @@ public class Ajax extends GQuery {
     s.setData(data);
     s.setSuccess(new Function() {
       public void f() {
-        // We clean up the returned string to smoothly append it to our document 
-        String s = getData()[0].toString().replaceAll("<![^>]+>\\s*", "")
-          .replaceAll("(?si)</?html[^>]*>\\s*", "")
-          .replaceFirst("(?si)<head[^>]*>.*</head>\\s*", "")
-          .replaceFirst("(?si)<script[^>]*>.*</script>\\s*", "")
-          .replaceAll("<?si></?body[^>]*>\\s*", "");
-        // We wrap the results in a div
-        s = "<div>" + s + "</div>";
-        
-        Ajax.this.empty().append(filter.isEmpty() ? $(s) : $(s).find(filter));
-        if (onSuccess != null) {
-          onSuccess.setElement(Ajax.this.get(0));
-          onSuccess.f();
+        try {
+          // We clean up the returned string to smoothly append it to our document 
+          String s = getData()[0].toString().replaceAll("<![^>]+>\\s*", "")
+            .replaceAll("(?si)</?html[^>]*>\\s*", "")
+            .replaceFirst("(?si)<head[^>]*>.*</head>\\s*", "")
+            .replaceFirst("(?si)<script[^>]*>.*</script>\\s*", "")
+            .replaceAll("<?si></?body[^>]*>\\s*", "");
+          // We wrap the results in a div
+          s = "<div>" + s + "</div>";
+          
+          Ajax.this.empty().append(filter.isEmpty() ? $(s) : $(s).find(filter));
+          if (onSuccess != null) {
+            onSuccess.setElement(Ajax.this.get(0));
+            onSuccess.f();
+          }
+        } catch (Exception e) {
+          if (GWT.getUncaughtExceptionHandler() != null) {
+            GWT.getUncaughtExceptionHandler().onUncaughtException(e);
+          }
         }
       }
     });
index 7699c47671e01862f08666364add01feaea2036f..8cbad2cc15f97ce371fcecb0eb36e4116a45a407 100644 (file)
@@ -84,6 +84,10 @@ public class EventsListener implements EventListener {
     public String toString() {
       return "bind function for event type " + type;
     }
+    
+    public boolean isEquals(Function f) {
+      return function.equals(f);
+    }
   }
 
   /**
@@ -329,7 +333,7 @@ public class EventsListener implements EventListener {
   public void bind(int eventbits, String namespace, final Object data,
       final Function function, int times) {
     if (function == null) {
-      unbind(eventbits, namespace);
+      unbind(eventbits, namespace, null);
       return;
     }
     eventBits |= eventbits;
@@ -435,30 +439,32 @@ public class EventsListener implements EventListener {
   }
 
   public void unbind(int eventbits) {
-    unbind(eventbits, null);
+    unbind(eventbits, null, null);
   }
 
-  public void unbind(int eventbits, String namespace) {
+  public void unbind(int eventbits, String namespace, Function f) {
     JsObjectArray<BindFunction> newList = JsObjectArray.createArray().cast();
     for (int i = 0; i < elementEvents.length(); i++) {
       BindFunction listener = elementEvents.get(i);
       boolean matchNS = namespace == null || namespace.isEmpty()
           || listener.nameSpace.equals(namespace);
       boolean matchEV = eventbits <= 0 || listener.hasEventType(eventbits);
-      if (matchNS && matchEV) {
+      boolean matchFC = f == null || listener.isEquals(f);
+      if (matchNS && matchEV && matchFC) {
         continue;
       }
       newList.add(listener);
     }
     elementEvents = newList;
+
   }
 
-  public void unbind(String event) {
+  public void unbind(String event, Function f) {
     // TODO: nameSpaces in event lists
     String nameSpace = event.replaceFirst("^[^\\.]+\\.*(.*)$", "$1");
     String eventName = event.replaceFirst("^([^\\.]+).*$", "$1");
     int b = getEventBits(eventName);
-    unbind(b, nameSpace);
+    unbind(b, nameSpace, f);
   }
 
   private void clean() {
@@ -515,4 +521,5 @@ public class EventsListener implements EventListener {
       function.clean();
     }
   }
+
 }
index 23eb49cd0b0d010e0f9c8ec9fa34de2fec876407..da07762223c9b1632a12daf186f5cfe963a16281 100644 (file)
@@ -215,6 +215,26 @@ public class GQueryEventsTestGwt extends GWTTestCase {
     $("p", e).unbind(Event.ONCLICK);
     $("p", e).click();
     assertEquals("white", $("p", e).css("color", false));
+    
+    Function f1 = new Function() {
+      public void f(){
+        $(this).css(CSS.COLOR.with(RGBColor.RED));
+      }
+    };
+    Function f2 = new Function() {
+      public void f(){
+        $(this).css(CSS.COLOR.with(RGBColor.GREEN));
+      }
+    };
+    $("p", e).click(f1, f2);
+    $("p", e).css(CSS.COLOR.with(RGBColor.WHITE));
+    $("p", e, Events.Events).trigger(Event.ONCLICK);
+    assertEquals("green", $("p", e).css("color", false));
+    $("p", e).unbind(Event.ONCLICK, f2);
+    $("p", e, Events.Events).trigger(Event.ONCLICK);
+    assertEquals("red", $("p", e).css("color", false));
+    
+    
 
     // toggle
     $("p", e).unbind(Event.ONCLICK);
@@ -266,7 +286,6 @@ public class GQueryEventsTestGwt extends GWTTestCase {
       public boolean f(Event evnt) {
         GQuery gq = $(evnt);
         int c = evnt.getCharCode() > 0 ? evnt.getCharCode() : evnt.getKeyCode();
-        System.out.println(evnt.getCharCode() + " " + evnt.getKeyCode());
         gq.val(gq.val() + Character.toString((char)c));
         return false;
       }