From 49f23cc10c7a18b35095183d39a98b6f4fd418b9 Mon Sep 17 00:00:00 2001 From: Jonatan Kronqvist Date: Wed, 6 Apr 2011 11:10:46 +0000 Subject: [PATCH] Cleaned up #6197 - moved keyboard handling from the table body to the table rows svn changeset:18129/svn branch:6.5 --- WebContent/VAADIN/themes/base/styles.css | 4 +- WebContent/VAADIN/themes/base/table/table.css | 4 +- WebContent/VAADIN/themes/liferay/styles.css | 4 +- WebContent/VAADIN/themes/reindeer/styles.css | 4 +- WebContent/VAADIN/themes/runo/styles.css | 4 +- .../terminal/gwt/client/ui/VScrollTable.java | 245 +++++++----------- 6 files changed, 111 insertions(+), 154 deletions(-) diff --git a/WebContent/VAADIN/themes/base/styles.css b/WebContent/VAADIN/themes/base/styles.css index aba8b88745..de17effabd 100644 --- a/WebContent/VAADIN/themes/base/styles.css +++ b/WebContent/VAADIN/themes/base/styles.css @@ -1674,7 +1674,8 @@ div.v-progressindicator-indeterminate-disabled { text-align: center; } .v-table-body:focus, -.v-table-body-wrapper:focus { +.v-table-body-wrapper:focus, +tr.v-table-focus:focus { outline: none; } .v-table-body.focused { @@ -1683,6 +1684,7 @@ div.v-progressindicator-indeterminate-disabled { .v-table-focus .v-table-cell-content { border-top: 1px dotted #0066bd; border-bottom: 1px dotted #0066bd; + outline: none; } /* row in column selector */ .v-on { diff --git a/WebContent/VAADIN/themes/base/table/table.css b/WebContent/VAADIN/themes/base/table/table.css index 7308cc4a46..e0f2f0e1d4 100644 --- a/WebContent/VAADIN/themes/base/table/table.css +++ b/WebContent/VAADIN/themes/base/table/table.css @@ -210,7 +210,8 @@ text-align: center; } .v-table-body:focus, -.v-table-body-wrapper:focus { +.v-table-body-wrapper:focus, +tr.v-table-focus:focus { outline: none; } .v-table-body.focused { @@ -219,6 +220,7 @@ .v-table-focus .v-table-cell-content { border-top: 1px dotted #0066bd; border-bottom: 1px dotted #0066bd; + outline: none; } /* row in column selector */ .v-on { diff --git a/WebContent/VAADIN/themes/liferay/styles.css b/WebContent/VAADIN/themes/liferay/styles.css index 8b248ae320..85fd302053 100644 --- a/WebContent/VAADIN/themes/liferay/styles.css +++ b/WebContent/VAADIN/themes/liferay/styles.css @@ -1674,7 +1674,8 @@ div.v-progressindicator-indeterminate-disabled { text-align: center; } .v-table-body:focus, -.v-table-body-wrapper:focus { +.v-table-body-wrapper:focus, +tr.v-table-focus:focus { outline: none; } .v-table-body.focused { @@ -1683,6 +1684,7 @@ div.v-progressindicator-indeterminate-disabled { .v-table-focus .v-table-cell-content { border-top: 1px dotted #0066bd; border-bottom: 1px dotted #0066bd; + outline: none; } /* row in column selector */ .v-on { diff --git a/WebContent/VAADIN/themes/reindeer/styles.css b/WebContent/VAADIN/themes/reindeer/styles.css index baabdf46dd..ad31dd3d77 100644 --- a/WebContent/VAADIN/themes/reindeer/styles.css +++ b/WebContent/VAADIN/themes/reindeer/styles.css @@ -1674,7 +1674,8 @@ div.v-progressindicator-indeterminate-disabled { text-align: center; } .v-table-body:focus, -.v-table-body-wrapper:focus { +.v-table-body-wrapper:focus, +tr.v-table-focus:focus { outline: none; } .v-table-body.focused { @@ -1683,6 +1684,7 @@ div.v-progressindicator-indeterminate-disabled { .v-table-focus .v-table-cell-content { border-top: 1px dotted #0066bd; border-bottom: 1px dotted #0066bd; + outline: none; } /* row in column selector */ .v-on { diff --git a/WebContent/VAADIN/themes/runo/styles.css b/WebContent/VAADIN/themes/runo/styles.css index c641a8c5f0..9a75cef4a6 100644 --- a/WebContent/VAADIN/themes/runo/styles.css +++ b/WebContent/VAADIN/themes/runo/styles.css @@ -1674,7 +1674,8 @@ div.v-progressindicator-indeterminate-disabled { text-align: center; } .v-table-body:focus, -.v-table-body-wrapper:focus { +.v-table-body-wrapper:focus, +tr.v-table-focus:focus { outline: none; } .v-table-body.focused { @@ -1683,6 +1684,7 @@ div.v-progressindicator-indeterminate-disabled { .v-table-focus .v-table-cell-content { border-top: 1px dotted #0066bd; border-bottom: 1px dotted #0066bd; + outline: none; } /* row in column selector */ .v-on { diff --git a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java index 7e6c6ecd82..a627f5d204 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VScrollTable.java @@ -94,8 +94,7 @@ import com.vaadin.terminal.gwt.client.ui.dd.VerticalDropLocation; * 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"; @@ -322,18 +321,6 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, 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); @@ -3687,7 +3674,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, } public class VScrollTableRow extends Panel implements ActionOwner, - Container { + Container, KeyPressHandler, KeyUpHandler, KeyDownHandler { private static final int DRAGMODE_MULTIROW = 2; protected ArrayList childWidgets = new ArrayList(); @@ -3709,7 +3696,20 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, 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()); } /** @@ -4179,59 +4179,91 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, 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); } /** @@ -5147,7 +5179,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, // Set new focused row focusedRow = row; - ensureRowIsVisible(row); + // ensureRowIsVisible(row); row.getElement().focus(); return true; @@ -5187,6 +5219,7 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, if (top < cur.scrollTop) { cur.scrollTop = top; } + if (top + height > cur.scrollTop + cur.clientHeight) { cur.scrollTop = (top + height) - cur.clientHeight; } @@ -5461,68 +5494,6 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, 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) * @@ -5650,30 +5621,6 @@ public class VScrollTable extends FlowPanel implements Table, ScrollHandler, } } - 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() { -- 2.39.5