FileSelectionBox.st
author claus
Sat, 11 Dec 1993 02:51:34 +0100
changeset 7 15a9291b9bd0
parent 5 7b4fb1b170e5
child 12 1c8e8c53e8cf
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     1
"
5
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1990 by Claus Gittinger
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     4
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    11
"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    12
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    13
ListSelectionBox subclass:#FileSelectionBox
3
claus
parents: 0
diff changeset
    14
       instanceVariableNames:'patternField directory timeStamp directoryId
claus
parents: 0
diff changeset
    15
                              directoryContents directoryFileTypes'
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    16
       classVariableNames:''
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    17
       poolDictionaries:''
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    18
       category:'Views-Interactors'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    19
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    20
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    21
FileSelectionBox comment:'
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    22
5
claus
parents: 3
diff changeset
    23
COPYRIGHT (c) 1990 by Claus Gittinger
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    24
              All Rights Reserved
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    25
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    26
$Header: /cvs/stx/stx/libwidg/FileSelectionBox.st,v 1.4 1993-12-11 01:44:10 claus Exp $
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    27
written Jan 90 by claus
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    28
'!
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    29
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    30
!FileSelectionBox class methodsFor:'documentation'!
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    31
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    32
documentation
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    33
"
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    34
this class implements file selection boxes. They show a list of
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    35
files, and perform an action block with the selected pathname as
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    36
argument when ok is clicked.
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    37
There is an optional PatternField, which shows itself when a pattern
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    38
is defined. If there is such a pattern, only files matching the pattern
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    39
will be shown in the list (and directories).
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    40
"
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    41
! !
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    42
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    43
!FileSelectionBox methodsFor:'initialization'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    44
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    45
initialize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    46
    directory := FileDirectory currentDirectory.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    47
    super initialize.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    48
3
claus
parents: 0
diff changeset
    49
    labelField extent:(0.7 @ labelField height).
claus
parents: 0
diff changeset
    50
    labelField label:(resources string:'select a file:').
claus
parents: 0
diff changeset
    51
    labelField adjust:#left.
claus
parents: 0
diff changeset
    52
claus
parents: 0
diff changeset
    53
    patternField := EditField
claus
parents: 0
diff changeset
    54
                        origin:(0.7 @ labelField origin y)
claus
parents: 0
diff changeset
    55
                        corner:(1.0 @ labelField corner y)
claus
parents: 0
diff changeset
    56
                            in:self.
claus
parents: 0
diff changeset
    57
    patternField initialText:'*'.
claus
parents: 0
diff changeset
    58
    patternField leaveAction:[:p | self updateList].
claus
parents: 0
diff changeset
    59
    patternField hidden:true.
claus
parents: 0
diff changeset
    60
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    61
    "selections in list get forwarded to enterfield if not a directory;
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    62
     otherwise directory is changed"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    63
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    64
    selectionList action:[:lineNr |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    65
        |entry|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    66
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    67
        entry := selectionList selectionValue.
3
claus
parents: 0
diff changeset
    68
        (entry endsWith:' ...') ifTrue:[
claus
parents: 0
diff changeset
    69
            entry := entry copyTo:(entry size - 4).
claus
parents: 0
diff changeset
    70
        ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    71
        ((directory typeOf:entry) == #directory) ifTrue:[
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    72
            (directory isReadable:entry) ifFalse:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    73
                self warn:(resources string:'not allowed to read directory %1' with:entry)
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    74
            ] ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    75
                (directory isExecutable:entry) ifFalse:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    76
                    self warn:(resources string:'not allowed to change to directory %1' with:entry)
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    77
                ] ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    78
                    self directory:(directory pathName , Filename separator asString , entry)
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    79
                ]
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
    80
            ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    81
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    82
            enterField contents:entry
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    83
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    84
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    85
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    86
    "FileSelectionBox new show"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    87
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    88
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    89
reinitialize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    90
    directory := FileDirectory currentDirectory.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    91
    super reinitialize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    92
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    93
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    94
!FileSelectionBox methodsFor:'accessing'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    95
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    96
directory:nameOrDirectory
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    97
    "set the lists contents to the filenames in the directory name"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    98
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    99
    |oldPath name|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   100
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   101
    (nameOrDirectory isKindOf:String) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   102
        name := nameOrDirectory
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   103
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   104
        name := nameOrDirectory pathName
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   105
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   106
    oldPath := directory pathName.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   107
    directory pathName:name.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   108
    (directory pathName = oldPath) ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   109
        self updateList
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   110
    ]
3
claus
parents: 0
diff changeset
   111
!
claus
parents: 0
diff changeset
   112
claus
parents: 0
diff changeset
   113
pattern:aPattern
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   114
    "set the pattern - this enables the PatternField."
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   115
3
claus
parents: 0
diff changeset
   116
    patternField initialText:aPattern.
claus
parents: 0
diff changeset
   117
    patternField hidden:false.
claus
parents: 0
diff changeset
   118
    realized ifTrue:[
claus
parents: 0
diff changeset
   119
        patternField realize.
claus
parents: 0
diff changeset
   120
        self updateList
claus
parents: 0
diff changeset
   121
    ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   122
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   123
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   124
!FileSelectionBox methodsFor:'private'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   125
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   126
updateList
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   127
    "set the lists contents to the filenames in the directory"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   128
3
claus
parents: 0
diff changeset
   129
    |oldCursor oldListCursor files pattern newList index|
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   130
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   131
    oldCursor := cursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   132
    oldListCursor := selectionList cursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   133
    self cursor:(Cursor read).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   134
    selectionList cursor:(Cursor read).
3
claus
parents: 0
diff changeset
   135
    directoryId == directory id ifFalse:[
claus
parents: 0
diff changeset
   136
        timeStamp := directory timeOfLastChange.
claus
parents: 0
diff changeset
   137
        directoryId := directory id.
claus
parents: 0
diff changeset
   138
        directoryContents := directory asText sort.
claus
parents: 0
diff changeset
   139
        directoryFileTypes := OrderedCollection new.
claus
parents: 0
diff changeset
   140
        directoryContents do:[:name | directoryFileTypes add:(directory typeOf:name)].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   141
    ].
3
claus
parents: 0
diff changeset
   142
    files := directoryContents.
claus
parents: 0
diff changeset
   143
    pattern := patternField contents.
claus
parents: 0
diff changeset
   144
    newList := OrderedCollection new.
claus
parents: 0
diff changeset
   145
    index := 1.
claus
parents: 0
diff changeset
   146
    files do:[:name |
claus
parents: 0
diff changeset
   147
        (directoryFileTypes at:index) == #directory ifTrue:[
claus
parents: 0
diff changeset
   148
            name = '..' ifTrue:[
claus
parents: 0
diff changeset
   149
                newList add:name
claus
parents: 0
diff changeset
   150
            ] ifFalse:[
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   151
                name = '.' ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   152
                ] ifFalse:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   153
                    newList add:(name , ' ...')
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   154
                ]
3
claus
parents: 0
diff changeset
   155
            ]
claus
parents: 0
diff changeset
   156
        ] ifFalse:[
claus
parents: 0
diff changeset
   157
            (pattern isEmpty or:[pattern match:name]) ifTrue:[
claus
parents: 0
diff changeset
   158
                newList add:name
claus
parents: 0
diff changeset
   159
            ]
claus
parents: 0
diff changeset
   160
        ].
claus
parents: 0
diff changeset
   161
        index := index + 1
claus
parents: 0
diff changeset
   162
    ].
claus
parents: 0
diff changeset
   163
    self list:newList.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   164
    self cursor:oldCursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   165
    selectionList cursor:oldListCursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   166
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   167
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   168
!FileSelectionBox methodsFor:'events'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   169
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   170
show
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   171
    "make the box visible; redefined to check if directory is still 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   172
     valid (using timestamp and inode numbers) - reread if not"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   173
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   174
    (timeStamp isNil 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   175
     or:[(directory timeOfLastChange > timeStamp) 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   176
     or:[(directoryId isNil)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   177
     or:[directoryId ~~ directory id]]]) ifTrue:[
3
claus
parents: 0
diff changeset
   178
        directoryId := nil.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   179
        self updateList
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   180
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   181
    super show
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   182
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   183
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   184
!FileSelectionBox methodsFor:'user interaction'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   185
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   186
okPressed
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   187
    "redefined, since action will be evaluated with full path as argument
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   188
     (instead of enterfields contents only as inherited by EnterBox"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   189
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   190
    |absPath|
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   191
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   192
    self hideAndEvaluate:[:string |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   193
        okAction notNil ifTrue:[
7
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   194
            (string startsWith:(Filename separator)) ifTrue:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   195
                absPath := string
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   196
            ] ifFalse:[
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   197
                absPath := directory pathName , Filename separator asString , string
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   198
            ].
15a9291b9bd0 *** empty log message ***
claus
parents: 5
diff changeset
   199
            okAction value:absPath
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   200
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   201
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   202
! !