Revision: 8722
Author: fre...@google.com
Date: Tue Sep  7 06:57:03 2010
Log: Continuation of r8542. 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: j...@google

http://code.google.com/p/google-web-toolkit/source/detail?r=8722

Added:
 /trunk/user/test/com/google/gwt/user/client/DoubleClickEventSinkTest.java
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

=======================================
--- /dev/null
+++ /trunk/user/test/com/google/gwt/user/client/DoubleClickEventSinkTest.java Tue Sep 7 06:57:03 2010
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.gwt.user.client;
+
+import com.google.gwt.event.dom.client.DoubleClickEvent;
+import com.google.gwt.event.dom.client.DoubleClickHandler;
+import com.google.gwt.event.dom.client.HasDoubleClickHandlers;
+import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.user.client.ui.Anchor;
+import com.google.gwt.user.client.ui.Button;
+import com.google.gwt.user.client.ui.CheckBox;
+import com.google.gwt.user.client.ui.FlexTable;
+import com.google.gwt.user.client.ui.FocusPanel;
+import com.google.gwt.user.client.ui.Grid;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.ListBox;
+import com.google.gwt.user.client.ui.PasswordTextBox;
+import com.google.gwt.user.client.ui.RichTextArea;
+import com.google.gwt.user.client.ui.RootPanel;
+import com.google.gwt.user.client.ui.SimpleRadioButton;
+import com.google.gwt.user.client.ui.TextArea;
+import com.google.gwt.user.client.ui.TextBox;
+import com.google.gwt.user.client.ui.ToggleButton;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * Test Case for sinking of double click events.
+ */
+public class DoubleClickEventSinkTest extends GWTTestCase {
+
+ private DoubleClickHandler dummyDoubleClickHandler = new DoubleClickHandler() {
+    @Override
+    public void onDoubleClick(DoubleClickEvent event) {
+    }
+  };
+
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.user.User";
+  }
+
+  public void testDoubleClickBitFieldNotTriviallyZero() throws Exception {
+    assertNotSame(0, Event.ONDBLCLICK);
+  }
+
+  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);
+    verifyEventSinkOnAddHandler(new TextArea(), false);
+    verifyEventSinkOnAddHandler(new PasswordTextBox(), false);
+    verifyEventSinkOnAddHandler(new TextBox(), false);
+    verifyEventSinkOnAddHandler(new SimpleRadioButton("foo"), false);
+  }
+
+  public void testFocusPanelDoubleClickEventSinkByAddingHandler() {
+    verifyEventSinkOnAddHandler(new FocusPanel(), false);
+  }
+
+  public void testHTMLTableDoubleClickEventSinkByAddingHandler() {
+    verifyEventSinkOnAddHandler(new Grid(), false);
+    verifyEventSinkOnAddHandler(new FlexTable(), false);
+  }
+
+  public void testImageDoubleClickEventSinkByAddingHandler() {
+    // allow Image to sink events early
+    verifyEventSinkOnAddHandler(new Image(), true);
+  }
+
+  public void testLabelDoubleClickEventSinkByAddingHandler() {
+    verifyEventSinkOnAddHandler(new Label(), false);
+  }
+
+ 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) {
+    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);
+    }
+
+    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);
+  }
+}
=======================================
--- /trunk/user/src/com/google/gwt/user/client/ui/FocusWidget.java Fri Aug 20 04:37:13 2010 +++ /trunk/user/src/com/google/gwt/user/client/ui/FocusWidget.java Tue Sep 7 06:57:03 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 Aug 13 16:13:23 2010 +++ /trunk/user/src/com/google/gwt/user/client/ui/HTMLTable.java Tue Sep 7 06:57:03 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 Aug 13 16:13:23 2010 +++ /trunk/user/src/com/google/gwt/user/client/ui/Hyperlink.java Tue Sep 7 06:57:03 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 Fri Aug 13 16:13:23 2010 +++ /trunk/user/src/com/google/gwt/user/client/ui/Image.java Tue Sep 7 06:57:03 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 Mon Aug 30 02:46:06 2010 +++ /trunk/user/src/com/google/gwt/user/client/ui/Label.java Tue Sep 7 06:57:03 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 3 06:47:32 2010 +++ /trunk/user/test/com/google/gwt/user/UISuite.java Tue Sep 7 06:57:03 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);

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

Reply via email to