author | Claus Gittinger <cg@exept.de> |
Sat, 02 May 2020 21:40:13 +0200 | |
changeset 5476 | 7355a4b11cb6 |
parent 2859 | 2a11716ab82a |
permissions | -rw-r--r-- |
1522 | 1 |
" |
2 |
COPYRIGHT (c) 2004 by eXept Software AG |
|
3 |
All Rights Reserved |
|
4 |
||
5 |
This software is furnished under a license and may be used |
|
6 |
only in accordance with the terms of that license and with the |
|
7 |
inclusion of the above copyright notice. This software may not |
|
8 |
be provided or otherwise made available to, or used by, any |
|
9 |
other person. No title to or ownership of the software is |
|
10 |
hereby transferred. |
|
11 |
" |
|
1367 | 12 |
"{ Package: 'stx:libbasic2' }" |
13 |
||
14 |
Object subclass:#FileSorter |
|
15 |
instanceVariableNames:'directoriesBeforeFiles selector sortCaseless sortReverse' |
|
16 |
classVariableNames:'' |
|
17 |
poolDictionaries:'' |
|
18 |
category:'Interface-Tools-File' |
|
19 |
! |
|
20 |
||
1368 | 21 |
!FileSorter class methodsFor:'documentation'! |
22 |
||
1522 | 23 |
copyright |
24 |
" |
|
25 |
COPYRIGHT (c) 2004 by eXept Software AG |
|
26 |
All Rights Reserved |
|
27 |
||
28 |
This software is furnished under a license and may be used |
|
29 |
only in accordance with the terms of that license and with the |
|
30 |
inclusion of the above copyright notice. This software may not |
|
31 |
be provided or otherwise made available to, or used by, any |
|
32 |
other person. No title to or ownership of the software is |
|
33 |
hereby transferred. |
|
34 |
" |
|
35 |
! |
|
36 |
||
1368 | 37 |
documentation |
38 |
" |
|
39 |
sort files by selector |
|
40 |
care for directoriesBeforeFiles sortCaseless sortReverse |
|
41 |
||
42 |
[author:] |
|
43 |
Christian Penk |
|
44 |
||
45 |
[instance variables:] |
|
46 |
directoriesBeforeFiles: if true all directories and files will be sorted |
|
47 |
independently by the selector and the directories |
|
48 |
are before files |
|
49 |
sortCaseless: if true and the selector is #baseName ignore upper |
|
50 |
and lowercase in sort |
|
51 |
sortReverse: if true starts with highest value of the sort |
|
52 |
||
53 |
[class variables:] |
|
54 |
||
55 |
[see also:] |
|
56 |
||
57 |
" |
|
58 |
! ! |
|
1367 | 59 |
|
60 |
!FileSorter class methodsFor:'instance creation'! |
|
61 |
||
62 |
directoriesBeforeFiles:arg1 selector:arg2 sortCaseless:arg3 sortReverse:arg4 |
|
63 |
^ self new directoriesBeforeFiles:arg1 selector:arg2 sortCaseless:arg3 sortReverse:arg4 |
|
64 |
! ! |
|
65 |
||
66 |
!FileSorter methodsFor:'accessing'! |
|
67 |
||
68 |
directoriesBeforeFiles |
|
1368 | 69 |
^ directoriesBeforeFiles ? false |
1367 | 70 |
! |
71 |
||
72 |
directoriesBeforeFiles:something |
|
73 |
directoriesBeforeFiles := something. |
|
74 |
! |
|
75 |
||
76 |
directoriesBeforeFiles:directoriesBeforeFilesArg selector:selectorArg sortCaseless:sortCaselessArg sortReverse:sortReverseArg |
|
77 |
"set instance variables (automatically generated)" |
|
78 |
||
79 |
directoriesBeforeFiles := directoriesBeforeFilesArg. |
|
80 |
selector := selectorArg. |
|
81 |
sortCaseless := sortCaselessArg. |
|
82 |
sortReverse := sortReverseArg. |
|
83 |
! |
|
84 |
||
85 |
selector |
|
86 |
^ selector |
|
87 |
! |
|
88 |
||
89 |
selector:something |
|
90 |
selector := something. |
|
91 |
! |
|
92 |
||
93 |
sortCaseless |
|
2497 | 94 |
sortCaseless isNil ifTrue:[^ Filename isCaseSensitive not ]. |
95 |
^ sortCaseless |
|
96 |
||
97 |
"Modified: / 14-10-2010 / 19:11:18 / cg" |
|
1367 | 98 |
! |
99 |
||
100 |
sortCaseless:something |
|
101 |
sortCaseless := something. |
|
102 |
! |
|
103 |
||
104 |
sortReverse |
|
105 |
^ sortReverse ? false |
|
106 |
! |
|
107 |
||
108 |
sortReverse:something |
|
109 |
sortReverse := something. |
|
110 |
! ! |
|
111 |
||
112 |
!FileSorter methodsFor:'action'! |
|
113 |
||
114 |
sortItemList:aList |
|
115 |
||
2174
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
116 |
|selectorSymbol instanceSortBlock cmpOp sortBlock locSortReverse convertToString caseLessNameString | |
1367 | 117 |
|
118 |
selectorSymbol := selector asSymbol. |
|
119 |
sortReverse ifTrue:[ |
|
2174
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
120 |
cmpOp := #>. |
1367 | 121 |
] ifFalse:[ |
2174
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
122 |
cmpOp := #<. |
1367 | 123 |
]. |
1369 | 124 |
locSortReverse := self sortReverse. |
2174
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
125 |
caseLessNameString := sortCaseless and:[selector = #baseName]. |
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
126 |
|
1367 | 127 |
instanceSortBlock := [:a :b | |
128 |
|entry1 entry2| |
|
129 |
||
2174
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
130 |
entry1 := a perform:selectorSymbol. |
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
131 |
entry2 := b perform:selectorSymbol. |
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
132 |
(entry1 isNil or:[entry2 isNil]) ifTrue:[ |
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
133 |
(entry1 isNil and:[entry2 isNil]) ifTrue:[ |
1367 | 134 |
true |
135 |
] ifFalse:[ |
|
2174
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
136 |
(entry1 notNil and:[entry2 isNil]) ifTrue:[ |
1369 | 137 |
locSortReverse |
1367 | 138 |
] ifFalse:[ |
1369 | 139 |
locSortReverse not |
1367 | 140 |
] |
141 |
] |
|
142 |
] ifFalse:[ |
|
2174
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
143 |
convertToString isNil ifTrue:[ |
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
144 |
"if we have to convert the first pair of values, convert every pair" |
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
145 |
convertToString := ((entry1 isNumber and:[entry2 isNumber]) |
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
146 |
or:[(entry1 respondsTo:cmpOp) and:[entry2 respondsTo:cmpOp]]) not. |
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
147 |
]. |
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
148 |
convertToString ifTrue:[ |
2135 | 149 |
entry1 := entry1 asString. |
150 |
entry2 := entry2 asString. |
|
151 |
]. |
|
2174
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
152 |
caseLessNameString ifTrue:[ |
1367 | 153 |
entry1 := entry1 asLowercase. |
154 |
entry2 := entry2 asLowercase. |
|
155 |
]. |
|
156 |
entry1 perform:cmpOp with:entry2 |
|
157 |
] |
|
158 |
]. |
|
2174
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
159 |
|
1367 | 160 |
directoriesBeforeFiles ifTrue:[ |
161 |
sortBlock := [:a :b| |
|
2174
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
162 |
|aIsDir| |
1367 | 163 |
|
164 |
aIsDir := a isDirectory. |
|
2174
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
165 |
(aIsDir ~~ b isDirectory) ifTrue:[ |
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
166 |
"one is a directory, the other is not" |
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
167 |
aIsDir |
1367 | 168 |
] ifFalse:[ |
2174
d1022a910535
Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents:
2135
diff
changeset
|
169 |
instanceSortBlock value:a value:b. |
1367 | 170 |
]. |
171 |
]. |
|
172 |
] ifFalse:[ |
|
173 |
sortBlock := instanceSortBlock. |
|
174 |
]. |
|
175 |
||
2859 | 176 |
aList notEmptyOrNil ifTrue:[aList sort:sortBlock]. |
1367 | 177 |
^ aList |
178 |
! ! |
|
179 |
||
180 |
!FileSorter class methodsFor:'documentation'! |
|
181 |
||
182 |
version |
|
2859 | 183 |
^ '$Header: /cvs/stx/stx/libbasic2/FileSorter.st,v 1.9 2012-11-25 08:53:04 cg Exp $' |
2497 | 184 |
! |
185 |
||
186 |
version_CVS |
|
2859 | 187 |
^ '$Header: /cvs/stx/stx/libbasic2/FileSorter.st,v 1.9 2012-11-25 08:53:04 cg Exp $' |
1367 | 188 |
! ! |