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

gregdove 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 87d0fb2  Fix for TabNavigator TabBar updates (removal) when navigator 
content is removed.
87d0fb2 is described below

commit 87d0fb29b7279647ea035339604cb2a1fa01fd47
Author: greg-dove <greg.d...@gmail.com>
AuthorDate: Thu Jan 13 18:50:45 2022 +1300

    Fix for TabNavigator TabBar updates (removal) when navigator content is 
removed.
---
 .../src/main/royale/mx/containers/TabNavigator.as  |  3 ++
 .../royale/mx/containers/beads/TabNavigatorView.as | 59 +++++++++++++++++-----
 2 files changed, 50 insertions(+), 12 deletions(-)

diff --git 
a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/TabNavigator.as 
b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/TabNavigator.as
index 69cf7e0..92ee428 100644
--- a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/TabNavigator.as
+++ b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/TabNavigator.as
@@ -31,6 +31,7 @@ import mx.controls.TabBar;
 import org.apache.royale.core.IBeadView;
 import org.apache.royale.core.IChild;
 import org.apache.royale.events.Event;
+import org.apache.royale.events.ValueEvent;
 import org.apache.royale.html.util.getModelByType;
 import org.apache.royale.core.ISelectionModel;
 //--------------------------------------
@@ -479,6 +480,8 @@ public class TabNavigator extends ViewStack implements 
IFocusManagerComponent
     {
         var tnView:TabNavigatorView = view as TabNavigatorView;
         tnView.contentArea.removeElement(c, dispatchEvent);
+        if (dispatchEvent)
+                this.dispatchEvent(new ValueEvent('childrenRemoved', c));
     }
     
     /**
diff --git 
a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/TabNavigatorView.as
 
b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/TabNavigatorView.as
index c19c7b1..d1e5b02 100644
--- 
a/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/TabNavigatorView.as
+++ 
b/frameworks/projects/MXRoyale/src/main/royale/mx/containers/beads/TabNavigatorView.as
@@ -40,6 +40,7 @@ import org.apache.royale.core.UIBase;
 import org.apache.royale.core.ValuesManager;
 import org.apache.royale.events.Event;
 import org.apache.royale.events.IEventDispatcher;
+import org.apache.royale.events.ValueEvent;
 import org.apache.royale.html.beads.GroupView;
 import org.apache.royale.html.supportClasses.PanelLayoutProxy;
 
@@ -143,8 +144,9 @@ public class TabNavigatorView extends GroupView
         contentArea.percentHeight = 100;
         // try to listen for childrenAdded before ViewStackLayout listens for 
childrenAdded
         // so we can update the selection before the layout picks the visible 
child
-        (_strand as IEventDispatcher).addEventListener("childrenAdded", 
childrenAddedHandler);
-        contentArea.addEventListener("childrenAdded", childrenAddedHandler);
+        (_strand as IEventDispatcher).addEventListener("childrenAdded", 
childrenChangedHandler);
+        contentArea.addEventListener("childrenAdded", childrenChangedHandler);
+        contentArea.addEventListener("childrenRemoved", 
childrenChangedHandler);
         var vsl:ViewStackLayout = new ViewStackLayout();
         vsl.target = contentArea as UIComponent;
         vsl.model = tabBar.model as ISelectionModel;
@@ -152,29 +154,53 @@ public class TabNavigatorView extends GroupView
         if (contentArea.parent == null) {
             (_strand as 
IContainerBaseStrandChildrenHost).$addElement(contentArea as IChild);
         }
-        
+
         // Now give the TabNavigator its own layout
         var boxLayout:BoxLayout = new BoxLayout();
         boxLayout.direction = "vertical";
         _strand.addBead(boxLayout);
-        
+
     }
-    
+
     private var tabDP:Array = [];
-    
-    private function childrenAddedHandler(event:Event):void
+
+    private function childrenChangedHandler(event:Event):void
     {
+        var isRemoval:Boolean = event.type == 'childrenRemoved';
+        var child:INavigatorContent;
+        var removeIndex:int = -1;
+
+        var n:int;
+        var i:int;
+
+        if (isRemoval) {
+            child = ValueEvent(event).value as INavigatorContent;
+            if (child) {
+                tabDP = (tabBar as TabBar).dataProvider as Array;
+                n = tabDP.length;
+                for (i = 0; i < n; i++)
+                {
+                    var item:Object = tabDP[i];
+                    if (item.label == child.label) {
+                        removeIndex = i;
+                        break;
+                    }
+                }
+            }
+        }
         tabDP = [];
-        var n:int = contentArea.numElements;
-        for (var i:int = 0; i < n; i++)
+        n = contentArea.numElements;
+        for (i = 0; i < n; i++)
         {
-            var child:INavigatorContent = contentArea.getElementAt(i) as 
INavigatorContent;
+            child = contentArea.getElementAt(i) as INavigatorContent;
             tabDP.push({ label: child.label});
             // run this again if the label changes
-            child.addEventListener("labelChanged", childrenAddedHandler);
+            child.addEventListener("labelChanged", childrenChangedHandler);
         }
+        var oldIndex:int = (tabBar.model as ISelectionModel).selectedIndex;
         (tabBar as TabBar).dataProvider = tabDP;
-        if ((tabBar.model as ISelectionModel).selectedIndex == -1 && n > 0)
+
+        if (oldIndex == -1 && n > 0)
         {
             (tabBar.model as ISelectionModel).selectedIndex = 0;
             var tabNavigator:TabNavigator = _strand as TabNavigator;
@@ -182,6 +208,15 @@ public class TabNavigatorView extends GroupView
             {
                 tabNavigator.selectedIndex = 0;
             }
+        } else {
+            if (removeIndex != -1 ) {
+                var tabNavigator:TabNavigator = _strand as TabNavigator;
+                if (removeIndex == tabDP.length) removeIndex--;
+                if (tabNavigator)
+                {
+                    tabNavigator.selectedIndex = removeIndex;
+                }
+            }
         }
     }
     

Reply via email to