--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/FileSorter.st Mon Dec 01 12:06:50 2003 +0100
@@ -0,0 +1,120 @@
+"{ Package: 'stx:libbasic2' }"
+
+Object subclass:#FileSorter
+ instanceVariableNames:'directoriesBeforeFiles selector sortCaseless sortReverse'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Interface-Tools-File'
+!
+
+
+!FileSorter class methodsFor:'instance creation'!
+
+directoriesBeforeFiles:arg1 selector:arg2 sortCaseless:arg3 sortReverse:arg4
+ ^ self new directoriesBeforeFiles:arg1 selector:arg2 sortCaseless:arg3 sortReverse:arg4
+! !
+
+!FileSorter methodsFor:'accessing'!
+
+directoriesBeforeFiles
+ ^ directoriesBeforeFiles
+!
+
+directoriesBeforeFiles:something
+ directoriesBeforeFiles := something.
+!
+
+directoriesBeforeFiles:directoriesBeforeFilesArg selector:selectorArg sortCaseless:sortCaselessArg sortReverse:sortReverseArg
+ "set instance variables (automatically generated)"
+
+ directoriesBeforeFiles := directoriesBeforeFilesArg.
+ selector := selectorArg.
+ sortCaseless := sortCaselessArg.
+ sortReverse := sortReverseArg.
+!
+
+selector
+ ^ selector
+!
+
+selector:something
+ selector := something.
+!
+
+sortCaseless
+ ^ sortCaseless
+!
+
+sortCaseless:something
+ sortCaseless := something.
+!
+
+sortReverse
+ ^ sortReverse ? false
+!
+
+sortReverse:something
+ sortReverse := something.
+! !
+
+!FileSorter methodsFor:'action'!
+
+sortItemList:aList
+
+ |selectorSymbol instanceSortBlock cmpOp sortBlock|
+
+ selectorSymbol := selector asSymbol.
+ sortReverse ifTrue:[
+ cmpOp := #'>'
+ ] ifFalse:[
+ cmpOp := #'<'
+ ].
+ instanceSortBlock := [:a :b |
+ |entry1 entry2|
+
+ entry1 := (a perform:selectorSymbol).
+ entry2 := (b perform:selectorSymbol).
+ ((entry1 isNil) or:[entry2 isNil]) ifTrue:[
+ ((entry1 isNil) and:[entry2 isNil]) ifTrue:[
+ true
+ ] ifFalse:[
+ ((entry1 notNil) and:[entry2 isNil]) ifTrue:[
+ sortReverse
+ ] ifFalse:[
+ sortReverse not
+ ]
+ ]
+ ] ifFalse:[
+ ((selector = #baseName) and:[sortCaseless]) ifTrue:[
+ entry1 := entry1 asLowercase.
+ entry2 := entry2 asLowercase.
+ ].
+ entry1 perform:cmpOp with:entry2
+ ]
+ ].
+ directoriesBeforeFiles ifTrue:[
+ sortBlock := [:a :b|
+ |aIsDir bIsDir res|
+
+ aIsDir := a isDirectory.
+ bIsDir := b isDirectory.
+ (aIsDir ~~ bIsDir) ifTrue:[
+ res := aIsDir
+ ] ifFalse:[
+ res := instanceSortBlock value:a value:b.
+ ].
+ res
+ ].
+ ] ifFalse:[
+ sortBlock := instanceSortBlock.
+ ].
+
+ aList sort:sortBlock.
+ ^ aList
+! !
+
+!FileSorter class methodsFor:'documentation'!
+
+version
+ ^ '$Header: /cvs/stx/stx/libbasic2/FileSorter.st,v 1.1 2003-12-01 11:06:50 penk Exp $'
+! !