You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by fr...@apache.org on 2012/01/21 02:33:28 UTC

svn commit: r1234229 [4/4] - in /incubator/flex/whiteboard/frishy: ./ FastGroupingCollection/ FastGroupingCollection/.settings/ FastGroupingCollection/libs/ FastGroupingCollection/src/ FastGroupingCollection/src/com/ FastGroupingCollection/src/com/fris...

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



Re: svn commit: r1234229 [4/4] - in /incubator/flex/whiteboard/frishy: ./ FastGroupingCollection/ FastGroupingCollection/.settings/ FastGroupingCollection/libs/ FastGroupingCollection/src/ FastGroupingCollection/src/com/ FastGroupingCollection/src/com/...

Posted by Alex Harui <ah...@adobe.com>.
Adobe header?


On 1/20/12 5:33 PM, "frishy@apache.org" <fr...@apache.org> wrote:

> Added:
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collect
> ions/PriorityQueue.as
> URL:
> http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingColl
> ection/src/com/frishy/collections/PriorityQueue.as?rev=1234229&view=auto
> ==============================================================================
> ---
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collect
> ions/PriorityQueue.as (added)
> +++
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collect
> ions/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.managrs.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
> +         *  Thesmallest 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/collect
> ions/PriorityQueue.as
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Added:
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collect
> ions/summarycalculators/ReturnArrayOfChildValuesSummaryCalculator.as
> URL:
> http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingColl
> ection/src/com/frishy/collections/summarycalculators/ReturnArrayOfChildValuesS
> ummaryCalculator.as?rev=1234229&view=auto
> ==============================================================================
> ---
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collect
> ions/summarycalculators/ReturnArrayOfChildValuesSummaryCalculator.as (added)
> +++
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collect
> ions/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/collect
> ions/summarycalculators/ReturnArrayOfChildValuesSummaryCalculator.as
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Added:
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collect
> ions/summarycalculators/ReturnChildValueSummaryCalculator.as
> URL:
> http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingColl
> ection/src/com/frishy/collections/summarycalculators/ReturnChildValueSummaryCa
> lculator.as?rev=1234229&view=auto
> ==============================================================================
> ---
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collect
> ions/summarycalculators/ReturnChildValueSummaryCalculator.as (added)
> +++
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/collect
> ions/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/collect
> ions/summarycalculators/ReturnChildValueSummaryCalculator.as
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Added:
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/utils/L
> ayoutManagerClientHelper.as
> URL:
> http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingColl
> ection/src/com/frishy/utils/LayoutManagerClientHelper.as?rev=1234229&view=auto
> ==============================================================================
> ---
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/utils/L
> ayoutManagerClientHelper.as (added)
> +++
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/com/frishy/utils/L
> ayoutManagerClientHelper.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/L
> ayoutManagerClientHelper.as
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Added:
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelper
> s/ChangeWatcherAdvancedDataGridItemRenderer.as
> URL:
> http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingColl
> ection/src/fastdatagridhelpers/ChangeWatcherAdvancedDataGridItemRenderer.as?re
> v=1234229&view=auto
> ==============================================================================
> ---
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelper
> s/ChangeWatcherAdvancedDataGridItemRenderer.as (added)
> +++
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelper
> s/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/fastdatagridhelper
> s/ChangeWatcherAdvancedDataGridItemRenderer.as
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Added:
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelper
> s/FastAdvancedDataGrid.as
> URL:
> http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingColl
> ection/src/fastdatagridhelpers/FastAdvancedDataGrid.as?rev=1234229&view=auto
> ==============================================================================
> ---
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelper
> s/FastAdvancedDataGrid.as (added)
> +++
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/fastdatagridhelper
> s/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/fastdatagridhelper
> s/FastAdvancedDataGrid.as
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Added:
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NestedProper
> tyObject.as
> URL:
> http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingColl
> ection/src/model/NestedPropertyObject.as?rev=1234229&view=auto
> ==============================================================================
> ---
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NestedProper
> tyObject.as (added)
> +++
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NestedProper
> tyObject.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/NestedProper
> tyObject.as
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Added:
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NonBindableO
> bject.as
> URL:
> http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingColl
> ection/src/model/NonBindableObject.as?rev=1234229&view=auto
> ==============================================================================
> ---
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NonBindableO
> bject.as (added)
> +++
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/NonBindableO
> bject.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/NonBindableO
> bject.as
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Added:
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/PropertyChan
> geBindableObject.as
> URL:
> http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingColl
> ection/src/model/PropertyChangeBindableObject.as?rev=1234229&view=auto
> ==============================================================================
> ---
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/PropertyChan
> geBindableObject.as (added)
> +++
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/PropertyChan
> geBindableObject.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/PropertyChan
> geBindableObject.as
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Added:
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/SingleVersio
> nEventBindableObject.as
> URL:
> http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingColl
> ection/src/model/SingleVersionEventBindableObject.as?rev=1234229&view=auto
> ==============================================================================
> ---
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/SingleVersio
> nEventBindableObject.as (added)
> +++
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/SingleVersio
> nEventBindableObject.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/SingleVersio
> nEventBindableObject.as
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Added:
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/UniqueEventB
> indableObject.as
> URL:
> http://svn.apache.org/viewvc/incubator/flex/whiteboard/frishy/FastGroupingColl
> ection/src/model/UniqueEventBindableObject.as?rev=1234229&view=auto
> ==============================================================================
> ---
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/UniqueEventB
> indableObject.as (added)
> +++
> incubator/flex/whiteboard/frishy/FastGroupingCollection/src/model/UniqueEventB
> indableObject.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/UniqueEventB
> indableObject.as
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
>

--
Alex Harui
Flex SDK Team
Adobe Systems, Inc.
http://blogs.adobe.com/aharui