FileSorter.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 2859 2a11716ab82a
permissions -rw-r--r--
#FEATURE by cg class: Socket class added: #newTCPclientToHost:port:domain:domainOrder:withTimeout: changed: #newTCPclientToHost:port:domain:withTimeout:
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
2497
67f066362736 changed: #sortCaseless
Claus Gittinger <cg@exept.de>
parents: 2174
diff changeset
    94
    sortCaseless isNil ifTrue:[^ Filename isCaseSensitive not ].
67f066362736 changed: #sortCaseless
Claus Gittinger <cg@exept.de>
parents: 2174
diff changeset
    95
    ^ sortCaseless
67f066362736 changed: #sortCaseless
Claus Gittinger <cg@exept.de>
parents: 2174
diff changeset
    96
67f066362736 changed: #sortCaseless
Claus Gittinger <cg@exept.de>
parents: 2174
diff changeset
    97
    "Modified: / 14-10-2010 / 19:11:18 / cg"
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
    98
!
85aebc08d304 initial checkin
penk
parents:
diff changeset
    99
85aebc08d304 initial checkin
penk
parents:
diff changeset
   100
sortCaseless:something
85aebc08d304 initial checkin
penk
parents:
diff changeset
   101
    sortCaseless := something.
85aebc08d304 initial checkin
penk
parents:
diff changeset
   102
!
85aebc08d304 initial checkin
penk
parents:
diff changeset
   103
85aebc08d304 initial checkin
penk
parents:
diff changeset
   104
sortReverse
85aebc08d304 initial checkin
penk
parents:
diff changeset
   105
    ^ sortReverse ? false
85aebc08d304 initial checkin
penk
parents:
diff changeset
   106
!
85aebc08d304 initial checkin
penk
parents:
diff changeset
   107
85aebc08d304 initial checkin
penk
parents:
diff changeset
   108
sortReverse:something
85aebc08d304 initial checkin
penk
parents:
diff changeset
   109
    sortReverse := something.
85aebc08d304 initial checkin
penk
parents:
diff changeset
   110
! !
85aebc08d304 initial checkin
penk
parents:
diff changeset
   111
85aebc08d304 initial checkin
penk
parents:
diff changeset
   112
!FileSorter methodsFor:'action'!
85aebc08d304 initial checkin
penk
parents:
diff changeset
   113
85aebc08d304 initial checkin
penk
parents:
diff changeset
   114
sortItemList:aList
85aebc08d304 initial checkin
penk
parents:
diff changeset
   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
85aebc08d304 initial checkin
penk
parents:
diff changeset
   117
85aebc08d304 initial checkin
penk
parents:
diff changeset
   118
    selectorSymbol := selector asSymbol.
85aebc08d304 initial checkin
penk
parents:
diff changeset
   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
85aebc08d304 initial checkin
penk
parents:
diff changeset
   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
85aebc08d304 initial checkin
penk
parents:
diff changeset
   123
    ].
1369
65ba75319c22 sortReverse use accessor for default
penk
parents: 1368
diff changeset
   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
85aebc08d304 initial checkin
penk
parents:
diff changeset
   127
    instanceSortBlock := [:a :b | 
85aebc08d304 initial checkin
penk
parents:
diff changeset
   128
        |entry1 entry2|
85aebc08d304 initial checkin
penk
parents:
diff changeset
   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
85aebc08d304 initial checkin
penk
parents:
diff changeset
   134
                true
85aebc08d304 initial checkin
penk
parents:
diff changeset
   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
65ba75319c22 sortReverse use accessor for default
penk
parents: 1368
diff changeset
   137
                    locSortReverse
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
   138
                ] ifFalse:[
1369
65ba75319c22 sortReverse use accessor for default
penk
parents: 1368
diff changeset
   139
                    locSortReverse not
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
   140
                ]
85aebc08d304 initial checkin
penk
parents:
diff changeset
   141
            ]
85aebc08d304 initial checkin
penk
parents:
diff changeset
   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
51ef149d010d fixed sort by fileSize.
Claus Gittinger <cg@exept.de>
parents: 1928
diff changeset
   149
                entry1 := entry1 asString.
51ef149d010d fixed sort by fileSize.
Claus Gittinger <cg@exept.de>
parents: 1928
diff changeset
   150
                entry2 := entry2 asString.
51ef149d010d fixed sort by fileSize.
Claus Gittinger <cg@exept.de>
parents: 1928
diff changeset
   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
85aebc08d304 initial checkin
penk
parents:
diff changeset
   153
                entry1 := entry1 asLowercase.
85aebc08d304 initial checkin
penk
parents:
diff changeset
   154
                entry2 := entry2 asLowercase.
85aebc08d304 initial checkin
penk
parents:
diff changeset
   155
            ].
85aebc08d304 initial checkin
penk
parents:
diff changeset
   156
            entry1 perform:cmpOp with:entry2
85aebc08d304 initial checkin
penk
parents:
diff changeset
   157
        ]
85aebc08d304 initial checkin
penk
parents:
diff changeset
   158
    ].
2174
d1022a910535 Fix sorting for differnt entries - thanks to Christian Penk
Stefan Vogel <sv@exept.de>
parents: 2135
diff changeset
   159
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
   160
    directoriesBeforeFiles ifTrue:[
85aebc08d304 initial checkin
penk
parents:
diff changeset
   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
85aebc08d304 initial checkin
penk
parents:
diff changeset
   163
85aebc08d304 initial checkin
penk
parents:
diff changeset
   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
85aebc08d304 initial checkin
penk
parents:
diff changeset
   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
85aebc08d304 initial checkin
penk
parents:
diff changeset
   170
            ].
85aebc08d304 initial checkin
penk
parents:
diff changeset
   171
          ].
85aebc08d304 initial checkin
penk
parents:
diff changeset
   172
    ] ifFalse:[
85aebc08d304 initial checkin
penk
parents:
diff changeset
   173
        sortBlock := instanceSortBlock.
85aebc08d304 initial checkin
penk
parents:
diff changeset
   174
    ].
85aebc08d304 initial checkin
penk
parents:
diff changeset
   175
2859
2a11716ab82a class: FileSorter
Claus Gittinger <cg@exept.de>
parents: 2497
diff changeset
   176
    aList notEmptyOrNil ifTrue:[aList sort:sortBlock].
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
   177
    ^ aList
85aebc08d304 initial checkin
penk
parents:
diff changeset
   178
! !
85aebc08d304 initial checkin
penk
parents:
diff changeset
   179
85aebc08d304 initial checkin
penk
parents:
diff changeset
   180
!FileSorter class methodsFor:'documentation'!
85aebc08d304 initial checkin
penk
parents:
diff changeset
   181
85aebc08d304 initial checkin
penk
parents:
diff changeset
   182
version
2859
2a11716ab82a class: FileSorter
Claus Gittinger <cg@exept.de>
parents: 2497
diff changeset
   183
    ^ '$Header: /cvs/stx/stx/libbasic2/FileSorter.st,v 1.9 2012-11-25 08:53:04 cg Exp $'
2497
67f066362736 changed: #sortCaseless
Claus Gittinger <cg@exept.de>
parents: 2174
diff changeset
   184
!
67f066362736 changed: #sortCaseless
Claus Gittinger <cg@exept.de>
parents: 2174
diff changeset
   185
67f066362736 changed: #sortCaseless
Claus Gittinger <cg@exept.de>
parents: 2174
diff changeset
   186
version_CVS
2859
2a11716ab82a class: FileSorter
Claus Gittinger <cg@exept.de>
parents: 2497
diff changeset
   187
    ^ '$Header: /cvs/stx/stx/libbasic2/FileSorter.st,v 1.9 2012-11-25 08:53:04 cg Exp $'
1367
85aebc08d304 initial checkin
penk
parents:
diff changeset
   188
! !