Author: rwhitcomb
Date: Wed Jun 22 19:21:49 2011
New Revision: 1138592

URL: http://svn.apache.org/viewvc?rev=1138592&view=rev
Log:
Incorrect handling of TAB key in SuggestionPopup

This is part of the fix for JIRA PIVOT-762.

Straightens out the handling of Tab/Shift-Tab keys in SuggestionPopup
(in the TerraSuggestionPopupSkin) by correctly checking for these keys
in the ListView rather than the SuggestionPopup itself, and then
setting a variable everywhere: "returnFocusToTextInput" which
determines whether the key or mouse click is trying to focus
elsewhere once the popup is closed, or whether (in the case of
ENTER or ESCAPE) the focus should go right back to the TextInput.

Note: there are still issues of whether ESCAPE should restore
the "previous" text or not and there are other components that
"pop up" that should have similar fixes for Tab/Shift-Tab handling.

Modified:
    
pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraSuggestionPopupSkin.java

Modified: 
pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraSuggestionPopupSkin.java
URL: 
http://svn.apache.org/viewvc/pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraSuggestionPopupSkin.java?rev=1138592&r1=1138591&r2=1138592&view=diff
==============================================================================
--- 
pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraSuggestionPopupSkin.java
 (original)
+++ 
pivot/trunk/wtk-terra/src/org/apache/pivot/wtk/skin/terra/TerraSuggestionPopupSkin.java
 Wed Jun 22 19:21:49 2011
@@ -63,6 +63,7 @@ public class TerraSuggestionPopupSkin ex
 
     private DropShadowDecorator dropShadowDecorator = null;
     private Transition closeTransition = null;
+    private boolean returnFocusToTextInput = true;
 
     private int closeTransitionDuration = DEFAULT_CLOSE_TRANSITION_DURATION;
     private int closeTransitionRate = DEFAULT_CLOSE_TRANSITION_RATE;
@@ -78,6 +79,7 @@ public class TerraSuggestionPopupSkin ex
 
             if (!suggestionPopup.isAncestor(descendant)
                 && descendant != textInput) {
+                returnFocusToTextInput = false;
                 suggestionPopup.close(false);
             }
 
@@ -98,6 +100,7 @@ public class TerraSuggestionPopupSkin ex
 
             if (!component.isFocused()
                 && !suggestionPopup.containsFocus()) {
+                returnFocusToTextInput = false;
                 suggestionPopup.close();
             }
         }
@@ -144,12 +147,43 @@ public class TerraSuggestionPopupSkin ex
         }
     };
 
+    private ComponentKeyListener listViewKeyListener = new 
ComponentKeyListener.Adapter() {
+        /**
+         * {@link KeyCode#TAB TAB} Close the suggestion popup with a 'result' 
of
+         * true, and transfer focus forwards from the TextInput.<br>
+         * {@link KeyCode#TAB TAB} + {@link Modifier#SHIFT SHIFT} Close the
+         * suggestion popup with a 'result' of true, and transfer focus 
backwards
+         * from the TextInput.<br>
+         */
+        @Override
+        public boolean keyPressed(Component component, int keyCode, 
Keyboard.KeyLocation keyLocation) {
+            SuggestionPopup suggestionPopup = (SuggestionPopup)getComponent();
+            TextInput textInput = suggestionPopup.getTextInput();
+
+            switch (keyCode) {
+                case Keyboard.KeyCode.TAB: {
+                    returnFocusToTextInput = false;
+                    suggestionPopup.close(true);
+
+                    FocusTraversalDirection direction = 
(Keyboard.isPressed(Keyboard.Modifier.SHIFT)) ?
+                        FocusTraversalDirection.BACKWARD : 
FocusTraversalDirection.FORWARD;
+                    textInput.transferFocus(direction);
+
+                    break;
+                }
+            }
+
+            return false;
+        }
+    };
+
     private static final int DEFAULT_CLOSE_TRANSITION_DURATION = 150;
     private static final int DEFAULT_CLOSE_TRANSITION_RATE = 30;
 
     public TerraSuggestionPopupSkin () {
         listView.getStyles().put("variableItemHeight", true);
         
listView.getListViewSelectionListeners().add(listViewSelectionListener);
+        listView.getComponentKeyListeners().add(listViewKeyListener);
 
         listViewPanorama = new Panorama(listView);
         listViewPanorama.getStyles().put("buttonBackgroundColor",
@@ -261,11 +295,6 @@ public class TerraSuggestionPopupSkin ex
     /**
      * {@link KeyCode#ENTER ENTER} Close the suggestion popup with a 'result' 
of
      * true.<br>
-     * {@link KeyCode#TAB TAB} Close the suggestion popup with a 'result' of
-     * true, and transfer focus forwards from the TextInput.<br>
-     * {@link KeyCode#TAB TAB} + {@link Modifier#SHIFT SHIFT} Close the
-     * suggestion popup with a 'result' of true, and transfer focus backwards
-     * from the TextInput.<br>
      * {@link KeyCode#ESCAPE ESCAPE} Close the suggestion popup with a 'result'
      * of false.
      */
@@ -280,16 +309,6 @@ public class TerraSuggestionPopupSkin ex
                 break;
             }
 
-            case Keyboard.KeyCode.TAB: {
-                suggestionPopup.close(true);
-
-                FocusTraversalDirection direction = 
(Keyboard.isPressed(Keyboard.Modifier.SHIFT)) ?
-                    FocusTraversalDirection.BACKWARD : 
FocusTraversalDirection.FORWARD;
-                textInput.transferFocus(direction);
-
-                break;
-            }
-
             case Keyboard.KeyCode.ESCAPE: {
                 suggestionPopup.close(false);
                 break;
@@ -327,6 +346,8 @@ public class TerraSuggestionPopupSkin ex
 
         
dropShadowDecorator.setShadowOpacity(DropShadowDecorator.DEFAULT_SHADOW_OPACITY);
 
+        returnFocusToTextInput = true;
+
         TextInput textInput = suggestionPopup.getTextInput();
         textInput.getComponentStateListeners().add(textInputStateListener);
         textInput.getComponentKeyListeners().add(textInputKeyListener);
@@ -428,7 +449,9 @@ public class TerraSuggestionPopupSkin ex
         textInput.getComponentStateListeners().remove(textInputStateListener);
         textInput.getComponentKeyListeners().remove(textInputKeyListener);
 
-        textInput.requestFocus();
+        if (returnFocusToTextInput) {
+            textInput.requestFocus();
+        }
 
         listViewBorder.setEnabled(true);
         closeTransition = null;


Reply via email to