Author: fabb...@google.com
Date: Thu Dec 11 18:30:55 2008
New Revision: 4314

Added:
     
trunk/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3186.java
       - copied unchanged from r4299,  
/releases/1.6/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/Issue3186.java
Modified:
    trunk/user/src/com/google/gwt/user/client/ListenerWrapper.java
    trunk/user/src/com/google/gwt/user/client/Window.java
    trunk/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java
    trunk/user/test/com/google/gwt/user/client/WindowTest.java
    trunk/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java

Log:
Cherrypick merges of 1.6 c4298 and c4299.


Modified: trunk/user/src/com/google/gwt/user/client/ListenerWrapper.java
==============================================================================
--- trunk/user/src/com/google/gwt/user/client/ListenerWrapper.java       
(original)
+++ trunk/user/src/com/google/gwt/user/client/ListenerWrapper.java      Thu Dec 
 
11 18:30:55 2008
@@ -131,24 +131,29 @@
      }
    }

+
    // This is an internal helper method with the current formulation, we  
have
    // lost the info needed to make it safe by this point.
    @SuppressWarnings("unchecked")
-  protected static void baseRemove(HandlerManager manager,
+  // This is a direct copy of the baseRemove from
+  // com.google.gwt.user.client.ui.ListenerWrapper. Change in parallel.
+  static <H extends EventHandler> void baseRemove(HandlerManager manager,
        EventListener listener, Type... keys) {
      if (manager != null) {
-      for (Type key : keys) {
+      for (Type<H> key : keys) {
          int handlerCount = manager.getHandlerCount(key);
-        for (int i = 0; i < handlerCount; i++) {
-          EventHandler handler = manager.getHandler(key, i);
-          if (handler instanceof ListenerWrapper && ((ListenerWrapper)  
handler).listener.equals(listener)) {
+        // We are removing things as we traverse, have to go backward
+        for (int i = handlerCount - 1; i >= 0; i--) {
+          H handler = manager.getHandler(key, i);
+          if (handler instanceof ListenerWrapper
+              && ((ListenerWrapper) handler).listener.equals(listener)) {
              manager.removeHandler(key, handler);
            }
          }
        }
      }
    }
-
+
    /**
     * Listener being wrapped.
     */

Modified: trunk/user/src/com/google/gwt/user/client/Window.java
==============================================================================
--- trunk/user/src/com/google/gwt/user/client/Window.java       (original)
+++ trunk/user/src/com/google/gwt/user/client/Window.java       Thu Dec 11  
18:30:55 2008
@@ -392,12 +392,13 @@
      }
    }

+  // Package protected for testing.
+  static WindowHandlers handlers;
    private static boolean closeHandlersInitialized;
    private static boolean scrollHandlersInitialized;
    private static boolean resizeHandlersInitialized;
    private static final WindowImpl impl = GWT.create(WindowImpl.class);

-  private static WindowHandlers handlers;

    /**
     * Adds a {...@link CloseEvent} handler.

Modified: trunk/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java
==============================================================================
--- trunk/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java    
(original)
+++ trunk/user/src/com/google/gwt/user/client/ui/ListenerWrapper.java   Thu  
Dec 11 18:30:55 2008
@@ -271,25 +271,44 @@
      }

      public void onMouseDown(MouseDownEvent event) {
-      listener.onMouseDown(source(event), event.getClientX(),
-          event.getClientY());
+      Widget source = source(event);
+      Element elem = source.getElement();
+      listener.onMouseDown(source, event.getRelativeX(elem),
+          event.getRelativeY(elem));
      }

      public void onMouseMove(MouseMoveEvent event) {
-      listener.onMouseMove(source(event), event.getClientX(),
-          event.getClientY());
+      Widget source = source(event);
+      Element elem = source.getElement();
+      listener.onMouseMove(source, event.getRelativeX(elem),
+          event.getRelativeY(elem));
      }

      public void onMouseOut(MouseOutEvent event) {
-      listener.onMouseLeave(source(event));
+      // Only fire the mouseLeave event if it's actually leaving this
+      // widget.
+      Element to = event.getToElement();
+      Widget source = source(event);
+      if (to == null || !source.getElement().isOrHasChild(to)) {
+        listener.onMouseLeave(source(event));
+      }
      }

      public void onMouseOver(MouseOverEvent event) {
-      listener.onMouseEnter(source(event));
+      // Only fire the mouseEnter event if it's coming from outside this
+      // widget.
+      Element from = event.getFromElement();
+      Widget source = source(event);
+      if (from == null || !source.getElement().isOrHasChild(from)) {
+        listener.onMouseEnter(source(event));
+      }
      }

      public void onMouseUp(MouseUpEvent event) {
-      listener.onMouseUp(source(event), event.getClientX(),  
event.getClientY());
+      Widget source = source(event);
+      Element elem = source.getElement();
+      listener.onMouseUp(source, event.getRelativeX(elem),
+          event.getRelativeY(elem));
      }
    }
    public static class MouseWheel extends  
ListenerWrapper<MouseWheelListener> implements
@@ -510,6 +529,8 @@
        EventListener listener, Type... keys) {
      HandlerManager manager = eventSource.getHandlers();
      if (manager != null) {
+      // This is a direct copy of the baseRemove from
+      // com.google.gwt.user.client.ListenerWrapper. Change in parallel.
        for (Type<H> key : keys) {
          int handlerCount = manager.getHandlerCount(key);
          // We are removing things as we traverse, have to go backward

Modified: trunk/user/test/com/google/gwt/user/client/WindowTest.java
==============================================================================
--- trunk/user/test/com/google/gwt/user/client/WindowTest.java  (original)
+++ trunk/user/test/com/google/gwt/user/client/WindowTest.java  Thu Dec 11  
18:30:55 2008
@@ -15,6 +15,7 @@
   */
  package com.google.gwt.user.client;

+import com.google.gwt.event.logical.shared.ResizeEvent;
  import com.google.gwt.junit.client.GWTTestCase;
  import com.google.gwt.user.client.ui.Label;
  import com.google.gwt.user.client.ui.RootPanel;
@@ -176,4 +177,40 @@
      // Cleanup the window
      RootPanel.get().remove(largeDOM);
    }
+
+  @SuppressWarnings("deprecation")
+  static class ListenerTester implements WindowResizeListener {
+    static int resize = 0;
+
+    public void onWindowResized(int width, int height) {
+      ++resize;
+    }
+
+    public static void fire() {
+      resize = 0;
+      ResizeEvent.fire(Window.handlers, 0, 0);
+    }
+  }
+
+  @SuppressWarnings("deprecation")
+  public void testListenerRemoval() {
+
+    WindowResizeListener r1 = new ListenerTester();
+    WindowResizeListener r2 = new ListenerTester();
+
+    Window.addWindowResizeListener(r1);
+    Window.addWindowResizeListener(r2);
+
+    ListenerTester.fire();
+    assertEquals(ListenerTester.resize, 2);
+
+    Window.removeWindowResizeListener(r1);
+    ListenerTester.fire();
+    assertEquals(ListenerTester.resize, 1);
+
+    Window.removeWindowResizeListener(r2);
+    ListenerTester.fire();
+    assertEquals(ListenerTester.resize, 0);
+  }
+
  }

Modified: trunk/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java
==============================================================================
--- trunk/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java      
(original)
+++ trunk/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java     Thu Dec 
 
11 18:30:55 2008
@@ -15,8 +15,10 @@
   */
  package com.google.gwt.user.client.ui;

+import com.google.gwt.event.dom.client.ClickEvent;
  import com.google.gwt.event.logical.shared.ValueChangeEvent;
  import com.google.gwt.event.logical.shared.ValueChangeHandler;
+import com.google.gwt.event.shared.HandlerManager;
  import com.google.gwt.junit.client.GWTTestCase;
  import com.google.gwt.user.client.DOM;
  import com.google.gwt.user.client.Element;
@@ -29,7 +31,7 @@
    @Override
    public String getModuleName() {
      return "com.google.gwt.user.DebugTest";
-  }
+  }

    @Override
    protected void gwtSetUp() throws Exception {
@@ -85,7 +87,7 @@
      UIObjectTest.assertDebugId("myCheck-input", newInput);
      UIObjectTest.assertDebugIdContents("myCheck-label", "myLabel");
    }
-
+
    public void testValueChangeEvent() {
      CheckBox cb = new CheckBox();
      Handler h = new Handler();
@@ -94,7 +96,7 @@
      assertNull(h.received);
      cb.setChecked(true);
      assertNull(h.received);
-
+
      cb.setValue(false);
      assertNull(h.received);
      cb.setValue(true);
@@ -102,17 +104,61 @@

      cb.setValue(true, true);
      assertNull(h.received);
-
+
      cb.setValue(false, true);
      assertFalse(h.received);

      cb.setValue(true, true);
      assertTrue(h.received);
+
+    try {
+      cb.setValue(null);
+      fail("Should throw IllegalArgumentException");
+    } catch (IllegalArgumentException e) {
+      /* pass */
+    }
    }
-
+
+  static class ListenerTester implements ClickListener {
+    static int fired = 0;
+    static HandlerManager manager;
+
+    public static void fire() {
+      fired = 0;
+      manager.fireEvent(new ClickEvent() {
+      });
+    }
+
+    public void onClick(Widget sender) {
+      ++fired;
+    }
+  }
+
+  @SuppressWarnings("deprecation")
+  public void testListenerRemoval() {
+    CheckBox b = new CheckBox();
+
+    ClickListener r1 = new ListenerTester();
+    ClickListener r2 = new ListenerTester();
+    ListenerTester.manager = b.ensureHandlers();
+    b.addClickListener(r1);
+    b.addClickListener(r2);
+
+    ListenerTester.fire();
+    assertEquals(ListenerTester.fired, 2);
+
+    b.removeClickListener(r1);
+    ListenerTester.fire();
+    assertEquals(ListenerTester.fired, 1);
+
+    b.removeClickListener(r2);
+    ListenerTester.fire();
+    assertEquals(ListenerTester.fired, 0);
+  }
+
    private static class Handler implements ValueChangeHandler<Boolean> {
      Boolean received = null;
-
+
      public void onValueChange(ValueChangeEvent<Boolean> event) {
        received = event.getValue();
      }

--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Reply via email to