openmedialibrary_platform_w.../tcl/tix8.4.3/demos/samples/DynTree.tcl

149 lines
3.7 KiB
Tcl

# -*-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
}