chooseDir.tcl
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:5k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. # magi: imported to scanalyze, slightly modified
  2. # original source http://www.wizvax.net/chrisn/TclTkProgRef/
  3. # thanks to Christopher Nelson
  4. # A platform-independent, pure Tcl version of tk_chooseDirectory
  5. # for use on non-Win32 platforms.
  6. # (magi: tk_chooseDirectory was added to Tk 8.3b2 for Win32, but the
  7. # final Tk 8.3 has it for all platforms I think)
  8. package require opt
  9. namespace eval ::tkChooseDirectory {
  10.     variable value
  11. }
  12. ::tcl::OptProc ::tkChooseDirectory::tk_chooseDirectory {
  13.     {-initialdir -string ""  
  14.             "Initial directory for browser"}
  15.     {-mustexist              
  16.             "If specified, user can't type in a new directory"}
  17.     {-parent     -string "."
  18.             "Parent window for browser"}
  19.     {-title      -string "Choose Directory"
  20.             "Title for browser window"}
  21. } {
  22.     # Handle default directory
  23.     if {[string length $initialdir] == 0} {
  24. set initialdir [pwd]
  25.     }
  26.     # Handle default parent window
  27.     if {[string compare $parent "."] == 0} {
  28. set parent ""
  29.     }
  30.     set w [toplevel $parent.choosedirectory]
  31.     wm title $w $title
  32.     label $w.label -text "Directory:"
  33.     grid $w.label -sticky w 
  34.     # Some frames for grouping
  35.     frame $w.list
  36.     grid $w.list -sticky news -pady 1m -padx 1m
  37.     if {[llength [file volumes]]} {
  38. # On Macs it would be nice to add a volume combobox here.
  39.     }
  40.     frame $w.entry
  41.     grid $w.entry -sticky news -pady 1m -padx 1m
  42.     frame $w.buttons
  43.     grid $w.buttons -sticky news -pady 1m -padx 1m
  44.     # Only directory list expands height
  45.     grid rowconfigure $w 1 -weight 1
  46.     # All resize width
  47.     grid columnconfigure $w 0 -weight 1
  48.     #----------------------------------------
  49.     # Fill the top frame (user entry)
  50.     label $w.entry.l -text "Selection:"
  51.     pack $w.entry.l -side left
  52.     entry $w.entry.e -width 30
  53.     pack $w.entry.e -side left -expand 1 -fill x
  54.     
  55.     $w.entry.e insert end $initialdir
  56.     #----------------------------------------
  57.     # Fill the middle frame (directory content list)
  58.     listbox $w.list.lb -height 8 
  59.     -yscrollcommand [list $w.list.sb set] 
  60.     -selectmode browse 
  61.     -setgrid true 
  62.     -exportselection 0 
  63.     -takefocus 1
  64.     scrollbar $w.list.sb -orient vertical 
  65.     -command [list $w.list.lb yview]
  66.     grid $w.list.lb $w.list.sb -sticky news
  67.     grid configure $w.list.lb -ipadx 2m
  68.     grid rowconfigure $w.list 0 -weight 1
  69.     grid columnconfigure $w.list 0 -weight 1
  70.     #----------------------------------------
  71.     # Commands for various bindings (which follow)
  72.     set okCommand  [namespace code 
  73.     [list Done $w ok ::tkChooseDirectory::value($w)]]
  74.     set cancelCommand  [namespace code 
  75.     [list Done $w cancel ::tkChooseDirectory::value($w)]]
  76.     #----------------------------------------
  77.     # Fill the bottom frame (buttons)
  78.     button $w.buttons.ok     -width 8 -text OK 
  79.     -command $okCommand
  80.     button $w.buttons.cancel -width 8 -text Cancel 
  81.     -command $cancelCommand
  82.     pack $w.buttons.ok $w.buttons.cancel -side left -expand 1
  83.     #-----------------------------------------
  84.     # Other bindings
  85.     # <Return> is the same as OK
  86.     bind $w <Return> $okCommand
  87.     # <Escape> is the same as cancel
  88.     bind $w <Escape> $cancelCommand
  89.     # Closing the window is the same as cancel
  90.     wm protocol $w WM_DELETE_WINDOW $cancelCommand
  91.     
  92.     #----------------------------------------
  93.     # Fill listbox and bind for browsing
  94.     Refresh $w.list.lb $initialdir
  95.     
  96.     bind $w.list.lb <Double-Button-1> [namespace code 
  97.     [list Update $w.entry.e $w.list.lb]]
  98.     # WUZ - need to center $w over parent
  99.     # Set the min size when the size is known
  100. #    tkwait visibility $w
  101. #    tkChooseDirectory::MinSize $w
  102.     focus $w.entry.e
  103.     $w.entry.e selection range 0 end
  104.     grab set $w
  105.     # Wait for OK, Cancel or close
  106.     tkwait window $w
  107.     grab release $w
  108.     
  109.     set dir $::tkChooseDirectory::value($w)
  110.     unset ::tkChooseDirectory::value($w)
  111.     return $dir
  112. }
  113. # tkChooseDirectory::tk_chooseDirectory
  114. proc ::tkChooseDirectory::MinSize { w } {
  115.     set geometry [wm geometry $w]
  116.     regexp {([0-9]*)x([0-9]*)+} geometry whole width height
  117.     wm minsize $w $width $height
  118. }
  119. proc ::tkChooseDirectory::Done { w why varName } {
  120.     variable value
  121.     switch -- $why {
  122. ok {
  123.     # If mustexist, validate with [cd]
  124.     set value($w) [$w.entry.e get]
  125. }
  126. cancel {
  127.     set value($w) ""
  128. }
  129.     }
  130.     destroy $w
  131. }
  132. proc ::tkChooseDirectory::Refresh { listbox dir } {
  133.     $listbox delete 0 end
  134.     $listbox insert end ".."
  135.     foreach f [lsort [glob -nocomplain $dir/*]] {
  136. if {[file isdirectory $f]} {
  137.     $listbox insert end "[file tail $f]/"
  138. }
  139.     }
  140. }
  141. proc ::tkChooseDirectory::Update { entry listbox } {
  142.     set subdir [$listbox get [$listbox curselection]]
  143.     if {[string compare $subdir ".."] == 0} {
  144. set fullpath [file dirname [$entry get]]
  145.     } else {
  146. set fullpath [file join [$entry get] $subdir]
  147.     }
  148.     $entry delete 0 end
  149.     $entry insert end $fullpath
  150.     Refresh $listbox $fullpath
  151. }
  152. catch {rename ::tk_chooseDirectory tk_chooseDir}
  153.     
  154. proc tk_chooseDirectory { args } {
  155.     uplevel ::tkChooseDirectory::tk_chooseDirectory $args
  156. }