FileSorter.st
changeset 1367 85aebc08d304
child 1368 cada7bfb7769
--- /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 $'
+! !