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

[5/6] git commit: [flex-sdk] [refs/heads/develop] - FLEX-34854 The spark Sort now extends the mx version, to prevent the need of changing both classes when a bug is fixed or a feature is implemented. NOTES: -this is a result of the mailing list discussio

FLEX-34854
The spark Sort now extends the mx version, to prevent the need of changing both classes when a bug is fixed or a feature is implemented.
NOTES:
-this is a result of the mailing list discussion entitled 'Can we unify spark and mx Sort and SortField?'.
-some members of mx.collections.Sort needed to be marked protected so that the sort() function could access them. In the next commit they will be reverted by implementing a way in which the sort() function doesn't need to be overridden.
-mx.collections.Sort needed to have a new method, createEmptySortField(), which is now used by noFieldsCompare(), and that ensures that the differences in spark.collections.Sort.noFieldsCompare() are preserved without having to copy-paste the entire method.


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

Branch: refs/heads/develop
Commit: 3aacd76295e213278612c4a6457e54df8f1d34f4
Parents: 2ce4252
Author: Mihai Chira <mi...@apache.org>
Authored: Sun Jun 21 21:15:03 2015 +0100
Committer: Mihai Chira <mi...@apache.org>
Committed: Sun Jun 21 21:15:03 2015 +0100

----------------------------------------------------------------------
 .../framework/src/mx/collections/Sort.as        |  15 +-
 .../spark/src/spark/collections/Sort.as         | 511 +------------------
 2 files changed, 30 insertions(+), 496 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/3aacd762/frameworks/projects/framework/src/mx/collections/Sort.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/framework/src/mx/collections/Sort.as b/frameworks/projects/framework/src/mx/collections/Sort.as
index b296ed3..02cb41e 100644
--- a/frameworks/projects/framework/src/mx/collections/Sort.as
+++ b/frameworks/projects/framework/src/mx/collections/Sort.as
@@ -211,7 +211,7 @@ public class Sort extends EventDispatcher implements ISort
      *  @private
      *  Used for accessing localized Error messages.
      */
-    private var resourceManager:IResourceManager =
+    protected var resourceManager:IResourceManager =
                                     ResourceManager.getInstance();
 
     //--------------------------------------------------------------------------
@@ -233,7 +233,7 @@ public class Sort extends EventDispatcher implements ISort
     /**
      *  @private
      */
-    private var usingCustomCompareFunction:Boolean;
+    protected var usingCustomCompareFunction:Boolean;
 
     [Inspectable(category="General")]
 
@@ -699,7 +699,7 @@ public class Sort extends EventDispatcher implements ISort
      *  @private
      *  Make sure all SortFields are ready to execute their comparators.
      */
-    private function initSortFields(item:Object, buildArraySortArgs:Boolean = false):Object
+    protected function initSortFields(item:Object, buildArraySortArgs:Boolean = false):Object
     {
         var arraySortArgs:Object = null;
         var i:int;
@@ -736,7 +736,7 @@ public class Sort extends EventDispatcher implements ISort
      *  number of fields to check.  We don't look at the actual values
      *  to see if they match the actual sort.
      */
-    private function internalCompare(a:Object, b:Object, fields:Array = null):int
+    protected function internalCompare(a:Object, b:Object, fields:Array = null):int
     {
         var result:int = 0;
         if (!_fields)
@@ -777,7 +777,7 @@ public class Sort extends EventDispatcher implements ISort
     {
         if (!defaultEmptyField)
         {
-            defaultEmptyField = new SortField();
+            defaultEmptyField = createEmptySortField();
             try
             {
                 defaultEmptyField.initializeDefaultCompareFunction(a);
@@ -800,5 +800,10 @@ public class Sort extends EventDispatcher implements ISort
 
         return result;
     }
+
+    protected function createEmptySortField():ISortField
+    {
+        return new SortField();
+    }
 }
 }

http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/3aacd762/frameworks/projects/spark/src/spark/collections/Sort.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/spark/src/spark/collections/Sort.as b/frameworks/projects/spark/src/spark/collections/Sort.as
index 807f121..e0f1447 100644
--- a/frameworks/projects/spark/src/spark/collections/Sort.as
+++ b/frameworks/projects/spark/src/spark/collections/Sort.as
@@ -21,15 +21,10 @@ package spark.collections
 {
 
     import flash.events.Event;
-
-    import mx.collections.ISort;
+    import mx.styles.IAdvancedStyleClient;
     import mx.collections.ISortField;
     import mx.collections.errors.SortError;
     import mx.core.FlexGlobals;
-    import mx.resources.IResourceManager;
-    import mx.resources.ResourceManager;
-    import mx.styles.AdvancedStyleClient;
-    import mx.utils.ObjectUtil;
 
     [DefaultProperty("fields")]
 [ResourceBundle("collections")]
@@ -193,9 +188,10 @@ package spark.collections
  *  @playerversion AIR 2.5
  *  @productversion Flex 4.5
  */
-public class Sort extends AdvancedStyleClient implements ISort
+public class Sort extends mx.collections.Sort implements IAdvancedStyleClient
 {
     include "../core/Version.as";
+    include "AdvancedStyleClientImplementation.as";
 
     //--------------------------------------------------------------------------
     //
@@ -257,11 +253,7 @@ public class Sort extends AdvancedStyleClient implements ISort
      */
     public function Sort(fields:Array = null, customCompareFunction:Function = null, unique:Boolean = false)
     {
-        super();
-
-        this.fields = fields;
-        this.compareFunction = customCompareFunction;
-        this.unique = unique;
+        super(fields, customCompareFunction, unique);
     }
 
     //--------------------------------------------------------------------------
@@ -272,13 +264,6 @@ public class Sort extends AdvancedStyleClient implements ISort
 
     /**
      *  @private
-     *  Used for accessing localized Error messages.
-     */
-    private var resourceManager:IResourceManager =
-                                    ResourceManager.getInstance();
-
-    /**
-     *  @private
      *  Cache for "locale" style.
      *
      *  The code needs be able to find out if the locale style has been changed
@@ -292,120 +277,7 @@ public class Sort extends AdvancedStyleClient implements ISort
     //
     //--------------------------------------------------------------------------
 
-    //----------------------------------
-    //  compareFunction
-    //----------------------------------
-
-    /**
-     *  @private
-     *  Storage for the compareFunction property.
-     */
-    private var _compareFunction:Function;
-
-    /**
-     *  @private
-     */
-    private var usingCustomCompareFunction:Boolean;
-
-    [Inspectable(category="General")]
-
-    /**
- *  @inheritDoc
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 1.5
-     *  @productversion Flex 4.5
-     */
-    public function get compareFunction():Function
-    {
-        return usingCustomCompareFunction ? _compareFunction : internalCompare;
-    }
-
-    /**
-     *  @private
-     */
-    public function set compareFunction(value:Function):void
-    {
-        _compareFunction = value;
-        usingCustomCompareFunction = _compareFunction != null;
-    }
-
-    //----------------------------------
-    //  fields
-    //----------------------------------
-
-    /**
-     *  @private
-     *  Storage for the fields property.
-     */
-    private var _fields:Array;
-
-
-    [Inspectable(category="General", arrayType="mx.collections.ISortField")]
-    [Bindable("fieldsChanged")]
-
-    /**
-     *  @inheritDoc
-     *
-     *  @default null
-     *
-     *  @see SortField
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public function get fields():Array
-    {
-        return _fields;
-    }
-
-    /**
-     *  @private
-     */
-    public function set fields(value:Array):void
-    {
-        _fields = value;
-
-        dispatchEvent(new Event("fieldsChanged"));
-    }
-
-    //----------------------------------
-    //  unique
-    //----------------------------------
-
-    /**
-     *  @private
-     *  Storage for the unique property.
-     */
-    private var _unique:Boolean;
 
-    [Inspectable(category="General")]
-
-    /**
-     *  @inheritDoc
-     *
-     *  @default false
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 1.5
-     *  @productversion Flex 4.5
-     */
-    public function get unique():Boolean
-    {
-        return _unique;
-    }
-
-    /**
-     *  @inheritDoc
-     */
-    public function set unique(value:Boolean):void
-    {
-        _unique = value;
-    }
 
     //--------------------------------------------------------------------------
     //
@@ -416,10 +288,10 @@ public class Sort extends AdvancedStyleClient implements ISort
     /**
     *  @private
     */
-    override public function getStyle(styleProp:String):*
+    private function _getStyle(styleProp:String):*
     {
         if (styleProp != "locale")
-            return super.getStyle(styleProp);
+            return _advancedStyleClient.getStyle(styleProp);
 
         if ((localeStyle !== undefined) && (localeStyle !== null))
             return localeStyle;
@@ -444,9 +316,9 @@ public class Sort extends AdvancedStyleClient implements ISort
      *  the class to be updated immediately when the locale style is
      *  set directly on this class instance.
      */
-    override public function setStyle(styleProp:String, newValue:*):void
+    private function _setStyle(styleProp:String, newValue:*):void
     {
-        super.setStyle(styleProp, newValue);
+        _advancedStyleClient.setStyle(styleProp, newValue);
 
         if (styleProp != "locale")
             return;
@@ -474,21 +346,12 @@ public class Sort extends AdvancedStyleClient implements ISort
      *  @playerversion AIR 2.5
      *  @productversion Flex 4.5
      */
-    override public function styleChanged(styleProp:String):void
+    private function _styleChanged(styleProp:String):void
     {
         localeChanged();
-        super.styleChanged(styleProp);
+        _advancedStyleClient.styleChanged(styleProp);
     }
 
-    /**
-     *  @private
-     *  A pretty printer for Sort that lists the sort fields and their
-     *  options.
-     */
-    override public function toString():String
-    {
-        return ObjectUtil.toString(this);
-    }
 
     //--------------------------------------------------------------------------
     //
@@ -503,244 +366,8 @@ public class Sort extends AdvancedStyleClient implements ISort
      *  @playerversion Flash 10.1
      *  @playerversion AIR 2.5
      *  @productversion Flex 4.5
-    */
-    public function findItem(items:Array,
-                             values:Object,
-                             mode:String,
-                             returnInsertionIndex:Boolean = false,
-                             compareFunction:Function = null):int
-    {
-        var compareForFind:Function;
-        var fieldsForCompare:Array;
-        var message:String;
-
-        if (!items)
-        {
-            message = resourceManager.getString(
-                "collections", "noItems");
-            throw new SortError(message);
-        }
-        else if (items.length == 0)
-        {
-            return returnInsertionIndex ? 1 : -1;
-        }
-
-        if (compareFunction == null)
-        {
-            compareForFind = this.compareFunction;
-            // configure the search criteria
-            if (values && fields && fields.length > 0)
-            {
-                fieldsForCompare = [];
-                //build up the fields we can compare, if we skip a field in the
-                //middle throw an error.  it is ok to not have all the fields
-                //though
-                var field:ISortField;
-                var hadPreviousFieldName:Boolean = true;
-                for (var i:int = 0; i < fields.length; i++)
-                {
-                    field = fields[i] as ISortField;
-                    if (field.name)
-                    {
-                        if (field.objectHasSortField(values))
-                        {
-                            if (!hadPreviousFieldName)
-                            {
-                                message = resourceManager.getString(
-                                    "collections", "findCondition", [ field.name ]);
-                                throw new SortError(message);
-                            }
-                            else
-                            {
-                                fieldsForCompare.push(field.name);
-                            }
-                        }
-                        else
-                        {
-                            hadPreviousFieldName = false;
-                        }
-                    }
-                    else
-                    {
-                        //this is ok because sometimes a sortfield might
-                        //have a custom comparator
-                        fieldsForCompare.push(null);
-                    }
-                }
-                if (fieldsForCompare.length == 0)
-                {
-                    message = resourceManager.getString(
-                        "collections", "findRestriction");
-                    throw new SortError(message);
-                }
-                else
-                {
-                    try
-                    {
-                        initSortFields(items[0]);
-                    }
-                    catch(initSortError:SortError)
-                    {
-                        //oh well, use the default comparators...
-                    }
-                }
-            }
-        }
-        else
-        {
-            compareForFind = compareFunction;
-        }
-
-        // let's begin searching
-        var found:Boolean = false;
-        var objFound:Boolean = false;
-        var index:int = 0;
-        var lowerBound:int = 0;
-        var upperBound:int = items.length -1;
-        var obj:Object = null;
-        var direction:int = 1;
-        while(!objFound && (lowerBound <= upperBound))
-        {
-            index = Math.round((lowerBound+ upperBound)/2);
-            obj = items[index];
-            //if we were given fields for comparison use that method, but
-            //if not the comparator may be for SortField in which case
-            //it'd be an error to pass a 3rd parameter
-            direction = fieldsForCompare
-                ? compareForFind(values, obj, fieldsForCompare)
-                : compareForFind(values, obj);
-
-            switch(direction)
-            {
-                case -1:
-                    upperBound = index -1;
-                break;
-
-                case 0:
-                    objFound = true;
-                    switch(mode)
-                    {
-                        case ANY_INDEX_MODE:
-                            found = true;
-                        break;
-
-                        case FIRST_INDEX_MODE:
-                            found = (index == lowerBound);
-                            // start looking towards bof
-                            var objIndex:int = index - 1;
-                            var match:Boolean = true;
-                            while(match && !found && (objIndex >= lowerBound))
-                            {
-                                obj = items[objIndex];
-                                var prevCompare:int = fieldsForCompare
-                                    ? compareForFind(values, obj, fieldsForCompare)
-                                    : compareForFind(values, obj);
-                                match = (prevCompare == 0);
-                                if (!match || (match && (objIndex == lowerBound)))
-                                {
-                                    found= true;
-                                    index = objIndex + (match ? 0 : 1);
-                                } // if match
-                                objIndex--;
-                            } // while
-                        break;
-
-                        case LAST_INDEX_MODE:
-                            // if we where already at the edge case then we already found the last value
-                            found = (index == upperBound);
-                            // start looking towards eof
-                            objIndex = index + 1;
-                            match = true;
-                            while(match && !found && (objIndex <= upperBound))
-                            {
-                                obj = items[objIndex];
-                                var nextCompare:int = fieldsForCompare
-                                    ? compareForFind(values, obj, fieldsForCompare)
-                                    : compareForFind(values, obj);
-                                match = (nextCompare == 0);
-                                if (!match || (match && (objIndex == upperBound)))
-                                {
-                                    found= true;
-                                    index = objIndex - (match ? 0 : 1);
-                                } // if match
-                                objIndex++;
-                            } // while
-                        break;
-                        default:
-                        {
-                            message = resourceManager.getString(
-                                "collections", "unknownMode");
-                            throw new SortError(message);
-                        }
-                    } // switch
-                break;
-
-                case 1:
-                    lowerBound = index +1;
-                break;
-            } // switch
-        } // while
-        if (!found && !returnInsertionIndex)
-        {
-            return -1;
-        }
-        else
-        {
-            return (direction > 0) ? index + 1 : index;
-        }
-    }
-
-    /**
-     *  @inheritDoc
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
      */
-    public function propertyAffectsSort(property:String):Boolean
-    {
-        if (usingCustomCompareFunction || !fields) return true;
-        for (var i:int = 0; i < fields.length; i++)
-        {
-            var field:ISortField = fields[i];
-            if (field.name == property || field.usingCustomCompareFunction)
-            {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     *  @inheritDoc
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public function reverse():void
-    {
-        if (fields)
-        {
-            for (var i:int = 0; i < fields.length; i++)
-            {
-                ISortField(fields[i]).reverse();
-            }
-        }
-        noFieldsDescending = !noFieldsDescending;
-    }
-
-    /**
-     *  @inheritDoc
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    public function sort(items:Array):void
+    override public function sort(items:Array):void
     {
         if (!items || items.length <= 1)
         {
@@ -757,7 +384,7 @@ public class Sort extends AdvancedStyleClient implements ISort
                 function (a:Object, b:Object):int
                 {
                     // append our fields to the call, since items.sort() won't
-                    return compareFunction(a, b, _fields);
+                    return compareFunction(a, b, fields);
                 };
 
             var message:String;
@@ -848,116 +475,18 @@ public class Sort extends AdvancedStyleClient implements ISort
         }
     }
 
-    /**
-     *  @private
-     *  Make sure all SortFields are ready to execute their comparators.
-     */
-    private function initSortFields(item:Object, buildArraySortArgs:Boolean = false):Object
-    {
-        var arraySortArgs:Object = null;
-        var i:int;
-        for (i = 0; i<fields.length; i++)
-        {
-            ISortField(fields[i]).initializeDefaultCompareFunction(item);
-        }
-        if (buildArraySortArgs)
-        {
-            arraySortArgs = {fields: [], options: []};
-            for (i = 0; i<fields.length; i++)
-            {
-                var field:ISortField = fields[i];
-                var options:int = field.arraySortOnOptions;
-                if (options == -1)
-                {
-                    return null;
-                }
-                else
-                {
-                    arraySortArgs.fields.push(field.name);
-                    arraySortArgs.options.push(options);
-                }
-            }
 
-        }
-        return arraySortArgs;
-    }
-
-    /**
-     *  @private
-     *  Compares the values specified based on the sort field options specified
-     *  for this sort.  The fields parameter is really just used to get the
-     *  number of fields to check.  We don't look at the actual values
-     *  to see if they match the actual sort.
-     */
-    private function internalCompare(a:Object, b:Object, fields:Array = null):int
-    {
-        var result:int = 0;
-        if (!_fields)
-        {
-            result = noFieldsCompare(a, b);
-        }
-        else
-        {
-            var i:int = 0;
-            var len:int = fields ? fields.length : _fields.length;
-            while (result == 0 && (i < len))
-            {
-                var sf:ISortField = ISortField(_fields[i]);
-                result = sf.compareFunction(a, b);
-                if (sf.descending)
-                    result *= -1;
-                i++;
-            }
-        }
-
-        return result;
-    }
 
     private var defaultEmptyField:SortField;
-    private var noFieldsDescending:Boolean = false;
 
-    /**
-     *  If the sort does not have any sort fields nor a custom comparator
-     *  just use an empty SortField object and have it use its default
-     *  logic.
-     *
-     *  @langversion 3.0
-     *  @playerversion Flash 10.1
-     *  @playerversion AIR 2.5
-     *  @productversion Flex 4.5
-     */
-    private function noFieldsCompare(a:Object, b:Object, fields:Array = null):int
+    override protected function createEmptySortField():ISortField
     {
-        if (!defaultEmptyField)
-        {
-            ensureStyleSource();
-
-            defaultEmptyField = new SortField();
-            const locale:* = getStyle("locale");
-            if (locale !== undefined)
-                defaultEmptyField.setStyle("locale", locale);
-
-            try
-            {
-                defaultEmptyField.initializeDefaultCompareFunction(a);
-            }
-            catch(e:SortError)
-            {
-                //this error message isn't as useful in this case so replace
-                var message:String = resourceManager.getString(
-                    "collections", "noComparator", [ a ]);
-                throw new SortError(message);
-            }
-        }
-
-        var result:int = defaultEmptyField.compareFunction(a, b);
-
-        if (noFieldsDescending)
-        {
-            result *= -1;
-        }
-
-        return result;
+        ensureStyleSource();
+        var sortField:SortField = new SortField();
+        const locale:* = getStyle("locale");
+        if (locale !== undefined)
+            sortField.setStyle("locale", locale);
+        return sortField;
     }
 
     /**
@@ -973,7 +502,7 @@ public class Sort extends AdvancedStyleClient implements ISort
      */
     private function localeChanged():void
     {
-        const newLocaleStyle:* = super.getStyle("locale");
+        const newLocaleStyle:* = _advancedStyleClient.getStyle("locale");
 
         if (localeStyle === newLocaleStyle)
             return;