Reviewers: sbrubaker,

Description:
Switching CellList to trigger selection on click instead of mousedown.
Selection causes the cell to be redrawn, which interrupts the click
event sequence and prevents click from ever firing to the Cell. This is
particularly annoying for Cells that contain Buttons. The same change
needs to be made for keyboard selection, which can be bound to selection
and cause the cell to be redrawn.  CellTable already triggers selection
on click, and now triggers keyboard selection on click.


Please review this at http://gwt-code-reviews.appspot.com/1102801/show

Affected files:
  M user/src/com/google/gwt/user/cellview/client/AbstractHasData.java
  M user/src/com/google/gwt/user/cellview/client/CellList.java
  M user/src/com/google/gwt/user/cellview/client/CellTable.java


Index: user/src/com/google/gwt/user/cellview/client/AbstractHasData.java
===================================================================
--- user/src/com/google/gwt/user/cellview/client/AbstractHasData.java (revision 9218) +++ user/src/com/google/gwt/user/cellview/client/AbstractHasData.java (working copy)
@@ -270,8 +270,9 @@
     Set<String> eventTypes = new HashSet<String>();
     eventTypes.add("focus");
     eventTypes.add("blur");
-    eventTypes.add("keydown");
-    eventTypes.add("mousedown"); // Used by subclasses to steal focus.
+    eventTypes.add("keydown"); // Used for keyboard navigation.
+    eventTypes.add("click"); // Used by subclasses for selection.
+ eventTypes.add("mousedown"); // No longer used, but here for legacy support.
     CellBasedWidgetImpl.get().sinkEvents(this, eventTypes);
   }

Index: user/src/com/google/gwt/user/cellview/client/CellList.java
===================================================================
--- user/src/com/google/gwt/user/cellview/client/CellList.java (revision 9218) +++ user/src/com/google/gwt/user/cellview/client/CellList.java (working copy)
@@ -379,7 +379,7 @@
// before firing the event to the cell in case the cell operates on the
       // currently selected item.
       String eventType = event.getType();
-      boolean isMouseDown = "mousedown".equals(eventType);
+      boolean isClick = "click".equals(eventType);
       int idx = Integer.parseInt(idxString);
       int indexOnPage = idx - getPageStart();
       if (!isRowWithinBounds(indexOnPage)) {
@@ -390,12 +390,12 @@
// Get the cell parent before doing selection in case the list is redrawn.
       Element cellParent = getCellParent(cellTarget);
       T value = getDisplayedItem(indexOnPage);
-      if (isMouseDown && !cell.handlesSelection()) {
+      if (isClick && !cell.handlesSelection()) {
         doSelection(event, value, indexOnPage);
       }

       // Focus on the cell.
-      if (isMouseDown
+      if (isClick
&& getPresenter().getKeyboardSelectedRowInView() != indexOnPage) {
         /*
* If the selected element is natively focusable, then we do not want to
Index: user/src/com/google/gwt/user/cellview/client/CellTable.java
===================================================================
--- user/src/com/google/gwt/user/cellview/client/CellTable.java (revision 9218) +++ user/src/com/google/gwt/user/cellview/client/CellTable.java (working copy)
@@ -563,7 +563,6 @@

     // Sink events.
     Set<String> eventTypes = new HashSet<String>();
-    eventTypes.add("click");
     eventTypes.add("mouseover");
     eventTypes.add("mouseout");
     CellBasedWidgetImpl.get().sinkEvents(this, eventTypes);
@@ -926,7 +925,7 @@
       }
     } else if (section == tbody) {
       // Update the hover state.
-      boolean isMouseDown = "mousedown".equals(eventType);
+      boolean isClick = "click".equals(eventType);
       int row = tr.getSectionRowIndex();
       if ("mouseover".equals(eventType)) {
         // Unstyle the old row if it is still part of the table.
@@ -941,7 +940,7 @@
         setRowStyleName(hoveringRow, style.cellTableHoveredRow(),
             style.cellTableHoveredRowCell(), false);
         hoveringRow = null;
-      } else if (isMouseDown
+      } else if (isClick
           && ((getPresenter().getKeyboardSelectedRowInView() != row)
           || (keyboardSelectedColumn != col))) {
// Move keyboard focus. Since the user clicked, allow focus to go to a
@@ -960,7 +959,7 @@
         return;
       }
       T value = getDisplayedItem(row);
-      if ("click".equals(eventType) && !handlesSelection) {
+      if (isClick && !handlesSelection) {
         doSelection(event, value, row, col);
       }



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

Reply via email to