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

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

commit 17e8fdbc7f4a9ea9e77be296517aeee21d21b1fd
Author: Alex Harui <[email protected]>
AuthorDate: Tue Feb 18 16:17:03 2020 -0800

    fix issues in tree node closing.  Should fix #673
---
 .../DataItemRendererFactoryForCollectionView.as    |  1 +
 .../treeClasses/HierarchicalCollectionView.as      | 73 +++++++++++++++++-----
 2 files changed, 60 insertions(+), 14 deletions(-)

diff --git 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
index 1806ab6..b68f375 100644
--- 
a/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
+++ 
b/frameworks/projects/Basic/src/main/royale/org/apache/royale/html/beads/DataItemRendererFactoryForCollectionView.as
@@ -142,6 +142,7 @@ package org.apache.royale.html.beads
             var dataGroup:IItemRendererOwnerView = view.dataGroup;
             
                        var ir:IIndexedItemRenderer = 
dataGroup.getItemRendererAt(event.index) as IIndexedItemRenderer;
+                       if (!ir) return; // may have already been cleaned up, 
possibly when a tree node closes
                        dataGroup.removeItemRenderer(ir);
                        
                        // adjust the itemRenderers' index to adjust for the 
shift
diff --git 
a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/treeClasses/HierarchicalCollectionView.as
 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/treeClasses/HierarchicalCollectionView.as
index 455750b..71d6096 100644
--- 
a/frameworks/projects/MXRoyale/src/main/royale/mx/controls/treeClasses/HierarchicalCollectionView.as
+++ 
b/frameworks/projects/MXRoyale/src/main/royale/mx/controls/treeClasses/HierarchicalCollectionView.as
@@ -1130,31 +1130,32 @@ public class HierarchicalCollectionView extends 
EventDispatcher
         var uid:String = itemToUID(node);
         openNodes[uid] = 1;
         var index:int = getItemIndex(node);
-        dispatchAddOrRemoveEvents(node, index + 1, 
org.apache.royale.events.CollectionEvent.ITEM_ADDED);
+        dispatchAddEvents(node, index + 1, 
org.apache.royale.events.CollectionEvent.ITEM_ADDED);
+               var collectionEvent:org.apache.royale.events.CollectionEvent;
+        collectionEvent = new 
org.apache.royale.events.CollectionEvent(org.apache.royale.events.CollectionEvent.ITEM_UPDATED);
+        collectionEvent.item = node;
+        collectionEvent.index = index;
+               dispatchEvent(collectionEvent);
     }
     
-    private function dispatchAddOrRemoveEvents(node:Object, index:int, 
type:String):int
+    private function dispatchAddEvents(node:Object, index:int, type:String):int
     {
-        var adding:Boolean = (type == 
org.apache.royale.events.CollectionEvent.ITEM_ADDED);
         var children:ICollectionView = getChildren(node);
         var cursor:IViewCursor = children.createCursor();
+               var item:Object;
+               var collectionEvent:org.apache.royale.events.CollectionEvent;
         do
         {
-            var item:Object = cursor.current;
-            var collectionEvent:org.apache.royale.events.CollectionEvent = new 
org.apache.royale.events.CollectionEvent(type);
+            item = cursor.current;
+            collectionEvent = new 
org.apache.royale.events.CollectionEvent(type);
             collectionEvent.item = item;
             collectionEvent.index = index;
             dispatchEvent(collectionEvent);
-            if (adding)
-                       {
-                currentLength++;
-                               index++;
-                       }
-            else
-                currentLength--;
+            currentLength++;
+                       index++;
             if (isOpen(item))
             {
-                index = dispatchAddOrRemoveEvents(node, index, type);
+                index = dispatchAddEvents(item, index, type);
             }
    
         } while (cursor.moveNext());
@@ -1166,8 +1167,52 @@ public class HierarchicalCollectionView extends 
EventDispatcher
         var uid:String = itemToUID(node);
         delete openNodes[uid];        
         var index:int = getItemIndex(node);
-        dispatchAddOrRemoveEvents(node, index + 1, 
org.apache.royale.events.CollectionEvent.ITEM_REMOVED);
+        dispatchRemoveEvents(node, index + 1, 
org.apache.royale.events.CollectionEvent.ITEM_REMOVED);
+               var collectionEvent:org.apache.royale.events.CollectionEvent;
+        collectionEvent = new 
org.apache.royale.events.CollectionEvent(org.apache.royale.events.CollectionEvent.ITEM_UPDATED);
+        collectionEvent.item = node;
+        collectionEvent.index = index;
+               dispatchEvent(collectionEvent);
+    }
+
+    private function dispatchRemoveEvents(node:Object, index:int, type:String, 
eventQueue:Array = null):int
+    {
+        var children:ICollectionView = getChildren(node);
+        var cursor:IViewCursor = children.createCursor();
+               var item:Object;
+               var collectionEvent:org.apache.royale.events.CollectionEvent;
+               var topLevel:Boolean = (eventQueue == null);
+               if (!eventQueue) 
+                       eventQueue = [];
+        do
+        {
+            item = cursor.current;
+            collectionEvent = new 
org.apache.royale.events.CollectionEvent(type);
+            collectionEvent.item = item;
+            collectionEvent.index = index;
+            eventQueue.push(collectionEvent);
+                       index++;
+            if (isOpen(item))
+            {
+                index = dispatchRemoveEvents(item, index, type, eventQueue);
+            }
+   
+        } while (cursor.moveNext());
+
+               if (topLevel)
+               {
+                       // dispatch events in reverse order
+                       while (eventQueue.length)
+                       {
+                               collectionEvent = eventQueue.pop() as 
org.apache.royale.events.CollectionEvent;
+                               dispatchEvent(collectionEvent);
+                currentLength--;
+                       }
+               }
+
+        return index;
     }
+    
 }
 
 }

Reply via email to