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 19:25:19 UTC

svn commit: r802868 - in /incubator/pivot/trunk/wtk: src/org/apache/pivot/wtk/ src/org/apache/pivot/wtk/skin/ src/org/apache/pivot/wtk/skin/terra/ test/org/apache/pivot/wtk/test/

Author: gbrown
Date: Mon Aug 10 17:25:18 2009
New Revision: 802868

URL: http://svn.apache.org/viewvc?rev=802868&view=rev
Log:
Preliminary work on PIVOT-215. Container are now theoretically focusable, but focus traversal logic will not currently respect it.

Modified:
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ApplicationContext.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Component.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ComponentStateListener.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Container.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Frame.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/MenuBar.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/MenuPopup.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Window.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/WindowListener.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ButtonSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/CalendarButtonSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ComponentSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ContainerSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ListButtonSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/MenuBarItemSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/MenuButtonSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/PushButtonSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/WindowSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraCalendarSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraExpanderSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraFrameSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraPaletteSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraRollupSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraSpinnerSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTableViewSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTextInputSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java
    incubator/pivot/trunk/wtk/test/org/apache/pivot/wtk/test/WindowFocusTest.java

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ApplicationContext.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ApplicationContext.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ApplicationContext.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ApplicationContext.java Mon Aug 10 17:25:18 2009
@@ -676,7 +676,7 @@
                     if (focusedComponent != null
                         && focusedComponent.isShowing()
                         && !focusedComponent.isBlocked()) {
-                        focusedComponent.requestFocus(true);
+                        focusedComponent.requestFocus();
                     }
 
                     break;
@@ -684,7 +684,7 @@
 
                 case FocusEvent.FOCUS_LOST: {
                     focusedComponent = Component.getFocusedComponent();
-                    Component.clearFocus(true);
+                    Component.clearFocus();
 
                     break;
                 }

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=802868&r1=802867&r2=802868&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 17:25:18 2009
@@ -389,9 +389,9 @@
             }
         }
 
-        public void focusedChanged(Component component, boolean temporary) {
+        public void focusedChanged(Component component, Component obverseComponent) {
             for (ComponentStateListener listener : this) {
-                listener.focusedChanged(component, temporary);
+                listener.focusedChanged(component, obverseComponent);
             }
         }
     }
@@ -2182,31 +2182,26 @@
      * <tt>true</tt> if the component has received the input focus;
      * <tt>false</tt> if the component has lost the focus.
      *
-     * @param temporary
-     * <tt>true</tt> if this focus change is temporary; <tt>false</tt>,
-     * otherwise.
+     * @param obverseComponent
+     * If <tt>focused</tt> is true, the component that has lost the focus;
+     * otherwise, the component that has gained the focus.
      */
-    protected void setFocused(boolean focused, boolean temporary) {
-        componentStateListeners.focusedChanged(this, temporary);
-    }
+    protected void setFocused(boolean focused, Component obverseComponent) {
+        componentStateListeners.focusedChanged(this, obverseComponent);
 
-    /**
-     * Requests that focus be given to this component.
-     */
-    public final boolean requestFocus() {
-        return requestFocus(false);
+        if (focused) {
+            parent.descendantGainedFocus(this);
+        } else {
+            parent.descendantLostFocus(this);
+        }
     }
 
     /**
      * Requests that focus be given to this component.
-     *
-     * @param temporary
-     * If <tt>true</tt>, indicates that focus is being restored from a
-     * temporary loss.
      */
-    protected boolean requestFocus(boolean temporary) {
+    public boolean requestFocus() {
         if (isFocusable()) {
-            setFocusedComponent(this, temporary);
+            setFocusedComponent(this);
         }
 
         return isFocused();
@@ -2258,7 +2253,7 @@
             && !component.isFocusable());
 
         // Focus the component (which may be null)
-        setFocusedComponent(component, false);
+        setFocusedComponent(component);
     }
 
     /**
@@ -2282,25 +2277,18 @@
      * <tt>true</tt> if this focus change is or was temporary; <tt>false</tt>,
      * if it is permanent.
      */
-    private static void setFocusedComponent(Component focusedComponent, boolean temporary) {
+    private static void setFocusedComponent(Component focusedComponent) {
         Component previousFocusedComponent = Component.focusedComponent;
 
         if (previousFocusedComponent != focusedComponent) {
-            // Set the focused component
             Component.focusedComponent = focusedComponent;
 
-            if (focusedComponent == null) {
-                if (previousFocusedComponent != null
-                    && !temporary) {
-                    previousFocusedComponent.getWindow().setFocusDescendant(null);
-                }
-            } else {
-                focusedComponent.getWindow().setFocusDescendant(focusedComponent);
-                focusedComponent.setFocused(true, temporary);
+            if (previousFocusedComponent != null) {
+                previousFocusedComponent.setFocused(false, focusedComponent);
             }
 
-            if (previousFocusedComponent != null) {
-                previousFocusedComponent.setFocused(false, temporary);
+            if (focusedComponent != null) {
+                focusedComponent.setFocused(true, previousFocusedComponent);
             }
 
             componentClassListeners.focusedComponentChanged(previousFocusedComponent);
@@ -2311,17 +2299,7 @@
      * Clears the focus.
      */
     public static void clearFocus() {
-        clearFocus(false);
-    }
-
-    /**
-     * Clears the focus.
-     *
-     * @param temporary
-     * If <tt>true</tt>, the focus is being cleared temporarily.
-     */
-    protected static void clearFocus(boolean temporary) {
-        setFocusedComponent(null, temporary);
+        setFocusedComponent(null);
     }
 
     /**

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ComponentStateListener.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ComponentStateListener.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ComponentStateListener.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ComponentStateListener.java Mon Aug 10 17:25:18 2009
@@ -32,7 +32,7 @@
         public void enabledChanged(Component component) {
         }
 
-        public void focusedChanged(Component component, boolean temporary) {
+        public void focusedChanged(Component component, Component obverseComponent) {
         }
     }
 
@@ -47,7 +47,7 @@
      * Called when a component's focused state has changed.
      *
      * @param component
-     * @param temporary
+     * @param obverseComponent
      */
-    public void focusedChanged(Component component, boolean temporary);
+    public void focusedChanged(Component component, Component obverseComponent);
 }

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=802868&r1=802867&r2=802868&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 17:25:18 2009
@@ -254,7 +254,7 @@
         // and contains the focused component, clear the focus
         if (parent == null
             && containsFocus()) {
-            clearFocus(false);
+            clearFocus();
         }
 
         super.setParent(parent);
@@ -303,7 +303,7 @@
     public void setVisible(boolean visible) {
         if (!visible
             && containsFocus()) {
-            clearFocus(false);
+            clearFocus();
         }
 
         super.setVisible(visible);
@@ -431,20 +431,11 @@
      }
 
     /**
-     * @return
-     * <tt>false</tt>; containers are not focusable.
-     */
-    @Override
-    public final boolean isFocusable() {
-        return false;
-    }
-
-    /**
      * Requests that focus be set to the first focusable descendant in this
      * container.
      */
     @Override
-    protected boolean requestFocus(boolean temporary) {
+    public boolean requestFocus() {
         boolean success = false;
 
         if (isShowing()
@@ -462,7 +453,7 @@
                     // yields false when requestFocus() is called on it
 
                     if (component != null) {
-                        success = component.requestFocus(temporary);
+                        success = component.requestFocus();
                     }
                 } while (component != null
                     && !success);
@@ -508,6 +499,22 @@
             && isAncestor(focusedComponent));
     }
 
+    protected void descendantGainedFocus(Component descendant) {
+        Container parent = getParent();
+
+        if (parent != null) {
+            parent.descendantGainedFocus(descendant);
+        }
+    }
+
+    protected void descendantLostFocus(Component descendant) {
+        Container parent = getParent();
+
+        if (parent != null) {
+            parent.descendantLostFocus(descendant);
+        }
+    }
+
     /**
      * Returns the container's context key.
      *

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Frame.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Frame.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Frame.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Frame.java Mon Aug 10 17:25:18 2009
@@ -81,52 +81,50 @@
     }
 
     @Override
-    protected void setFocusDescendant(Component focusDescendant) {
+    protected void descendantGainedFocus(Component descendant) {
+        super.descendantGainedFocus(descendant);
+
+        // Walk down descendant hierarchy and call configureMenuBar()
         if (menuBar != null) {
-            // Walk down previous focus descendant hierarchy and call cleanupMenuBar()
-            Component previousFocusDescendant = getFocusDescendant();
+            LinkedList<Component> path = new LinkedList<Component>();
 
-            if (previousFocusDescendant != null
-                && !(previousFocusDescendant instanceof MenuBar.Item)) {
-                LinkedList<Component> previousFocusDescendantPath = new LinkedList<Component>();
-
-                Component previousFocusAncestor = previousFocusDescendant;
-                while (!(previousFocusAncestor instanceof Display)) {
-                    previousFocusDescendantPath.insert(previousFocusAncestor, 0);
-                    previousFocusAncestor = previousFocusAncestor.getParent();
-                }
+            Component ancestor = descendant;
+            while (!(ancestor instanceof Display)) {
+                path.insert(ancestor, 0);
+                ancestor = ancestor.getParent();
+            }
 
-                for (Component component : previousFocusDescendantPath) {
-                    MenuHandler menuHandler = component.getMenuHandler();
+            for (Component component : path) {
+                MenuHandler menuHandler = component.getMenuHandler();
 
-                    if (menuHandler != null) {
-                        menuHandler.cleanupMenuBar(component, menuBar);
-                    }
+                if (menuHandler != null) {
+                    menuHandler.configureMenuBar(component, menuBar);
                 }
             }
+        }
+    }
 
-            // Walk down focus descendant hierarchy and call configureMenuBar()
-            if (focusDescendant != null
-                && !(previousFocusDescendant instanceof MenuBar.Item)) {
-                LinkedList<Component> focusDescendantPath = new LinkedList<Component>();
-
-                Component focusAncestor = focusDescendant;
-                while (!(focusAncestor instanceof Display)) {
-                    focusDescendantPath.insert(focusAncestor, 0);
-                    focusAncestor = focusAncestor.getParent();
-                }
+    protected void descendantLostFocus(Component descendant) {
+        super.descendantLostFocus(descendant);
 
-                for (Component component : focusDescendantPath) {
-                    MenuHandler menuHandler = component.getMenuHandler();
+        // Walk down descendant hierarchy and call configureMenuBar()
+        if (menuBar != null) {
+            LinkedList<Component> path = new LinkedList<Component>();
+
+            Component ancestor = descendant;
+            while (!(ancestor instanceof Display)) {
+                path.insert(ancestor, 0);
+                ancestor = ancestor.getParent();
+            }
 
-                    if (menuHandler != null) {
-                        menuHandler.configureMenuBar(component, menuBar);
-                    }
+            for (Component component : path) {
+                MenuHandler menuHandler = component.getMenuHandler();
+
+                if (menuHandler != null) {
+                    menuHandler.cleanupMenuBar(component, menuBar);
                 }
             }
         }
-
-        super.setFocusDescendant(focusDescendant);
     }
 
     @Override

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/MenuBar.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/MenuBar.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/MenuBar.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/MenuBar.java Mon Aug 10 17:25:18 2009
@@ -232,10 +232,6 @@
         if (this.active != active) {
             this.active = active;
 
-            if (!active) {
-                getWindow().setFocusDescendant(null);
-            }
-
             menuBarListeners.activeChanged(this);
         }
     }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/MenuPopup.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/MenuPopup.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/MenuPopup.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/MenuPopup.java Mon Aug 10 17:25:18 2009
@@ -134,7 +134,6 @@
         super.close();
 
         if (isClosed()) {
-            setFocusDescendant(null);
             affiliate = null;
         }
     }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Window.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Window.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Window.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Window.java Mon Aug 10 17:25:18 2009
@@ -247,9 +247,9 @@
             }
         }
 
-        public void activeChanged(Window window) {
+        public void activeChanged(Window window, Window obverseWindow) {
             for (WindowListener listener : this) {
-                listener.activeChanged(window);
+                listener.activeChanged(window, obverseWindow);
             }
         }
 
@@ -814,9 +814,10 @@
      * Called to notify a window that its active state has changed.
      *
      * @param active
+     * @param obverseWindow
      */
-    protected void setActive(boolean active) {
-        windowListeners.activeChanged(this);
+    protected void setActive(boolean active, Window obverseWindow) {
+        windowListeners.activeChanged(this, obverseWindow);
     }
 
     /**
@@ -861,12 +862,12 @@
 
             // Notify the windows of the state change
             if (previousActiveWindow != null) {
-                previousActiveWindow.setActive(false);
+                previousActiveWindow.setActive(false, activeWindow);
             }
 
             // Activate the window
             if (activeWindow != null) {
-                activeWindow.setActive(true);
+                activeWindow.setActive(true, previousActiveWindow);
             }
 
             windowClassListeners.activeWindowChanged(previousActiveWindow);
@@ -881,17 +882,11 @@
         return focusDescendant;
     }
 
-    /**
-     * Sets the window descendant to which focus will be restored by a call to
-     * {@link #restoreFocus()}.
-     *
-     * @param focusDescendant
-     */
-    protected void setFocusDescendant(Component focusDescendant) {
-        assert(focusDescendant == null
-            || focusDescendant.getWindow() == this);
+    @Override
+    protected void descendantGainedFocus(Component descendant) {
+        super.descendantGainedFocus(descendant);
 
-        this.focusDescendant = focusDescendant;
+        this.focusDescendant = descendant;
     }
 
     /**
@@ -903,14 +898,14 @@
 
         if (focusDescendant != null) {
             if (isAncestor(focusDescendant)) {
-                focusDescendant.requestFocus(true);
+                focusDescendant.requestFocus();
             } else {
                 focusDescendant = null;
             }
         }
 
         if (focusDescendant == null) {
-            Component.clearFocus(false);
+            Component.clearFocus();
         }
     }
 
@@ -1016,7 +1011,7 @@
         }
 
         if (containsFocus()) {
-            clearFocus(true);
+            clearFocus();
         }
 
         Display display = getDisplay();

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/WindowListener.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/WindowListener.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/WindowListener.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/WindowListener.java Mon Aug 10 17:25:18 2009
@@ -42,7 +42,7 @@
         public void ownerChanged(Window window, Window previousOwner) {
         }
 
-        public void activeChanged(Window window) {
+        public void activeChanged(Window window, Window obverseWindow) {
         }
 
         public void maximizedChanged(Window window) {
@@ -88,8 +88,9 @@
      * Called when a window's active state has changed.
      *
      * @param window
+     * @param obverseWindow
      */
-    public void activeChanged(Window window);
+    public void activeChanged(Window window, Window obverseWindow);
 
     /**
      * Called when a window's maximized state has changed.

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ButtonSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ButtonSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ButtonSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ButtonSkin.java Mon Aug 10 17:25:18 2009
@@ -71,8 +71,8 @@
     }
 
     @Override
-    public void focusedChanged(Component component, boolean temporary) {
-        super.focusedChanged(component, temporary);
+    public void focusedChanged(Component component, Component obverseComponent) {
+        super.focusedChanged(component, obverseComponent);
 
         repaintComponent(!component.isFocused());
     }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/CalendarButtonSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/CalendarButtonSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/CalendarButtonSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/CalendarButtonSkin.java Mon Aug 10 17:25:18 2009
@@ -223,8 +223,8 @@
     }
 
     @Override
-    public void focusedChanged(Component component, boolean temporary) {
-        super.focusedChanged(component, temporary);
+    public void focusedChanged(Component component, Component obverseComponent) {
+        super.focusedChanged(component, obverseComponent);
 
         // Close the popup if focus was transferred to a component whose
         // window is not the popup

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ComponentSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ComponentSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ComponentSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ComponentSkin.java Mon Aug 10 17:25:18 2009
@@ -204,10 +204,9 @@
         // No-op
     }
 
-    public void focusedChanged(Component component, boolean temporary) {
+    public void focusedChanged(Component component, Component obverseComponent) {
         // Ensure that the component is visible if it is in a viewport
-        if (component.isFocused()
-            && !temporary) {
+        if (component.isFocused()) {
             component.scrollAreaToVisible(0, 0, getWidth(), getHeight());
         }
     }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ContainerSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ContainerSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ContainerSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ContainerSkin.java Mon Aug 10 17:25:18 2009
@@ -167,10 +167,10 @@
 
     /**
      * @return
-     * <tt>false</tt>; containers are not focusable.
+     * <tt>false</tt>; by default, containers are not focusable.
      */
     @Override
-    public final boolean isFocusable() {
+    public boolean isFocusable() {
         return false;
     }
 

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ListButtonSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ListButtonSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ListButtonSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/ListButtonSkin.java Mon Aug 10 17:25:18 2009
@@ -226,8 +226,8 @@
     }
 
     @Override
-    public void focusedChanged(Component component, boolean temporary) {
-        super.focusedChanged(component, temporary);
+    public void focusedChanged(Component component, Component obverseComponent) {
+        super.focusedChanged(component, obverseComponent);
 
         // Close the popup if focus was transferred to a component whose
         // window is not the popup

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/MenuBarItemSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/MenuBarItemSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/MenuBarItemSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/MenuBarItemSkin.java Mon Aug 10 17:25:18 2009
@@ -200,8 +200,8 @@
     }
 
     @Override
-    public void focusedChanged(Component component, boolean temporary) {
-        super.focusedChanged(component, temporary);
+    public void focusedChanged(Component component, Component obverseComponent) {
+        super.focusedChanged(component, obverseComponent);
 
         if (component.isFocused()) {
             if (!menuPopup.isOpen()) {
@@ -215,8 +215,7 @@
                 menuPopup.open(menuBarItem);
             }
         } else {
-            if (!temporary
-                && !menuPopup.containsFocus()) {
+            if (!menuPopup.containsFocus()) {
                 menuPopup.close();
             }
         }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/MenuButtonSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/MenuButtonSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/MenuButtonSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/MenuButtonSkin.java Mon Aug 10 17:25:18 2009
@@ -69,8 +69,8 @@
     }
 
     @Override
-    public void focusedChanged(Component component, boolean temporary) {
-        super.focusedChanged(component, temporary);
+    public void focusedChanged(Component component, Component obverseComponent) {
+        super.focusedChanged(component, obverseComponent);
 
         // Close the popup if focus was transferred to a component whose
         // window is not the popup

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/PushButtonSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/PushButtonSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/PushButtonSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/PushButtonSkin.java Mon Aug 10 17:25:18 2009
@@ -37,8 +37,8 @@
     }
 
     @Override
-    public void focusedChanged(Component component, boolean temporary) {
-        super.focusedChanged(component, temporary);
+    public void focusedChanged(Component component, Component obverseComponent) {
+        super.focusedChanged(component, obverseComponent);
 
         pressed = false;
     }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/TextAreaSkin.java Mon Aug 10 17:25:18 2009
@@ -1585,8 +1585,8 @@
     }
 
     @Override
-    public void focusedChanged(Component component, boolean temporary) {
-        super.focusedChanged(component, temporary);
+    public void focusedChanged(Component component, Component obverseComponent) {
+        super.focusedChanged(component, obverseComponent);
 
         TextArea textArea = (TextArea)getComponent();
         showCaret(textArea.isFocused()

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/WindowSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/WindowSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/WindowSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/WindowSkin.java Mon Aug 10 17:25:18 2009
@@ -134,7 +134,7 @@
         // No-op
     }
 
-    public void activeChanged(Window window) {
+    public void activeChanged(Window window, Window obverseWindow) {
         // No-op
     }
 

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraCalendarSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraCalendarSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraCalendarSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraCalendarSkin.java Mon Aug 10 17:25:18 2009
@@ -186,10 +186,10 @@
         }
 
         @Override
-        public void focusedChanged(Component component, boolean temporary) {
+        public void focusedChanged(Component component, Component obverseComponent) {
             highlighted = component.isFocused();
 
-            super.focusedChanged(component, temporary);
+            super.focusedChanged(component, obverseComponent);
         }
 
         @Override

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraExpanderSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraExpanderSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraExpanderSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraExpanderSkin.java Mon Aug 10 17:25:18 2009
@@ -391,9 +391,9 @@
         titleBarTablePane.setSize(Math.max(width - 2, 0), titleBarHeight);
         titleBarTablePane.setLocation(1, 1);
 
-        if (expander.isExpanded()
-            || expandTransition != null) {
-            if (content != null) {
+        if (content != null) {
+            if (expander.isExpanded()
+                || expandTransition != null) {
                 int contentWidth = Math.max(width - (2 + padding.left + padding.right), 0);
                 int contentHeight = Math.max(height - (3 + padding.top + padding.bottom + titleBarHeight), 0);
                 content.setSize(contentWidth, contentHeight);
@@ -401,6 +401,10 @@
                 int contentX = 1 + padding.left;
                 int contentY = 2 + padding.top + titleBarHeight;
                 content.setLocation(contentX, contentY);
+
+                content.setVisible(true);
+            } else {
+                content.setVisible(false);
             }
         }
     }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraFrameSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraFrameSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraFrameSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraFrameSkin.java Mon Aug 10 17:25:18 2009
@@ -341,7 +341,7 @@
 
         iconChanged(frame, null);
         titleChanged(frame, null);
-        activeChanged(frame);
+        activeChanged(frame, null);
 
         updateMaximizedState();
     }
@@ -770,7 +770,7 @@
     }
 
     @Override
-    public void activeChanged(Window window) {
+    public void activeChanged(Window window, Window obverseWindow) {
         boolean active = window.isActive();
 
         titleLabel.getStyles().put("color", active ?

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java Mon Aug 10 17:25:18 2009
@@ -788,8 +788,8 @@
     }
 
     @Override
-    public void focusedChanged(Component component, boolean temporary) {
-        super.focusedChanged(component, temporary);
+    public void focusedChanged(Component component, Component obverseComponent) {
+        super.focusedChanged(component, obverseComponent);
 
         repaintComponent(!component.isFocused());
     }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraPaletteSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraPaletteSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraPaletteSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraPaletteSkin.java Mon Aug 10 17:25:18 2009
@@ -100,7 +100,7 @@
     private Insets padding = new Insets(4);
 
     private WindowListener ownerListener = new WindowListener.Adapter() {
-        public void activeChanged(Window owner) {
+        public void activeChanged(Window owner, Window obverseWindow) {
             Window window = (Window)getComponent();
             window.setVisible(owner.isActive());
         }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraRollupSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraRollupSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraRollupSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraRollupSkin.java Mon Aug 10 17:25:18 2009
@@ -342,7 +342,12 @@
 
                 content.setLocation(x, y);
                 content.setSize(contentWidth, contentHeight);
+
+                content.setVisible(true);
+            } else {
+                content.setVisible(false);
             }
+
         }
 
         y = (heading == null ? 0 : (heading.getHeight() - rollupButtonSize.height) / 2 + 1);

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraSpinnerSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraSpinnerSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraSpinnerSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraSpinnerSkin.java Mon Aug 10 17:25:18 2009
@@ -243,8 +243,8 @@
         }
 
         @Override
-        public void focusedChanged(Component component, boolean temporary) {
-            super.focusedChanged(component, temporary);
+        public void focusedChanged(Component component, Component obverseComponent) {
+            super.focusedChanged(component, obverseComponent);
 
             repaintComponent(!component.isFocused());
         }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTableViewSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTableViewSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTableViewSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTableViewSkin.java Mon Aug 10 17:25:18 2009
@@ -1027,8 +1027,8 @@
     }
 
     @Override
-    public void focusedChanged(Component component, boolean temporary) {
-        super.focusedChanged(component, temporary);
+    public void focusedChanged(Component component, Component obverseComponent) {
+        super.focusedChanged(component, obverseComponent);
 
         repaintComponent(!component.isFocused());
     }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTextInputSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTextInputSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTextInputSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTextInputSkin.java Mon Aug 10 17:25:18 2009
@@ -45,6 +45,7 @@
 import org.apache.pivot.wtk.TextInputListener;
 import org.apache.pivot.wtk.TextInputSelectionListener;
 import org.apache.pivot.wtk.Theme;
+import org.apache.pivot.wtk.Window;
 import org.apache.pivot.wtk.skin.ComponentSkin;
 import org.apache.pivot.wtk.text.TextNode;
 import org.apache.pivot.wtk.text.validation.Validator;
@@ -1215,21 +1216,32 @@
     }
 
     @Override
-    public void focusedChanged(Component component, boolean temporary) {
-        super.focusedChanged(component, temporary);
+    public void focusedChanged(Component component, Component obverseComponent) {
+        super.focusedChanged(component, obverseComponent);
 
         TextInput textInput = (TextInput)getComponent();
         TextNode textNode = textInput.getTextNode();
 
-        if (component.isFocused()) {
-            showCaret(textInput.getSelectionLength() == 0);
+        Window window = component.getWindow();
 
-            if (!temporary
-                && Mouse.getCapturer() != component) {
-                textInput.setSelection(0, textNode.getCharacterCount());
+        if (component.isFocused()) {
+            // If focus is not being restored or the focus was permanently
+            // transferred within this window, select all
+            if ((obverseComponent == null
+                    && window.getFocusDescendant() != component)
+                || (obverseComponent != null
+                    && obverseComponent.getWindow() == window)) {
+                if (Mouse.getCapturer() != component) {
+                    textInput.setSelection(0, textNode.getCharacterCount());
+                }
             }
+
+            showCaret(textInput.getSelectionLength() == 0);
         } else {
-            if (!temporary) {
+            // If focus is being permanently transferred within this window,
+            // clear the selection
+            if (obverseComponent != null
+                && obverseComponent.getWindow() == window) {
                 textInput.setSelection(textInput.getSelectionStart()
                     + textInput.getSelectionLength(), 0);
             }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java Mon Aug 10 17:25:18 2009
@@ -1665,8 +1665,8 @@
     }
 
     @Override
-    public void focusedChanged(Component component, boolean temporary) {
-        super.focusedChanged(component, temporary);
+    public void focusedChanged(Component component, Component obverseComponent) {
+        super.focusedChanged(component, obverseComponent);
 
         repaintComponent(!component.isFocused());
     }

Modified: incubator/pivot/trunk/wtk/test/org/apache/pivot/wtk/test/WindowFocusTest.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/test/org/apache/pivot/wtk/test/WindowFocusTest.java?rev=802868&r1=802867&r2=802868&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/test/org/apache/pivot/wtk/test/WindowFocusTest.java (original)
+++ incubator/pivot/trunk/wtk/test/org/apache/pivot/wtk/test/WindowFocusTest.java Mon Aug 10 17:25:18 2009
@@ -22,6 +22,7 @@
 import org.apache.pivot.wtk.Display;
 import org.apache.pivot.wtk.BoxPane;
 import org.apache.pivot.wtk.Frame;
+import org.apache.pivot.wtk.Orientation;
 import org.apache.pivot.wtk.TextInput;
 
 public class WindowFocusTest implements Application {
@@ -30,13 +31,17 @@
 
     @Override
     public void startup(Display display, Map<String, String> properties) throws Exception {
-        BoxPane boxPane1 = new BoxPane();
+        BoxPane boxPane1 = new BoxPane(Orientation.VERTICAL);
+        boxPane1.add(new TextInput());
+        boxPane1.add(new TextInput());
         boxPane1.add(new TextInput());
         frame1 = new Frame(boxPane1);
         frame1.setPreferredSize(320, 240);
         frame1.open(display);
 
-        BoxPane boxPane2 = new BoxPane();
+        BoxPane boxPane2 = new BoxPane(Orientation.VERTICAL);
+        boxPane2.add(new TextInput());
+        boxPane2.add(new TextInput());
         boxPane2.add(new TextInput());
         frame2 = new Frame(boxPane2);
         frame2.setPreferredSize(320, 240);