Fixed issue 3248 by adding Focusable interface Review by:jlabanca git-svn-id: https://google-web-toolkit.googlecode.com/svn/releases/1.6@4413 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/client/ui/Focusable.java b/user/src/com/google/gwt/user/client/ui/Focusable.java new file mode 100644 index 0000000..a7828eb --- /dev/null +++ b/user/src/com/google/gwt/user/client/ui/Focusable.java
@@ -0,0 +1,55 @@ +/* + * Copyright 2008 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.ui; + +/** + * A widget that implements this interface can receive keyboard focus. + */ +public interface Focusable { + + /** + * Gets the widget's position in the tab index. + * + * @return the widget's tab index + */ + int getTabIndex(); + + /** + * Sets the widget's 'access key'. This key is used (in conjunction with a + * browser-specific modifier key) to automatically focus the widget. + * + * @param key the widget's access key + */ + void setAccessKey(char key); + + /** + * Explicitly focus/unfocus this widget. Only one widget can have focus at a + * time, and the widget that does will receive all keyboard events. + * + * @param focused whether this widget should take focus or release it + */ + void setFocus(boolean focused); + + /** + * Sets the widget's position in the tab index. If more than one widget has + * the same tab index, each such widget will receive focus in an arbitrary + * order. Setting the tab index to <code>-1</code> will cause this widget to + * be removed from the tab order. + * + * @param index the widget's tab index + */ + void setTabIndex(int index); +}
diff --git a/user/src/com/google/gwt/user/client/ui/HasFocus.java b/user/src/com/google/gwt/user/client/ui/HasFocus.java index c869bd4..e0e999e 100644 --- a/user/src/com/google/gwt/user/client/ui/HasFocus.java +++ b/user/src/com/google/gwt/user/client/ui/HasFocus.java
@@ -17,40 +17,11 @@ /** * A widget that implements this interface can receive keyboard focus. + * + * @deprecated use {@link Focusable} instead */ -@SuppressWarnings("deprecation") -public interface HasFocus extends SourcesFocusEvents, SourcesKeyboardEvents { +@Deprecated +public interface HasFocus extends Focusable, SourcesFocusEvents, + SourcesKeyboardEvents { - /** - * Gets the widget's position in the tab index. - * - * @return the widget's tab index - */ - int getTabIndex(); - - /** - * Sets the widget's 'access key'. This key is used (in conjunction with a - * browser-specific modifier key) to automatically focus the widget. - * - * @param key the widget's access key - */ - void setAccessKey(char key); - - /** - * Explicitly focus/unfocus this widget. Only one widget can have focus at a - * time, and the widget that does will receive all keyboard events. - * - * @param focused whether this widget should take focus or release it - */ - void setFocus(boolean focused); - - /** - * Sets the widget's position in the tab index. If more than one widget has - * the same tab index, each such widget will receive focus in an arbitrary - * order. Setting the tab index to <code>-1</code> will cause this widget to - * be removed from the tab order. - * - * @param index the widget's tab index - */ - void setTabIndex(int index); }
diff --git a/user/src/com/google/gwt/user/client/ui/Tree.java b/user/src/com/google/gwt/user/client/ui/Tree.java index 3f794ba..f27b247 100644 --- a/user/src/com/google/gwt/user/client/ui/Tree.java +++ b/user/src/com/google/gwt/user/client/ui/Tree.java
@@ -72,11 +72,14 @@ * <img class='gallery' src='Tree.png'/> * </p> * <h3>CSS Style Rules</h3> - * <ul class='css'> - * <li>.gwt-Tree { the tree itself }</li> - * <li>.gwt-Tree .gwt-TreeItem { a tree item }</li> - * <li>.gwt-Tree .gwt-TreeItem-selected { a selected tree item }</li> - * </ul> + * <dl> + * <dt>.gwt-Tree</dt> + * <dd>the tree itself</dd> + * <dt>.gwt-Tree .gwt-TreeItem</dt> + * <dd>a tree item</dd> + * <dt>.gwt-Tree .gwt-TreeItem-selected</dt> + * <dd>a selected tree item</dd> + * </dl> * <p> * <h3>Example</h3> * {@example com.google.gwt.examples.TreeExample} @@ -353,7 +356,7 @@ } public HandlerRegistration addMouseDownHandler(MouseDownHandler handler) { - return addHandler(handler,MouseDownEvent.getType()); + return addHandler(handler, MouseDownEvent.getType()); } @Deprecated @@ -362,23 +365,23 @@ } public HandlerRegistration addMouseMoveHandler(MouseMoveHandler handler) { - return addDomHandler(handler,MouseMoveEvent.getType()); + return addDomHandler(handler, MouseMoveEvent.getType()); } public HandlerRegistration addMouseOutHandler(MouseOutHandler handler) { - return addDomHandler(handler,MouseOutEvent.getType()); + return addDomHandler(handler, MouseOutEvent.getType()); } public HandlerRegistration addMouseOverHandler(MouseOverHandler handler) { - return addDomHandler(handler,MouseOverEvent.getType()); + return addDomHandler(handler, MouseOverEvent.getType()); } public HandlerRegistration addMouseUpHandler(MouseUpHandler handler) { - return addDomHandler(handler,MouseUpEvent.getType()); + return addDomHandler(handler, MouseUpEvent.getType()); } public HandlerRegistration addMouseWheelHandler(MouseWheelHandler handler) { - return addDomHandler(handler,MouseWheelEvent.getType()); + return addDomHandler(handler, MouseWheelEvent.getType()); } public final HandlerRegistration addOpenHandler(OpenHandler<TreeItem> handler) { @@ -1039,7 +1042,7 @@ * Move the tree focus to the specified selected item. */ private void moveFocus() { - HasFocus focusableWidget = curSelection.getFocusableWidget(); + Focusable focusableWidget = curSelection.getFocusable(); if (focusableWidget != null) { focusableWidget.setFocus(true); DOM.scrollIntoView(((Widget) focusableWidget).getElement());
diff --git a/user/src/com/google/gwt/user/client/ui/TreeItem.java b/user/src/com/google/gwt/user/client/ui/TreeItem.java index c3c808f..38c5756 100644 --- a/user/src/com/google/gwt/user/client/ui/TreeItem.java +++ b/user/src/com/google/gwt/user/client/ui/TreeItem.java
@@ -619,11 +619,35 @@ } /** + * Returns a suggested {@link Focusable} instance to use when this tree item + * is selected. The tree maintains focus if this method returns null. By + * default, if the tree item contains a focusable widget, that widget is + * returned. + * + * Note, the {@link Tree} will ignore this value if the user clicked on an + * input element such as a button or text area when selecting this item. + * + * @return the focusable item + */ + protected Focusable getFocusable() { + Focusable focus = getFocusableWidget(); + if (focus == null) { + Widget w = getWidget(); + if (w instanceof Focusable) { + focus = (Focusable) w; + } + } + return focus; + } + + /** * Returns the widget, if any, that should be focused on if this TreeItem is * selected. * + * @deprecated use {@link #getFocusable()} instead * @return widget to be focused. */ + @Deprecated protected HasFocus getFocusableWidget() { Widget w = getWidget(); if (w instanceof HasFocus) {