FileSorter.st
author Claus Gittinger <cg@exept.de>
Tue, 26 Feb 2008 11:29:14 +0100
changeset 1930 935b2870be2e
parent 1928 32553a766637
child 2135 51ef149d010d
permissions -rw-r--r--
arrow points reusable (class protocol)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1522
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
     1
"
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
     2
 COPYRIGHT (c) 2004 by eXept Software AG
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
     3
              All Rights Reserved
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
     4
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
     5
 This software is furnished under a license and may be used
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
     6
 only in accordance with the terms of that license and with the
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
     8
 be provided or otherwise made available to, or used by, any
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
     9
 other person.  No title to or ownership of the software is
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    10
 hereby transferred.
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    11
"
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
    12
"{ Package: 'stx:libbasic2' }"
85aebc08d304 initial checkin
penk
parents:
diff changeset
    13
85aebc08d304 initial checkin
penk
parents:
diff changeset
    14
Object subclass:#FileSorter
85aebc08d304 initial checkin
penk
parents:
diff changeset
    15
	instanceVariableNames:'directoriesBeforeFiles selector sortCaseless sortReverse'
85aebc08d304 initial checkin
penk
parents:
diff changeset
    16
	classVariableNames:''
85aebc08d304 initial checkin
penk
parents:
diff changeset
    17
	poolDictionaries:''
85aebc08d304 initial checkin
penk
parents:
diff changeset
    18
	category:'Interface-Tools-File'
85aebc08d304 initial checkin
penk
parents:
diff changeset
    19
!
85aebc08d304 initial checkin
penk
parents:
diff changeset
    20
1368
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    21
!FileSorter class methodsFor:'documentation'!
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    22
1522
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    23
copyright
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    24
"
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    25
 COPYRIGHT (c) 2004 by eXept Software AG
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    26
              All Rights Reserved
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    27
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    28
 This software is furnished under a license and may be used
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    29
 only in accordance with the terms of that license and with the
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    30
 inclusion of the above copyright notice.   This software may not
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    31
 be provided or otherwise made available to, or used by, any
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    32
 other person.  No title to or ownership of the software is
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    33
 hereby transferred.
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    34
"
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    35
!
7a569eca4d68 copyright
Claus Gittinger <cg@exept.de>
parents: 1369
diff changeset
    36
1368
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    37
documentation
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    38
"
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    39
    sort files by selector
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    40
    care for directoriesBeforeFiles sortCaseless sortReverse
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    41
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    42
    [author:]
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    43
        Christian Penk
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    44
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    45
    [instance variables:]
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    46
    directoriesBeforeFiles: if true all directories and files will be sorted 
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    47
                            independently by the selector and the directories 
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    48
                            are before files 
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    49
    sortCaseless:           if true and the selector is #baseName ignore upper
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    50
                            and lowercase in sort
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    51
    sortReverse:            if true starts with highest value of the sort
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    52
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    53
    [class variables:]
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    54
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    55
    [see also:]
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    56
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    57
"
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    58
! !
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
    59
85aebc08d304 initial checkin
penk
parents:
diff changeset
    60
!FileSorter class methodsFor:'instance creation'!
85aebc08d304 initial checkin
penk
parents:
diff changeset
    61
85aebc08d304 initial checkin
penk
parents:
diff changeset
    62
directoriesBeforeFiles:arg1 selector:arg2 sortCaseless:arg3 sortReverse:arg4
85aebc08d304 initial checkin
penk
parents:
diff changeset
    63
    ^ self new directoriesBeforeFiles:arg1 selector:arg2 sortCaseless:arg3 sortReverse:arg4
85aebc08d304 initial checkin
penk
parents:
diff changeset
    64
! !
85aebc08d304 initial checkin
penk
parents:
diff changeset
    65
85aebc08d304 initial checkin
penk
parents:
diff changeset
    66
!FileSorter methodsFor:'accessing'!
85aebc08d304 initial checkin
penk
parents:
diff changeset
    67
85aebc08d304 initial checkin
penk
parents:
diff changeset
    68
directoriesBeforeFiles
1368
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    69
    ^ directoriesBeforeFiles ? false
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
    70
!
85aebc08d304 initial checkin
penk
parents:
diff changeset
    71
85aebc08d304 initial checkin
penk
parents:
diff changeset
    72
directoriesBeforeFiles:something
85aebc08d304 initial checkin
penk
parents:
diff changeset
    73
    directoriesBeforeFiles := something.
85aebc08d304 initial checkin
penk
parents:
diff changeset
    74
!
85aebc08d304 initial checkin
penk
parents:
diff changeset
    75
85aebc08d304 initial checkin
penk
parents:
diff changeset
    76
directoriesBeforeFiles:directoriesBeforeFilesArg selector:selectorArg sortCaseless:sortCaselessArg sortReverse:sortReverseArg 
85aebc08d304 initial checkin
penk
parents:
diff changeset
    77
    "set instance variables (automatically generated)"
85aebc08d304 initial checkin
penk
parents:
diff changeset
    78
85aebc08d304 initial checkin
penk
parents:
diff changeset
    79
    directoriesBeforeFiles := directoriesBeforeFilesArg.
85aebc08d304 initial checkin
penk
parents:
diff changeset
    80
    selector := selectorArg.
85aebc08d304 initial checkin
penk
parents:
diff changeset
    81
    sortCaseless := sortCaselessArg.
85aebc08d304 initial checkin
penk
parents:
diff changeset
    82
    sortReverse := sortReverseArg.
85aebc08d304 initial checkin
penk
parents:
diff changeset
    83
!
85aebc08d304 initial checkin
penk
parents:
diff changeset
    84
85aebc08d304 initial checkin
penk
parents:
diff changeset
    85
selector
85aebc08d304 initial checkin
penk
parents:
diff changeset
    86
    ^ selector
85aebc08d304 initial checkin
penk
parents:
diff changeset
    87
!
85aebc08d304 initial checkin
penk
parents:
diff changeset
    88
85aebc08d304 initial checkin
penk
parents:
diff changeset
    89
selector:something
85aebc08d304 initial checkin
penk
parents:
diff changeset
    90
    selector := something.
85aebc08d304 initial checkin
penk
parents:
diff changeset
    91
!
85aebc08d304 initial checkin
penk
parents:
diff changeset
    92
85aebc08d304 initial checkin
penk
parents:
diff changeset
    93
sortCaseless
1368
cada7bfb7769 add a bit documentation
penk
parents: 1367
diff changeset
    94
    ^ sortCaseless ? false
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
    95
!
85aebc08d304 initial checkin
penk
parents:
diff changeset
    96
85aebc08d304 initial checkin
penk
parents:
diff changeset
    97
sortCaseless:something
85aebc08d304 initial checkin
penk
parents:
diff changeset
    98
    sortCaseless := something.
85aebc08d304 initial checkin
penk
parents:
diff changeset
    99
!
85aebc08d304 initial checkin
penk
parents:
diff changeset
   100
85aebc08d304 initial checkin
penk
parents:
diff changeset
   101
sortReverse
85aebc08d304 initial checkin
penk
parents:
diff changeset
   102
    ^ sortReverse ? false
85aebc08d304 initial checkin
penk
parents:
diff changeset
   103
!
85aebc08d304 initial checkin
penk
parents:
diff changeset
   104
85aebc08d304 initial checkin
penk
parents:
diff changeset
   105
sortReverse:something
85aebc08d304 initial checkin
penk
parents:
diff changeset
   106
    sortReverse := something.
85aebc08d304 initial checkin
penk
parents:
diff changeset
   107
! !
85aebc08d304 initial checkin
penk
parents:
diff changeset
   108
85aebc08d304 initial checkin
penk
parents:
diff changeset
   109
!FileSorter methodsFor:'action'!
85aebc08d304 initial checkin
penk
parents:
diff changeset
   110
85aebc08d304 initial checkin
penk
parents:
diff changeset
   111
sortItemList:aList
85aebc08d304 initial checkin
penk
parents:
diff changeset
   112
1369
65ba75319c22 sortReverse use accessor for default
penk
parents: 1368
diff changeset
   113
    |selectorSymbol instanceSortBlock cmpOp sortBlock locSortReverse|
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
   114
85aebc08d304 initial checkin
penk
parents:
diff changeset
   115
    selectorSymbol := selector asSymbol.
85aebc08d304 initial checkin
penk
parents:
diff changeset
   116
    sortReverse ifTrue:[
85aebc08d304 initial checkin
penk
parents:
diff changeset
   117
        cmpOp := #'>'
85aebc08d304 initial checkin
penk
parents:
diff changeset
   118
    ] ifFalse:[
85aebc08d304 initial checkin
penk
parents:
diff changeset
   119
        cmpOp := #'<'
85aebc08d304 initial checkin
penk
parents:
diff changeset
   120
    ].
1369
65ba75319c22 sortReverse use accessor for default
penk
parents: 1368
diff changeset
   121
    locSortReverse := self sortReverse.
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
   122
    instanceSortBlock := [:a :b | 
85aebc08d304 initial checkin
penk
parents:
diff changeset
   123
        |entry1 entry2|
85aebc08d304 initial checkin
penk
parents:
diff changeset
   124
85aebc08d304 initial checkin
penk
parents:
diff changeset
   125
        entry1 := (a perform:selectorSymbol).
85aebc08d304 initial checkin
penk
parents:
diff changeset
   126
        entry2 := (b perform:selectorSymbol).
85aebc08d304 initial checkin
penk
parents:
diff changeset
   127
        ((entry1 isNil) or:[entry2 isNil]) ifTrue:[
85aebc08d304 initial checkin
penk
parents:
diff changeset
   128
            ((entry1 isNil) and:[entry2 isNil]) ifTrue:[
85aebc08d304 initial checkin
penk
parents:
diff changeset
   129
                true
85aebc08d304 initial checkin
penk
parents:
diff changeset
   130
            ] ifFalse:[
85aebc08d304 initial checkin
penk
parents:
diff changeset
   131
                ((entry1 notNil) and:[entry2 isNil]) ifTrue:[
1369
65ba75319c22 sortReverse use accessor for default
penk
parents: 1368
diff changeset
   132
                    locSortReverse
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
   133
                ] ifFalse:[
1369
65ba75319c22 sortReverse use accessor for default
penk
parents: 1368
diff changeset
   134
                    locSortReverse not
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
   135
                ]
85aebc08d304 initial checkin
penk
parents:
diff changeset
   136
            ]
85aebc08d304 initial checkin
penk
parents:
diff changeset
   137
        ] ifFalse:[
1928
32553a766637 care for non-strings when sorting
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
   138
            entry1 := entry1 asString.
32553a766637 care for non-strings when sorting
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
   139
            entry2 := entry2 asString.
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
   140
            ((selector = #baseName) and:[sortCaseless]) ifTrue:[
85aebc08d304 initial checkin
penk
parents:
diff changeset
   141
                entry1 := entry1 asLowercase.
85aebc08d304 initial checkin
penk
parents:
diff changeset
   142
                entry2 := entry2 asLowercase.
85aebc08d304 initial checkin
penk
parents:
diff changeset
   143
            ].
85aebc08d304 initial checkin
penk
parents:
diff changeset
   144
            entry1 perform:cmpOp with:entry2
85aebc08d304 initial checkin
penk
parents:
diff changeset
   145
        ]
85aebc08d304 initial checkin
penk
parents:
diff changeset
   146
    ].
85aebc08d304 initial checkin
penk
parents:
diff changeset
   147
    directoriesBeforeFiles ifTrue:[
85aebc08d304 initial checkin
penk
parents:
diff changeset
   148
        sortBlock := [:a :b|
85aebc08d304 initial checkin
penk
parents:
diff changeset
   149
            |aIsDir bIsDir res|
85aebc08d304 initial checkin
penk
parents:
diff changeset
   150
85aebc08d304 initial checkin
penk
parents:
diff changeset
   151
            aIsDir := a isDirectory.
85aebc08d304 initial checkin
penk
parents:
diff changeset
   152
            bIsDir := b isDirectory.
85aebc08d304 initial checkin
penk
parents:
diff changeset
   153
            (aIsDir ~~ bIsDir) ifTrue:[
85aebc08d304 initial checkin
penk
parents:
diff changeset
   154
                res := aIsDir 
85aebc08d304 initial checkin
penk
parents:
diff changeset
   155
            ] ifFalse:[
85aebc08d304 initial checkin
penk
parents:
diff changeset
   156
                res := instanceSortBlock value:a value:b.
85aebc08d304 initial checkin
penk
parents:
diff changeset
   157
            ].
85aebc08d304 initial checkin
penk
parents:
diff changeset
   158
            res
85aebc08d304 initial checkin
penk
parents:
diff changeset
   159
          ].
85aebc08d304 initial checkin
penk
parents:
diff changeset
   160
    ] ifFalse:[
85aebc08d304 initial checkin
penk
parents:
diff changeset
   161
        sortBlock := instanceSortBlock.
85aebc08d304 initial checkin
penk
parents:
diff changeset
   162
    ].
85aebc08d304 initial checkin
penk
parents:
diff changeset
   163
85aebc08d304 initial checkin
penk
parents:
diff changeset
   164
    aList sort:sortBlock.
85aebc08d304 initial checkin
penk
parents:
diff changeset
   165
    ^ aList
85aebc08d304 initial checkin
penk
parents:
diff changeset
   166
! !
85aebc08d304 initial checkin
penk
parents:
diff changeset
   167
85aebc08d304 initial checkin
penk
parents:
diff changeset
   168
!FileSorter class methodsFor:'documentation'!
85aebc08d304 initial checkin
penk
parents:
diff changeset
   169
85aebc08d304 initial checkin
penk
parents:
diff changeset
   170
version
1928
32553a766637 care for non-strings when sorting
Claus Gittinger <cg@exept.de>
parents: 1522
diff changeset
   171
    ^ '$Header: /cvs/stx/stx/libbasic2/FileSorter.st,v 1.5 2008-02-06 17:59:58 cg Exp $'
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
   172
! !