# -*-mode: tcl; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*- # # $Id: DynTree.tcl,v 1.3 2001/12/09 05:31:07 idiscovery Exp $ # # Tix Demostration Program # # This sample program is structured in such a way so that it can be # executed from the Tix demo program "widget": it must have a # procedure called "RunSample". It should also have the "if" statment # at the end of this file so that it can be run as a standalone # program using tixwish. # This file demonstrates how to use the TixTree widget to display # dynamic hierachical data (the files in the Unix file system) # proc RunSample {w} { # We create the frame and the ScrolledHList widget # at the top of the dialog box # frame $w.top -relief raised -bd 1 # Create a TixTree widget to display the hypothetical DOS disk drive # # tixTree $w.top.a -options { hlist.separator "/" hlist.width 35 hlist.height 25 } pack $w.top.a -expand yes -fill both -padx 10 -pady 10 -side left set tree $w.top.a set hlist [$tree subwidget hlist] $tree config -opencmd "DynTree:OpenDir $tree" # Add the root directory the TixTree widget DynTree:AddDir $tree / # The / directory is added in the "open" mode. The user can open it # and then browse its subdirectories ... # Use a ButtonBox to hold the buttons. # tixButtonBox $w.box -orientation horizontal $w.box add ok -text Ok -underline 0 -command "destroy $w" \ -width 6 $w.box add cancel -text Cancel -underline 0 -command "destroy $w" \ -width 6 pack $w.box -side bottom -fill x pack $w.top -side top -fill both -expand yes } proc DynTree:AddDir {tree dir} { set hlist [$tree subwidget hlist] if {$dir == "/"} { set text / } else { set text [file tail $dir] } $hlist add $dir -itemtype imagetext \ -text $text -image [tix getimage folder] catch { # We need a catch here because the directory may not be readable by us # $tree setmode $dir none if {[glob -nocomplain $dir/*] != {}} { $tree setmode $dir open } } } # This command is called whenever the user presses the (+) indicator or # double clicks on a directory whose mode is "open". It loads the files # inside that directory into the Tree widget. # # Note we didn't specify the -closecmd option for the Tree widget, so it # performs the default action when the user presses the (-) indicator or # double clicks on a directory whose mode is "close": hide all of its child # entries # proc DynTree:OpenDir {tree dir} { set PWD [pwd] set hlist [$tree subwidget hlist] if {[$hlist info children $dir] != {}} { # We have already loaded this directory. Let's just # show all the child entries # # Note: since we load the directory only once, it will not be # refreshed if the you add or remove files from this # directory. # foreach kid [$hlist info children $dir] { $hlist show entry $kid } return } if [catch {cd $dir}] { # We can't read that directory, better not do anything cd $PWD return } set files [lsort [glob -nocomplain *]] foreach f $files { if [file isdirectory $f] { if {$dir == "/"} { set subdir /$f } else { set subdir $dir/$f } DynTree:AddDir $tree $subdir } else { if {$dir == "/"} { set file /$f } else { set file $dir/$f } $hlist add $file -itemtype imagetext \ -text $f -image [tix getimage file] } } cd $PWD } # This "if" statement makes it possible to run this script file inside or # outside of the main demo program "widget". # if {![info exists tix_demo_running]} { wm withdraw . set w .demo toplevel $w; wm transient $w "" RunSample $w bind $w exit }