FileSorter.st
changeset 1367 85aebc08d304
child 1368 cada7bfb7769
equal deleted inserted replaced
1366:e01d0f6c102a 1367:85aebc08d304
       
     1 "{ Package: 'stx:libbasic2' }"
       
     2 
       
     3 Object subclass:#FileSorter
       
     4 	instanceVariableNames:'directoriesBeforeFiles selector sortCaseless sortReverse'
       
     5 	classVariableNames:''
       
     6 	poolDictionaries:''
       
     7 	category:'Interface-Tools-File'
       
     8 !
       
     9 
       
    10 
       
    11 !FileSorter class methodsFor:'instance creation'!
       
    12 
       
    13 directoriesBeforeFiles:arg1 selector:arg2 sortCaseless:arg3 sortReverse:arg4
       
    14     ^ self new directoriesBeforeFiles:arg1 selector:arg2 sortCaseless:arg3 sortReverse:arg4
       
    15 ! !
       
    16 
       
    17 !FileSorter methodsFor:'accessing'!
       
    18 
       
    19 directoriesBeforeFiles
       
    20     ^ directoriesBeforeFiles
       
    21 !
       
    22 
       
    23 directoriesBeforeFiles:something
       
    24     directoriesBeforeFiles := something.
       
    25 !
       
    26 
       
    27 directoriesBeforeFiles:directoriesBeforeFilesArg selector:selectorArg sortCaseless:sortCaselessArg sortReverse:sortReverseArg 
       
    28     "set instance variables (automatically generated)"
       
    29 
       
    30     directoriesBeforeFiles := directoriesBeforeFilesArg.
       
    31     selector := selectorArg.
       
    32     sortCaseless := sortCaselessArg.
       
    33     sortReverse := sortReverseArg.
       
    34 !
       
    35 
       
    36 selector
       
    37     ^ selector
       
    38 !
       
    39 
       
    40 selector:something
       
    41     selector := something.
       
    42 !
       
    43 
       
    44 sortCaseless
       
    45     ^ sortCaseless
       
    46 !
       
    47 
       
    48 sortCaseless:something
       
    49     sortCaseless := something.
       
    50 !
       
    51 
       
    52 sortReverse
       
    53     ^ sortReverse ? false
       
    54 !
       
    55 
       
    56 sortReverse:something
       
    57     sortReverse := something.
       
    58 ! !
       
    59 
       
    60 !FileSorter methodsFor:'action'!
       
    61 
       
    62 sortItemList:aList
       
    63 
       
    64     |selectorSymbol instanceSortBlock cmpOp sortBlock|
       
    65 
       
    66     selectorSymbol := selector asSymbol.
       
    67     sortReverse ifTrue:[
       
    68         cmpOp := #'>'
       
    69     ] ifFalse:[
       
    70         cmpOp := #'<'
       
    71     ].
       
    72     instanceSortBlock := [:a :b | 
       
    73         |entry1 entry2|
       
    74 
       
    75         entry1 := (a perform:selectorSymbol).
       
    76         entry2 := (b perform:selectorSymbol).
       
    77         ((entry1 isNil) or:[entry2 isNil]) ifTrue:[
       
    78             ((entry1 isNil) and:[entry2 isNil]) ifTrue:[
       
    79                 true
       
    80             ] ifFalse:[
       
    81                 ((entry1 notNil) and:[entry2 isNil]) ifTrue:[
       
    82                     sortReverse
       
    83                 ] ifFalse:[
       
    84                     sortReverse not
       
    85                 ]
       
    86             ]
       
    87         ] ifFalse:[
       
    88             ((selector = #baseName) and:[sortCaseless]) ifTrue:[
       
    89                 entry1 := entry1 asLowercase.
       
    90                 entry2 := entry2 asLowercase.
       
    91             ].
       
    92             entry1 perform:cmpOp with:entry2
       
    93         ]
       
    94     ].
       
    95     directoriesBeforeFiles ifTrue:[
       
    96         sortBlock := [:a :b|
       
    97             |aIsDir bIsDir res|
       
    98 
       
    99             aIsDir := a isDirectory.
       
   100             bIsDir := b isDirectory.
       
   101             (aIsDir ~~ bIsDir) ifTrue:[
       
   102                 res := aIsDir 
       
   103             ] ifFalse:[
       
   104                 res := instanceSortBlock value:a value:b.
       
   105             ].
       
   106             res
       
   107           ].
       
   108     ] ifFalse:[
       
   109         sortBlock := instanceSortBlock.
       
   110     ].
       
   111 
       
   112     aList sort:sortBlock.
       
   113     ^ aList
       
   114 ! !
       
   115 
       
   116 !FileSorter class methodsFor:'documentation'!
       
   117 
       
   118 version
       
   119     ^ '$Header: /cvs/stx/stx/libbasic2/FileSorter.st,v 1.1 2003-12-01 11:06:50 penk Exp $'
       
   120 ! !