OSDN Git Service

touched all tk files to ease next import
[pf3gnuchains/pf3gnuchains4x.git] / tk / library / xmfbox.tcl
index e4d4aee..67ec667 100644 (file)
@@ -4,13 +4,16 @@
 #      Unix platform. This implementation is used only if the
 #      "tk_strictMotif" flag is set.
 #
-# SCCS: @(#) xmfbox.tcl 1.6 97/10/01 15:06:07
+# RCS: @(#) $Id$
 #
 # Copyright (c) 1996 Sun Microsystems, Inc.
+# Copyright (c) 1998-2000 Scriptics Corporation
 #
 # See the file "license.terms" for information on usage and redistribution
 # of this file, and for a DISCLAIMER OF ALL WARRANTIES.
-#
+
+namespace eval ::tk::dialog {}
+namespace eval ::tk::dialog::file {}
 
 
 # tkMotifFDialog --
 #      Implements a file dialog similar to the standard Motif file
 #      selection box.
 #
-# Return value:
+# Arguments:
+#      type            "open" or "save"
+#      args            Options parsed by the procedure.
 #
+# Results:
 #      A list of two members. The first member is the absolute
 #      pathname of the selected file or "" if user hits cancel. The
 #      second member is the name of the selected file type, or ""
 #      which stands for "default file type"
-#
-proc tkMotifFDialog {args} {
+
+proc tkMotifFDialog {type args} {
     global tkPriv
-    set w __tk_filedialog
-    upvar #0 $w data
+    set dataName __tk_filedialog
+    upvar ::tk::dialog::file::$dataName data
 
-    if {![string compare [lindex [info level 0] 0] tk_getOpenFile]} {
-       set type open
-    } else {
-       set type save
-    }
+    set w [tkMotifFDialog_Create $dataName $type $args]
+
+    # Set a grab and claim the focus too.
+
+    ::tk::SetFocusGrab $w $data(sEnt)
+    $data(sEnt) selection range 0 end
+
+    # Wait for the user to respond, then restore the focus and
+    # return the index of the selected button.  Restore the focus
+    # before deleting the window, since otherwise the window manager
+    # may take the focus away so we can't redirect it.  Finally,
+    # restore any grab that was in effect.
+
+    tkwait variable tkPriv(selectFilePath)
+    ::tk::RestoreFocusGrab $w $data(sEnt) withdraw
+
+    return $tkPriv(selectFilePath)
+}
+
+# tkMotifFDialog_Create --
+#
+#      Creates the Motif file dialog (if it doesn't exist yet) and
+#      initialize the internal data structure associated with the
+#      dialog.
+#
+#      This procedure is used by tkMotifFDialog to create the
+#      dialog. It's also used by the test suite to test the Motif
+#      file dialog implementation. User code shouldn't call this
+#      procedure directly.
+#
+# Arguments:
+#      dataName        Name of the global "data" array for the file dialog.
+#      type            "Save" or "Open"
+#      argList         Options parsed by the procedure.
+#
+# Results:
+#      Pathname of the file dialog.
+
+proc tkMotifFDialog_Create {dataName type argList} {
+    global tkPriv
+    upvar ::tk::dialog::file::$dataName data
 
-    tkMotifFDialog_Config $w $type $args
+    tkMotifFDialog_Config $dataName $type $argList
 
-    if {![string compare $data(-parent) .]} {
-        set w .$w
+    if {[string equal $data(-parent) .]} {
+        set w .$dataName
     } else {
-        set w $data(-parent).$w
+        set w $data(-parent).$dataName
     }
 
     # (re)create the dialog box if necessary
     #
     if {![winfo exists $w]} {
-       tkMotifFDialog_Create $w
+       tkMotifFDialog_BuildUI $w
     } elseif {[string compare [winfo class $w] TkMotifFDialog]} {
        destroy $w
-       tkMotifFDialog_Create $w
+       tkMotifFDialog_BuildUI $w
     } else {
        set data(fEnt) $w.top.f1.ent
        set data(dList) $w.top.f2.a.l
@@ -60,58 +102,35 @@ proc tkMotifFDialog {args} {
        set data(filterBtn) $w.bot.filter
        set data(cancelBtn) $w.bot.cancel
     }
+
     wm transient $w $data(-parent)
 
     tkMotifFDialog_Update $w
 
-    # 5. Withdraw the window, then update all the geometry information
+    # Withdraw the window, then update all the geometry information
     # so we know how big it wants to be, then center the window in the
-    # display and de-iconify it.
-
-    wm withdraw $w
-    update idletasks
-    set x [expr {[winfo screenwidth $w]/2 - [winfo reqwidth $w]/2 \
-           - [winfo vrootx [winfo parent $w]]}]
-    set y [expr {[winfo screenheight $w]/2 - [winfo reqheight $w]/2 \
-           - [winfo vrooty [winfo parent $w]]}]
-    wm geom $w +$x+$y
-    wm deiconify $w
-    wm title $w $data(-title)
-
-    # 6. Set a grab and claim the focus too.
+    # display (Motif style) and de-iconify it.
 
-    set oldFocus [focus]
-    set oldGrab [grab current $w]
-    if {$oldGrab != ""} {
-       set grabStatus [grab status $oldGrab]
-    }
-    grab $w
-    focus $data(sEnt)
-    $data(sEnt) select from 0
-    $data(sEnt) select to   end
-
-    # 7. Wait for the user to respond, then restore the focus and
-    # return the index of the selected button.  Restore the focus
-    # before deleting the window, since otherwise the window manager
-    # may take the focus away so we can't redirect it.  Finally,
-    # restore any grab that was in effect.
+    ::tk::PlaceWindow $w
+    wm title $w $data(-title)
 
-    tkwait variable tkPriv(selectFilePath)
-    catch {focus $oldFocus}
-    grab release $w
-    wm withdraw $w
-    if {$oldGrab != ""} {
-       if {$grabStatus == "global"} {
-           grab -global $oldGrab
-       } else {
-           grab $oldGrab
-       }
-    }
-    return $tkPriv(selectFilePath)
+    return $w
 }
 
-proc tkMotifFDialog_Config {w type argList} {
-    upvar #0 $w data
+# tkMotifFDialog_Config --
+#
+#      Iterates over the optional arguments to determine the option
+#      values for the Motif file dialog; gives default values to
+#      unspecified options.
+#
+# Arguments:
+#      dataName        The name of the global variable in which
+#                      data for the file dialog is stored.
+#      type            "Save" or "Open"
+#      argList         Options parsed by the procedure.
+
+proc tkMotifFDialog_Config {dataName type argList} {
+    upvar ::tk::dialog::file::$dataName data
 
     set data(type) $type
 
@@ -136,10 +155,10 @@ proc tkMotifFDialog_Config {w type argList} {
 
     # 3: parse the arguments
     #
-    tclParseConfigSpec $w $specs "" $argList
+    tclParseConfigSpec ::tk::dialog::file::$dataName $specs "" $argList
 
-    if {![string compare $data(-title) ""]} {
-       if {![string compare $type "open"]} {
+    if {[string equal $data(-title) ""]} {
+       if {[string equal $type "open"]} {
            set data(-title) "Open"
        } else {
            set data(-title) "Save As"
@@ -179,11 +198,21 @@ proc tkMotifFDialog_Config {w type argList} {
     }
 }
 
-proc tkMotifFDialog_Create {w} {
+# tkMotifFDialog_BuildUI --
+#
+#      Builds the UI components of the Motif file dialog.
+#
+# Arguments:
+#      w               Pathname of the dialog to build.
+#
+# Results:
+#      None.
+
+proc tkMotifFDialog_BuildUI {w} {
     set dataName [lindex [split $w .] end]
-    upvar #0 $dataName data
+    upvar ::tk::dialog::file::$dataName data
 
-    # 1: Create the dialog ...
+    # Create the dialog toplevel and internal frames.
     #
     toplevel $w -class TkMotifFDialog
     set top [frame $w.top -relief raised -bd 1]
@@ -235,41 +264,53 @@ proc tkMotifFDialog_Create {w} {
     # The buttons
     #
     set data(okBtn) [button $bot.ok     -text OK     -width 6 -under 0 \
-       -command "tkMotifFDialog_OkCmd $w"]
+       -command [list tkMotifFDialog_OkCmd $w]]
     set data(filterBtn) [button $bot.filter -text Filter -width 6 -under 0 \
-       -command "tkMotifFDialog_FilterCmd $w"]
+       -command [list tkMotifFDialog_FilterCmd $w]]
     set data(cancelBtn) [button $bot.cancel -text Cancel -width 6 -under 0 \
-       -command "tkMotifFDialog_CancelCmd $w"]
+       -command [list tkMotifFDialog_CancelCmd $w]]
 
     pack $bot.ok $bot.filter $bot.cancel -padx 10 -pady 10 -expand yes \
        -side left
 
     # Create the bindings:
     #
-    bind $w <Alt-t> "focus $data(fEnt)"
-    bind $w <Alt-d> "focus $data(dList)"
-    bind $w <Alt-l> "focus $data(fList)"
-    bind $w <Alt-s> "focus $data(sEnt)"
+    bind $w <Alt-t> [list focus $data(fEnt)]
+    bind $w <Alt-d> [list focus $data(dList)]
+    bind $w <Alt-l> [list focus $data(fList)]
+    bind $w <Alt-s> [list focus $data(sEnt)]
 
-    bind $w <Alt-o> "tkButtonInvoke $bot.ok    "
-    bind $w <Alt-f> "tkButtonInvoke $bot.filter"
-    bind $w <Alt-c> "tkButtonInvoke $bot.cancel"
+    bind $w <Alt-o> [list tkButtonInvoke $bot.ok]
+    bind $w <Alt-f> [list tkButtonInvoke $bot.filter]
+    bind $w <Alt-c> [list tkButtonInvoke $bot.cancel]
 
-    bind $data(fEnt) <Return> "tkMotifFDialog_ActivateFEnt $w"
-    bind $data(sEnt) <Return> "tkMotifFDialog_ActivateSEnt $w"
+    bind $data(fEnt) <Return> [list tkMotifFDialog_ActivateFEnt $w]
+    bind $data(sEnt) <Return> [list tkMotifFDialog_ActivateSEnt $w]
 
-    wm protocol $w WM_DELETE_WINDOW "tkMotifFDialog_CancelCmd $w"
+    wm protocol $w WM_DELETE_WINDOW [list tkMotifFDialog_CancelCmd $w]
 }
 
-proc tkMotifFDialog_MakeSList {w f label under cmd} {
+# tkMotifFDialog_MakeSList --
+#
+#      Create a scrolled-listbox and set the keyboard accelerator
+#      bindings so that the list selection follows what the user
+#      types.
+#
+# Arguments:
+#      w               Pathname of the dialog box.
+#      f               Frame widget inside which to create the scrolled
+#                      listbox. This frame widget already exists.
+#      label           The string to display on top of the listbox.
+#      under           Sets the -under option of the label.
+#      cmdPrefix       Specifies procedures to call when the listbox is
+#                      browsed or activated.
+
+proc tkMotifFDialog_MakeSList {w f label under cmdPrefix} {
     label $f.lab -text $label -under $under -anchor w
     listbox $f.l -width 12 -height 5 -selectmode browse -exportselection 0\
-       -xscrollcommand "$f.h set" \
-       -yscrollcommand "$f.v set" 
-    scrollbar $f.v -orient vertical   -takefocus 0 \
-       -command "$f.l yview"
-    scrollbar $f.h -orient horizontal -takefocus 0 \
-       -command "$f.l xview"
+       -xscrollcommand [list $f.h set] -yscrollcommand [list $f.v set]
+    scrollbar $f.v -orient vertical   -takefocus 0 -command [list $f.l yview]
+    scrollbar $f.h -orient horizontal -takefocus 0 -command [list $f.l xview]
     grid $f.lab -row 0 -column 0 -sticky news -rowspan 1 -columnspan 2 \
        -padx 2 -pady 2
     grid $f.l -row 1 -column 0 -rowspan 1 -columnspan 1 -sticky news
@@ -283,29 +324,191 @@ proc tkMotifFDialog_MakeSList {w f label under cmd} {
     # bindings for the listboxes
     #
     set list $f.l
-    bind $list <Up>        "tkMotifFDialog_Browse$cmd $w"
-    bind $list <Down>      "tkMotifFDialog_Browse$cmd $w"
-    bind $list <space>     "tkMotifFDialog_Browse$cmd $w"
-    bind $list <1>         "tkMotifFDialog_Browse$cmd $w"
-    bind $list <B1-Motion> "tkMotifFDialog_Browse$cmd $w"
-    bind $list <Double-1>  "tkMotifFDialog_Activate$cmd $w"
-    bind $list <Return>    "tkMotifFDialog_Browse$cmd $w; tkMotifFDialog_Activate$cmd $w"
-
-    bindtags $list "Listbox $list [winfo toplevel $list] all"
+    bind $list <Up>            [list tkMotifFDialog_Browse$cmdPrefix $w]
+    bind $list <Down>          [list tkMotifFDialog_Browse$cmdPrefix $w]
+    bind $list <space>         [list tkMotifFDialog_Browse$cmdPrefix $w]
+    bind $list <1>             [list tkMotifFDialog_Browse$cmdPrefix $w]
+    bind $list <B1-Motion>     [list tkMotifFDialog_Browse$cmdPrefix $w]
+    bind $list <Double-ButtonRelease-1> \
+           [list tkMotifFDialog_Activate$cmdPrefix $w]
+    bind $list <Return>    "tkMotifFDialog_Browse$cmdPrefix [list $w]; \
+           tkMotifFDialog_Activate$cmdPrefix [list $w]"
+
+    bindtags $list [list Listbox $list [winfo toplevel $list] all]
     tkListBoxKeyAccel_Set $list
 
     return $f.l
 }
 
+# tkMotifFDialog_InterpFilter --
+#
+#      Interpret the string in the filter entry into two components:
+#      the directory and the pattern. If the string is a relative
+#      pathname, give a warning to the user and restore the pattern
+#      to original.
+#
+# Arguments:
+#      w               pathname of the dialog box.
+#
+# Results:
+#      A list of two elements. The first element is the directory
+#      specified # by the filter. The second element is the filter
+#      pattern itself.
+
+proc tkMotifFDialog_InterpFilter {w} {
+    upvar ::tk::dialog::file::[winfo name $w] data
+
+    set text [string trim [$data(fEnt) get]]
+
+    # Perform tilde substitution
+    #
+    set badTilde 0
+    if {[string equal [string index $text 0] ~]} {
+       set list [file split $text]
+       set tilde [lindex $list 0]
+       if {[catch {set tilde [glob $tilde]}]} {
+           set badTilde 1
+       } else {
+           set text [eval file join [concat $tilde [lrange $list 1 end]]]
+       }
+    }
+
+    # If the string is a relative pathname, combine it
+    # with the current selectPath.
+
+    set relative 0
+    if {[string equal [file pathtype $text] "relative"]} {
+       set relative 1
+    } elseif {$badTilde} {
+       set relative 1  
+    }
+
+    if {$relative} {
+       tk_messageBox -icon warning -type ok \
+           -message "\"$text\" must be an absolute pathname"
+
+       $data(fEnt) delete 0 end
+       $data(fEnt) insert 0 [::tk::dialog::file::JoinFile $data(selectPath) \
+               $data(filter)]
+
+       return [list $data(selectPath) $data(filter)]
+    }
+
+    set resolved [::tk::dialog::file::JoinFile [file dirname $text] [file tail $text]]
+
+    if {[file isdirectory $resolved]} {
+       set dir $resolved
+       set fil $data(filter)
+    } else {
+       set dir [file dirname $resolved]
+       set fil [file tail    $resolved]
+    }
+
+    return [list $dir $fil]
+}
+
+# tkMotifFDialog_Update
+#
+#      Load the files and synchronize the "filter" and "selection" fields
+#      boxes.
+#
+# Arguments:
+#      w               pathname of the dialog box.
+#
+# Results:
+#      None.
+
+proc tkMotifFDialog_Update {w} {
+    upvar ::tk::dialog::file::[winfo name $w] data
+
+    $data(fEnt) delete 0 end
+    $data(fEnt) insert 0 [::tk::dialog::file::JoinFile $data(selectPath) $data(filter)]
+    $data(sEnt) delete 0 end
+    $data(sEnt) insert 0 [::tk::dialog::file::JoinFile $data(selectPath) \
+           $data(selectFile)]
+    tkMotifFDialog_LoadFiles $w
+}
+
+# tkMotifFDialog_LoadFiles --
+#
+#      Loads the files and directories into the two listboxes according
+#      to the filter setting.
+#
+# Arguments:
+#      w               pathname of the dialog box.
+#
+# Results:
+#      None.
+
+proc tkMotifFDialog_LoadFiles {w} {
+    upvar ::tk::dialog::file::[winfo name $w] data
+
+    $data(dList) delete 0 end
+    $data(fList) delete 0 end
+
+    set appPWD [pwd]
+    if {[catch {cd $data(selectPath)}]} {
+       cd $appPWD
+
+       $data(dList) insert end ".."
+       return
+    }
+
+    # Make the dir list
+    #
+    foreach f [lsort -dictionary [glob -nocomplain .* *]] {
+       if {[file isdir ./$f]} {
+           $data(dList) insert end $f
+       }
+    }
+    # Make the file list
+    #
+    if {[string equal $data(filter) *]} {
+       set files [lsort -dictionary [glob -nocomplain .* *]]
+    } else {
+       set files [lsort -dictionary \
+           [glob -nocomplain $data(filter)]]
+    }
+
+    set top 0
+    foreach f $files {
+       if {![file isdir ./$f]} {
+           regsub {^[.]/} $f "" f
+           $data(fList) insert end $f
+           if {[string match .* $f]} {
+               incr top
+           }
+       }
+    }
+
+    # The user probably doesn't want to see the . files. We adjust the view
+    # so that the listbox displays all the non-dot files
+    $data(fList) yview $top
+
+    cd $appPWD
+}
+
+# tkMotifFDialog_BrowseFList --
+#
+#      This procedure is called when the directory list is browsed
+#      (clicked-over) by the user.
+#
+# Arguments:
+#      w               The pathname of the dialog box.
+#
+# Results:
+#      None.   
+
 proc tkMotifFDialog_BrowseDList {w} {
-    upvar #0 [winfo name $w] data
+    upvar ::tk::dialog::file::[winfo name $w] data
 
     focus $data(dList)
-    if {![string compare [$data(dList) curselection] ""]} {
+    if {[string equal [$data(dList) curselection] ""]} {
        return
     }
     set subdir [$data(dList) get [$data(dList) curselection]]
-    if {![string compare $subdir ""]} {
+    if {[string equal $subdir ""]} {
        return
     }
 
@@ -314,16 +517,17 @@ proc tkMotifFDialog_BrowseDList {w} {
     set list [tkMotifFDialog_InterpFilter $w]
     set data(filter) [lindex $list 1]
 
-    case $subdir {
+    switch -- $subdir {
        . {
-           set newSpec [file join $data(selectPath) $data(filter)]
+           set newSpec [::tk::dialog::file::JoinFile $data(selectPath) $data(filter)]
        }
        .. {
-           set newSpec [file join [file dirname $data(selectPath)] \
+           set newSpec [::tk::dialog::file::JoinFile [file dirname $data(selectPath)] \
                $data(filter)]
        }
        default {
-           set newSpec [file join $data(selectPath) $subdir $data(filter)]
+           set newSpec [::tk::dialog::file::JoinFile [::tk::dialog::file::JoinFile \
+                   $data(selectPath) $subdir] $data(filter)]
        }
     }
 
@@ -331,20 +535,31 @@ proc tkMotifFDialog_BrowseDList {w} {
     $data(fEnt) insert 0 $newSpec
 }
 
+# tkMotifFDialog_ActivateDList --
+#
+#      This procedure is called when the directory list is activated
+#      (double-clicked) by the user.
+#
+# Arguments:
+#      w               The pathname of the dialog box.
+#
+# Results:
+#      None.   
+
 proc tkMotifFDialog_ActivateDList {w} {
-    upvar #0 [winfo name $w] data
+    upvar ::tk::dialog::file::[winfo name $w] data
 
-    if {![string compare [$data(dList) curselection] ""]} {
+    if {[string equal [$data(dList) curselection] ""]} {
        return
     }
     set subdir [$data(dList) get [$data(dList) curselection]]
-    if {![string compare $subdir ""]} {
+    if {[string equal $subdir ""]} {
        return
     }
 
     $data(fList) selection clear 0 end
 
-    case $subdir {
+    switch -- $subdir {
        . {
            set newDir $data(selectPath)
        }
@@ -352,7 +567,7 @@ proc tkMotifFDialog_ActivateDList {w} {
            set newDir [file dirname $data(selectPath)]
        }
        default {
-           set newDir [file join $data(selectPath) $subdir]
+           set newDir [::tk::dialog::file::JoinFile $data(selectPath) $subdir]
        }
     }
 
@@ -368,45 +583,80 @@ proc tkMotifFDialog_ActivateDList {w} {
     }
 }
 
+# tkMotifFDialog_BrowseFList --
+#
+#      This procedure is called when the file list is browsed
+#      (clicked-over) by the user.
+#
+# Arguments:
+#      w               The pathname of the dialog box.
+#
+# Results:
+#      None.   
+
 proc tkMotifFDialog_BrowseFList {w} {
-    upvar #0 [winfo name $w] data
+    upvar ::tk::dialog::file::[winfo name $w] data
 
     focus $data(fList)
-    if {![string compare [$data(fList) curselection] ""]} {
+    if {[string equal [$data(fList) curselection] ""]} {
        return
     }
     set data(selectFile) [$data(fList) get [$data(fList) curselection]]
-    if {![string compare $data(selectFile) ""]} {
+    if {[string equal $data(selectFile) ""]} {
        return
     }
 
     $data(dList) selection clear 0 end
 
     $data(fEnt) delete 0 end
-    $data(fEnt) insert 0 [file join $data(selectPath) $data(filter)]
+    $data(fEnt) insert 0 [::tk::dialog::file::JoinFile $data(selectPath) $data(filter)]
     $data(fEnt) xview end
  
     $data(sEnt) delete 0 end
-    $data(sEnt) insert 0 [file join $data(selectPath) $data(selectFile)]
+    $data(sEnt) insert 0 [::tk::dialog::file::JoinFile $data(selectPath) \
+           $data(selectFile)]
     $data(sEnt) xview end
 }
 
+# tkMotifFDialog_ActivateFList --
+#
+#      This procedure is called when the file list is activated
+#      (double-clicked) by the user.
+#
+# Arguments:
+#      w               The pathname of the dialog box.
+#
+# Results:
+#      None.   
+
 proc tkMotifFDialog_ActivateFList {w} {
-    upvar #0 [winfo name $w] data
+    upvar ::tk::dialog::file::[winfo name $w] data
 
-    if {![string compare [$data(fList) curselection] ""]} {
+    if {[string equal [$data(fList) curselection] ""]} {
        return
     }
     set data(selectFile) [$data(fList) get [$data(fList) curselection]]
-    if {![string compare $data(selectFile) ""]} {
+    if {[string equal $data(selectFile) ""]} {
        return
     } else {
        tkMotifFDialog_ActivateSEnt $w
     }
 }
 
+# tkMotifFDialog_ActivateFEnt --
+#
+#      This procedure is called when the user presses Return inside
+#      the "filter" entry. It updates the dialog according to the
+#      text inside the filter entry.
+#
+# Arguments:
+#      w               The pathname of the dialog box.
+#
+# Results:
+#      None.   
+
 proc tkMotifFDialog_ActivateFEnt {w} {
-    upvar #0 [winfo name $w] data
+    upvar ::tk::dialog::file::[winfo name $w] data
 
     set list [tkMotifFDialog_InterpFilter $w]
     set data(selectPath) [lindex $list 0]
@@ -415,45 +665,28 @@ proc tkMotifFDialog_ActivateFEnt {w} {
     tkMotifFDialog_Update $w
 }
 
-proc tkMotifFDialog_InterpFilter {w} {
-    upvar #0 [winfo name $w] data
-
-    set text [string trim [$data(fEnt) get]]
-    # Perform tilde substitution
-    #
-    if {![string compare [string index $text 0] ~]} {
-       set list [file split $text]
-       set tilde [lindex $list 0]
-       catch {
-           set tilde [glob $tilde]
-       }
-       set text [eval file join [concat $tilde [lrange $list 1 end]]]
-    }
-
-    set resolved [file join [file dirname $text] [file tail $text]]
-
-    if {[file isdirectory $resolved]} {
-       set dir $resolved
-       set fil $data(filter)
-    } else {
-       set dir [file dirname $resolved]
-       set fil [file tail    $resolved]
-    }
-
-    return [list $dir $fil]
-}
-
+# tkMotifFDialog_ActivateSEnt --
+#
+#      This procedure is called when the user presses Return inside
+#      the "selection" entry. It sets the tkPriv(selectFilePath) global
+#      variable so that the vwait loop in tkMotifFDialog will be
+#      terminated.
+#
+# Arguments:
+#      w               The pathname of the dialog box.
+#
+# Results:
+#      None.   
 
 proc tkMotifFDialog_ActivateSEnt {w} {
     global tkPriv
-    upvar #0 [winfo name $w] data
+    upvar ::tk::dialog::file::[winfo name $w] data
 
     set selectFilePath [string trim [$data(sEnt) get]]
     set selectFile     [file tail    $selectFilePath]
     set selectPath     [file dirname $selectFilePath]
 
-
-    if {![string compare $selectFilePath ""]} {
+    if {[string equal $selectFilePath ""]} {
        tkMotifFDialog_FilterCmd $w
        return
     }
@@ -478,19 +711,19 @@ proc tkMotifFDialog_ActivateSEnt {w} {
     }
 
     if {![file exists $selectFilePath]} {
-       if {![string compare $data(type) open]} {
+       if {[string equal $data(type) open]} {
            tk_messageBox -icon warning -type ok \
                -message "File \"$selectFilePath\" does not exist."
            return
        }
     } else {
-       if {![string compare $data(type) save]} {
+       if {[string equal $data(type) save]} {
            set message [format %s%s \
                "File \"$selectFilePath\" already exists.\n\n" \
                "Replace existing file?"]
            set answer [tk_messageBox -icon warning -type yesno \
                -message $message]
-           if {![string compare $answer "no"]} {
+           if {[string equal $answer "no"]} {
                return
            }
        }
@@ -503,13 +736,13 @@ proc tkMotifFDialog_ActivateSEnt {w} {
 
 
 proc tkMotifFDialog_OkCmd {w} {
-    upvar #0 [winfo name $w] data
+    upvar ::tk::dialog::file::[winfo name $w] data
 
     tkMotifFDialog_ActivateSEnt $w
 }
 
 proc tkMotifFDialog_FilterCmd {w} {
-    upvar #0 [winfo name $w] data
+    upvar ::tk::dialog::file::[winfo name $w] data
 
     tkMotifFDialog_ActivateFEnt $w
 }
@@ -522,79 +755,10 @@ proc tkMotifFDialog_CancelCmd {w} {
     set tkPriv(selectPath)     ""
 }
 
-# tkMotifFDialog_Update
-#
-#      Load the files and synchronize the "filter" and "selection" fields
-#      boxes.
-#
-# popup:
-#      If this is true, then update the selection field according to the
-#      "-selection" flag
-#
-proc tkMotifFDialog_Update {w} {
-    upvar #0 [winfo name $w] data
-
-    $data(fEnt) delete 0 end
-    $data(fEnt) insert 0 [file join $data(selectPath) $data(filter)]
-    $data(sEnt) delete 0 end
-    $data(sEnt) insert 0 [file join $data(selectPath) $data(selectFile)]
-    tkMotifFDialog_LoadFiles $w
-}
-
-proc tkMotifFDialog_LoadFiles {w} {
-    upvar #0 [winfo name $w] data
-
-    $data(dList) delete 0 end
-    $data(fList) delete 0 end
-
-    set appPWD [pwd]
-    if {[catch {
-       cd $data(selectPath)
-    }]} {
-       cd $appPWD
-
-       $data(dList) insert end ".."
-       return
-    }
-
-    # Make the dir list
-    #
-    foreach f [lsort -command tclSortNoCase [glob -nocomplain .* *]] {
-       if {[file isdirectory $f]} {
-           $data(dList) insert end $f
-       }
-    }
-    # Make the file list
-    #
-    if {![string compare $data(filter) *]} {
-       set files [lsort -command tclSortNoCase [glob -nocomplain .* *]]
-    } else {
-       set files [lsort -command tclSortNoCase \
-           [glob -nocomplain $data(filter)]]
-    }
-
-    set top 0
-    foreach f $files {
-       if {![file isdir $f]} {
-           $data(fList) insert end $f
-           if {[string match .* $f]} {
-               incr top
-           }
-       }
-    }
-
-    # The user probably doesn't want to see the . files. We adjust the view
-    # so that the listbox displays all the non-dot files
-    $data(fList) yview $top
-
-    cd $appPWD
-}
-
 proc tkListBoxKeyAccel_Set {w} {
     bind Listbox <Any-KeyPress> ""
-    bind $w <Destroy> "tkListBoxKeyAccel_Unset $w"
-    bind $w <Any-KeyPress> "tkListBoxKeyAccel_Key $w %A"
+    bind $w <Destroy> [list tkListBoxKeyAccel_Unset $w]
+    bind $w <Any-KeyPress> [list tkListBoxKeyAccel_Key $w %A]
 }
 
 proc tkListBoxKeyAccel_Unset {w} {
@@ -605,6 +769,20 @@ proc tkListBoxKeyAccel_Unset {w} {
     catch {unset tkPriv(lbAccel,$w,afterId)}
 }
 
+# tkListBoxKeyAccel_Key--
+#
+#      This procedure maintains a list of recently entered keystrokes
+#      over a listbox widget. It arranges an idle event to move the
+#      selection of the listbox to the entry that begins with the
+#      keystrokes.
+#
+# Arguments:
+#      w               The pathname of the listbox.
+#      key             The key which the user just pressed.
+#
+# Results:
+#      None.   
+
 proc tkListBoxKeyAccel_Key {w key} {
     global tkPriv
 
@@ -613,7 +791,8 @@ proc tkListBoxKeyAccel_Key {w key} {
     catch {
        after cancel $tkPriv(lbAccel,$w,afterId)
     }
-    set tkPriv(lbAccel,$w,afterId) [after 500 tkListBoxKeyAccel_Reset $w]
+    set tkPriv(lbAccel,$w,afterId) [after 500 \
+           [list tkListBoxKeyAccel_Reset $w]]
 }
 
 proc tkListBoxKeyAccel_Goto {w string} {
@@ -648,3 +827,5 @@ proc tkListBoxKeyAccel_Reset {w} {
     catch {unset tkPriv(lbAccel,$w)}
 }
 
+
+