FileDialog.st
changeset 3892 321c1729db5b
child 3904 7f20fe941a4c
equal deleted inserted replaced
3891:bd4e9d606e98 3892:321c1729db5b
       
     1 "{ Package: 'stx:libtool' }"
       
     2 
       
     3 SimpleDialog subclass:#FileDialog
       
     4 	instanceVariableNames:'aspects treeBrowser enableBack enableDirectoryUp enableForward
       
     5 		enableHome directory pattern filterHolder initialText
       
     6 		cancelLabelHolder okLabelHolder startFilename result filterField
       
     7 		filenameField viewFiles'
       
     8 	classVariableNames:'LastFileSelectionDirectory'
       
     9 	poolDictionaries:''
       
    10 	category:'Interface-Tools-File'
       
    11 !
       
    12 
       
    13 !FileDialog class methodsFor:'documentation'!
       
    14 
       
    15 documentation
       
    16 "
       
    17     documentation to be added.
       
    18 
       
    19     [author:]
       
    20         Martin Walser (martin@vercingetorix)
       
    21 
       
    22     [instance variables:]
       
    23 
       
    24     [class variables:]
       
    25 
       
    26     [see also:]
       
    27 
       
    28 "
       
    29 !
       
    30 
       
    31 examples
       
    32 "
       
    33   Starting the application:
       
    34                                                                 [exBegin]
       
    35     FileDialog open
       
    36 
       
    37                                                                 [exEnd]
       
    38 
       
    39   more examples to be added:
       
    40                                                                 [exBegin]
       
    41     ... add code fragment for 
       
    42     ... executable example here ...
       
    43                                                                 [exEnd]
       
    44 "
       
    45 !
       
    46 
       
    47 history
       
    48     "Created: / 19.9.2002 / 13:05:28 / martin"
       
    49 ! !
       
    50 
       
    51 !FileDialog class methodsFor:'instance creation'!
       
    52 
       
    53 requestDirectoryName:title default:aFileName ifFail:failBlock
       
    54     "same as requestFileName, but only show directories"
       
    55 
       
    56     ^ self  requestDirectoryName:title 
       
    57             default:aFileName 
       
    58             ok:nil 
       
    59             abort:nil 
       
    60             version:nil 
       
    61             pattern:nil 
       
    62             fromDirectory:nil 
       
    63             ifFail:failBlock 
       
    64             whenBoxCreatedEvaluate:nil.
       
    65 
       
    66     "
       
    67      Dialog
       
    68         requestDirectoryName:'which directory ?' 
       
    69         default:'/etc'
       
    70         ifFail:'none'
       
    71     "
       
    72 !
       
    73 
       
    74 requestDirectoryName:title default:aFileName ok:okText abort:abortText version:versionSymbol pattern:pattern fromDirectory:aDirectoryPath ifFail:failBlock whenBoxCreatedEvaluate:boxCreatedCallback
       
    75     "same as requestFileName, but only show directories"
       
    76 
       
    77     |enteredFileName instance defaultNm defaultDir enteredFileNameString defaultFile|
       
    78 
       
    79     defaultNm := aFileName.
       
    80     defaultDir := aDirectoryPath.
       
    81     defaultDir isNil ifTrue:[
       
    82         defaultNm notNil ifTrue:[
       
    83             defaultDir := defaultNm asFilename directory.
       
    84         ] ifFalse:[
       
    85             defaultDir := FileSelectionBox lastFileSelectionDirectory.
       
    86             defaultDir isNil ifTrue:[
       
    87                 defaultDir := Filename currentDirectory asAbsoluteFilename.        
       
    88             ].
       
    89         ]
       
    90     ].
       
    91     defaultDir := defaultDir asFilename.
       
    92     [defaultDir exists not] whileTrue:[
       
    93         defaultDir := defaultDir directory.
       
    94     ].
       
    95     defaultNm isNil ifTrue:[
       
    96         defaultFile := defaultDir.
       
    97     ] ifFalse:[
       
    98         defaultFile := defaultNm asFilename.
       
    99     ].
       
   100     instance := self new.
       
   101 "/    defaultDir notNil ifTrue:[instance directory:(defaultDir asFilename)].
       
   102     defaultDir notNil ifTrue:[instance directory:defaultFile].
       
   103     instance startFilename:defaultFile.
       
   104     instance initialText:title.
       
   105     instance pattern:((pattern isNil or:[pattern isEmpty]) ifTrue:['*'] ifFalse:[pattern]).
       
   106     instance okLabelHolder value:okText.
       
   107     instance cancelLabelHolder value:abortText.
       
   108     instance viewFiles:false.
       
   109 
       
   110     instance allButOpenInterface:#windowSpec.
       
   111     boxCreatedCallback notNil ifTrue:[boxCreatedCallback value:instance].
       
   112     instance openWindowModal.
       
   113 
       
   114     enteredFileNameString := instance result.
       
   115     enteredFileNameString isNil ifTrue:[
       
   116         ^ failBlock value
       
   117     ].
       
   118     enteredFileName := enteredFileNameString asFilename.
       
   119     enteredFileNameString := enteredFileName asString.
       
   120     (enteredFileName notNil 
       
   121     and:[enteredFileNameString notEmpty]) ifTrue:[
       
   122         versionSymbol isNil ifTrue:[ ^ enteredFileNameString].
       
   123         versionSymbol == #mustBeNew ifTrue:[
       
   124             "/ file may not exist
       
   125             enteredFileName exists ifTrue:[^ ''].
       
   126         ].
       
   127         versionSymbol == #new ifTrue:[
       
   128             "/ file may not exist
       
   129             enteredFileName exists ifTrue:[
       
   130                 (Dialog confirm:(self classResources string:'''%1'' exists.\\Continue anyway ?' with:enteredFileNameString) withCRs)
       
   131                     ifFalse:[^ ''].
       
   132             ].
       
   133         ].
       
   134         versionSymbol == #mustBeOld ifTrue:[
       
   135             enteredFileName exists ifFalse:[^ ''].
       
   136         ].
       
   137         versionSymbol == #old ifTrue:[
       
   138             "/ file may not exist
       
   139             enteredFileName exists ifFalse:[
       
   140                 (self confirm:(self classResources string:'''%1'' does not exist yet.\\Continue anyway ?' with:enteredFileNameString) withCRs)
       
   141                 ifFalse:[^ ''].
       
   142             ].
       
   143         ].
       
   144         FileSelectionBox lastFileSelectionDirectory:(enteredFileNameString).
       
   145     ].
       
   146     ^ enteredFileNameString
       
   147 
       
   148     "
       
   149      FileDialog
       
   150         requestDirectoryName:'which directory ?' 
       
   151         default:'/etc'
       
   152         ifFail:nil
       
   153     "
       
   154 !
       
   155 
       
   156 requestFileName:titleString default:defaultName ok:okText abort:abortText pattern:pattern fromDirectory:aDirectoryPathOrNil whenBoxCreatedEvaluate:boxCreatedCallback
       
   157 
       
   158     ^ self  requestFileName:titleString 
       
   159             default:defaultName 
       
   160             ok:okText 
       
   161             abort:abortText 
       
   162             version:nil 
       
   163             ifFail:nil 
       
   164             pattern:pattern 
       
   165             fromDirectory:aDirectoryPathOrNil 
       
   166             whenBoxCreatedEvaluate:boxCreatedCallback
       
   167 !
       
   168 
       
   169 requestFileName:titleString default:defaultName ok:okText abort:abortText version:versionSymbol ifFail:failBlock pattern:pattern fromDirectory:aDirectoryPath whenBoxCreatedEvaluate:boxCreatedCallback
       
   170     "launch a Dialog, which allows user to enter a filename.
       
   171      The files presented initially are those in aDirectoryPathOrNil, or the
       
   172      last fileBox directory (default: current directory) (if a nil path is given).
       
   173      The box will show okText in its okButton, abortText in the abortButton.
       
   174      The matchPattern is set to pattern initially.
       
   175      Return the string, or nil if cancel was pressed
       
   176      The version argument allows validation of the files existance;
       
   177      it may be any of:
       
   178         #mustBeNew      - fail (return empty string) if the file exists
       
   179         #new            - confirm if the file exists
       
   180         #mustBeOld      - fail if the file does not exist
       
   181         #old            - confirm if the file does not exist
       
   182         #any (other)    - no validation
       
   183     "
       
   184 
       
   185 
       
   186     | defaultDir defaultNm instance enteredFileName enteredFileNameString defaultFile|
       
   187 
       
   188     defaultNm := defaultName.
       
   189     defaultDir := aDirectoryPath.
       
   190     defaultDir isNil ifTrue:[
       
   191         defaultDir := FileSelectionBox lastFileSelectionDirectory.
       
   192         defaultDir isNil ifTrue:[
       
   193             defaultDir := Filename currentDirectory asAbsoluteFilename.        
       
   194         ].
       
   195     ].
       
   196     defaultDir := defaultDir asFilename.
       
   197     [defaultDir exists not] whileTrue:[
       
   198         defaultDir := defaultDir directory.
       
   199     ].
       
   200     (defaultName notNil and:[defaultName asFilename withoutSuffix baseName ~= '*']) ifTrue:[
       
   201         defaultFile := defaultDir construct:defaultName.
       
   202     ] ifFalse:[
       
   203         defaultFile := defaultDir.
       
   204     ].
       
   205     instance := self new.
       
   206     defaultDir notNil ifTrue:[instance directory:(defaultDir asFilename)].
       
   207     instance startFilename:defaultFile.
       
   208     instance pattern:((pattern isNil or:[pattern isEmpty]) ifTrue:['*'] ifFalse:[pattern]).
       
   209     instance initialText:titleString.
       
   210     instance okLabelHolder value:okText.
       
   211     instance cancelLabelHolder value:abortText.
       
   212     instance viewFiles:true.
       
   213 
       
   214     instance allButOpenInterface:#windowSpec.
       
   215     boxCreatedCallback notNil ifTrue:[boxCreatedCallback value:instance].
       
   216     instance openWindowModal.
       
   217 
       
   218     enteredFileNameString := instance result.
       
   219     enteredFileNameString isNil ifTrue:[
       
   220         ^ failBlock value
       
   221     ].
       
   222     enteredFileName := enteredFileNameString asFilename.
       
   223     enteredFileNameString := enteredFileName asString.
       
   224     (enteredFileName notNil 
       
   225     and:[enteredFileNameString notEmpty]) ifTrue:[
       
   226         versionSymbol isNil ifTrue:[ ^ enteredFileNameString].
       
   227         versionSymbol == #mustBeNew ifTrue:[
       
   228             "/ file may not exist
       
   229             enteredFileName exists ifTrue:[^ ''].
       
   230         ].
       
   231         versionSymbol == #new ifTrue:[
       
   232             "/ file may not exist
       
   233             enteredFileName exists ifTrue:[
       
   234                 (Dialog confirm:(self classResources string:'''%1'' exists.\\Continue anyway ?' with:enteredFileNameString) withCRs)
       
   235                     ifFalse:[^ ''].
       
   236             ].
       
   237         ].
       
   238         versionSymbol == #mustBeOld ifTrue:[
       
   239             enteredFileName exists ifFalse:[^ ''].
       
   240         ].
       
   241         versionSymbol == #old ifTrue:[
       
   242             "/ file may not exist
       
   243             enteredFileName exists ifFalse:[
       
   244                 (self confirm:(self classResources string:'''%1'' does not exist yet.\\Continue anyway ?' with:enteredFileNameString) withCRs)
       
   245                 ifFalse:[^ ''].
       
   246             ].
       
   247         ].
       
   248         FileSelectionBox lastFileSelectionDirectory:(enteredFileName directoryName).
       
   249     ].
       
   250     ^ enteredFileNameString
       
   251 !
       
   252 
       
   253 requestFileName:titleString default:defaultName version:versionSymbol ifFail:failBlock pattern:pattern fromDirectory:aDirectoryPathOrNil whenBoxCreatedEvaluate:boxCreatedCallback
       
   254 
       
   255     ^ self  requestFileName:titleString 
       
   256             default:defaultName 
       
   257             ok:nil 
       
   258             abort:nil 
       
   259             version:versionSymbol 
       
   260             ifFail:failBlock 
       
   261             pattern:pattern 
       
   262             fromDirectory:aDirectoryPathOrNil 
       
   263             whenBoxCreatedEvaluate:boxCreatedCallback
       
   264 
       
   265     "
       
   266      FileDialog 
       
   267         requestFileName:'enter a fileName:'
       
   268         default:''
       
   269         version:nil
       
   270         ifFail:['none']
       
   271         pattern:'*.conf'
       
   272         fromDirectory:'/etc'
       
   273         whenBoxCreatedEvaluate:nil.
       
   274      Dialog 
       
   275         requestFileName:'enter a fileName:'
       
   276         default:''
       
   277         version:nil
       
   278         ifFail:['none']
       
   279         pattern:'*.conf'
       
   280         fromDirectory:'/etc'
       
   281         whenBoxCreatedEvaluate:nil
       
   282     "
       
   283     "
       
   284      FileDialog
       
   285         requestFileName:'enter a fileName:'
       
   286         default:''
       
   287         version:#old 
       
   288         ifFail:['none']   
       
   289         pattern:'*.conf'
       
   290         fromDirectory:'/etc'
       
   291         whenBoxCreatedEvaluate:nil
       
   292     "
       
   293     "
       
   294      FileDialog
       
   295         requestFileName:'enter a fileName:'
       
   296         default:''
       
   297         version:#mustBeNew 
       
   298         ifFail:['none']   
       
   299         pattern:'*.conf'
       
   300         fromDirectory:'/etc'
       
   301         whenBoxCreatedEvaluate:nil
       
   302     "
       
   303 ! !
       
   304 
       
   305 !FileDialog class methodsFor:'accessing'!
       
   306 
       
   307 lastFileSelectionDirectory
       
   308     "return the name of the directory used in the previous
       
   309      fileSelection dialog. This will be used as default for the next dialog,
       
   310      if no explicit path is specified (see requestFileName:* methods)"
       
   311 
       
   312     |f|
       
   313 
       
   314     LastFileSelectionDirectory notNil ifTrue:[
       
   315         ((f := LastFileSelectionDirectory asFilename) exists 
       
   316         and:[f isDirectory]) ifFalse:[
       
   317             LastFileSelectionDirectory := nil.
       
   318         ]
       
   319     ].
       
   320     ^ LastFileSelectionDirectory
       
   321 !
       
   322 
       
   323 lastFileSelectionDirectory:aDirectoryString
       
   324     "set the name of the directory used in the previous
       
   325      fileSelection dialog. This will be used as default for the next dialog,
       
   326      if no explicit path is specified (see requestFileName:* methods)"
       
   327 
       
   328     LastFileSelectionDirectory := aDirectoryString
       
   329 ! !
       
   330 
       
   331 !FileDialog class methodsFor:'interface specs'!
       
   332 
       
   333 windowSpec
       
   334     "This resource specification was automatically generated
       
   335      by the UIPainter of ST/X."
       
   336 
       
   337     "Do not manually edit this!! If it is corrupted,
       
   338      the UIPainter may not be able to read the specification."
       
   339 
       
   340     "
       
   341      UIPainter new openOnClass:FileDialog andSelector:#windowSpec
       
   342      FileDialog new openInterface:#windowSpec
       
   343      FileDialog open
       
   344     "
       
   345 
       
   346     <resource: #canvas>
       
   347 
       
   348     ^ 
       
   349      #(#FullSpec
       
   350         #name: #windowSpec
       
   351         #window: 
       
   352        #(#WindowSpec
       
   353           #label: 'FileDialog'
       
   354           #name: 'FileDialog'
       
   355           #min: #(#Point 10 10)
       
   356           #max: #(#Point 1024 768)
       
   357           #bounds: #(#Rectangle 16 42 416 442)
       
   358         )
       
   359         #component: 
       
   360        #(#SpecCollection
       
   361           #collection: #(
       
   362            #(#MenuPanelSpec
       
   363               #name: 'ToolBar1'
       
   364               #layout: #(#LayoutFrame 0 0.0 0 0.0 0 1.0 30 0)
       
   365               #tabable: true
       
   366               #menu: #toolBarMenu
       
   367               #textDefault: true
       
   368             )
       
   369            #(#SubCanvasSpec
       
   370               #name: 'DirectoryTreeBrowser'
       
   371               #layout: #(#LayoutFrame 0 0.0 30 0 0 1.0 -107 1)
       
   372               #tabable: true
       
   373               #hasHorizontalScrollBar: false
       
   374               #hasVerticalScrollBar: false
       
   375               #majorKey: #DirectoryTreeBrowser
       
   376               #createNewApplication: true
       
   377               #createNewBuilder: true
       
   378               #postBuildCallback: #postBuildTreeBrowser:
       
   379             )
       
   380            #(#LabelSpec
       
   381               #label: 'Filename:'
       
   382               #name: 'FilenameLabel'
       
   383               #layout: #(#LayoutFrame 3 0 -97 1 73 0 -77 1)
       
   384               #translateLabel: true
       
   385               #adjust: #left
       
   386             )
       
   387            #(#FilenameInputFieldSpec
       
   388               #name: 'FilenameEntryField'
       
   389               #layout: #(#LayoutFrame 70 0 -96 1 -10 1 -76 1)
       
   390               #tabable: true
       
   391               #model: #filenameHolder
       
   392               #acceptOnPointerLeave: false
       
   393               #postBuildCallback: #postBuildFileNameField:
       
   394             )
       
   395            #(#LabelSpec
       
   396               #label: 'Filter:'
       
   397               #name: 'FilterLabel'
       
   398               #layout: #(#LayoutFrame 3 0 -70 1 67 0 -50 1)
       
   399               #translateLabel: true
       
   400               #adjust: #left
       
   401             )
       
   402            #(#InputFieldSpec
       
   403               #name: 'FilterEntryField'
       
   404               #layout: #(#LayoutFrame 70 0 -69 1 -10 1 -49 1)
       
   405               #model: #filterHolder
       
   406               #immediateAccept: true
       
   407               #acceptOnReturn: true
       
   408               #acceptOnTab: true
       
   409               #acceptOnLostFocus: true
       
   410               #acceptOnPointerLeave: false
       
   411               #postBuildCallback: #postBuildFilterField:
       
   412             )
       
   413            #(#HorizontalPanelViewSpec
       
   414               #name: 'ButtonPanel'
       
   415               #layout: #(#LayoutFrame 0 0.0 -40 1 0 1 0 1)
       
   416               #horizontalLayout: #spreadSpace
       
   417               #verticalLayout: #center
       
   418               #horizontalSpace: 3
       
   419               #verticalSpace: 3
       
   420               #reverseOrderIfOKAtLeft: true
       
   421               #component: 
       
   422              #(#SpecCollection
       
   423                 #collection: #(
       
   424                  #(#ActionButtonSpec
       
   425                     #label: 'Cancel'
       
   426                     #name: 'cancelButton'
       
   427                     #translateLabel: true
       
   428                     #labelChannel: #cancelLabelHolder
       
   429                     #tabable: true
       
   430                     #model: #doCancel
       
   431                     #extent: #(#Point 150 21)
       
   432                   )
       
   433                  #(#ActionButtonSpec
       
   434                     #label: 'OK'
       
   435                     #name: 'okButton'
       
   436                     #translateLabel: true
       
   437                     #labelChannel: #okLabelHolder
       
   438                     #tabable: true
       
   439                     #model: #doAccept
       
   440                     #isDefault: true
       
   441                     #extent: #(#Point 150 22)
       
   442                   )
       
   443                  )
       
   444                
       
   445               )
       
   446             )
       
   447            )
       
   448          
       
   449         )
       
   450       )
       
   451 ! !
       
   452 
       
   453 !FileDialog class methodsFor:'menu specs'!
       
   454 
       
   455 toolBarMenu
       
   456     "This resource specification was automatically generated
       
   457      by the MenuEditor of ST/X."
       
   458 
       
   459     "Do not manually edit this!! If it is corrupted,
       
   460      the MenuEditor may not be able to read the specification."
       
   461 
       
   462     "
       
   463      MenuEditor new openOnClass:FileDialog andSelector:#toolBarMenu
       
   464      (Menu new fromLiteralArrayEncoding:(FileDialog toolBarMenu)) startUp
       
   465     "
       
   466 
       
   467     <resource: #menu>
       
   468 
       
   469     ^ 
       
   470      #(#Menu
       
   471         #(
       
   472          #(#MenuItem
       
   473             #label: 'DirectoryUp'
       
   474             #translateLabel: true
       
   475             #isButton: true
       
   476             #value: #doGoDirectoryUp
       
   477             #activeHelpKey: #directoryUp
       
   478             #enabled: #enableDirectoryUp
       
   479             #labelImage: #(#ResourceRetriever #AbstractFileBrowser #upArrow20x20Icon)
       
   480           )
       
   481          #(#MenuItem
       
   482             #label: '-'
       
   483           )
       
   484          #(#MenuItem
       
   485             #label: 'Back'
       
   486             #translateLabel: true
       
   487             #isButton: true
       
   488             #value: #doBack
       
   489             #activeHelpKey: #directoryBack
       
   490             #enabled: #enableBack
       
   491             #submenuChannel: #menuDirHistoryBack
       
   492             #labelImage: #(#ResourceRetriever #AbstractFileBrowser #leftArrow20x20PlusMenuIcon)
       
   493           )
       
   494          #(#MenuItem
       
   495             #label: '-'
       
   496           )
       
   497          #(#MenuItem
       
   498             #label: 'Forward'
       
   499             #translateLabel: true
       
   500             #isButton: true
       
   501             #value: #doForward
       
   502             #activeHelpKey: #directoryForward
       
   503             #submenuChannel: #menuDirHistoryForward
       
   504             #enabled: #enableForward
       
   505             #labelImage: #(#ResourceRetriever #AbstractFileBrowser #rightArrowPlusMenu20x20Icon)
       
   506           )
       
   507          #(#MenuItem
       
   508             #label: '-'
       
   509           )
       
   510          #(#MenuItem
       
   511             #label: 'Home'
       
   512             #translateLabel: true
       
   513             #isButton: true
       
   514             #value: #doGotoHomeDirectory
       
   515             #activeHelpKey: #fileHome
       
   516             #enabled: #enableHome
       
   517             #labelImage: #(#ResourceRetriever #AbstractFileBrowser #goHomeIcon)
       
   518           )
       
   519          )
       
   520         nil
       
   521         nil
       
   522       )
       
   523 ! !
       
   524 
       
   525 !FileDialog methodsFor:'accessing'!
       
   526 
       
   527 directory
       
   528     "return the value of the instance variable 'directory' (automatically generated)"
       
   529 
       
   530     ^ directory
       
   531 !
       
   532 
       
   533 directory:something
       
   534     "set the value of the instance variable 'directory' (automatically generated)"
       
   535 
       
   536     directory := something.
       
   537 !
       
   538 
       
   539 initialText
       
   540     "return the value of the instance variable 'initialText' (automatically generated)"
       
   541 
       
   542     ^ initialText
       
   543 !
       
   544 
       
   545 initialText:something
       
   546     "set the value of the instance variable 'initialText' (automatically generated)"
       
   547 
       
   548     initialText := something.
       
   549 !
       
   550 
       
   551 pattern
       
   552     "return the value of the instance variable 'pattern' (automatically generated)"
       
   553 
       
   554     ^ pattern
       
   555 !
       
   556 
       
   557 pattern:something
       
   558     "set the value of the instance variable 'pattern' (automatically generated)"
       
   559 
       
   560     pattern := something.
       
   561 !
       
   562 
       
   563 result
       
   564     "return the value of the instance variable 'result' (automatically generated)"
       
   565 
       
   566     ^ result
       
   567 !
       
   568 
       
   569 result:something
       
   570     "set the value of the instance variable 'result' (automatically generated)"
       
   571 
       
   572     result := something.
       
   573 !
       
   574 
       
   575 startFilename
       
   576     "return the value of the instance variable 'startFilename' (automatically generated)"
       
   577 
       
   578     startFilename isNil ifTrue:[
       
   579         startFilename := Filename currentDirectory asAbsoluteFilename.
       
   580     ].
       
   581     ^ startFilename
       
   582 !
       
   583 
       
   584 startFilename:something
       
   585     "set the value of the instance variable 'startFilename' (automatically generated)"
       
   586 
       
   587     startFilename := something.
       
   588 !
       
   589 
       
   590 viewFiles
       
   591     "return the value of the instance variable 'viewFiles' (automatically generated)"
       
   592 
       
   593     ^ viewFiles
       
   594 !
       
   595 
       
   596 viewFiles:something
       
   597     "set the value of the instance variable 'viewFiles' (automatically generated)"
       
   598 
       
   599     viewFiles := something.
       
   600 ! !
       
   601 
       
   602 !FileDialog methodsFor:'aspects'!
       
   603 
       
   604 cancelLabelHolder
       
   605     "automatically generated by UIPainter ..."
       
   606 
       
   607     "*** the code below creates a default model when invoked."
       
   608     "*** (which may not be the one you wanted)"
       
   609     "*** Please change as required and accept it in the browser."
       
   610     "*** (and replace this comment by something more useful ;-)"
       
   611 
       
   612     cancelLabelHolder isNil ifTrue:[
       
   613         cancelLabelHolder := 'Cancel' asValue.
       
   614     ].
       
   615     ^ cancelLabelHolder.
       
   616 !
       
   617 
       
   618 enableBack
       
   619     "Return a value holder for the input string.
       
   620     "
       
   621     enableBack isNil ifTrue:[
       
   622         enableBack := treeBrowser enableBack.
       
   623     ].
       
   624     ^ enableBack
       
   625 !
       
   626 
       
   627 enableDirectoryUp
       
   628 
       
   629     enableDirectoryUp isNil ifTrue:[
       
   630         enableDirectoryUp := treeBrowser enableDirectoryUp.
       
   631     ].
       
   632     ^ enableDirectoryUp
       
   633 !
       
   634 
       
   635 enableForward
       
   636     "Return a value holder for the input string.
       
   637     "
       
   638     enableForward isNil ifTrue:[
       
   639         enableForward := treeBrowser enableForward.
       
   640     ].
       
   641     ^ enableForward
       
   642 !
       
   643 
       
   644 enableHome
       
   645     "Return a value holder for the input string.
       
   646     "
       
   647     enableHome isNil ifTrue:[
       
   648         enableHome := treeBrowser enableHome.
       
   649     ].
       
   650     ^ enableHome
       
   651 !
       
   652 
       
   653 filenameHolder
       
   654     "Return a value holder with the filename.
       
   655      Shown in the filename input-field.
       
   656      Being the selection in the tree.
       
   657     "
       
   658     |holder|
       
   659     holder := builder bindingAt:#filenameHolder.
       
   660 
       
   661     holder ifNil:[
       
   662         holder := ValueHolder new.
       
   663         holder addDependent:self.
       
   664         builder aspectAt:#filenameHolder 
       
   665                      put:holder.
       
   666     ].
       
   667 
       
   668     ^ holder.
       
   669 !
       
   670 
       
   671 filterHolder
       
   672     "Return a value holder for the input string.
       
   673     "
       
   674 
       
   675     filterHolder isNil ifTrue:[
       
   676         filterHolder := treeBrowser filterModel.
       
   677         self pattern notNil ifTrue:[
       
   678             filterHolder value:pattern.
       
   679         ]
       
   680     ].
       
   681     ^ filterHolder
       
   682 !
       
   683 
       
   684 okLabelHolder
       
   685     "automatically generated by UIPainter ..."
       
   686 
       
   687     "*** the code below creates a default model when invoked."
       
   688     "*** (which may not be the one you wanted)"
       
   689     "*** Please change as required and accept it in the browser."
       
   690     "*** (and replace this comment by something more useful ;-)"
       
   691 
       
   692     okLabelHolder isNil ifTrue:[
       
   693         okLabelHolder := 'OK' asValue.
       
   694     ].
       
   695     ^ okLabelHolder.
       
   696 ! !
       
   697 
       
   698 !FileDialog methodsFor:'change & update'!
       
   699 
       
   700 update:something with:aParameter from:changedObject
       
   701     "Invoked when an object that I depend upon sends a change notification."
       
   702 
       
   703     "stub code automatically generated - please change as required"
       
   704 
       
   705     changedObject == treeBrowser currentFileNameHolder ifTrue:[
       
   706         | files newDir|
       
   707         files := treeBrowser currentFileNameHolder value.
       
   708 
       
   709         (files isEmpty) ifTrue:[
       
   710             self filenameHolder value:nil withoutNotifying:self.
       
   711             treeBrowser hasSelection value:false.
       
   712         ] ifFalse:[
       
   713             treeBrowser hasSelection value:true.
       
   714             files size == 1 ifTrue:[
       
   715                 self filenameHolder value:(files first) withoutNotifying:self.    
       
   716             ] ifFalse:[
       
   717                 self filenameHolder value:'' withoutNotifying:self.
       
   718             ].
       
   719         ].
       
   720     ].
       
   721     changedObject == self filenameHolder ifTrue:[
       
   722         (changedObject value asFilename exists not) ifTrue:[^ self].
       
   723         treeBrowser currentFileNameHolder value:(OrderedCollection with:(changedObject value asFilename)) withoutNotifying:self.
       
   724     ].
       
   725     changedObject == treeBrowser enableBack ifTrue:[
       
   726         self enableBack value:changedObject value.
       
   727         ^ self.
       
   728     ].
       
   729     changedObject == treeBrowser enableForward ifTrue:[
       
   730         self enableForward value:changedObject value.
       
   731         ^ self.
       
   732     ].
       
   733     changedObject == treeBrowser enableHome ifTrue:[
       
   734         self enableHome value:changedObject value.
       
   735         ^ self.
       
   736     ].
       
   737     changedObject == treeBrowser enableDirectoryUp ifTrue:[
       
   738         self enableDirectoryUp value:changedObject value.
       
   739         ^ self.
       
   740     ].
       
   741     ^ super update:something with:aParameter from:changedObject
       
   742 ! !
       
   743 
       
   744 !FileDialog methodsFor:'event handling'!
       
   745 
       
   746 processEvent:anEvent
       
   747     "filter keyboard events.
       
   748      Return true, if I have eaten the event"
       
   749 
       
   750     |focusView key rawKey|
       
   751 
       
   752     anEvent isKeyPressEvent ifTrue:[
       
   753         focusView := anEvent targetView.
       
   754         key := anEvent key.
       
   755         rawKey := anEvent rawKey.
       
   756 
       
   757         (focusView == filterField) ifTrue:[
       
   758             ^ false.
       
   759         ].
       
   760         (focusView == filenameField) ifTrue:[
       
   761             ^ false.
       
   762         ].
       
   763     ].
       
   764     ^ false
       
   765 ! !
       
   766 
       
   767 !FileDialog methodsFor:'initialization & release'!
       
   768 
       
   769 postBuildFileNameField:aWidget
       
   770 
       
   771     filenameField := aWidget.
       
   772 !
       
   773 
       
   774 postBuildFilterField:aWidget
       
   775 
       
   776     filterField := aWidget.
       
   777 !
       
   778 
       
   779 postBuildTreeBrowser:aSubCanvasView
       
   780 
       
   781     treeBrowser := aSubCanvasView client.
       
   782 !
       
   783 
       
   784 postBuildWith:aBuilder
       
   785     "This is a hook method generated by the Browser.
       
   786      It will be invoked during the initialization of your app/dialog,
       
   787      after all of the visual components have been built, 
       
   788      but BEFORE the top window is made visible.
       
   789      Add any app-specific actions here (reading files, setting up values etc.)
       
   790      See also #postOpenWith:, which is invoked after opening."
       
   791 
       
   792     "/ add any code here ...
       
   793 
       
   794     ^ super postBuildWith:aBuilder
       
   795 !
       
   796 
       
   797 postOpenWith:aBuilder
       
   798     "This is a hook method generated by the Browser.
       
   799      It will be invoked right after the applications window has been opened.
       
   800      Add any app-specific actions here (starting background processes etc.).
       
   801      See also #postBuildWith:, which is invoked before opening."
       
   802 
       
   803     "/ add any code here ...
       
   804     
       
   805 
       
   806 "/     self windowGroup addPreEventHook:self.
       
   807     treeBrowser currentFileNameHolder addDependent:self.
       
   808     treeBrowser enableBack addDependent:self.
       
   809     treeBrowser enableForward addDependent:self.
       
   810     treeBrowser enableHome addDependent:self.
       
   811     treeBrowser enableDirectoryUp addDependent:self.
       
   812     treeBrowser setNewRoot:((self directory) ? (Filename currentDirectory asAbsoluteFilename)).
       
   813     treeBrowser viewFilesInDirectoryTree value:(viewFiles ? true).
       
   814     treeBrowser currentFileNameHolder value:(OrderedCollection with:(self startFilename)).
       
   815     self filenameHolder value:(self startFilename asString).
       
   816     self window label:(self initialText) ? 'File Dialog'.
       
   817     ^ super postOpenWith:aBuilder
       
   818 ! !
       
   819 
       
   820 !FileDialog methodsFor:'user actions'!
       
   821 
       
   822 doAccept
       
   823     "force accept - ignore in filterField"
       
   824 
       
   825     |ev|
       
   826 
       
   827     ev := self windowGroup lastEvent.
       
   828     (ev notNil 
       
   829     and:[ev isKeyEvent 
       
   830     and:[ev key == #Return
       
   831     and:[(   ev targetView isSameOrComponentOf:filterField) 
       
   832          or:[ev targetView isSameOrComponentOf:filenameField]]]]) ifTrue:[
       
   833         ^ self
       
   834     ].
       
   835     self result:(self filenameHolder value).
       
   836 
       
   837     ^ super doAccept
       
   838 !
       
   839 
       
   840 doBack
       
   841 
       
   842     treeBrowser doBack.
       
   843 !
       
   844 
       
   845 doCancel
       
   846 
       
   847     self result:nil.
       
   848     ^ super doCancel.
       
   849 !
       
   850 
       
   851 doForward
       
   852 
       
   853     treeBrowser doForward.
       
   854 !
       
   855 
       
   856 doGoDirectoryUp
       
   857 
       
   858     treeBrowser doGoDirectoryUp.
       
   859 !
       
   860 
       
   861 doGotoHomeDirectory
       
   862 
       
   863     treeBrowser doGotoHomeDirectory.
       
   864 !
       
   865 
       
   866 menuDirHistory:backOrForward
       
   867 
       
   868     ^ treeBrowser menuDirHistory:backOrForward.
       
   869 !
       
   870 
       
   871 menuDirHistoryBack
       
   872 
       
   873     ^ treeBrowser menuDirHistory:#back.
       
   874 !
       
   875 
       
   876 menuDirHistoryForward
       
   877 
       
   878     ^ treeBrowser menuDirHistory:#forward.
       
   879 ! !
       
   880 
       
   881 !FileDialog class methodsFor:'documentation'!
       
   882 
       
   883 version
       
   884     ^ '$Header: /cvs/stx/stx/libtool/FileDialog.st,v 1.1 2002-09-25 08:00:23 penk Exp $'
       
   885 ! !