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