FileSelectionBox.st
author claus
Wed, 13 Oct 1993 03:49:56 +0100
changeset 5 7b4fb1b170e5
parent 3 9d7eefb5e69f
child 7 15a9291b9bd0
permissions -rw-r--r--
(none)
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
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    26
this class implements file selection boxes. They show a list of
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    27
files, and perform an action block with the selected pathname as
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    28
argument when ok is clicked.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    29
5
claus
parents: 3
diff changeset
    30
$Header: /cvs/stx/stx/libwidg/FileSelectionBox.st,v 1.3 1993-10-13 02:47:44 claus Exp $
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    31
written Jan 90 by claus
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    32
'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    33
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    34
!FileSelectionBox methodsFor:'initialization'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    35
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    36
initialize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    37
    directory := FileDirectory currentDirectory.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    38
    super initialize.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    39
3
claus
parents: 0
diff changeset
    40
    labelField extent:(0.7 @ labelField height).
claus
parents: 0
diff changeset
    41
    labelField label:(resources string:'select a file:').
claus
parents: 0
diff changeset
    42
    labelField adjust:#left.
claus
parents: 0
diff changeset
    43
claus
parents: 0
diff changeset
    44
    patternField := EditField
claus
parents: 0
diff changeset
    45
                        origin:(0.7 @ labelField origin y)
claus
parents: 0
diff changeset
    46
                        corner:(1.0 @ labelField corner y)
claus
parents: 0
diff changeset
    47
                            in:self.
claus
parents: 0
diff changeset
    48
    patternField initialText:'*'.
claus
parents: 0
diff changeset
    49
    patternField leaveAction:[:p | self updateList].
claus
parents: 0
diff changeset
    50
    patternField hidden:true.
claus
parents: 0
diff changeset
    51
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    52
    "selections in list get forwarded to enterfield if not a directory;
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    53
     otherwise directory is changed"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    54
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    55
    selectionList action:[:lineNr |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    56
        |entry|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    57
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    58
        entry := selectionList selectionValue.
3
claus
parents: 0
diff changeset
    59
        (entry endsWith:' ...') ifTrue:[
claus
parents: 0
diff changeset
    60
            entry := entry copyTo:(entry size - 4).
claus
parents: 0
diff changeset
    61
        ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    62
        ((directory typeOf:entry) == #directory) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    63
            self directory:(directory pathName , '/' , entry)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    64
        ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    65
            enterField contents:entry
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    66
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    67
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    68
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    69
    "FileSelectionBox new show"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    70
!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    71
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    72
reinitialize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    73
    directory := FileDirectory currentDirectory.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    74
    super reinitialize
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    75
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    76
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    77
!FileSelectionBox methodsFor:'accessing'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    78
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    79
directory:nameOrDirectory
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    80
    "set the lists contents to the filenames in the directory name"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    81
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    82
    |oldPath name|
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    83
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    84
    (nameOrDirectory isKindOf:String) ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    85
        name := nameOrDirectory
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    86
    ] ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    87
        name := nameOrDirectory pathName
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    88
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    89
    oldPath := directory pathName.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    90
    directory pathName:name.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    91
    (directory pathName = oldPath) ifFalse:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    92
        self updateList
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
    93
    ]
3
claus
parents: 0
diff changeset
    94
!
claus
parents: 0
diff changeset
    95
claus
parents: 0
diff changeset
    96
pattern:aPattern
claus
parents: 0
diff changeset
    97
    patternField initialText:aPattern.
claus
parents: 0
diff changeset
    98
    patternField hidden:false.
claus
parents: 0
diff changeset
    99
    realized ifTrue:[
claus
parents: 0
diff changeset
   100
        patternField realize.
claus
parents: 0
diff changeset
   101
        self updateList
claus
parents: 0
diff changeset
   102
    ].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   103
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   104
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   105
!FileSelectionBox methodsFor:'private'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   106
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   107
updateList
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   108
    "set the lists contents to the filenames in the directory"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   109
3
claus
parents: 0
diff changeset
   110
    |oldCursor oldListCursor files pattern newList index|
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   111
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   112
    oldCursor := cursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   113
    oldListCursor := selectionList cursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   114
    self cursor:(Cursor read).
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   115
    selectionList cursor:(Cursor read).
3
claus
parents: 0
diff changeset
   116
    directoryId == directory id ifFalse:[
claus
parents: 0
diff changeset
   117
        timeStamp := directory timeOfLastChange.
claus
parents: 0
diff changeset
   118
        directoryId := directory id.
claus
parents: 0
diff changeset
   119
        directoryContents := directory asText sort.
claus
parents: 0
diff changeset
   120
        ((directoryContents at:1) = '.') ifTrue:[
claus
parents: 0
diff changeset
   121
            directoryContents removeIndex:1
claus
parents: 0
diff changeset
   122
        ].
claus
parents: 0
diff changeset
   123
        directoryFileTypes := OrderedCollection new.
claus
parents: 0
diff changeset
   124
        directoryContents do:[:name | directoryFileTypes add:(directory typeOf:name)].
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   125
    ].
3
claus
parents: 0
diff changeset
   126
    files := directoryContents.
claus
parents: 0
diff changeset
   127
    pattern := patternField contents.
claus
parents: 0
diff changeset
   128
    newList := OrderedCollection new.
claus
parents: 0
diff changeset
   129
    index := 1.
claus
parents: 0
diff changeset
   130
    files do:[:name |
claus
parents: 0
diff changeset
   131
        (directoryFileTypes at:index) == #directory ifTrue:[
claus
parents: 0
diff changeset
   132
            name = '..' ifTrue:[
claus
parents: 0
diff changeset
   133
                newList add:name
claus
parents: 0
diff changeset
   134
            ] ifFalse:[
claus
parents: 0
diff changeset
   135
                newList add:(name , ' ...')
claus
parents: 0
diff changeset
   136
            ]
claus
parents: 0
diff changeset
   137
        ] ifFalse:[
claus
parents: 0
diff changeset
   138
            (pattern isEmpty or:[pattern match:name]) ifTrue:[
claus
parents: 0
diff changeset
   139
                newList add:name
claus
parents: 0
diff changeset
   140
            ]
claus
parents: 0
diff changeset
   141
        ].
claus
parents: 0
diff changeset
   142
        index := index + 1
claus
parents: 0
diff changeset
   143
    ].
claus
parents: 0
diff changeset
   144
    self list:newList.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   145
    self cursor:oldCursor.
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   146
    selectionList cursor:oldListCursor
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   147
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   148
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   149
!FileSelectionBox methodsFor:'events'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   150
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   151
show
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   152
    "make the box visible; redefined to check if directory is still 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   153
     valid (using timestamp and inode numbers) - reread if not"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   154
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   155
    (timeStamp isNil 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   156
     or:[(directory timeOfLastChange > timeStamp) 
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   157
     or:[(directoryId isNil)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   158
     or:[directoryId ~~ directory id]]]) ifTrue:[
3
claus
parents: 0
diff changeset
   159
        directoryId := nil.
0
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   160
        self updateList
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   161
    ].
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   162
    super show
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   163
! !
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   164
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   165
!FileSelectionBox methodsFor:'user interaction'!
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   166
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   167
okPressed
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   168
    "redefined, since action will be evaluated with full path as argument
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   169
     (instead of enterfields contents only as inherited by EnterBox"
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   170
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   171
    self hideAndEvaluate:[:string |
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   172
        okAction notNil ifTrue:[
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   173
            okAction value:(directory pathName , '/' , string)
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   174
        ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   175
    ]
e6a541c1c0eb Initial revision
claus
parents:
diff changeset
   176
! !