This is an automated email from the ASF dual-hosted git repository.

carlosrovira pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


The following commit(s) were added to refs/heads/develop by this push:
     new d0d6504  searchforlist: fix to manage correctly hidden items with keys
d0d6504 is described below

commit d0d65040f304986c7871439ca8447e70fec9f515
Author: Carlos Rovira <[email protected]>
AuthorDate: Fri Apr 24 21:41:36 2020 +0200

    searchforlist: fix to manage correctly hidden items with keys
---
 .../controls/textinput/SearchFilterForList.as      | 128 ++++++++++++++++++---
 1 file changed, 109 insertions(+), 19 deletions(-)

diff --git 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controls/textinput/SearchFilterForList.as
 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controls/textinput/SearchFilterForList.as
index fd393d6..e538d1e 100644
--- 
a/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controls/textinput/SearchFilterForList.as
+++ 
b/frameworks/projects/Jewel/src/main/royale/org/apache/royale/jewel/beads/controls/textinput/SearchFilterForList.as
@@ -19,13 +19,20 @@
 package org.apache.royale.jewel.beads.controls.textinput
 {
        import org.apache.royale.core.Bead;
+       import org.apache.royale.core.IBeadKeyController;
+       import org.apache.royale.core.IFocusable;
+       import org.apache.royale.core.IItemRendererOwnerView;
+       import org.apache.royale.core.IRemovableBead;
        import org.apache.royale.core.IStrand;
        import org.apache.royale.events.Event;
        import org.apache.royale.events.KeyboardEvent;
+       import org.apache.royale.html.beads.IListView;
        import org.apache.royale.html.util.getLabelFromData;
        import org.apache.royale.jewel.List;
+       import org.apache.royale.jewel.beads.views.IScrollToIndexView;
        import org.apache.royale.jewel.itemRenderers.ListItemRenderer;
        import org.apache.royale.jewel.supportClasses.textinput.TextInputBase;
+       import org.apache.royale.utils.sendEvent;
 
        /**
         *  The SearchFilterForList bead class is a specialty bead that can be 
used with
@@ -66,11 +73,56 @@ package org.apache.royale.jewel.beads.controls.textinput
 
                public function set list(value:List):void
                {
+                       if(_list)
+                       {
+                               
list.removeEventListener(KeyboardEvent.KEY_DOWN, keyEventHandler, true);
+                       }
+
                        _list = value;
 
-                       if(_list != null)
+                       if(_list)
+                       {
+                               var keyBead:IRemovableBead = 
_list.getBeadByType(IBeadKeyController) as IRemovableBead;
+                               if(keyBead)
+                               {
+                                       keyBead.tearDown();
+                                       _list.removeBead(keyBead);
+                               }
+                               list.addEventListener(KeyboardEvent.KEY_DOWN, 
keyEventHandler, true);
+                       }
+               }
+
+               protected function keyEventHandler(event:KeyboardEvent):void
+               {
+                       // avoid Tab loose the normal behaviour, for navigation 
we don't want build int scrolling support in browsers
+                       if(event.key === KeyboardEvent.KEYCODE__TAB)
+                               return;
+                       
+                       event.preventDefault();
+
+                       var index:int = 
visibleIndexes.indexOf(list.selectedIndex);
+                       currentIndex = index;
+
+                       if(event.key === KeyboardEvent.KEYCODE__UP || event.key 
=== KeyboardEvent.KEYCODE__LEFT)
+                       {
+                               if(index > 0)
+                                       currentIndex = prevIndex;
+                       } 
+                       else if(event.key === KeyboardEvent.KEYCODE__DOWN || 
event.key === KeyboardEvent.KEYCODE__RIGHT)
+                       {
+                               currentIndex = nextIndex;
+                       }
+
+                       if(index != currentIndex)
                        {
-                               length = list.numElements;
+                               list.selectedItem = 
list.dataProvider.getItemAt(currentIndex);
+
+                               var fir:IFocusable = (list.view as 
IListView).dataGroup.getItemRendererForIndex(currentIndex) as IFocusable;
+                               fir.setFocus();
+                               
+                (list.view as IScrollToIndexView).scrollToIndex(index);
+                               
+                               sendEvent(list, 'change');
                        }
                }
 
@@ -95,12 +147,6 @@ package org.apache.royale.jewel.beads.controls.textinput
                {
                        return _length;
                }
-
-               public function set length(value:int):void
-               {
-                       _length = value;
-               }
-
                
                /**
                 *  @copy org.apache.royale.core.IBead#strand
@@ -148,7 +194,7 @@ package org.apache.royale.jewel.beads.controls.textinput
                        var input:TextInputBase = TextInputBase(_strand);
             COMPILE::JS
                        {
-                input.element.addEventListener('focus', onInputFocus);
+            input.element.addEventListener('focus', onInputFocus);
             }
                }
 
@@ -186,17 +232,18 @@ package org.apache.royale.jewel.beads.controls.textinput
 
         protected function applyFilter(filterText:String):void
                {
-            var ir:ListItemRenderer;
+                       var ir:ListItemRenderer;
             var numElements:int = list.numElements;
                        var item:Object = null;
-                       length = numElements;
+                       _visibleIndexes = [];
             while (numElements--)
             {
                 ir = list.getElementAt(numElements) as ListItemRenderer;
                                var textData:String = getLabelFromData(ir, 
ir.data);
-                if (filterFunction(textData, filterText))
-                {
-                    ir.visible = true;
+                               if (filterFunction(textData, filterText))
+                               {
+                                       ir.visible = true;
+                                       visibleIndexes.push(ir.index);
                                        
                                        //stores the item if text is the same
                                        if(textData.toUpperCase() == 
filterText.toUpperCase())
@@ -207,19 +254,62 @@ package org.apache.royale.jewel.beads.controls.textinput
                                        {
                                                ir.text = "<span>" + 
(filterText != "" ?  decorateText(textData, 
textData.toUpperCase().indexOf(filterText.toUpperCase()), filterText.length) : 
textData ) + "</span>";
                                        }
-                } else {
-                    ir.visible = false;
-                                       length--;
-                }
+                               } else {
+                                       ir.visible = false;
+                               }
             }
 
+                       _visibleIndexes = _visibleIndexes.sort(numberSort);
+
                        // Select the item in the list if text is the same 
                        // we do at the end to avoid multiple selection (if 
there's more than one matches)
                        // in that case, select the first one in the list
                        if(item != null)
-                       {
                                list.selectedItem = item;
+               }
+
+               private var _visibleIndexes: Array;
+        /**
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion Royale 0.9.7
+         */
+               public function get visibleIndexes():Array
+               {
+                       if(!_visibleIndexes)
+                       {
+                               _visibleIndexes = [];
+                               var view:IListView = list.view as IListView;
+                               var dataGroup:IItemRendererOwnerView = 
view.dataGroup;
+                               var len:int = list.numElements;
+                               var ir:ListItemRenderer;
+                               for(var i:int = 0; i < len; i++)
+                               {
+                                       ir = 
dataGroup.getItemRendererForIndex(i) as ListItemRenderer;
+                                       if(ir.visible)
+                                               _visibleIndexes.push(ir.index);
+                               }
                        }
+                       return _visibleIndexes;
+               }
+
+               protected function numberSort(a:int, b:int):int
+        {
+            return a - b;
+        }
+
+               protected var currentIndex:int = 0;
+
+               protected function get prevIndex():int
+               {
+                       return currentIndex > 0 ? 
_visibleIndexes[--currentIndex] : 0;
+               }
+
+               protected function get nextIndex():int
+               {
+                       return currentIndex < _visibleIndexes.length - 1 ? 
_visibleIndexes[++currentIndex] : _visibleIndexes.length - 1;
                }
        }
 }

Reply via email to