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.
Review at http://gwt-code-reviews.appspot.com/1102801
Review by: sbrubaker@google.com
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9220 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/cellview/client/AbstractHasData.java b/user/src/com/google/gwt/user/cellview/client/AbstractHasData.java
index 234e6bd..7bfaca5 100644
--- a/user/src/com/google/gwt/user/cellview/client/AbstractHasData.java
+++ b/user/src/com/google/gwt/user/cellview/client/AbstractHasData.java
@@ -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);
}
diff --git a/user/src/com/google/gwt/user/cellview/client/CellList.java b/user/src/com/google/gwt/user/cellview/client/CellList.java
index 37f7c8c..2e68ca1 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellList.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellList.java
@@ -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
diff --git a/user/src/com/google/gwt/user/cellview/client/CellTable.java b/user/src/com/google/gwt/user/cellview/client/CellTable.java
index 305c502..cbf2365 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellTable.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellTable.java
@@ -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);
}