FileSystemList 按日期排序

FileSystemList sorting by date

我有这个 FileSystemList,显然,它列出了指定目录中的文件。除了我想根据文件的创建日期对列表进行排序外,一切都很好。

FileSystemList 这可能吗?

开箱即用,您只能通过 nameCompareFunction 属性 按文件名排序。不幸的是,FileSystem* 控件的 API 未针对可扩展性或自定义进行良好设计。所以事情变得 "little bit" 更复杂,你必须从 FileSystemList:

派生

com.Whosebug.MyFileSystemList

package com.Whosebug
{
    import mx.controls.FileSystemList;
    import mx.core.mx_internal;

    use namespace mx_internal;

    public class MyFileSystemList extends FileSystemList
    {
        public function MyFileSystemList()
        {
            super();
            // overwrite the FileSystemControlHelper instance                
            helper = new MyFileSystemControlHelper(this, false);
            iconFunction = helper.fileIconFunction;
            labelFunction = helper.fileLabelFunction;
            directory = COMPUTER;
        }

        public function set fileCompareFunction(value:Function): void
        {
            MyFileSystemControlHelper(helper).fileCompareFunction = value;
        }

        public function get fileCompareFunction():Function
        {
            return MyFileSystemControlHelper(helper).fileCompareFunction;
        }
    }
}

com.Whosebug.MyFileSystemControlHelper

package com.Whosebug
{
    import mx.controls.fileSystemClasses.FileSystemControlHelper;
    import mx.core.mx_internal;

    use namespace mx_internal;

    public class MyFileSystemControlHelper extends FileSystemControlHelper
    {
        public function MyFileSystemControlHelper(owner:Object, hierarchical:Boolean)
        {
            super(owner, hierarchical);                
            directoryEnumeration = new MyDirectoryEnumeration();
        }

        private var _customFileCompareFunction:Function;            
        private var customFileCompareFunctionChanged:Boolean = false;

        public function set fileCompareFunction(value:Function): void
        {
            _customFileCompareFunction = value;
            customFileCompareFunctionChanged = true;
            owner.invalidateProperties();
        }

        public function get fileCompareFunction():Function
        {
            return _customFileCompareFunction;
        }

        override public function commitProperties():void
        {
            super.commitProperties();                
            if (customFileCompareFunctionChanged)
            {
                MyDirectoryEnumeration(directoryEnumeration).customFileCompareFunction = fileCompareFunction;
                directoryEnumeration.refresh();
                owner.dataProvider = directoryEnumeration.collection;
                itemsChanged();
                customFileCompareFunctionChanged = false;
            }
        }
    }
}

com.Whosebug.MyDirectoryEnumeration

package com.Whosebug
{
    import flash.filesystem.File;

    import mx.utils.DirectoryEnumeration;
    import mx.utils.DirectoryEnumerationMode;

    public class MyDirectoryEnumeration extends DirectoryEnumeration
    {
        public function MyDirectoryEnumeration(source:Array = null)
        {
            super(source);
        }

        private var _fileCompareFunction:Function;

        public function get customFileCompareFunction(): Function
        {
            return _fileCompareFunction;
        }

        public function set customFileCompareFunction(value: Function):void
        {
            _fileCompareFunction = value;
        }

        override public function fileCompareFunction(file1:File, file2:File, fields:Array=null):int
        {
            if (_fileCompareFunction == null)
                return super.fileCompareFunction(file1, file2, fields);

            if (file1.isDirectory && !file2.isDirectory)
            {
                if (enumerationMode == DirectoryEnumerationMode.DIRECTORIES_FIRST)
                    return -1;
                if (enumerationMode == DirectoryEnumerationMode.FILES_FIRST)
                    return 1;
            }

            if (!file1.isDirectory && file2.isDirectory)
            {
                if (enumerationMode == DirectoryEnumerationMode.DIRECTORIES_FIRST)
                    return 1;
                if (enumerationMode == DirectoryEnumerationMode.FILES_FIRST)
                    return -1;
            }

            return _fileCompareFunction(file1, file2);
        }
    }
}

之后您可以使用 MyFileSystemList 组件并提供您自己的比较功能以根据创建日期对文件进行排序:

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:Whosebug="com.Whosebug.*">

    <Whosebug:MyFileSystemList fileCompareFunction="compareFiles"/>

<fx:Script><![CDATA[
    private function compareFiles(file1:File, file2:File):int
    {
        if (file1.creationDate.time > file2.creationDate.time)
            return 1;
        else
            return -1;
    }

]]></fx:Script>
</s:WindowedApplication>