Revision: 8750
Author: [email protected]
Date: Fri Sep 10 07:37:39 2010
Log: Resubmitting r8722, which was a continuation of r8542, with changes to the way Image is tested in DoubleClickEventSinkTest.

Fixes double click where it was broken and adds tests to ensure that events are sunk.

Fix double click in the following widgets (and their subclasses):
- com/google/gwt/user/client/ui/FocusWidget.java
- com/google/gwt/user/client/ui/HTMLTable.java
- com/google/gwt/user/client/ui/Image.java
- com/google/gwt/user/client/ui/Label.java

Undo the addition of double click support to Hyperlink, since it is provided by Anchor:
- com/google/gwt/user/client/ui/Hyperlink.java

Note that r8542 never actually added double click support for:
- com/google/gwt/user/client/ui/TabBar.java

Note also that double click support was indeed correctly added in r8542 for:
- com/google/gwt/user/client/ui/FocusPanel.java

Review at http://gwt-code-reviews.appspot.com/774801

Fixes issues: 5212

Review by: [email protected]
http://code.google.com/p/google-web-toolkit/source/detail?r=8750

Modified:
 /trunk/user/src/com/google/gwt/user/client/ui/FocusWidget.java
 /trunk/user/src/com/google/gwt/user/client/ui/HTMLTable.java
 /trunk/user/src/com/google/gwt/user/client/ui/Hyperlink.java
 /trunk/user/src/com/google/gwt/user/client/ui/Image.java
 /trunk/user/src/com/google/gwt/user/client/ui/Label.java
 /trunk/user/test/com/google/gwt/user/UISuite.java
 /trunk/user/test/com/google/gwt/user/client/DoubleClickEventSinkTest.java

=======================================
--- /trunk/user/src/com/google/gwt/user/client/ui/FocusWidget.java Tue Sep 7 14:01:53 2010 +++ /trunk/user/src/com/google/gwt/user/client/ui/FocusWidget.java Fri Sep 10 07:37:39 2010
@@ -104,7 +104,7 @@
   }

public HandlerRegistration addDoubleClickHandler(DoubleClickHandler handler) {
-    return addHandler(handler, DoubleClickEvent.getType());
+    return addDomHandler(handler, DoubleClickEvent.getType());
   }

   public HandlerRegistration addFocusHandler(FocusHandler handler) {
=======================================
--- /trunk/user/src/com/google/gwt/user/client/ui/HTMLTable.java Fri Sep 10 05:47:32 2010 +++ /trunk/user/src/com/google/gwt/user/client/ui/HTMLTable.java Fri Sep 10 07:37:39 2010
@@ -725,7 +725,7 @@
   }

public HandlerRegistration addDoubleClickHandler(DoubleClickHandler handler) {
-    return addHandler(handler, DoubleClickEvent.getType());
+    return addDomHandler(handler, DoubleClickEvent.getType());
   }

   /**
=======================================
--- /trunk/user/src/com/google/gwt/user/client/ui/Hyperlink.java Fri Sep 10 05:47:32 2010 +++ /trunk/user/src/com/google/gwt/user/client/ui/Hyperlink.java Fri Sep 10 07:37:39 2010
@@ -18,10 +18,7 @@
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.DoubleClickEvent;
-import com.google.gwt.event.dom.client.DoubleClickHandler;
 import com.google.gwt.event.dom.client.HasClickHandlers;
-import com.google.gwt.event.dom.client.HasDoubleClickHandlers;
 import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Element;
@@ -63,7 +60,7 @@
  */
 @SuppressWarnings("deprecation")
public class Hyperlink extends Widget implements HasHTML, SourcesClickEvents,
-    HasClickHandlers, HasDoubleClickHandlers {
+    HasClickHandlers {

   private static HyperlinkImpl impl = GWT.create(HyperlinkImpl.class);

@@ -140,10 +137,6 @@
   public void addClickListener(ClickListener listener) {
     ListenerWrapper.WrappedClickListener.add(this, listener);
   }
-
- public HandlerRegistration addDoubleClickHandler(DoubleClickHandler handler) {
-    return addHandler(handler, DoubleClickEvent.getType());
-  }

   public String getHTML() {
     return DOM.getInnerHTML(anchorElem);
=======================================
--- /trunk/user/src/com/google/gwt/user/client/ui/Image.java Tue Sep 7 14:01:53 2010 +++ /trunk/user/src/com/google/gwt/user/client/ui/Image.java Fri Sep 10 07:37:39 2010
@@ -125,7 +125,7 @@
image.replaceElement(impl.createStructure(url, left, top, width, height)); // Todo(ecc) This is wrong, we should not be sinking these here on such a
       // common widget.After the branch is stable, this should be fixed.
- image.sinkEvents(Event.ONCLICK | Event.MOUSEEVENTS | Event.ONMOUSEWHEEL + image.sinkEvents(Event.ONCLICK | Event.ONDBLCLICK | Event.MOUSEEVENTS | Event.ONMOUSEWHEEL
           | Event.ONLOAD);
     }

@@ -282,7 +282,7 @@
     UnclippedState(Element element) {
// This case is relatively unusual, in that we swapped a clipped image
       // out, so does not need to be efficient.
-      Event.sinkEvents(element, Event.ONCLICK | Event.MOUSEEVENTS
+ Event.sinkEvents(element, Event.ONCLICK | Event.ONDBLCLICK | Event.MOUSEEVENTS
           | Event.ONLOAD | Event.ONERROR | Event.ONMOUSEWHEEL);
     }

@@ -294,7 +294,7 @@
       Event.sinkEvents(image.getElement(), Event.ONLOAD);

       // Todo(ecc) this could be more efficient overall.
-      image.sinkEvents(Event.ONCLICK | Event.MOUSEEVENTS | Event.ONLOAD
+ image.sinkEvents(Event.ONCLICK | Event.ONDBLCLICK | Event.MOUSEEVENTS | Event.ONLOAD
           | Event.ONERROR | Event.ONMOUSEWHEEL);
     }

=======================================
--- /trunk/user/src/com/google/gwt/user/client/ui/Label.java Fri Sep 10 05:47:32 2010 +++ /trunk/user/src/com/google/gwt/user/client/ui/Label.java Fri Sep 10 07:37:39 2010
@@ -216,7 +216,7 @@
   }

public HandlerRegistration addDoubleClickHandler(DoubleClickHandler handler) {
-    return addHandler(handler, DoubleClickEvent.getType());
+    return addDomHandler(handler, DoubleClickEvent.getType());
   }

public HandlerRegistration addMouseDownHandler(MouseDownHandler handler) {
=======================================
--- /trunk/user/test/com/google/gwt/user/UISuite.java Fri Sep 10 05:47:32 2010 +++ /trunk/user/test/com/google/gwt/user/UISuite.java Fri Sep 10 07:37:39 2010
@@ -20,6 +20,7 @@
 import com.google.gwt.user.client.AsyncProxyTest;
 import com.google.gwt.user.client.CommandExecutorTest;
 import com.google.gwt.user.client.CookieTest;
+import com.google.gwt.user.client.DoubleClickEventSinkTest;
 import com.google.gwt.user.client.EventTest;
 import com.google.gwt.user.client.HistoryDisabledTest;
 import com.google.gwt.user.client.WindowTest;
@@ -141,6 +142,7 @@
     suite.addTestSuite(DockLayoutPanelRtlTest.class);
     suite.addTestSuite(DockLayoutPanelTest.class);
     suite.addTestSuite(DockPanelTest.class);
+    suite.addTestSuite(DoubleClickEventSinkTest.class);
     suite.addTestSuite(DOMTest.class);
     suite.addTestSuite(DOMRtlTest.class);
     suite.addTestSuite(ElementWrappingTest.class);
=======================================
--- /trunk/user/test/com/google/gwt/user/client/DoubleClickEventSinkTest.java Tue Sep 7 09:47:45 2010 +++ /trunk/user/test/com/google/gwt/user/client/DoubleClickEventSinkTest.java Fri Sep 10 07:37:39 2010
@@ -43,11 +43,6 @@
  */
 public class DoubleClickEventSinkTest extends GWTTestCase {

- private DoubleClickHandler dummyDoubleClickHandler = new DoubleClickHandler() {
-    public void onDoubleClick(DoubleClickEvent event) {
-    }
-  };
-
   @Override
   public String getModuleName() {
     return "com.google.gwt.user.User";
@@ -56,16 +51,20 @@
   public void testDoubleClickBitFieldNotTriviallyZero() {
     assertNotSame(0, Event.ONDBLCLICK);
   }
-
+
+  public void testFocusPanelDoubleClickEventSinkByAddingHandler() {
+    verifyEventSinkOnAddHandler(new FocusPanel(), false);
+  }
+
   public void testFocusWidgetDoubleClickEventSinkByAddingHandler() {
     verifyEventSinkOnAddHandler(new Anchor(), false);
     verifyEventSinkOnAddHandler(new Button(), false);
-
+
     CheckBox checkBox = new CheckBox();
     // Get the inputElem on which events are sunk
     Element e = (Element) checkBox.getElement().getFirstChildElement();
     verifyEventSinkOnAddHandler(checkBox, e, false);
-
+
     verifyEventSinkOnAddHandler(new ToggleButton(), false);
     verifyEventSinkOnAddHandler(new ListBox(), false);
     verifyEventSinkOnAddHandler(new RichTextArea(), false);
@@ -74,10 +73,6 @@
     verifyEventSinkOnAddHandler(new TextBox(), false);
     verifyEventSinkOnAddHandler(new SimpleRadioButton("foo"), false);
   }
-
-  public void testFocusPanelDoubleClickEventSinkByAddingHandler() {
-    verifyEventSinkOnAddHandler(new FocusPanel(), false);
-  }

   public void testHTMLTableDoubleClickEventSinkByAddingHandler() {
     verifyEventSinkOnAddHandler(new Grid(), false);
@@ -85,7 +80,12 @@
   }

   public void testImageDoubleClickEventSinkByAddingHandler() {
-    // allow Image to sink events early
+    /*
+ * The Image widget currently sinks events too early, before handlers are
+     * attached. We verify that (broken) behavior in this test.
+     * TODO(fredsa) Once Image has been fixed to lazily sink events, update
+     * this test and remove verifyEventSinkOnAddHandler's second parameter.
+     */
     verifyEventSinkOnAddHandler(new Image(), true);
   }

@@ -93,25 +93,38 @@
     verifyEventSinkOnAddHandler(new Label(), false);
   }

- private <W extends Widget & HasDoubleClickHandlers> void verifyEventSinkOnAddHandler(
-      W w, boolean allowEarlySink) {
+  private boolean isDoubleClickEventSunk(Element e) {
+    return (DOM.getEventsSunk(e) & Event.ONDBLCLICK) != 0;
+  }
+
+  private <W extends Widget & HasDoubleClickHandlers>
+      void verifyEventSinkOnAddHandler(W w, boolean allowEarlySink) {
     verifyEventSinkOnAddHandler(w, w.getElement(), allowEarlySink);
   }

- private <W extends Widget & HasDoubleClickHandlers> void verifyEventSinkOnAddHandler(
-      W w, Element e, boolean allowEarlySink) {
+  private <W extends Widget & HasDoubleClickHandlers>
+ void verifyEventSinkOnAddHandler(W w, Element e, boolean widgetSinksEventsOnAttach) {
     RootPanel.get().add(w);

-    if (!allowEarlySink) {
- assertEquals("Event should not be sunk on " + w.getClass().getName() + " until a " - + DoubleClickEvent.getType().getName() + " handler has been added",
-         0, DOM.getEventsSunk(e) & Event.ONDBLCLICK);
+    if (widgetSinksEventsOnAttach) {
+      assertTrue("Event should have been sunk on " + w.getClass().getName()
+ + " once the widget has been attached", isDoubleClickEventSunk(e));
+    } else {
+      assertFalse(
+ "Event should not be sunk on " + w.getClass().getName() + " until a "
+              + DoubleClickEvent.getType().getName()
+              + " handler has been added", isDoubleClickEventSunk(e));
     }

-    w.addDoubleClickHandler(dummyDoubleClickHandler);
-
-    assertEquals("Event should have been sunk on " + w.getClass().getName()
- + " once the widget has been attached and a " + DoubleClickEvent.getType().getName() - + " handler has been added", Event.ONDBLCLICK, DOM.getEventsSunk(e) & Event.ONDBLCLICK);
+    w.addDoubleClickHandler(new DoubleClickHandler() {
+      public void onDoubleClick(DoubleClickEvent event) {
+      }
+    });
+
+    assertTrue(
+        "Event should have been sunk on " + w.getClass().getName()
+            + " once the widget has been attached and a "
+ + DoubleClickEvent.getType().getName() + " handler has been added",
+        isDoubleClickEventSunk(e));
   }
 }

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

Reply via email to