Spaces:
Building
Building
# -*-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 <Destroy> exit | |
} | |