FileDialog.st
author penk
Tue, 01 Oct 2002 10:00:16 +0200
changeset 3923 2988fc3c88ab
parent 3905 2a1afd0fdcd3
child 3938 cc381aba7134
permissions -rw-r--r--
next stage

"{ Package: 'stx:libtool' }"

SimpleDialog subclass:#FileDialog
	instanceVariableNames:'aspects treeBrowser enableBack enableDirectoryUp enableForward
		enableHome directory pattern filterHolder initialText
		cancelLabelHolder okLabelHolder startFilename result filterField
		filenameField viewFiles filenameLabelHolder'
	classVariableNames:'LastFileSelectionDirectory'
	poolDictionaries:''
	category:'Interface-Tools-File'
!

!FileDialog class methodsFor:'documentation'!

documentation
"
    documentation to be added.

    [author:]
        Martin Walser (martin@vercingetorix)

    [instance variables:]

    [class variables:]

    [see also:]

"
!

examples
"
  Starting the application:
                                                                [exBegin]
    FileDialog open

                                                                [exEnd]

  more examples to be added:
                                                                [exBegin]
    ... add code fragment for 
    ... executable example here ...
                                                                [exEnd]
"
!

history
    "Created: / 19.9.2002 / 13:05:28 / martin"
! !

!FileDialog class methodsFor:'instance creation'!

requestDirectoryName:title default:aFileName ifFail:failBlock
    "same as requestFileName, but only show directories"

    ^ self  requestDirectoryName:title 
            default:aFileName 
            ok:nil 
            abort:nil 
            version:nil 
            pattern:nil 
            fromDirectory:nil 
            ifFail:failBlock 
            whenBoxCreatedEvaluate:nil.

    "
     FileDialog
        requestDirectoryName:'which directory ?' 
        default:'/etc'
        ifFail:'none'
    "
!

requestDirectoryName:title default:aFileName ok:okText abort:abortText version:versionSymbol pattern:pattern fromDirectory:aDirectoryPath ifFail:failBlock whenBoxCreatedEvaluate:boxCreatedCallback
    "same as requestFileName, but only show directories"

    |enteredFileName instance defaultNm defaultDir enteredFileNameString defaultFile|

    defaultNm := aFileName.
    defaultDir := aDirectoryPath.
    defaultDir isNil ifTrue:[
        defaultNm notNil ifTrue:[
            defaultDir := defaultNm asFilename directory.
        ] ifFalse:[
            defaultDir := FileSelectionBox lastFileSelectionDirectory.
            defaultDir isNil ifTrue:[
                defaultDir := Filename currentDirectory asAbsoluteFilename.        
            ].
        ]
    ].
    defaultDir := defaultDir asFilename.
    [defaultDir exists not] whileTrue:[
        defaultDir := defaultDir directory.
    ].
    defaultNm isNil ifTrue:[
        defaultFile := defaultDir.
    ] ifFalse:[
        defaultFile := defaultNm asFilename.
    ].
    instance := self new.
"/    defaultDir notNil ifTrue:[instance directory:(defaultDir asFilename)].
    defaultDir notNil ifTrue:[instance directory:defaultFile].
    instance startFilename:defaultFile.
    instance initialText:title.
    instance pattern:((pattern isNil or:[pattern isEmpty]) ifTrue:['*'] ifFalse:[pattern]).
    instance okLabelHolder value:okText.
    instance cancelLabelHolder value:abortText.
    instance viewFiles:false.

    instance allButOpenInterface:#windowSpec.
    boxCreatedCallback notNil ifTrue:[boxCreatedCallback value:instance].
    instance openWindowModal.

    enteredFileNameString := instance result.
    enteredFileNameString isNil ifTrue:[
        ^ failBlock value
    ].
    enteredFileName := enteredFileNameString asFilename.
    enteredFileNameString := enteredFileName asString.
    (enteredFileName notNil 
    and:[enteredFileNameString notEmpty]) ifTrue:[
        versionSymbol isNil ifTrue:[ ^ enteredFileNameString].
        versionSymbol == #mustBeNew ifTrue:[
            "/ file may not exist
            enteredFileName exists ifTrue:[^ ''].
        ].
        versionSymbol == #new ifTrue:[
            "/ file may not exist
            enteredFileName exists ifTrue:[
                (Dialog confirm:(self classResources string:'''%1'' exists.\\Continue anyway ?' with:enteredFileNameString) withCRs)
                    ifFalse:[^ ''].
            ].
        ].
        versionSymbol == #mustBeOld ifTrue:[
            enteredFileName exists ifFalse:[^ ''].
        ].
        versionSymbol == #old ifTrue:[
            "/ file may not exist
            enteredFileName exists ifFalse:[
                (self confirm:(self classResources string:'''%1'' does not exist yet.\\Continue anyway ?' with:enteredFileNameString) withCRs)
                ifFalse:[^ ''].
            ].
        ].
        FileSelectionBox lastFileSelectionDirectory:(enteredFileNameString).
    ].
    ^ enteredFileNameString

    "
     FileDialog
        requestDirectoryName:'which directory ?' 
        default:'/etc'
        ifFail:nil
    "
!

requestFileName:titleString default:defaultName ok:okText abort:abortText pattern:pattern fromDirectory:aDirectoryPathOrNil whenBoxCreatedEvaluate:boxCreatedCallback

    ^ self  requestFileName:titleString 
            default:defaultName 
            ok:okText 
            abort:abortText 
            version:nil 
            ifFail:nil 
            pattern:pattern 
            fromDirectory:aDirectoryPathOrNil 
            whenBoxCreatedEvaluate:boxCreatedCallback
!

requestFileName:titleString default:defaultName ok:okText abort:abortText version:versionSymbol ifFail:failBlock pattern:pattern fromDirectory:aDirectoryPath whenBoxCreatedEvaluate:boxCreatedCallback
    "launch a Dialog, which allows user to enter a filename.
     The files presented initially are those in aDirectoryPathOrNil, or the
     last fileBox directory (default: current directory) (if a nil path is given).
     The box will show okText in its okButton, abortText in the abortButton.
     The matchPattern is set to pattern initially.
     Return the string, or nil if cancel was pressed
     The version argument allows validation of the files existance;
     it may be any of:
        #mustBeNew      - fail (return empty string) if the file exists
        #new            - confirm if the file exists
        #mustBeOld      - fail if the file does not exist
        #old            - confirm if the file does not exist
        #any (other)    - no validation
    "


    | instance enteredFileName enteredFileNameString|

    instance := self    startApplicationFor:titleString 
                        default:defaultName 
                        ok:okText 
                        abort:abortText 
                        ifFail:failBlock 
                        pattern:pattern 
                        fromDirectory:aDirectoryPath 
                        whenBoxCreatedEvaluate:boxCreatedCallback.

    enteredFileNameString := instance result.
    enteredFileNameString isNil ifTrue:[
        ^ failBlock value
    ].
    enteredFileName := enteredFileNameString asFilename.
    enteredFileNameString := enteredFileName asString.
    (enteredFileName notNil 
    and:[enteredFileNameString notEmpty]) ifTrue:[
        versionSymbol isNil ifTrue:[ ^ enteredFileNameString].
        versionSymbol == #mustBeNew ifTrue:[
            "/ file may not exist
            enteredFileName exists ifTrue:[^ ''].
        ].
        versionSymbol == #new ifTrue:[
            "/ file may not exist
            enteredFileName exists ifTrue:[
                (Dialog confirm:(self classResources string:'''%1'' exists.\\Continue anyway ?' with:enteredFileNameString) withCRs)
                    ifFalse:[^ ''].
            ].
        ].
        versionSymbol == #mustBeOld ifTrue:[
            enteredFileName exists ifFalse:[^ ''].
        ].
        versionSymbol == #old ifTrue:[
            "/ file may not exist
            enteredFileName exists ifFalse:[
                (self confirm:(self classResources string:'''%1'' does not exist yet.\\Continue anyway ?' with:enteredFileNameString) withCRs)
                ifFalse:[^ ''].
            ].
        ].
        FileSelectionBox lastFileSelectionDirectory:(enteredFileName directoryName).
    ].
    ^ enteredFileNameString
!

requestFileName:titleString default:defaultName version:versionSymbol ifFail:failBlock pattern:pattern fromDirectory:aDirectoryPathOrNil whenBoxCreatedEvaluate:boxCreatedCallback

    ^ self  requestFileName:titleString 
            default:defaultName 
            ok:nil 
            abort:nil 
            version:versionSymbol 
            ifFail:failBlock 
            pattern:pattern 
            fromDirectory:aDirectoryPathOrNil 
            whenBoxCreatedEvaluate:boxCreatedCallback

    "
     FileDialog 
        requestFileName:'enter a fileName:'
        default:''
        version:nil
        ifFail:['none']
        pattern:'*.conf'
        fromDirectory:'/etc'
        whenBoxCreatedEvaluate:nil.
     Dialog 
        requestFileName:'enter a fileName:'
        default:''
        version:nil
        ifFail:['none']
        pattern:'*.conf'
        fromDirectory:'/etc'
        whenBoxCreatedEvaluate:nil
    "
    "
     FileDialog
        requestFileName:'enter a fileName:'
        default:''
        version:#old 
        ifFail:['none']   
        pattern:'*.conf'
        fromDirectory:'/etc'
        whenBoxCreatedEvaluate:nil
    "
    "
     FileDialog
        requestFileName:'enter a fileName:'
        default:''
        version:#mustBeNew 
        ifFail:['none']   
        pattern:'*.conf'
        fromDirectory:'/etc'
        whenBoxCreatedEvaluate:nil
    "
!

requestFileNames:titleString default:defaultName ok:okText abort:abortText ifFail:failBlock pattern:pattern fromDirectory:aDirectoryPath whenBoxCreatedEvaluate:boxCreatedCallback
    "launch a Dialog, which allows user to enter a filename.
     The files presented initially are those in aDirectoryPathOrNil, or the
     last fileBox directory (default: current directory) (if a nil path is given).
     The box will show okText in its okButton, abortText in the abortButton.
     The matchPattern is set to pattern initially.
     Return all selected Filenames as filenames in a collection, or nil if cancel was pressed
    "


    | instance enteredFileNames lastDirectory|

    instance := self    startApplicationFor:titleString 
                        default:defaultName 
                        ok:okText 
                        abort:abortText 
                        ifFail:failBlock 
                        pattern:pattern 
                        fromDirectory:aDirectoryPath 
                        whenBoxCreatedEvaluate:boxCreatedCallback.

    enteredFileNames := instance selectedFiles.
    (enteredFileNames isEmpty or:[instance result isNil]) ifTrue:[
        ^ failBlock value
    ].
    lastDirectory := enteredFileNames first.
    lastDirectory := lastDirectory isFilename ifTrue:[lastDirectory directory] ifFalse:[lastDirectory].
    FileSelectionBox lastFileSelectionDirectory:(lastDirectory directoryName).
    ^ enteredFileNames

"
     FileDialog 
        requestFileNames:'enter a fileName:'
        default:''
        ok:nil 
        abort:nil 
        ifFail:['none']
        pattern:'*.conf'
        fromDirectory:'/etc'
        whenBoxCreatedEvaluate:nil.
"
!

startApplicationFor:titleString default:defaultName ok:okText abort:abortText ifFail:failBlock pattern:pattern fromDirectory:aDirectoryPath whenBoxCreatedEvaluate:boxCreatedCallback
    "launch a Dialog, which allows user to enter a filename.
     The files presented initially are those in aDirectoryPathOrNil, or the
     last fileBox directory (default: current directory) (if a nil path is given).
     The box will show okText in its okButton, abortText in the abortButton.
     The matchPattern is set to pattern initially.
     Return the string, or nil if cancel was pressed
     The version argument allows validation of the files existance;
     it may be any of:
        #mustBeNew      - fail (return empty string) if the file exists
        #new            - confirm if the file exists
        #mustBeOld      - fail if the file does not exist
        #old            - confirm if the file does not exist
        #any (other)    - no validation
    "


    | defaultDir defaultNm instance defaultFile|

    defaultNm := defaultName.
    defaultDir := aDirectoryPath.
    defaultDir isNil ifTrue:[
        defaultDir := FileSelectionBox lastFileSelectionDirectory.
        defaultDir isNil ifTrue:[
            defaultDir := Filename currentDirectory asAbsoluteFilename.        
        ].
    ].
    defaultDir := defaultDir asFilename.
    [defaultDir exists not] whileTrue:[
        defaultDir := defaultDir directory.
    ].
    (defaultName notNil and:[defaultName asFilename withoutSuffix baseName ~= '*']) ifTrue:[
        defaultFile := defaultDir construct:defaultName.
    ] ifFalse:[
        defaultFile := defaultDir.
    ].
    instance := self new.
    defaultDir notNil ifTrue:[instance directory:(defaultDir asFilename)].
    instance startFilename:defaultFile.
    instance pattern:((pattern isNil or:[pattern isEmpty]) ifTrue:['*'] ifFalse:[pattern]).
    instance initialText:titleString.
    instance okLabelHolder value:okText.
    instance cancelLabelHolder value:abortText.
    instance viewFiles:true.

    instance allButOpenInterface:#windowSpec.
    boxCreatedCallback notNil ifTrue:[boxCreatedCallback value:instance].
    instance openWindowModal.
    ^ instance
! !

!FileDialog class methodsFor:'accessing'!

lastFileSelectionDirectory
    "return the name of the directory used in the previous
     fileSelection dialog. This will be used as default for the next dialog,
     if no explicit path is specified (see requestFileName:* methods)"

    |f|

    LastFileSelectionDirectory notNil ifTrue:[
        ((f := LastFileSelectionDirectory asFilename) exists 
        and:[f isDirectory]) ifFalse:[
            LastFileSelectionDirectory := nil.
        ]
    ].
    ^ LastFileSelectionDirectory
!

lastFileSelectionDirectory:aDirectoryString
    "set the name of the directory used in the previous
     fileSelection dialog. This will be used as default for the next dialog,
     if no explicit path is specified (see requestFileName:* methods)"

    LastFileSelectionDirectory := aDirectoryString
! !

!FileDialog class methodsFor:'interface specs'!

windowSpec
    "This resource specification was automatically generated
     by the UIPainter of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the UIPainter may not be able to read the specification."

    "
     UIPainter new openOnClass:FileDialog andSelector:#windowSpec
     FileDialog new openInterface:#windowSpec
     FileDialog open
    "

    <resource: #canvas>

    ^ 
     #(#FullSpec
        #name: #windowSpec
        #window: 
       #(#WindowSpec
          #label: 'FileDialog'
          #name: 'FileDialog'
          #min: #(#Point 10 10)
          #max: #(#Point 1024 768)
          #bounds: #(#Rectangle 16 42 416 442)
        )
        #component: 
       #(#SpecCollection
          #collection: #(
           #(#MenuPanelSpec
              #name: 'ToolBar1'
              #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 30 0)
              #tabable: true
              #menu: #toolBarMenu
              #textDefault: true
            )
           #(#SubCanvasSpec
              #name: 'DirectoryTreeBrowser'
              #layout: #(#LayoutFrame 0 0.0 30 0 0 1.0 -107 1)
              #tabable: true
              #hasHorizontalScrollBar: false
              #hasVerticalScrollBar: false
              #majorKey: #DirectoryTreeBrowser
              #createNewApplication: true
              #createNewBuilder: true
              #postBuildCallback: #postBuildTreeBrowser:
            )
           #(#LabelSpec
              #label: 'Filename:'
              #name: 'FilenameLabel'
              #layout: #(#LayoutFrame 3 0 -97 1 73 0 -77 1)
              #translateLabel: true
              #labelChannel: #filenameLabelHolder
              #adjust: #left
            )
           #(#FilenameInputFieldSpec
              #name: 'FilenameEntryField'
              #layout: #(#LayoutFrame 70 0 -96 1 -10 1 -76 1)
              #tabable: true
              #model: #filenameHolder
              #acceptOnPointerLeave: false
              #postBuildCallback: #postBuildFileNameField:
            )
           #(#LabelSpec
              #label: 'Filter:'
              #name: 'FilterLabel'
              #layout: #(#LayoutFrame 3 0 -70 1 67 0 -50 1)
              #translateLabel: true
              #adjust: #left
            )
           #(#InputFieldSpec
              #name: 'FilterEntryField'
              #layout: #(#LayoutFrame 70 0 -69 1 -10 1 -49 1)
              #model: #filterHolder
              #immediateAccept: true
              #acceptOnReturn: true
              #acceptOnTab: true
              #acceptOnLostFocus: true
              #acceptOnPointerLeave: false
              #postBuildCallback: #postBuildFilterField:
            )
           #(#HorizontalPanelViewSpec
              #name: 'ButtonPanel'
              #layout: #(#LayoutFrame 0 0.0 -40 1 0 1 0 1)
              #horizontalLayout: #spreadSpace
              #verticalLayout: #center
              #horizontalSpace: 3
              #verticalSpace: 3
              #reverseOrderIfOKAtLeft: true
              #component: 
             #(#SpecCollection
                #collection: #(
                 #(#ActionButtonSpec
                    #label: 'Cancel'
                    #name: 'cancelButton'
                    #translateLabel: true
                    #labelChannel: #cancelLabelHolder
                    #tabable: true
                    #model: #doCancel
                    #extent: #(#Point 150 21)
                  )
                 #(#ActionButtonSpec
                    #label: 'OK'
                    #name: 'okButton'
                    #translateLabel: true
                    #labelChannel: #okLabelHolder
                    #tabable: true
                    #model: #doAccept
                    #isDefault: true
                    #extent: #(#Point 150 22)
                  )
                 )
               
              )
            )
           )
         
        )
      )
! !

!FileDialog class methodsFor:'menu specs'!

toolBarMenu
    "This resource specification was automatically generated
     by the MenuEditor of ST/X."

    "Do not manually edit this!! If it is corrupted,
     the MenuEditor may not be able to read the specification."

    "
     MenuEditor new openOnClass:FileDialog andSelector:#toolBarMenu
     (Menu new fromLiteralArrayEncoding:(FileDialog toolBarMenu)) startUp
    "

    <resource: #menu>

    ^ 
     #(#Menu
        #(
         #(#MenuItem
            #label: 'DirectoryUp'
            #translateLabel: true
            #isButton: true
            #value: #doGoDirectoryUp
            #activeHelpKey: #directoryUp
            #enabled: #enableDirectoryUp
            #labelImage: #(#ResourceRetriever #AbstractFileBrowser #upArrow20x20Icon)
          )
         #(#MenuItem
            #label: '-'
          )
         #(#MenuItem
            #label: 'Back'
            #translateLabel: true
            #isButton: true
            #value: #doBack
            #activeHelpKey: #directoryBack
            #enabled: #enableBack
            #labelImage: #(#ResourceRetriever #AbstractFileBrowser #leftArrow20x20Icon)
            #submenuChannel: #menuDirHistoryBack
          )
         #(#MenuItem
            #label: '-'
          )
         #(#MenuItem
            #label: 'Forward'
            #translateLabel: true
            #isButton: true
            #value: #doForward
            #activeHelpKey: #directoryForward
            #enabled: #enableForward
            #labelImage: #(#ResourceRetriever #AbstractFileBrowser #rightArrow20x20Icon)
            #submenuChannel: #menuDirHistoryForward
          )
         #(#MenuItem
            #label: '-'
          )
         #(#MenuItem
            #label: 'Home'
            #translateLabel: true
            #isButton: true
            #value: #doGotoHomeDirectory
            #activeHelpKey: #fileHome
            #enabled: #enableHome
            #labelImage: #(#ResourceRetriever #AbstractFileBrowser #goHomeIcon)
          )
         #(#MenuItem
            #label: '-'
          )
         #(#MenuItem
            #label: 'New Directory'
            #isButton: true
            #value: #newDirectory
            #labelImage: #(#ResourceRetriever #AbstractFileBrowser #newDirectory20x20Icon)
          )
         )
        nil
        nil
      )
! !

!FileDialog methodsFor:'accessing'!

directory
    "return the value of the instance variable 'directory' (automatically generated)"

    ^ directory
!

directory:something
    "set the value of the instance variable 'directory' (automatically generated)"

    directory := something.
!

initialText
    "return the value of the instance variable 'initialText' (automatically generated)"

    ^ initialText
!

initialText:something
    "set the value of the instance variable 'initialText' (automatically generated)"

    initialText := something.
!

pattern
    "return the value of the instance variable 'pattern' (automatically generated)"

    ^ pattern
!

pattern:something
    "set the value of the instance variable 'pattern' (automatically generated)"

    pattern := something.
!

result
    "return the value of the instance variable 'result' (automatically generated)"

    ^ result
!

result:something
    "set the value of the instance variable 'result' (automatically generated)"

    result := something.
!

selectedDirectories

    | selectedFiles|

    selectedFiles := treeBrowser currentFileNameHolder value.
    ^ selectedFiles select:[:aFile| aFile isDirectory].
!

selectedFiles

    | selectedFiles|

    selectedFiles := treeBrowser currentFileNameHolder value.
    ^ selectedFiles select:[:aFile| aFile isDirectory not].
!

startFilename
    "return the value of the instance variable 'startFilename' (automatically generated)"

    startFilename isNil ifTrue:[
        startFilename := Filename currentDirectory asAbsoluteFilename.
    ].
    ^ startFilename
!

startFilename:something
    "set the value of the instance variable 'startFilename' (automatically generated)"

    startFilename := something.
!

treeBrowser
    "return the value of the instance variable 'treeBrowser' (automatically generated)"

    ^ treeBrowser
!

viewFiles
    "return the value of the instance variable 'viewFiles' (automatically generated)"

    ^ viewFiles
!

viewFiles:something
    "set the value of the instance variable 'viewFiles' (automatically generated)"

    viewFiles := something.
! !

!FileDialog methodsFor:'aspects'!

cancelLabelHolder
    "automatically generated by UIPainter ..."

    "*** the code below creates a default model when invoked."
    "*** (which may not be the one you wanted)"
    "*** Please change as required and accept it in the browser."
    "*** (and replace this comment by something more useful ;-)"

    cancelLabelHolder isNil ifTrue:[
        cancelLabelHolder := 'Cancel' asValue.
    ].
    ^ cancelLabelHolder.
!

enableBack
    "Return a value holder for the input string.
    "
    enableBack isNil ifTrue:[
        enableBack := treeBrowser enableBack.
    ].
    ^ enableBack
!

enableDirectoryUp

    enableDirectoryUp isNil ifTrue:[
        enableDirectoryUp := treeBrowser enableDirectoryUp.
    ].
    ^ enableDirectoryUp
!

enableForward
    "Return a value holder for the input string.
    "
    enableForward isNil ifTrue:[
        enableForward := treeBrowser enableForward.
    ].
    ^ enableForward
!

enableHome
    "Return a value holder for the input string.
    "
    enableHome isNil ifTrue:[
        enableHome := treeBrowser enableHome.
    ].
    ^ enableHome
!

filenameHolder
    "Return a value holder with the filename.
     Shown in the filename input-field.
     Being the selection in the tree.
    "
    |holder|
    holder := builder bindingAt:#filenameHolder.

    holder ifNil:[
        holder := ValueHolder new.
        holder addDependent:self.
        builder aspectAt:#filenameHolder 
                     put:holder.
    ].

    ^ holder.
!

filenameLabelHolder
    "Return a value holder for the input string.
    "
    filenameLabelHolder isNil ifTrue:[
        filenameLabelHolder := 'Filename:' asValue.
    ].
    ^ filenameLabelHolder
!

filterHolder
    "Return a value holder for the input string.
    "

    filterHolder isNil ifTrue:[
        filterHolder := treeBrowser filterModel.
        self pattern notNil ifTrue:[
            filterHolder value:pattern.
        ]
    ].
    ^ filterHolder
!

okLabelHolder
    "automatically generated by UIPainter ..."

    "*** the code below creates a default model when invoked."
    "*** (which may not be the one you wanted)"
    "*** Please change as required and accept it in the browser."
    "*** (and replace this comment by something more useful ;-)"

    okLabelHolder isNil ifTrue:[
        okLabelHolder := 'OK' asValue.
    ].
    ^ okLabelHolder.
! !

!FileDialog methodsFor:'change & update'!

update:something with:aParameter from:changedObject
    "Invoked when an object that I depend upon sends a change notification."

    "stub code automatically generated - please change as required"

    changedObject == treeBrowser currentFileNameHolder ifTrue:[
        | files newDir|
        files := treeBrowser currentFileNameHolder value.

        (files isEmpty) ifTrue:[
            self filenameHolder value:nil withoutNotifying:self.
        ] ifFalse:[
            files size == 1 ifTrue:[
                self filenameHolder value:(files first) withoutNotifying:self.    
            ] ifFalse:[
                self filenameHolder value:'' withoutNotifying:self.
            ].
        ].
    ].
    changedObject == treeBrowser viewFilesInDirectoryTree ifTrue:[
        changedObject value ifTrue:[
            self filenameLabelHolder value:'Filename:'.
        ] ifFalse:[
            self filenameLabelHolder value:'Directory:'.
        ]
    ].
    changedObject == self filenameHolder ifTrue:[
        (changedObject value asFilename exists not) ifTrue:[^ self].
        treeBrowser currentFileNameHolder value:(OrderedCollection with:(changedObject value asFilename)) withoutNotifying:self.
    ].
    changedObject == treeBrowser enableBack ifTrue:[
        self enableBack value:changedObject value.
        ^ self.
    ].
    changedObject == treeBrowser enableForward ifTrue:[
        self enableForward value:changedObject value.
        ^ self.
    ].
    changedObject == treeBrowser enableHome ifTrue:[
        self enableHome value:changedObject value.
        ^ self.
    ].
    changedObject == treeBrowser enableDirectoryUp ifTrue:[
        self enableDirectoryUp value:changedObject value.
        ^ self.
    ].
    ^ super update:something with:aParameter from:changedObject
! !

!FileDialog methodsFor:'event handling'!

processEvent:anEvent
    "filter keyboard events.
     Return true, if I have eaten the event"

    |focusView key rawKey|

    anEvent isKeyPressEvent ifTrue:[
        focusView := anEvent targetView.
        key := anEvent key.
        rawKey := anEvent rawKey.

        (focusView == filterField) ifTrue:[
            ^ false.
        ].
        (focusView == filenameField) ifTrue:[
            ^ false.
        ].
    ].
    ^ false
! !

!FileDialog methodsFor:'initialization & release'!

postBuildFileNameField:aWidget

    filenameField := aWidget.
!

postBuildFilterField:aWidget

    filterField := aWidget.
!

postBuildTreeBrowser:aSubCanvasView

    treeBrowser := aSubCanvasView client.
!

postBuildWith:aBuilder
    "This is a hook method generated by the Browser.
     It will be invoked during the initialization of your app/dialog,
     after all of the visual components have been built, 
     but BEFORE the top window is made visible.
     Add any app-specific actions here (reading files, setting up values etc.)
     See also #postOpenWith:, which is invoked after opening."

    "/ add any code here ...

    ^ super postBuildWith:aBuilder
!

postOpenWith:aBuilder
    "This is a hook method generated by the Browser.
     It will be invoked right after the applications window has been opened.
     Add any app-specific actions here (starting background processes etc.).
     See also #postBuildWith:, which is invoked before opening."

    "/ add any code here ...
    

"/     self windowGroup addPreEventHook:self.
    treeBrowser currentFileNameHolder addDependent:self.
    treeBrowser enableBack addDependent:self.
    treeBrowser enableForward addDependent:self.
    treeBrowser enableHome addDependent:self.
    treeBrowser enableDirectoryUp addDependent:self.
    treeBrowser viewFilesInDirectoryTree addDependent:self.
    treeBrowser setNewRoot:((self directory) ? (Filename currentDirectory asAbsoluteFilename)).
    treeBrowser viewFilesInDirectoryTree value:(self viewFiles ? true).
    treeBrowser viewFilesInDirectoryTree changed.
    treeBrowser currentFileNameHolder value:(OrderedCollection with:(self startFilename)).
    self filenameHolder value:(self startFilename asString).
    self window label:(self initialText) ? 'File Dialog'.
    ^ super postOpenWith:aBuilder
! !

!FileDialog methodsFor:'user actions'!

doAccept
    "force accept - ignore in filterField"

    |ev|

    ev := self windowGroup lastEvent.
    (ev notNil 
    and:[ev isKeyEvent 
    and:[ev key == #Return
    and:[(   ev targetView isSameOrComponentOf:filterField) 
         or:[ev targetView isSameOrComponentOf:filenameField]]]]) ifTrue:[
        ^ self
    ].
    self result:(self filenameHolder value).

    ^ super doAccept
!

doBack

    treeBrowser doBack.
!

doCancel

    self result:nil.
    ^ super doCancel.
!

doForward

    treeBrowser doForward.
!

doGoDirectoryUp

    treeBrowser doGoDirectoryUp.
!

doGotoHomeDirectory

    treeBrowser doGotoHomeDirectory.
!

menuDirHistory:backOrForward

    ^ treeBrowser menuDirHistory:backOrForward.
!

menuDirHistoryBack

    ^ treeBrowser menuDirHistory:#back.
!

menuDirHistoryForward

    ^ treeBrowser menuDirHistory:#forward.
!

newDirectory

    ^ treeBrowser newDirectory
! !

!FileDialog class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/libtool/FileDialog.st,v 1.4 2002-10-01 08:00:06 penk Exp $'
! !