You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by gb...@apache.org on 2009/08/10 21:14:33 UTC
svn commit: r802901 - in
/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk: Component.java
Container.java
Author: gbrown
Date: Mon Aug 10 19:14:33 2009
New Revision: 802901
URL: http://svn.apache.org/viewvc?rev=802901&view=rev
Log:
Support focusable containers in focus traversal; make traversal logic recursive.
Modified:
incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Component.java
incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Container.java
Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Component.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Component.java?rev=802901&r1=802900&r2=802901&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Component.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Component.java Mon Aug 10 19:14:33 2009
@@ -2214,46 +2214,25 @@
* The direction in which to transfer focus.
*/
public void transferFocus(Direction direction) {
- Component component = this;
+ Container container = getParent();
- // Loop until we either find a component that is capable of receiving
- // the focus or we run out of components
- do {
- // Attempt to traverse the current component's parent
- Container container = component.getParent();
- FocusTraversalPolicy focusTraversalPolicy = (container == null
- ? null : container.getFocusTraversalPolicy());
+ if (container != null) {
+ // Get the focus traversal policy for this component's parent
+ FocusTraversalPolicy focusTraversalPolicy = container.getFocusTraversalPolicy();
if (focusTraversalPolicy == null) {
- // This container has no traversal policy; move up a level
- component = container;
+ // The container has no traversal policy; move up a level
+ container.transferFocus(direction);
} else {
// Get the next component in the traversal
- component = focusTraversalPolicy.getNextComponent(container, component, direction);
-
- // If the next component is a container, attempt to traverse
- // down into it
- while (component instanceof Container) {
- container = (Container)component;
- component = null;
-
- focusTraversalPolicy = container.getFocusTraversalPolicy();
-
- if (focusTraversalPolicy != null) {
- component = focusTraversalPolicy.getNextComponent(container, component, direction);
- }
- }
+ Component component = container.focusNext(this, direction);
if (component == null) {
- // We are at the end of the traversal; move up a level
- component = container;
+ // We are at the end of the traversal
+ container.transferFocus(direction);
}
}
- } while (component != null
- && !component.isFocusable());
-
- // Focus the component (which may be null)
- setFocusedComponent(component);
+ }
}
/**
Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Container.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Container.java?rev=802901&r1=802900&r2=802901&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Container.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Container.java Mon Aug 10 19:14:33 2009
@@ -436,31 +436,48 @@
*/
@Override
public boolean requestFocus() {
- boolean success = false;
+ boolean focused = super.requestFocus();
- if (isShowing()
- && isEnabled()) {
- FocusTraversalPolicy focusTraversalPolicy = getFocusTraversalPolicy();
+ if (!focused
+ && focusTraversalPolicy != null) {
+ Component component = null;
- if (focusTraversalPolicy != null) {
- Component component = null;
+ do {
+ component = focusTraversalPolicy.getNextComponent(this, component, Direction.FORWARD);
+ } while (component != null
+ && !component.requestFocus());
- do {
- component = focusTraversalPolicy.getNextComponent(this, component, Direction.FORWARD);
+ focused = (component != null
+ && component.isFocused());
+ }
+
+ return focused;
+ }
- // TODO Detect infinite loop that can occur if the focus
- // traversal policy loops and every component it returns
- // yields false when requestFocus() is called on it
+ protected Component focusNext(Component component, Direction direction) {
+ do {
+ component = focusTraversalPolicy.getNextComponent(this, component, direction);
- if (component != null) {
- success = component.requestFocus();
+ if (component == null) {
+ Container parent = getParent();
+
+ if (parent != null) {
+ component = parent.focusNext(this, direction);
+ }
+ } else {
+ if (component.isFocusable()) {
+ component.requestFocus();
+ } else {
+ if (component instanceof Container) {
+ Container container = (Container)component;
+ component = container.focusNext(null, direction);
}
- } while (component != null
- && !success);
+ }
}
- }
+ } while (component != null
+ && !component.isFocused());
- return success;
+ return component;
}
/**