2016-06-17 6 views
0

これは明らかに、指定されたディレクトリからファイルを一覧表示するFileSystemListを持っています。すべて私はファイルの作成日に基づいてリストを並べ替えることを除いて素晴らしい作品。FileSystemList日付で並べ替え

FileSystemListの場合は可能ですか?

答えて

1

デフォルトでは、ファイル名はnameCompareFunctionプロパティでのみソートできます。残念ながら、FileSystem *コントロールのAPIは、拡張性やカスタマイズのために設計されていません。だから、物事が "少し" より複雑になり、あなたがFileSystemListから派生する必要があります。

com.stackoverflow.MyFileSystemList

package com.stackoverflow 
{ 
    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.stackoverflow.MyFileSystemControlHelper

package com.stackoverflow 
{ 
    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.stackoverflow .DirectoryEnumeration

package com.stackoverflow 
{ 
    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:stackoverflow="com.stackoverflow.*"> 

    <stackoverflow: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> 
+0

Thanx!非常に有望に見えます!私はそれを見て、後で "レポート" ;-)とあなたに戻ってきます – Nicke

+0

私はあなたのソリューションのスプラッシュを実装し、それは素晴らしい動作します! Thanx、これは命の恩人だった! :-) – Nicke

関連する問題