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; } + } }
