flex-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From fri...@apache.org
Subject svn commit: r1234229 [4/4] - in /incubator/flex/whiteboard/frishy: ./ FastGroupingCollection/ FastGroupingCollection/.settings/ FastGroupingCollection/libs/ FastGroupingCollection/src/ FastGroupingCollection/src/com/ FastGroupingCollection/src/com/fris...
Date Sat, 21 Jan 2012 01:33:28 GMT
Added: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collections/PriorityQueue.as
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collections/PriorityQueue.as?rev=1234229&view=auto
==============================================================================
--- incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collections/PriorityQueue.as (added)
+++ incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collections/PriorityQueue.as Sat Jan 21 01:33:26 2012
@@ -0,0 +1,284 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  ADOBE SYSTEMS INCORPORATED
+//  Copyright 2003-2006 Adobe Systems Incorporated
+//  All Rights Reserved.
+//
+//  NOTICE: Adobe permits you to use, modify, and distribute this file
+//  in accordance with the terms of the license agreement accompanying it.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package com.frishy.collections
+{
+    
+    import flash.display.DisplayObject;
+    import flash.display.DisplayObjectContainer;
+    import flash.utils.Dictionary;
+    
+    
+    /**
+     *  The PriorityQueue class mx.managers.layoutClasses.PriorityQueue, but it has been
+     *  made slightly more general purpose so that it can hold non-ILayoutManagerClients, 
+     *  removeSmallestChild() and removeLargestChild() have been axed, and
+     *  so that it can return the current largest or smallest priority number
+     */
+    public class PriorityQueue
+    {
+        //--------------------------------------------------------------------------
+        //
+        //  Constructor
+        //
+        //--------------------------------------------------------------------------
+        
+        /**
+         *  Constructor.
+         */
+        public function PriorityQueue()
+        {
+            super();
+        }
+        
+        //--------------------------------------------------------------------------
+        //
+        //  Variables
+        //
+        //--------------------------------------------------------------------------
+        
+        /**
+         *  @private
+         */
+        private var priorityBins:Array = [];
+        
+        /**
+         *  @private
+         *  The smallest occupied index in arrayOfDictionaries.
+         */
+        private var minPriority:int = 0;
+        
+        /**
+         *  @private
+         *  The largest occupied index in arrayOfDictionaries.
+         */
+        private var maxPriority:int = -1;
+        
+        //--------------------------------------------------------------------------
+        //
+        //  Methods
+        //
+        //--------------------------------------------------------------------------
+        
+        /**
+         *  @private
+         */
+        public function addObject(obj:Object, priority:int):void
+        {       
+            // Update our min and max priorities.
+            if (maxPriority < minPriority)
+            {
+                minPriority = maxPriority = priority;
+            }
+            else
+            {
+                if (priority < minPriority)
+                    minPriority = priority;
+                if (priority > maxPriority)
+                    maxPriority = priority;
+            }
+            
+            var bin:PriorityBin = priorityBins[priority];
+            
+            if (!bin)
+            {
+                // If no hash exists for the specified priority, create one.
+                bin = new PriorityBin();
+                priorityBins[priority] = bin;
+                bin.items[obj] = true;
+                bin.length++;
+            }
+            else
+            {
+                // If we don't already hold the obj in the specified hash, add it
+                // and update our item count.
+                if (bin.items[obj] == null)
+                { 
+                    bin.items[obj] = true;
+                    bin.length++;
+                }
+            }
+            
+        }
+        
+        /**
+         *  @private
+         */
+        public function removeLargest():Object
+        {
+            var obj:Object = null;
+            
+            if (minPriority <= maxPriority)
+            {
+                var bin:PriorityBin = priorityBins[maxPriority];
+                while (!bin || bin.length == 0)
+                {
+                    maxPriority--;
+                    if (maxPriority < minPriority)
+                        return null;
+                    bin = priorityBins[maxPriority];
+                }
+                
+                // Remove the item with largest priority from our priority queue.
+                // Must use a for loop here since we're removing a specific item
+                // from a 'Dictionary' (no means of directly indexing).
+                for (var key:Object in bin.items )
+                {
+                    obj = key;
+                    removeItem(key, maxPriority);
+                    break;
+                }
+                
+                // Update maxPriority if applicable.
+                while (!bin || bin.length == 0)
+                {
+                    maxPriority--;
+                    if (maxPriority < minPriority)
+                        break;
+                    bin = priorityBins[maxPriority];
+                }
+                
+            }
+            
+            return obj;
+        }
+        
+        /**
+         *  @private
+         */
+        public function removeSmallest():Object
+        {
+            var obj:Object = null;
+            
+            if (minPriority <= maxPriority)
+            {
+                var bin:PriorityBin = priorityBins[minPriority];
+                while (!bin || bin.length == 0)
+                {
+                    minPriority++;
+                    if (minPriority > maxPriority)
+                        return null;
+                    bin = priorityBins[minPriority];
+                }           
+                
+                // Remove the item with smallest priority from our priority queue.
+                // Must use a for loop here since we're removing a specific item
+                // from a 'Dictionary' (no means of directly indexing).
+                for (var key:Object in bin.items )
+                {
+                    obj = key;
+                    removeItem(key, minPriority);
+                    break;
+                }
+                
+                // Update minPriority if applicable.
+                while (!bin || bin.length == 0)
+                {
+                    minPriority++;
+                    if (minPriority > maxPriority)
+                        break;
+                    bin = priorityBins[minPriority];
+                }           
+            }
+            
+            return obj;
+        }
+        
+        /**
+         *  @private
+         */
+        protected function removeItem(client:Object, priority:int):Object
+        {
+            var bin:PriorityBin = priorityBins[priority];
+            if (bin && bin.items[client] != null)
+            {
+                delete bin.items[client];
+                bin.length--;
+                return client;
+            }
+            return null;
+        }
+        
+        /**
+         *  @private
+         */
+        public function removeAll():void
+        {
+            priorityBins.length = 0;
+            minPriority = 0;
+            maxPriority = -1;
+        }
+        
+        /**
+         *  @private
+         */
+        public function isEmpty():Boolean
+        {
+            return minPriority > maxPriority;
+        }
+        
+        /**
+         *  Returns the max priority an item as it or -1 if there is none
+         */
+        public function getMaxPriority():int
+        {
+            var bin:PriorityBin = priorityBins[maxPriority];
+            
+            // TODO (frishbry): not sure if we need to do this loop 
+            // since it's done at the end of removeSmallest() and removeLargest()
+            // but it's done in the beginning, so perhaps there's a reason why it's in there
+            while (!bin || bin.length == 0)
+            {
+                maxPriority--;
+                if (maxPriority < minPriority)
+                    return -1;
+                bin = priorityBins[maxPriority];
+            }
+            
+            return maxPriority;
+        }
+        
+        /**
+         *  Returns the min priority an item as it or -1 if there is none
+         */
+        public function getMinPriority():int
+        {
+            var bin:PriorityBin = priorityBins[minPriority];
+            
+            // TODO (frishbry): not sure if we need to do this loop 
+            // since it's done at the end of removeSmallest() and removeLargest()
+            // but it's done in the beginning, so perhaps there's a reason why it's in there
+            while (!bin || bin.length == 0)
+            {
+                minPriority++;
+                if (minPriority > maxPriority)
+                    return -1;
+                bin = priorityBins[minPriority];
+            }
+            
+            return minPriority;
+        }
+    }
+    
+}
+
+import flash.utils.Dictionary;
+
+/**
+ *  Represents one priority bucket of entries.
+ *  @private
+ */
+class PriorityBin 
+{
+    public var length:int;
+    public var items:Dictionary = new Dictionary();
+    
+}

Propchange: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collections/PriorityQueue.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collections/summarycalculators/ReturnArrayOfChildValuesSummaryCalculator.as
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collections/summarycalculators/ReturnArrayOfChildValuesSummaryCalculator.as?rev=1234229&view=auto
==============================================================================
--- incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collections/summarycalculators/ReturnArrayOfChildValuesSummaryCalculator.as (added)
+++ incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collections/summarycalculators/ReturnArrayOfChildValuesSummaryCalculator.as Sat Jan 21 01:33:26 2012
@@ -0,0 +1,133 @@
+package com.frishy.collections.summarycalculators
+{
+    import com.frishy.collections.CollectionUtil;
+    import com.frishy.collections.ISummaryCalculator2;
+    
+    import mx.collections.SummaryField2;
+    
+    /**
+     *  Special summary calculator for use in FastGroupingCollection that creates an array 
+     *  of values from the children.  This can be useful if you are implementing the composite
+     *  pattern.  If the values are themselves arrays, it will 
+     *  not create an array of arrays, but instead will create a single array out of 
+     *  those values.  This way, multiple levels will still calculate summaries easily.
+     */
+    public class ReturnArrayOfChildValuesSummaryCalculator implements ISummaryCalculator2 
+    { 
+        //-------------------------------------------------------------------------- 
+        // 
+        // Class Members 
+        // 
+        //--------------------------------------------------------------------------
+        
+        private static function addUniqueValuesToArray(newValue:Object, currentValueArray:Array):void 
+        { 
+            var newValues:Array = newValue as Array;
+            
+            if (newValues) 
+            { 
+                for (var i:int = 0; i < newValues.length; i++) 
+                { 
+                    if (currentValueArray.indexOf(newValues[i]) == -1) 
+                    { 
+                        currentValueArray.push(newValues[i]); 
+                    } 
+                } 
+            } 
+            else 
+            { 
+                if (currentValueArray.indexOf(newValue) == -1) 
+                { 
+                    currentValueArray.push(newValue); 
+                } 
+            } 
+        }
+        
+        //-------------------------------------------------------------------------- 
+        // 
+        // Constructor 
+        // 
+        //--------------------------------------------------------------------------
+        
+        public function ReturnArrayOfChildValuesSummaryCalculator() 
+        { 
+            super(); 
+        }
+        
+        //-------------------------------------------------------------------------- 
+        // 
+        // Methods: ISummaryCalculator 
+        // 
+        //--------------------------------------------------------------------------
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function summaryCalculationBegin(field:SummaryField2):Object 
+        { 
+            return {value: []}; 
+        }
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function calculateSummary(data:Object, field:SummaryField2, rowData:Object):void 
+        { 
+            var newValue:Object = CollectionUtil.getDataFieldValue(rowData, field.dataField); 
+            var currentValueArray:Array = data.value;
+            
+            addUniqueValuesToArray(newValue, currentValueArray) 
+        }
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function returnSummary(data:Object, field:SummaryField2):Number 
+        { 
+            return returnSummary2(data, field) as Number; 
+        }
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function returnSummary2(data:Object, field:SummaryField2):Object 
+        { 
+            return data.value; 
+        }
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function summaryOfSummaryCalculationBegin(value:Object, field:SummaryField2):Object 
+        { 
+            return {value: value.value.concat()}; 
+        }
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function calculateSummaryOfSummary(value:Object, newValue:Object, field:SummaryField2):void 
+        { 
+            var newValue:Object = newValue.value; 
+            var currentValueArray:Array = value.value;
+            
+            addUniqueValuesToArray(newValue, currentValueArray); 
+        }
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function returnSummaryOfSummary(value:Object, field:SummaryField2):Number 
+        { 
+            return returnSummaryOfSummary2(value, field) as Number; 
+        }
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function returnSummaryOfSummary2(value:Object, field:SummaryField2):Object 
+        { 
+            return value.value; 
+        } 
+    }
+}
\ No newline at end of file

Propchange: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collections/summarycalculators/ReturnArrayOfChildValuesSummaryCalculator.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collections/summarycalculators/ReturnChildValueSummaryCalculator.as
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collections/summarycalculators/ReturnChildValueSummaryCalculator.as?rev=1234229&view=auto
==============================================================================
--- incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collections/summarycalculators/ReturnChildValueSummaryCalculator.as (added)
+++ incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collections/summarycalculators/ReturnChildValueSummaryCalculator.as Sat Jan 21 01:33:26 2012
@@ -0,0 +1,99 @@
+package com.frishy.collections.summarycalculators
+{
+    import com.frishy.collections.CollectionUtil;
+    import com.frishy.collections.ISummaryCalculator2;
+    
+    import mx.collections.SummaryField2;
+
+    /**
+     *  Special summary calculator for use in FastGroupingCollection that returns 
+     *  the same value as one of its children.  This is useful if you are attempting to 
+     *  implement the composite pattern and all children have the same value for a particular 
+     *  property.  If children have unique values for the property, this class is not as 
+     *  as useful, and it may return a random children's value.
+     */
+    public class ReturnChildValueSummaryCalculator implements ISummaryCalculator2
+    {
+        
+        //-------------------------------------------------------------------------- 
+        // 
+        // Constructor 
+        // 
+        //--------------------------------------------------------------------------
+        
+        public function ReturnChildValueSummaryCalculator() 
+        { 
+            super(); 
+        }
+        
+        //-------------------------------------------------------------------------- 
+        // 
+        // Methods: ISummaryCalculator 
+        // 
+        //--------------------------------------------------------------------------
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function summaryCalculationBegin(field:SummaryField2):Object 
+        { 
+            return {}; 
+        }
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function calculateSummary(data:Object, field:SummaryField2, rowData:Object):void 
+        { 
+            data.value = CollectionUtil.getDataFieldValue(rowData, field.dataField); 
+        }
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function returnSummary(data:Object, field:SummaryField2):Number 
+        { 
+            return returnSummary2(data, field) as Number; 
+        }
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function returnSummary2(data:Object, field:SummaryField2):Object 
+        { 
+            return data.value; 
+        }
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function summaryOfSummaryCalculationBegin(value:Object, field:SummaryField2):Object 
+        { 
+            return {value: value.value}; 
+        }
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function calculateSummaryOfSummary(value:Object, newValue:Object, field:SummaryField2):void 
+        { 
+            value.value = newValue.value; 
+        }
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function returnSummaryOfSummary(value:Object, field:SummaryField2):Number 
+        { 
+            return returnSummaryOfSummary2(value, field) as Number; 
+        }
+        
+        /** 
+         *  @inheritDoc 
+         */ 
+        public function returnSummaryOfSummary2(value:Object, field:SummaryField2):Object 
+        { 
+            return value.value; 
+        } 
+    }
+}
\ No newline at end of file

Propchange: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collections/summarycalculators/ReturnChildValueSummaryCalculator.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/utils/LayoutManagerClientHelper.as
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/utils/LayoutManagerClientHelper.as?rev=1234229&view=auto
==============================================================================
--- incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/utils/LayoutManagerClientHelper.as (added)
+++ incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/utils/LayoutManagerClientHelper.as Sat Jan 21 01:33:26 2012
@@ -0,0 +1,310 @@
+package com.frishy.utils
+{
+    import flash.events.EventDispatcher;
+    import flash.events.IEventDispatcher;
+    
+    import mx.core.IInvalidating;
+    import mx.core.UIComponentGlobals;
+    import mx.core.mx_internal;
+    import mx.managers.ILayoutManagerClient;
+    
+    use namespace mx_internal;
+    
+    public class LayoutManagerClientHelper extends EventDispatcher 
+        implements ILayoutManagerClient, IInvalidating
+    {
+        //--------------------------------------------------------------------------
+        //
+        //  Constructor
+        //
+        //--------------------------------------------------------------------------
+        
+        /**
+         *  Constructor
+         */
+        public function LayoutManagerClientHelper(validatePropertiesCallback:Function = null,
+                                                  validateSizeCallback:Function = null, 
+                                                  validateDisplayListCallback:Function = null)
+        {
+            super();
+            
+            this.validatePropertiesCallback = validatePropertiesCallback;
+            this.validateSizeCallback = validateSizeCallback;
+            this.validateDisplayListCallback = validateDisplayListCallback;
+        }
+        
+        //--------------------------------------------------------------------------
+        //
+        //  Variables
+        //
+        //--------------------------------------------------------------------------
+        
+        /**
+         *  @private
+         *  Whether validateProperties() needs to be called
+         */
+        private var invalidatePropertiesFlag:Boolean = false;
+        
+        /**
+         *  @private
+         *  Whether validateSize() needs to be called
+         */
+        private var invalidateSizeFlag:Boolean = false;
+        
+        /**
+         *  @private
+         *  Whether validateDisplayList() needs to be called
+         */
+        private var invalidateDisplayListFlag:Boolean = false;
+        
+        /**
+         *  Callback for the validateProperties() pass
+         */
+        public var validatePropertiesCallback:Function;
+        
+        /**
+         *  Callback for the validateSize() pass
+         */
+        public var validateSizeCallback:Function;
+        
+        /**
+         *  Callback for the validateDisplayList() pass
+         */
+        public var validateDisplayListCallback:Function;
+        
+        //--------------------------------------------------------------------------
+        //
+        //  Properties
+        //
+        //--------------------------------------------------------------------------
+        
+        //----------------------------------
+        //  needsValidation
+        //----------------------------------
+        
+        /**
+         *  Whether this object is invalid
+         */
+        public function get needsValidation():Boolean
+        {
+            // if any of the flags are invalid, then we need validation
+            return (invalidatePropertiesFlag || invalidateSizeFlag || invalidateDisplayListFlag);
+        }
+        
+        //--------------------------------------------------------------------------
+        //
+        //  Properties: ILayoutManagerClient
+        //
+        //--------------------------------------------------------------------------
+        
+        //----------------------------------
+        //  initialized
+        //----------------------------------
+        
+        /**
+         *  @private
+         *  Storage for the initialized property.
+         */
+        private var _initialized:Boolean = false;
+        
+        /**
+         *  @copy mx.core.UIComponent#initialized
+         */
+        public function get initialized():Boolean
+        {
+            return _initialized;
+        }
+        
+        /**
+         *  @private
+         */
+        public function set initialized(value:Boolean):void
+        {
+            _initialized = value;
+        }
+        
+        //----------------------------------
+        //  nestLevel
+        //----------------------------------
+        
+        /**
+         *  @private
+         *  Storage for the nestLevel property.
+         */
+        private var _nestLevel:int = 1;
+        
+        // no one will likely set nestLevel (but there's a setter in case
+        // someone wants to.  We default nestLevel to 1 so it's a top-level component
+        
+        /**
+         *  @copy mx.core.UIComponent#nestLevel
+         */
+        public function get nestLevel():int
+        {
+            return _nestLevel;
+        }
+        
+        /**
+         *  @private
+         */
+        public function set nestLevel(value:int):void
+        {
+            _nestLevel = value;
+        }
+        
+        //----------------------------------
+        //  processedDescriptors
+        //----------------------------------
+        
+        /**
+         *  @private
+         *  Storage for the processedDescriptors property.
+         */
+        private var _processedDescriptors:Boolean = false;
+        
+        /**
+         *  @copy mx.core.UIComponent#processedDescriptors
+         */
+        public function get processedDescriptors():Boolean
+        {
+            return _processedDescriptors;
+        }
+        
+        /**
+         *  @private
+         */
+        public function set processedDescriptors(value:Boolean):void
+        {
+            _processedDescriptors = value;
+        }
+        
+        //----------------------------------
+        //  updateCompletePendingFlag
+        //----------------------------------
+        
+        /**
+         *  @private
+         *  Storage for the updateCompletePendingFlag property.
+         */
+        private var _updateCompletePendingFlag:Boolean = false;
+        
+        /**
+         *  A flag that determines if an object has been through all three phases
+         *  of layout validation (provided that any were required).
+         */
+        public function get updateCompletePendingFlag():Boolean
+        {
+            return _updateCompletePendingFlag;
+        }
+        
+        /**
+         *  @private
+         */
+        public function set updateCompletePendingFlag(value:Boolean):void
+        {
+            _updateCompletePendingFlag = value;
+        }
+        
+        //--------------------------------------------------------------------------
+        //
+        //  Methods: IInvalidating
+        //
+        //--------------------------------------------------------------------------
+        
+        /**
+         *  @copy mx.core.IInvalidating#invalidateProperties()
+         */
+        public function invalidateProperties():void
+        {
+            // Don't try to add the object to the display list queue until we've
+            // been assigned a nestLevel, or we'll get added at the wrong place in
+            // the LayoutManager's priority queue.
+            if (!invalidatePropertiesFlag && nestLevel > 0)
+            {
+                invalidatePropertiesFlag = true;
+                UIComponentGlobals.layoutManager.invalidateProperties(this);
+            }
+        }
+        
+        /**
+         *  @copy mx.core.IInvalidating#invalidateSize()
+         */
+        public function invalidateSize():void
+        {
+            // Don't try to add the object to the display list queue until we've
+            // been assigned a nestLevel, or we'll get added at the wrong place in
+            // the LayoutManager's priority queue.
+            if (!invalidateSizeFlag && nestLevel > 0)
+            {
+                invalidateSizeFlag = true;
+                UIComponentGlobals.layoutManager.invalidateSize(this);
+            }
+        }
+        
+        /**
+         *  @copy mx.core.IInvalidating#invalidateDisplayList()
+         */
+        public function invalidateDisplayList():void
+        {
+            // Don't try to add the object to the display list queue until we've
+            // been assigned a nestLevel, or we'll get added at the wrong place in
+            // the LayoutManager's priority queue.
+            if (!invalidateDisplayListFlag && nestLevel > 0)
+            {
+                invalidateDisplayListFlag = true;
+                UIComponentGlobals.layoutManager.invalidateDisplayList(this);
+            }
+        }
+        
+        /**
+         *  @copy mx.core.IInvalidating#validateNow()
+         */
+        public function validateNow():void
+        {
+            if (invalidatePropertiesFlag)
+                validateProperties();
+            
+            if (invalidateSizeFlag)
+                validateSize();
+            
+            if (invalidateDisplayListFlag)
+                validateDisplayList();
+        }
+        
+        //--------------------------------------------------------------------------
+        //
+        //  Methods: Validation
+        //
+        //--------------------------------------------------------------------------
+        
+        /**
+         *  @inheritDoc
+         */
+        public function validateProperties():void
+        {
+            if (validatePropertiesCallback != null)
+                validatePropertiesCallback();
+            
+            invalidatePropertiesFlag = false;
+        }
+        
+        /**
+         *  @inheritDoc
+         */
+        public function validateSize(recursive:Boolean=false):void
+        {
+            if (validateSizeCallback != null)
+                validateSizeCallback(recursive);
+            
+            invalidateSizeFlag = false;
+        }
+        
+        public function validateDisplayList():void
+        {
+            if (validateDisplayListCallback != null)
+                validateDisplayListCallback();
+            
+            invalidateDisplayListFlag = false;
+        }
+    }
+}
\ No newline at end of file

Propchange: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/utils/LayoutManagerClientHelper.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelpers/ChangeWatcherAdvancedDataGridItemRenderer.as
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelpers/ChangeWatcherAdvancedDataGridItemRenderer.as?rev=1234229&view=auto
==============================================================================
--- incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelpers/ChangeWatcherAdvancedDataGridItemRenderer.as (added)
+++ incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelpers/ChangeWatcherAdvancedDataGridItemRenderer.as Sat Jan 21 01:33:26 2012
@@ -0,0 +1,109 @@
+package fastdatagridhelpers
+{
+    import flash.events.Event;
+    
+    import mx.binding.utils.ChangeWatcher;
+    import mx.controls.advancedDataGridClasses.AdvancedDataGridItemRenderer;
+    import mx.controls.advancedDataGridClasses.AdvancedDataGridListData;
+    import mx.core.UIComponentGlobals;
+    import mx.core.mx_internal;
+    
+    use namespace mx_internal;
+    
+    public class ChangeWatcherAdvancedDataGridItemRenderer extends AdvancedDataGridItemRenderer
+    {
+        public function ChangeWatcherAdvancedDataGridItemRenderer()
+        {
+            super();
+        }
+        
+        private var invalidatePropertiesFlag:Boolean = false;
+        
+        private var invalidateSizeFlag:Boolean = false;
+        
+        private var changeWatcher:ChangeWatcher;
+        
+        override public function set data(value:Object):void
+        {
+            if (data)
+            {
+                removeChangeWatcher();
+            }
+            
+            super.data = value;
+            
+            if (data)
+            {
+                addChangeWatcher();
+            }
+        }
+        
+        protected function addChangeWatcher():void
+        {
+            var adgListData:AdvancedDataGridListData = AdvancedDataGridListData(listData);
+            if (adgListData.dataField)
+            {
+                changeWatcher = ChangeWatcher.watch(data, adgListData.dataField.split("."), dataHasUpdated);
+            }
+        }
+        
+        protected function removeChangeWatcher():void
+        {
+            if (changeWatcher)
+            {
+                changeWatcher.unwatch();
+                changeWatcher = null;
+            }
+        }
+        
+        protected function dataHasUpdated(event:Event = null):void
+        {
+            if (nestLevel && !invalidatePropertiesFlag)
+            {
+                UIComponentGlobals.layoutManager.invalidateProperties(this);
+                invalidatePropertiesFlag = true;
+//                UIComponentGlobals.layoutManager.invalidateSize(this);
+//                invalidateSizeFlag = true;
+            }
+        }
+        
+        override public function validateProperties():void
+        {
+            invalidatePropertiesFlag = false;
+            
+            // update listData.label so super.validateProperties() will update the text correctly
+            var _listData:AdvancedDataGridListData = listData as AdvancedDataGridListData;
+            if (_listData)
+            {
+                var label:String;
+                try 
+                {
+                    var isComplexDataField:Boolean = (_listData.dataField.indexOf(".") >= 0);
+                    if (isComplexDataField)
+                    {
+                        var pathElements:Array = _listData.dataField.split(".");
+                        var currentItemData:Object = data;
+                        
+                        for each (var pathElement:String in pathElements)
+                        {
+                            currentItemData = currentItemData[pathElement];
+                        }
+                        
+                        if (currentItemData != null)
+                            label = currentItemData.toString();
+                    }
+                    else if (data.hasOwnProperty(_listData.dataField))
+                    {
+                        label = data[_listData.dataField];
+                    }
+                }
+                catch(ignored:Error)
+                {
+                }
+                
+                _listData.label = label;
+            }
+            super.validateProperties();
+        }
+    }
+}
\ No newline at end of file

Propchange: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelpers/ChangeWatcherAdvancedDataGridItemRenderer.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelpers/FastAdvancedDataGrid.as
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelpers/FastAdvancedDataGrid.as?rev=1234229&view=auto
==============================================================================
--- incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelpers/FastAdvancedDataGrid.as (added)
+++ incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelpers/FastAdvancedDataGrid.as Sat Jan 21 01:33:26 2012
@@ -0,0 +1,25 @@
+package fastdatagridhelpers
+{
+    import flash.events.Event;
+    
+    import mx.controls.AdvancedDataGrid;
+    import mx.events.CollectionEvent;
+    import mx.events.CollectionEventKind;
+    
+    public class FastAdvancedDataGrid extends AdvancedDataGrid
+    {
+        public function FastAdvancedDataGrid()
+        {
+            super();
+        }
+        
+        override protected function collectionChangeHandler(event:Event):void
+        {
+            var ce:CollectionEvent = CollectionEvent(event);
+            if (ce.kind != CollectionEventKind.UPDATE)
+            {
+                super.collectionChangeHandler(event);
+            }
+        }
+    }
+}
\ No newline at end of file

Propchange: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelpers/FastAdvancedDataGrid.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NestedPropertyObject.as
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NestedPropertyObject.as?rev=1234229&view=auto
==============================================================================
--- incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NestedPropertyObject.as (added)
+++ incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NestedPropertyObject.as Sat Jan 21 01:33:26 2012
@@ -0,0 +1,15 @@
+package model
+{
+    public class NestedPropertyObject
+    {
+        public function NestedPropertyObject()
+        {
+        }
+        
+        [Bindable]
+        public var propertyChangeBindableObject:PropertyChangeBindableObject;
+        
+        [Bindable]
+        public var uniqueEventBindableObject:UniqueEventBindableObject;
+    }
+}
\ No newline at end of file

Propchange: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NestedPropertyObject.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NonBindableObject.as
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NonBindableObject.as?rev=1234229&view=auto
==============================================================================
--- incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NonBindableObject.as (added)
+++ incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NonBindableObject.as Sat Jan 21 01:33:26 2012
@@ -0,0 +1,109 @@
+package model
+{
+    import flash.events.EventDispatcher;
+
+    public class NonBindableObject extends EventDispatcher
+    {
+        public function NonBindableObject()
+        {
+            super();
+        }
+        
+        public static const NUM_PROPERTIES:int = 30;
+        
+        public function fillAllProperties():void
+        {
+            for (var i:int = 0; i < NUM_PROPERTIES; i++)
+            {
+                fillProperty(i);
+            }
+        }
+        
+        public function fillNRandomProperties(numPropertiesToUpdate:int):void
+        {
+            for (var j:int = 0; j < numPropertiesToUpdate; j++)
+            {
+                fillARandomProperty();
+            }
+        }
+        
+        private function fillARandomProperty():void
+        {
+            var propertyIndex:int = Math.floor(Math.random() * NUM_PROPERTIES);
+            fillProperty(propertyIndex);
+        }
+        
+        private function fillProperty(propertyIndex:int):void
+        {
+            if (propertyIndex % 3 == 0)
+            {
+                // Number
+                this["property" + propertyIndex] = Math.random();
+            }
+            else
+            {
+                this["property" + propertyIndex] = Math.random().toString();
+            }
+        }
+        
+        public var property0:Number;
+        
+        public var property1:String;
+        
+        public var property2:String;
+        
+        public var property3:Number;
+        
+        public var property4:String;
+        
+        public var property5:String;
+        
+        public var property6:Number;
+        
+        public var property7:String;
+        
+        public var property8:String;
+        
+        public var property9:Number;
+        
+        public var property10:String;
+        
+        public var property11:String;
+        
+        public var property12:Number;
+        
+        public var property13:String;
+        
+        public var property14:String;
+        
+        public var property15:Number;
+        
+        public var property16:String;
+        
+        public var property17:String;
+        
+        public var property18:Number;
+        
+        public var property19:String;
+        
+        public var property20:String;
+        
+        public var property21:Number;
+        
+        public var property22:String;
+        
+        public var property23:String;
+        
+        public var property24:Number;
+        
+        public var property25:String;
+        
+        public var property26:String;
+        
+        public var property27:Number;
+        
+        public var property28:String;
+        
+        public var property29:String;
+    }
+}
\ No newline at end of file

Propchange: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NonBindableObject.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/PropertyChangeBindableObject.as
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/PropertyChangeBindableObject.as?rev=1234229&view=auto
==============================================================================
--- incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/PropertyChangeBindableObject.as (added)
+++ incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/PropertyChangeBindableObject.as Sat Jan 21 01:33:26 2012
@@ -0,0 +1,159 @@
+package model
+{
+    import flash.events.EventDispatcher;
+    
+    import mx.events.PropertyChangeEvent;
+
+    public class PropertyChangeBindableObject extends EventDispatcher
+    {
+        public function PropertyChangeBindableObject()
+        {
+            super();
+        }
+        
+        public static const NUM_PROPERTIES:int = 30;
+        
+        public function fillAllProperties():void
+        {
+            for (var i:int = 0; i < NUM_PROPERTIES; i++)
+            {
+                fillProperty(i);
+            }
+        }
+        
+        public function fillNRandomProperties(numPropertiesToUpdate:int):void
+        {
+            for (var j:int = 0; j < numPropertiesToUpdate; j++)
+            {
+                fillARandomProperty();
+            }
+        }
+        
+        private function fillARandomProperty():void
+        {
+            var propertyIndex:int = Math.floor(Math.random() * NUM_PROPERTIES);
+            fillProperty(propertyIndex);
+        }
+        
+        private function fillProperty(propertyIndex:int):void
+        {
+            if (propertyIndex % 3 == 0)
+            {
+                // Number
+                this["property" + propertyIndex] = Math.random();
+            }
+            else
+            {
+                this["property" + propertyIndex] = Math.random().toString();
+            }
+        }
+        
+        [Bindable]
+        public var property0:Number;
+        
+        [Bindable]
+        public var property1:String;
+        
+        [Bindable]
+        public var property2:String;
+        
+//        [Bindable]
+//        public var property3:Number;
+        private var _property3:Number;
+        
+        [Bindable("propertyChange")]
+        public function get property3():Number
+        {
+            return _property3;
+        }
+        
+        public function set property3(value:Number):void
+        {
+            if (value == _property3)
+                return;
+            
+            var oldValue:Number = _property3;
+            _property3 = value;
+            
+            dispatchEvent(PropertyChangeEvent.createUpdateEvent(this, "property3", oldValue, _property3));
+        }
+        
+        [Bindable]
+        public var property4:String;
+        
+        [Bindable]
+        public var property5:String;
+        
+        [Bindable]
+        public var property6:Number;
+        
+        [Bindable]
+        public var property7:String;
+        
+        [Bindable]
+        public var property8:String;
+        
+        [Bindable]
+        public var property9:Number;
+        
+        [Bindable]
+        public var property10:String;
+        
+        [Bindable]
+        public var property11:String;
+        
+        [Bindable]
+        public var property12:Number;
+        
+        [Bindable]
+        public var property13:String;
+        
+        [Bindable]
+        public var property14:String;
+        
+        [Bindable]
+        public var property15:Number;
+        
+        [Bindable]
+        public var property16:String;
+        
+        [Bindable]
+        public var property17:String;
+        
+        [Bindable]
+        public var property18:Number;
+        
+        [Bindable]
+        public var property19:String;
+        
+        [Bindable]
+        public var property20:String;
+        
+        [Bindable]
+        public var property21:Number;
+        
+        [Bindable]
+        public var property22:String;
+        
+        [Bindable]
+        public var property23:String;
+        
+        [Bindable]
+        public var property24:Number;
+        
+        [Bindable]
+        public var property25:String;
+        
+        [Bindable]
+        public var property26:String;
+        
+        [Bindable]
+        public var property27:Number;
+        
+        [Bindable]
+        public var property28:String;
+        
+        [Bindable]
+        public var property29:String;
+    }
+}
\ No newline at end of file

Propchange: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/PropertyChangeBindableObject.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/SingleVersionEventBindableObject.as
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/SingleVersionEventBindableObject.as?rev=1234229&view=auto
==============================================================================
--- incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/SingleVersionEventBindableObject.as (added)
+++ incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/SingleVersionEventBindableObject.as Sat Jan 21 01:33:26 2012
@@ -0,0 +1,503 @@
+package model
+{
+    import flash.events.Event;
+    import flash.events.EventDispatcher;
+    
+    import mx.events.PropertyChangeEvent;
+
+    public class SingleVersionEventBindableObject extends EventDispatcher
+    {
+        public function SingleVersionEventBindableObject()
+        {
+            super();
+        }
+        
+        public static function createProperties(start:int, end:int):void
+        {
+            for (var i:int = start; i <= end; i++)
+            {
+                var type:String = (i % 3 == 0 ? "Number" : "String");
+                
+                trace('private var _property' + i + ':' + type + ';');
+                trace('');
+                trace('[Bindable("versionNumberChanged")]');
+                trace('public function get property' + i + '():' + type + '');
+                trace('{');
+                    trace('return _property' + i + ';');
+                trace('}');
+                trace('');
+                trace('public function set property' + i + '(value:' + type + '):void');
+                trace('{');
+                    trace('_property' + i + ' = value;');
+                trace('}');
+                trace('');
+            }
+            
+        }
+        
+        public static const NUM_PROPERTIES:int = 30;
+        
+        public function fillAllProperties():void
+        {
+            for (var i:int = 0; i < NUM_PROPERTIES; i++)
+            {
+                fillProperty(i);
+            }
+            
+            versionNumber++;
+        }
+        
+        public function fillNRandomProperties(numPropertiesToUpdate:int):void
+        {
+            for (var j:int = 0; j < numPropertiesToUpdate; j++)
+            {
+                fillARandomProperty();
+            }
+            
+            versionNumber++;
+        }
+        
+        // doesn't update version.... so no binding here
+        private function fillARandomProperty():void
+        {
+            var propertyIndex:int = Math.floor(Math.random() * NUM_PROPERTIES);
+            fillProperty(propertyIndex);
+        }
+        
+        private function fillProperty(propertyIndex:int):void
+        {
+            if (propertyIndex % 3 == 0)
+            {
+                // Number
+                this["property" + propertyIndex] = Math.random();
+            }
+            else
+            {
+                this["property" + propertyIndex] = Math.random().toString();
+            }
+        }
+        
+        private var _versionNumber:Number = 0;
+        
+        [Bindable("versionNumberChanged")]
+        public function get versionNumber():int
+        {
+            return _versionNumber;
+        }
+        
+        public function set versionNumber(value:int):void
+        {
+            if (_versionNumber == value)
+                return;
+            
+            var oldValue:Number = _versionNumber;
+            
+            _versionNumber = value;
+            
+            dispatchEvent(new Event("versionNumberChanged"));
+            
+//            dispatchEvent(PropertyChangeEvent.createUpdateEvent(this, "versionNumber", oldValue, _versionNumber));
+            
+            // prop0 is filter
+            // prop1 is sort
+            // prop3 is grouping
+//            dispatchEvent(PropertyChangeEvent.createUpdateEvent(this, "property0", property0, property0));
+//            dispatchEvent(PropertyChangeEvent.createUpdateEvent(this, "property1", property1, property1));
+            dispatchEvent(PropertyChangeEvent.createUpdateEvent(this, "property3", property3, property3));
+        }
+        
+        
+        
+        
+        
+        private var _property0:Number;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property0():Number
+        {
+            return _property0;
+        }
+        
+        public function set property0(value:Number):void
+        {
+            _property0 = value;
+        }
+        
+        private var _property1:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property1():String
+        {
+            return _property1;
+        }
+        
+        public function set property1(value:String):void
+        {
+            _property1 = value;
+        }
+        
+        private var _property2:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property2():String
+        {
+            return _property2;
+        }
+        
+        public function set property2(value:String):void
+        {
+            _property2 = value;
+        }
+        
+        private var _property3:Number;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property3():Number
+        {
+            return _property3;
+        }
+        
+        public function set property3(value:Number):void
+        {
+            _property3 = value;
+        }
+        
+        private var _property4:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property4():String
+        {
+            return _property4;
+        }
+        
+        public function set property4(value:String):void
+        {
+            _property4 = value;
+        }
+        
+        private var _property5:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property5():String
+        {
+            return _property5;
+        }
+        
+        public function set property5(value:String):void
+        {
+            _property5 = value;
+        }
+        
+        private var _property6:Number;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property6():Number
+        {
+            return _property6;
+        }
+        
+        public function set property6(value:Number):void
+        {
+            _property6 = value;
+        }
+        
+        private var _property7:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property7():String
+        {
+            return _property7;
+        }
+        
+        public function set property7(value:String):void
+        {
+            _property7 = value;
+        }
+        
+        private var _property8:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property8():String
+        {
+            return _property8;
+        }
+        
+        public function set property8(value:String):void
+        {
+            _property8 = value;
+        }
+        
+        private var _property9:Number;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property9():Number
+        {
+            return _property9;
+        }
+        
+        public function set property9(value:Number):void
+        {
+            _property9 = value;
+        }
+        
+        private var _property10:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property10():String
+        {
+            return _property10;
+        }
+        
+        public function set property10(value:String):void
+        {
+            _property10 = value;
+        }
+        
+        private var _property11:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property11():String
+        {
+            return _property11;
+        }
+        
+        public function set property11(value:String):void
+        {
+            _property11 = value;
+        }
+        
+        private var _property12:Number;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property12():Number
+        {
+            return _property12;
+        }
+        
+        public function set property12(value:Number):void
+        {
+            _property12 = value;
+        }
+        
+        private var _property13:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property13():String
+        {
+            return _property13;
+        }
+        
+        public function set property13(value:String):void
+        {
+            _property13 = value;
+        }
+        
+        private var _property14:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property14():String
+        {
+            return _property14;
+        }
+        
+        public function set property14(value:String):void
+        {
+            _property14 = value;
+        }
+        
+        private var _property15:Number;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property15():Number
+        {
+            return _property15;
+        }
+        
+        public function set property15(value:Number):void
+        {
+            _property15 = value;
+        }
+        
+        private var _property16:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property16():String
+        {
+            return _property16;
+        }
+        
+        public function set property16(value:String):void
+        {
+            _property16 = value;
+        }
+        
+        private var _property17:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property17():String
+        {
+            return _property17;
+        }
+        
+        public function set property17(value:String):void
+        {
+            _property17 = value;
+        }
+        
+        private var _property18:Number;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property18():Number
+        {
+            return _property18;
+        }
+        
+        public function set property18(value:Number):void
+        {
+            _property18 = value;
+        }
+        
+        private var _property19:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property19():String
+        {
+            return _property19;
+        }
+        
+        public function set property19(value:String):void
+        {
+            _property19 = value;
+        }
+        
+        private var _property20:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property20():String
+        {
+            return _property20;
+        }
+        
+        public function set property20(value:String):void
+        {
+            _property20 = value;
+        }
+        
+        private var _property21:Number;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property21():Number
+        {
+            return _property21;
+        }
+        
+        public function set property21(value:Number):void
+        {
+            _property21 = value;
+        }
+        
+        private var _property22:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property22():String
+        {
+            return _property22;
+        }
+        
+        public function set property22(value:String):void
+        {
+            _property22 = value;
+        }
+        
+        private var _property23:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property23():String
+        {
+            return _property23;
+        }
+        
+        public function set property23(value:String):void
+        {
+            _property23 = value;
+        }
+        
+        private var _property24:Number;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property24():Number
+        {
+            return _property24;
+        }
+        
+        public function set property24(value:Number):void
+        {
+            _property24 = value;
+        }
+        
+        private var _property25:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property25():String
+        {
+            return _property25;
+        }
+        
+        public function set property25(value:String):void
+        {
+            _property25 = value;
+        }
+        
+        private var _property26:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property26():String
+        {
+            return _property26;
+        }
+        
+        public function set property26(value:String):void
+        {
+            _property26 = value;
+        }
+        
+        private var _property27:Number;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property27():Number
+        {
+            return _property27;
+        }
+        
+        public function set property27(value:Number):void
+        {
+            _property27 = value;
+        }
+        
+        private var _property28:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property28():String
+        {
+            return _property28;
+        }
+        
+        public function set property28(value:String):void
+        {
+            _property28 = value;
+        }
+        
+        private var _property29:String;
+        
+        [Bindable("versionNumberChanged")]
+        public function get property29():String
+        {
+            return _property29;
+        }
+        
+        public function set property29(value:String):void
+        {
+            _property29 = value;
+        }
+    }
+}
\ No newline at end of file

Propchange: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/SingleVersionEventBindableObject.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/UniqueEventBindableObject.as
URL: http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/UniqueEventBindableObject.as?rev=1234229&view=auto
==============================================================================
--- incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/UniqueEventBindableObject.as (added)
+++ incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/UniqueEventBindableObject.as Sat Jan 21 01:33:26 2012
@@ -0,0 +1,626 @@
+package model
+{
+    import flash.events.Event;
+    import flash.events.EventDispatcher;
+    
+    import mx.events.PropertyChangeEvent;
+
+    public class UniqueEventBindableObject extends EventDispatcher
+    {
+        public function UniqueEventBindableObject()
+        {
+            super();
+        }
+        
+        public static function createProperties(start:int, end:int):void
+        {
+            for (var i:int = start; i <= end; i++)
+            {
+                var type:String = (i % 3 == 0 ? "Number" : "String");
+                
+                trace('private var _property' + i + ':' + type + ';');
+                trace('');
+                trace('[Bindable("property' + i + 'Changed")]');
+                trace('public function get property' + i + '():' + type + '');
+                trace('{');
+                    trace('return _property' + i + ';');
+                trace('}');
+                trace('');
+                trace('public function set property' + i + '(value:' + type + '):void');
+                trace('{');
+                    trace('if (_property' + i + ' == value)');
+                        trace('return;');
+                    trace('');
+                    trace('_property' + i + ' = value;');
+                    trace('if (hasEventListener("property' + i + 'Changed"))');
+                        trace('dispatchEvent(new Event("property' + i + 'Changed"));');
+                trace('}');
+                trace('');
+            }
+            
+        }
+        
+        public static const NUM_PROPERTIES:int = 30;
+        
+        public function fillAllProperties():void
+        {
+            for (var i:int = 0; i < NUM_PROPERTIES; i++)
+            {
+                fillProperty(i);
+            }
+        }
+        
+        public function fillNRandomProperties(numPropertiesToUpdate:int):void
+        {
+            for (var j:int = 0; j < numPropertiesToUpdate; j++)
+            {
+                fillARandomProperty();
+            }
+        }
+        
+        private function fillARandomProperty():void
+        {
+            var propertyIndex:int = Math.floor(Math.random() * NUM_PROPERTIES);
+            fillProperty(propertyIndex);
+        }
+        
+        private function fillProperty(propertyIndex:int):void
+        {
+            if (propertyIndex % 3 == 0)
+            {
+                // Number
+                this["property" + propertyIndex] = Math.random();
+            }
+            else
+            {
+                this["property" + propertyIndex] = Math.random().toString();
+            }
+        }
+        
+        private var _property0:Number;
+        
+        [Bindable("property0Changed")]
+        public function get property0():Number
+        {
+            return _property0;
+        }
+        
+        public function set property0(value:Number):void
+        {
+            if (_property0 == value)
+                return;
+            
+            _property0 = value;
+            if (hasEventListener("property0Changed"))
+                dispatchEvent(new Event("property0Changed"));
+            
+            dispatchEvent(PropertyChangeEvent.createUpdateEvent(this, "property0", property0, property0));
+        }
+        
+        private var _property1:String;
+        
+        [Bindable("property1Changed")]
+        public function get property1():String
+        {
+            return _property1;
+        }
+        
+        public function set property1(value:String):void
+        {
+            if (_property1 == value)
+                return;
+            
+            _property1 = value;
+            if (hasEventListener("property1Changed"))
+                dispatchEvent(new Event("property1Changed"));
+            
+            dispatchEvent(PropertyChangeEvent.createUpdateEvent(this, "property1", property1, property1));
+        }
+        
+        private var _property2:String;
+        
+        [Bindable("property2Changed")]
+        public function get property2():String
+        {
+            return _property2;
+        }
+        
+        public function set property2(value:String):void
+        {
+            if (_property2 == value)
+                return;
+            
+            _property2 = value;
+            if (hasEventListener("property2Changed"))
+                dispatchEvent(new Event("property2Changed"));
+        }
+        
+        private var _property3:Number;
+        
+        [Bindable("property3Changed")]
+        public function get property3():Number
+        {
+            return _property3;
+        }
+        
+        public function set property3(value:Number):void
+        {
+            if (_property3 == value)
+                return;
+            
+            _property3 = value;
+            if (hasEventListener("property3Changed"))
+                dispatchEvent(new Event("property3Changed"));
+            
+            dispatchEvent(PropertyChangeEvent.createUpdateEvent(this, "property3", property3, property3));
+        }
+        
+        private var _property4:String;
+        
+        [Bindable("property4Changed")]
+        public function get property4():String
+        {
+            return _property4;
+        }
+        
+        public function set property4(value:String):void
+        {
+            if (_property4 == value)
+                return;
+            
+            _property4 = value;
+            if (hasEventListener("property4Changed"))
+                dispatchEvent(new Event("property4Changed"));
+        }
+        
+        private var _property5:String;
+        
+        [Bindable("property5Changed")]
+        public function get property5():String
+        {
+            return _property5;
+        }
+        
+        public function set property5(value:String):void
+        {
+            if (_property5 == value)
+                return;
+            
+            _property5 = value;
+            if (hasEventListener("property5Changed"))
+                dispatchEvent(new Event("property5Changed"));
+        }
+        
+        private var _property6:Number;
+        
+        [Bindable("property6Changed")]
+        public function get property6():Number
+        {
+            return _property6;
+        }
+        
+        public function set property6(value:Number):void
+        {
+            if (_property6 == value)
+                return;
+            
+            _property6 = value;
+            if (hasEventListener("property6Changed"))
+                dispatchEvent(new Event("property6Changed"));
+        }
+        
+        private var _property7:String;
+        
+        [Bindable("property7Changed")]
+        public function get property7():String
+        {
+            return _property7;
+        }
+        
+        public function set property7(value:String):void
+        {
+            if (_property7 == value)
+                return;
+            
+            _property7 = value;
+            if (hasEventListener("property7Changed"))
+                dispatchEvent(new Event("property7Changed"));
+        }
+        
+        private var _property8:String;
+        
+        [Bindable("property8Changed")]
+        public function get property8():String
+        {
+            return _property8;
+        }
+        
+        public function set property8(value:String):void
+        {
+            if (_property8 == value)
+                return;
+            
+            _property8 = value;
+            if (hasEventListener("property8Changed"))
+                dispatchEvent(new Event("property8Changed"));
+        }
+        
+        private var _property9:Number;
+        
+        [Bindable("property9Changed")]
+        public function get property9():Number
+        {
+            return _property9;
+        }
+        
+        public function set property9(value:Number):void
+        {
+            if (_property9 == value)
+                return;
+            
+            _property9 = value;
+            if (hasEventListener("property9Changed"))
+                dispatchEvent(new Event("property9Changed"));
+        }
+        
+        private var _property10:String;
+        
+        [Bindable("property10Changed")]
+        public function get property10():String
+        {
+            return _property10;
+        }
+        
+        public function set property10(value:String):void
+        {
+            if (_property10 == value)
+                return;
+            
+            _property10 = value;
+            if (hasEventListener("property10Changed"))
+                dispatchEvent(new Event("property10Changed"));
+        }
+        
+        private var _property11:String;
+        
+        [Bindable("property11Changed")]
+        public function get property11():String
+        {
+            return _property11;
+        }
+        
+        public function set property11(value:String):void
+        {
+            if (_property11 == value)
+                return;
+            
+            _property11 = value;
+            if (hasEventListener("property11Changed"))
+                dispatchEvent(new Event("property11Changed"));
+        }
+        
+        private var _property12:Number;
+        
+        [Bindable("property12Changed")]
+        public function get property12():Number
+        {
+            return _property12;
+        }
+        
+        public function set property12(value:Number):void
+        {
+            if (_property12 == value)
+                return;
+            
+            _property12 = value;
+            if (hasEventListener("property12Changed"))
+                dispatchEvent(new Event("property12Changed"));
+        }
+        
+        private var _property13:String;
+        
+        [Bindable("property13Changed")]
+        public function get property13():String
+        {
+            return _property13;
+        }
+        
+        public function set property13(value:String):void
+        {
+            if (_property13 == value)
+                return;
+            
+            _property13 = value;
+            if (hasEventListener("property13Changed"))
+                dispatchEvent(new Event("property13Changed"));
+        }
+        
+        private var _property14:String;
+        
+        [Bindable("property14Changed")]
+        public function get property14():String
+        {
+            return _property14;
+        }
+        
+        public function set property14(value:String):void
+        {
+            if (_property14 == value)
+                return;
+            
+            _property14 = value;
+            if (hasEventListener("property14Changed"))
+                dispatchEvent(new Event("property14Changed"));
+        }
+        
+        private var _property15:Number;
+        
+        [Bindable("property15Changed")]
+        public function get property15():Number
+        {
+            return _property15;
+        }
+        
+        public function set property15(value:Number):void
+        {
+            if (_property15 == value)
+                return;
+            
+            _property15 = value;
+            if (hasEventListener("property15Changed"))
+                dispatchEvent(new Event("property15Changed"));
+        }
+        
+        private var _property16:String;
+        
+        [Bindable("property16Changed")]
+        public function get property16():String
+        {
+            return _property16;
+        }
+        
+        public function set property16(value:String):void
+        {
+            if (_property16 == value)
+                return;
+            
+            _property16 = value;
+            if (hasEventListener("property16Changed"))
+                dispatchEvent(new Event("property16Changed"));
+        }
+        
+        private var _property17:String;
+        
+        [Bindable("property17Changed")]
+        public function get property17():String
+        {
+            return _property17;
+        }
+        
+        public function set property17(value:String):void
+        {
+            if (_property17 == value)
+                return;
+            
+            _property17 = value;
+            if (hasEventListener("property17Changed"))
+                dispatchEvent(new Event("property17Changed"));
+        }
+        
+        private var _property18:Number;
+        
+        [Bindable("property18Changed")]
+        public function get property18():Number
+        {
+            return _property18;
+        }
+        
+        public function set property18(value:Number):void
+        {
+            if (_property18 == value)
+                return;
+            
+            _property18 = value;
+            if (hasEventListener("property18Changed"))
+                dispatchEvent(new Event("property18Changed"));
+        }
+        
+        private var _property19:String;
+        
+        [Bindable("property19Changed")]
+        public function get property19():String
+        {
+            return _property19;
+        }
+        
+        public function set property19(value:String):void
+        {
+            if (_property19 == value)
+                return;
+            
+            _property19 = value;
+            if (hasEventListener("property19Changed"))
+                dispatchEvent(new Event("property19Changed"));
+        }
+        
+        private var _property20:String;
+        
+        [Bindable("property20Changed")]
+        public function get property20():String
+        {
+            return _property20;
+        }
+        
+        public function set property20(value:String):void
+        {
+            if (_property20 == value)
+                return;
+            
+            _property20 = value;
+            if (hasEventListener("property20Changed"))
+                dispatchEvent(new Event("property20Changed"));
+        }
+        
+        private var _property21:Number;
+        
+        [Bindable("property21Changed")]
+        public function get property21():Number
+        {
+            return _property21;
+        }
+        
+        public function set property21(value:Number):void
+        {
+            if (_property21 == value)
+                return;
+            
+            _property21 = value;
+            if (hasEventListener("property21Changed"))
+                dispatchEvent(new Event("property21Changed"));
+        }
+        
+        private var _property22:String;
+        
+        [Bindable("property22Changed")]
+        public function get property22():String
+        {
+            return _property22;
+        }
+        
+        public function set property22(value:String):void
+        {
+            if (_property22 == value)
+                return;
+            
+            _property22 = value;
+            if (hasEventListener("property22Changed"))
+                dispatchEvent(new Event("property22Changed"));
+        }
+        
+        private var _property23:String;
+        
+        [Bindable("property23Changed")]
+        public function get property23():String
+        {
+            return _property23;
+        }
+        
+        public function set property23(value:String):void
+        {
+            if (_property23 == value)
+                return;
+            
+            _property23 = value;
+            if (hasEventListener("property23Changed"))
+                dispatchEvent(new Event("property23Changed"));
+        }
+        
+        private var _property24:Number;
+        
+        [Bindable("property24Changed")]
+        public function get property24():Number
+        {
+            return _property24;
+        }
+        
+        public function set property24(value:Number):void
+        {
+            if (_property24 == value)
+                return;
+            
+            _property24 = value;
+            if (hasEventListener("property24Changed"))
+                dispatchEvent(new Event("property24Changed"));
+        }
+        
+        private var _property25:String;
+        
+        [Bindable("property25Changed")]
+        public function get property25():String
+        {
+            return _property25;
+        }
+        
+        public function set property25(value:String):void
+        {
+            if (_property25 == value)
+                return;
+            
+            _property25 = value;
+            if (hasEventListener("property25Changed"))
+                dispatchEvent(new Event("property25Changed"));
+        }
+        
+        private var _property26:String;
+        
+        [Bindable("property26Changed")]
+        public function get property26():String
+        {
+            return _property26;
+        }
+        
+        public function set property26(value:String):void
+        {
+            if (_property26 == value)
+                return;
+            
+            _property26 = value;
+            if (hasEventListener("property26Changed"))
+                dispatchEvent(new Event("property26Changed"));
+        }
+        
+        private var _property27:Number;
+        
+        [Bindable("property27Changed")]
+        public function get property27():Number
+        {
+            return _property27;
+        }
+        
+        public function set property27(value:Number):void
+        {
+            if (_property27 == value)
+                return;
+            
+            _property27 = value;
+            if (hasEventListener("property27Changed"))
+                dispatchEvent(new Event("property27Changed"));
+        }
+        
+        private var _property28:String;
+        
+        [Bindable("property28Changed")]
+        public function get property28():String
+        {
+            return _property28;
+        }
+        
+        public function set property28(value:String):void
+        {
+            if (_property28 == value)
+                return;
+            
+            _property28 = value;
+            if (hasEventListener("property28Changed"))
+                dispatchEvent(new Event("property28Changed"));
+        }
+        
+        private var _property29:String;
+        
+        [Bindable("property29Changed")]
+        public function get property29():String
+        {
+            return _property29;
+        }
+        
+        public function set property29(value:String):void
+        {
+            if (_property29 == value)
+                return;
+            
+            _property29 = value;
+            if (hasEventListener("property29Changed"))
+                dispatchEvent(new Event("property29Changed"));
+        }
+    }
+}
\ No newline at end of file

Propchange: incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/UniqueEventBindableObject.as
------------------------------------------------------------------------------
    svn:eol-style = native



Mime
View raw message