* TODO implement unregistering for child components in Cells
*/
public class VScrollTable extends FlowPanel implements Table, ScrollHandler,
- VHasDropHandler, KeyPressHandler, KeyDownHandler, FocusHandler,
- BlurHandler, Focusable, KeyUpHandler {
+ VHasDropHandler, FocusHandler, BlurHandler, Focusable {
public static final String CLASSNAME = "v-table";
public static final String CLASSNAME_SELECTION_FOCUS = CLASSNAME + "-focus";
public VScrollTable() {
scrollBodyPanel.setStyleName(CLASSNAME + "-body-wrapper");
- /*
- * Firefox auto-repeat works correctly only if we use a key press
- * handler, other browsers handle it correctly when using a key down
- * handler
- */
- if (BrowserInfo.get().isGecko()) {
- scrollBodyPanel.addKeyPressHandler(this);
- } else {
- scrollBodyPanel.addKeyDownHandler(this);
- }
- scrollBodyPanel.addKeyUpHandler(this);
-
scrollBodyPanel.addFocusHandler(this);
scrollBodyPanel.addBlurHandler(this);
}
public class VScrollTableRow extends Panel implements ActionOwner,
- Container {
+ Container, KeyPressHandler, KeyUpHandler, KeyDownHandler {
private static final int DRAGMODE_MULTIROW = 2;
protected ArrayList<Widget> childWidgets = new ArrayList<Widget>();
setElement(rowElement);
DOM.sinkEvents(getElement(), Event.MOUSEEVENTS
| Event.ONDBLCLICK | Event.ONCONTEXTMENU
- | Event.KEYEVENTS);
+ /* | Event.KEYEVENTS */);
+ getElement().setTabIndex(-1);
+
+ /*
+ * Firefox auto-repeat works correctly only if we use a key
+ * press handler, other browsers handle it correctly when using
+ * a key down handler
+ */
+ if (BrowserInfo.get().isGecko()) {
+ addDomHandler(this, KeyPressEvent.getType());
+ } else {
+ addDomHandler(this, KeyDownEvent.getType());
+ }
+ addDomHandler(this, KeyUpEvent.getType());
}
/**
mDown = false;
break;
- /*
- * The ONKEYDOWN and ONKEYUP are only run in IE, see
- * #6197
- */
- case Event.ONKEYDOWN:
- if (!enabled) {
- // Cancel default keyboard events on a disabled
- // Table (prevents scrolling)
- event.preventDefault();
- } else {
- if (handleNavigation(
- event.getKeyCode(),
- event.getCtrlKey()
- || event.getMetaKey(),
- event.getShiftKey())) {
- navKeyDown = true;
- event.preventDefault();
- }
- startScrollingVelocityTimer();
- }
+ default:
break;
+ }
+ }
+ }
+ super.onBrowserEvent(event);
+ }
+
+ public void onKeyPress(KeyPressEvent keyPressEvent) {
+ // This is used for Firefox only, since Firefox auto-repeat
+ // works correctly only if we use a key press handler, other
+ // browsers handle it correctly when using a key down handler
+ if (!BrowserInfo.get().isGecko()) {
+ return;
+ }
- case Event.ONKEYUP:
- int keyCode = event.getKeyCode();
+ NativeEvent event = keyPressEvent.getNativeEvent();
+ if (!enabled) {
+ // Cancel default keyboard events on a disabled Table
+ // (prevents scrolling)
+ event.preventDefault();
+ } else {
+ // Key code in Firefox/onKeyPress is present only for
+ // special keys, otherwise 0 is returned
+ int keyCode = event.getKeyCode();
+ if (keyCode == 0 && event.getCharCode() == ' ') {
+ // Provide a keyCode for space to be compatible with
+ // FireFox keypress event
+ keyCode = CHARCODE_SPACE;
+ }
- if (!isFocusable()) {
- cancelScrollingVelocityTimer();
- } else if (isNavigationKey(keyCode)) {
- if (keyCode == getNavigationDownKey()
- || keyCode == getNavigationUpKey()) {
- /*
- * in multiselect mode the server may still
- * have value from previous page. Clear it
- * unless doing multiselection or just
- * moving focus.
- */
- if (!event.getShiftKey()
- && !event.getCtrlKey()) {
- instructServerToForgetPreviousSelections();
- }
- sendSelectedRows();
- }
- cancelScrollingVelocityTimer();
- navKeyDown = false;
- }
- break;
+ if (handleNavigation(keyCode,
+ event.getCtrlKey() || event.getMetaKey(),
+ event.getShiftKey())) {
+ event.preventDefault();
+ }
- default:
- break;
+ startScrollingVelocityTimer();
+ }
+ }
+
+ public void onKeyDown(KeyDownEvent keyDownEvent) {
+ NativeEvent event = keyDownEvent.getNativeEvent();
+ // This is not used for Firefox
+ if (BrowserInfo.get().isGecko()) {
+ return;
+ }
+
+ if (!enabled) {
+ // Cancel default keyboard events on a disabled Table
+ // (prevents scrolling)
+ event.preventDefault();
+ } else {
+ if (handleNavigation(event.getKeyCode(), event.getCtrlKey()
+ || event.getMetaKey(), event.getShiftKey())) {
+ navKeyDown = true;
+ event.preventDefault();
+ }
+
+ startScrollingVelocityTimer();
+ }
+ }
+
+ public void onKeyUp(KeyUpEvent keyUpEvent) {
+ NativeEvent event = keyUpEvent.getNativeEvent();
+ int keyCode = event.getKeyCode();
+
+ if (!isFocusable()) {
+ cancelScrollingVelocityTimer();
+ } else if (isNavigationKey(keyCode)) {
+ if (keyCode == getNavigationDownKey()
+ || keyCode == getNavigationUpKey()) {
+ /*
+ * in multiselect mode the server may still have value
+ * from previous page. Clear it unless doing
+ * multiselection or just moving focus.
+ */
+ if (!event.getShiftKey() && !event.getCtrlKey()) {
+ instructServerToForgetPreviousSelections();
}
+ sendSelectedRows();
}
+ cancelScrollingVelocityTimer();
+ navKeyDown = false;
}
- super.onBrowserEvent(event);
}
/**
// Set new focused row
focusedRow = row;
- ensureRowIsVisible(row);
+ // ensureRowIsVisible(row);
row.getElement().focus();
return true;
if (top < cur.scrollTop) {
cur.scrollTop = top;
}
+
if (top + height > cur.scrollTop + cur.clientHeight) {
cur.scrollTop = (top + height) - cur.clientHeight;
}
scrollBodyPanel.setScrollPosition(newPixels);
}
- /*
- * (non-Javadoc)
- *
- * @see
- * com.google.gwt.event.dom.client.KeyPressHandler#onKeyPress(com.google
- * .gwt.event.dom.client.KeyPressEvent)
- */
- public void onKeyPress(KeyPressEvent event) {
- // This is used for Firefox only
- if (!BrowserInfo.get().isGecko()) {
- return;
- }
-
- if (!enabled) {
- // Cancel default keyboard events on a disabled Table (prevents
- // scrolling)
- event.preventDefault();
- } else if (hasFocus) {
- // Key code in Firefox/onKeyPress is present only for special keys,
- // otherwise 0 is returned
- NativeEvent nativeEvent = event.getNativeEvent();
- int keyCode = nativeEvent.getKeyCode();
- if (keyCode == 0 && nativeEvent.getCharCode() == ' ') {
- // Provide a keyCode for space to be compatible with FireFox
- // keypress event
- keyCode = CHARCODE_SPACE;
- }
-
- if (handleNavigation(keyCode,
- event.isControlKeyDown() || event.isMetaKeyDown(),
- event.isShiftKeyDown())) {
- event.preventDefault();
- }
-
- startScrollingVelocityTimer();
- }
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * com.google.gwt.event.dom.client.KeyDownHandler#onKeyDown(com.google.gwt
- * .event.dom.client.KeyDownEvent)
- */
- public void onKeyDown(KeyDownEvent event) {
- if (!enabled) {
- // Cancel default keyboard events on a disabled Table (prevents
- // scrolling)
- event.preventDefault();
- } else if (hasFocus) {
- if (handleNavigation(event.getNativeEvent().getKeyCode(),
- event.isControlKeyDown() || event.isMetaKeyDown(),
- event.isShiftKeyDown())) {
- navKeyDown = true;
- event.preventDefault();
- }
-
- startScrollingVelocityTimer();
- }
- }
-
/*
* (non-Javadoc)
*
}
}
- public void onKeyUp(KeyUpEvent event) {
- int keyCode = event.getNativeKeyCode();
-
- if (!isFocusable()) {
- cancelScrollingVelocityTimer();
- } else if (isNavigationKey(keyCode)) {
- if (keyCode == getNavigationDownKey()
- || keyCode == getNavigationUpKey()) {
- /*
- * in multiselect mode the server may still have value from
- * previous page. Clear it unless doing multiselection or just
- * moving focus.
- */
- if (!event.getNativeEvent().getShiftKey()
- && !event.getNativeEvent().getCtrlKey()) {
- instructServerToForgetPreviousSelections();
- }
- sendSelectedRows();
- }
- cancelScrollingVelocityTimer();
- navKeyDown = false;
- }
- }
-
public void startScrollingVelocityTimer() {
if (scrollingVelocityTimer == null) {
scrollingVelocityTimer = new Timer() {