You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by mi...@apache.org on 2015/06/08 20:02:34 UTC

[07/12] git commit: [flex-sdk] [refs/heads/develop] - FLEX-34854 Refactored ComplexFieldChangeWatcher to allow for monitoring of additions to the sorted list.

FLEX-34854
Refactored ComplexFieldChangeWatcher to allow for monitoring of additions to the sorted list.

NOTES
-Now all the functions in FLEX_34854_Tests pass.
-Now we're using ChangeWatcher.watch instead of BindingUtils.bindSetter, to avoid unnecessary steps and memory allocation.


Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/017ab1f0
Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/017ab1f0
Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/017ab1f0

Branch: refs/heads/develop
Commit: 017ab1f0e48b6ecc2dd1bf0857365b55d614ed74
Parents: 849d90a
Author: Mihai Chira <mi...@apache.org>
Authored: Mon Jun 8 17:59:01 2015 +0200
Committer: Mihai Chira <mi...@apache.org>
Committed: Mon Jun 8 17:59:01 2015 +0200

----------------------------------------------------------------------
 .../mx/collections/ComplexFieldChangeWatcher.as | 112 ++++++++++++++++---
 .../src/mx/collections/ListCollectionView.as    |  63 ++++++-----
 2 files changed, 131 insertions(+), 44 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/017ab1f0/frameworks/projects/framework/src/mx/collections/ComplexFieldChangeWatcher.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/framework/src/mx/collections/ComplexFieldChangeWatcher.as b/frameworks/projects/framework/src/mx/collections/ComplexFieldChangeWatcher.as
index faef198..7190bd5 100644
--- a/frameworks/projects/framework/src/mx/collections/ComplexFieldChangeWatcher.as
+++ b/frameworks/projects/framework/src/mx/collections/ComplexFieldChangeWatcher.as
@@ -20,17 +20,22 @@
 package mx.collections {
     import flash.events.EventDispatcher;
 
-    import mx.binding.utils.BindingUtils;
     import mx.binding.utils.ChangeWatcher;
+    import mx.core.mx_internal;
+    import mx.events.CollectionEvent;
+    import mx.events.CollectionEventKind;
     import mx.events.PropertyChangeEvent;
 
     public class ComplexFieldChangeWatcher extends EventDispatcher {
 
         private var _complexFieldWatchers:Vector.<ChangeWatcher> = new Vector.<ChangeWatcher>();
         private var _list:IList;
+        private var _listCollection:ICollectionView;
 
         public function stopWatchingForComplexFieldChanges():void
         {
+            unwatchListForChanges();
+
             for each(var watcher:ChangeWatcher in _complexFieldWatchers)
             {
                 watcher.unwatch();
@@ -39,36 +44,107 @@ package mx.collections {
             _complexFieldWatchers.length = 0;
         }
 
-        public function startWatchingForComplexFieldChanges(list:IList, fields:Array):void
+        public function startWatchingForComplexFieldChanges():void
+        {
+            watchListForChanges();
+
+            watchItems(list);
+        }
+
+        private function watchItems(items:IList):void
+        {
+            if(sortFields)
+            {
+                for(var i:int = 0; i < items.length; i++)
+                {
+                    watchItem(items.getItemAt(i), sortFields);
+                }
+            }
+        }
+
+        private function watchArrayOfItems(items:Array):void
         {
-            _list = list;
+            if(sortFields)
+            {
+                for(var i:int = 0; i < items.length; i++)
+                {
+                    watchItem(items[i], sortFields);
+                }
+            }
+        }
 
-            for(var i:int = 0; i < fields.length; i++)
+        private function watchItem(item:Object, sortFields:Array):void
+        {
+            if(item)
             {
-                var sortField:IComplexSortField = fields[i] as IComplexSortField;
-                if(sortField && sortField.nameParts)
+                for(var i:int = 0; i < sortFields.length; i++)
                 {
-                    for(var j:int = 0; j < _list.length; j++)
+                    var sortField:IComplexSortField = sortFields[i] as IComplexSortField;
+                    if(sortField && sortField.nameParts)
                     {
-                        var item:Object = _list.getItemAt(j);
-                        if(item)
-                        {
-                            var watcher:ChangeWatcher = BindingUtils.bindSetter(function(value:Object):void {}, item, sortField.nameParts);
-                            if(watcher)
-                            {
-                                watcher.setHandler(new Closure(item, complexValueChanged).callFunctionOnObject);
-                                _complexFieldWatchers.push(watcher);
-                            }
-                        }
+                        watchItemForField(item, sortField.nameParts);
                     }
                 }
             }
         }
 
-        private function complexValueChanged(item:Object):void
+        private function watchItemForField(item:Object, chain:Array):void
+        {
+            var watcher:ChangeWatcher = ChangeWatcher.watch(item, chain, new Closure(item, onComplexValueChanged).callFunctionOnObject, false, true);
+            if(watcher)
+            {
+                _complexFieldWatchers.push(watcher);
+            }
+        }
+
+        private function onCollectionChanged(event:CollectionEvent):void
+        {
+            switch(event.kind)
+            {
+                case CollectionEventKind.ADD: {
+                    watchArrayOfItems(event.items);
+                    break;
+                }
+            }
+        }
+
+        private function onComplexValueChanged(item:Object):void
         {
             dispatchEvent(PropertyChangeEvent.createUpdateEvent(item, null, null, null));
         }
+
+        private function get sortFields():Array
+        {
+            return _listCollection && _listCollection.sort ? _listCollection.sort.fields : null;
+        }
+
+        mx_internal function set list(value:IList):void
+        {
+            if(_list != value)
+            {
+                stopWatchingForComplexFieldChanges();
+
+                _list = value;
+                _listCollection = value as ICollectionView;
+            }
+        }
+
+        protected function get list():IList
+        {
+            return _list;
+        }
+
+        private function watchListForChanges():void
+        {
+            if(list)
+                list.addEventListener(CollectionEvent.COLLECTION_CHANGE, onCollectionChanged, false, 0, true);
+        }
+
+        private function unwatchListForChanges():void
+        {
+            if(list)
+                list.removeEventListener(CollectionEvent.COLLECTION_CHANGE, onCollectionChanged);
+        }
     }
 }
 

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/017ab1f0/frameworks/projects/framework/src/mx/collections/ListCollectionView.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/framework/src/mx/collections/ListCollectionView.as b/frameworks/projects/framework/src/mx/collections/ListCollectionView.as
index 0f76081..f5bef43 100644
--- a/frameworks/projects/framework/src/mx/collections/ListCollectionView.as
+++ b/frameworks/projects/framework/src/mx/collections/ListCollectionView.as
@@ -379,29 +379,22 @@ public class ListCollectionView extends Proxy
     /**
      *  @private
      */
-    public function set sort(s:ISort):void
+    public function set sort(value:ISort):void
     {
-        if(_sort && _sort != s && complexFieldWatcher)
-            complexFieldWatcher.stopWatchingForComplexFieldChanges();
+        if(_sort != value)
+        {
+            stopWatchingForComplexFieldsChanges();
 
-        _sort = s;
+            _sort = value;
 
-        if(_sort && _sort.fields && complexFieldWatcher)
-            complexFieldWatcher.startWatchingForComplexFieldChanges(this, _sort.fields);
+            startWatchingForComplexFieldsChanges();
 
-        dispatchEvent(new Event("sortChanged"));
+            dispatchEvent(new Event("sortChanged"));
+        }
     }
 
 
 
-    private function onComplexFieldValueChanged(changeEvent:PropertyChangeEvent):void
-    {
-        if(sort)
-        {
-            moveItemInView(changeEvent.source);
-        }
-    }
-
     //--------------------------------------------------------------------------
     //
     // ICollectionView Methods
@@ -1866,20 +1859,38 @@ public class ListCollectionView extends Proxy
     {
         if(_complexFieldWatcher != value)
         {
-            if(_complexFieldWatcher)
-            {
-                _complexFieldWatcher.removeEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onComplexFieldValueChanged);
-                _complexFieldWatcher.stopWatchingForComplexFieldChanges();
-            }
+            stopWatchingForComplexFieldsChanges();
 
             _complexFieldWatcher = value;
+            _complexFieldWatcher.mx_internal::list = this;
 
-            if(_complexFieldWatcher)
-            {
-                _complexFieldWatcher.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onComplexFieldValueChanged, false, 0, true);
-                if(sort)
-                    _complexFieldWatcher.startWatchingForComplexFieldChanges(this, sort.fields);
-            }
+            startWatchingForComplexFieldsChanges();
+        }
+    }
+
+    private function startWatchingForComplexFieldsChanges():void
+    {
+        if(complexFieldWatcher && sort && sort.fields)
+        {
+            _complexFieldWatcher.addEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onComplexFieldValueChanged, false, 0, true);
+            _complexFieldWatcher.startWatchingForComplexFieldChanges();
+        }
+    }
+
+    private function stopWatchingForComplexFieldsChanges():void
+    {
+        if(complexFieldWatcher)
+        {
+            _complexFieldWatcher.removeEventListener(PropertyChangeEvent.PROPERTY_CHANGE, onComplexFieldValueChanged);
+            _complexFieldWatcher.stopWatchingForComplexFieldChanges();
+        }
+    }
+
+    private function onComplexFieldValueChanged(changeEvent:PropertyChangeEvent):void
+    {
+        if(sort)
+        {
+            moveItemInView(changeEvent.source);
         }
     }
 }