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;
     }
 
     /**