home *** CD-ROM | disk | FTP | other *** search
- # ----------------------------------------------------------------------
- # DEMO: hierarchy in [incr Widgets]
- # ----------------------------------------------------------------------
- package require Iwidgets 4.0
-
- # This demo displays a users file system starting at thier HOME
- # directory. You can change the starting directory by setting the
- # environment variable SHOWDIR.
- #
- if {![info exists env(SHOWDIR)]} {
- set env(SHOWDIR) $env(HOME)
- }
-
- # ----------------------------------------------------------------------
- # PROC: get_files file
- #
- # Used as the -querycommand for the hierarchy viewer. Returns the
- # list of files under a particular directory. If the file is "",
- # then the SHOWDIR is used as the directory. Otherwise, the node itself
- # is treated as a directory. The procedure returns a unique id and
- # the text to be displayed for each file. The unique id is the complete
- # path name and the text is the file name.
- # ----------------------------------------------------------------------
- proc get_files {file} {
- global env
-
- if {$file == ""} {
- set dir $env(SHOWDIR)
- } else {
- set dir $file
- }
-
- if {[catch {cd $dir}] != 0} {
- return ""
- }
-
- set rlist ""
-
- foreach file [lsort [glob -nocomplain *]] {
- lappend rlist [list [file join $dir $file] $file]
- }
-
- return $rlist
- }
-
- # ----------------------------------------------------------------------
- # PROC: select_node tags status
- #
- # Select/Deselect the node given the tags and current selection status.
- # The unique id which is the complete file path name is mixed in with
- # all the tags for the node. So, we'll find it by searching for our
- # SHOWDIR and then doing the selection or deselection.
- # ----------------------------------------------------------------------
- proc select_node {tags status} {
- global env
-
- set uid [lindex $tags [lsearch -regexp $tags $env(SHOWDIR)]]
-
- if {$status} {
- .h selection remove $uid
- } else {
- .h selection add $uid
- }
- }
-
- # ----------------------------------------------------------------------
- # PROC: expand_node tags
- #
- # Expand the node given the tags. The unique id which is the complete
- # file path name is mixed in with all the tags for the node. So, we'll
- # find it by searching for our SHOWDIR and then doing the expansion.
- # ----------------------------------------------------------------------
- proc expand_node {tags} {
- global env
-
- set uid [lindex $tags [lsearch -regexp $tags $env(SHOWDIR)]]
-
- .h expand $uid
- }
-
- # ----------------------------------------------------------------------
- # PROC: collapse_node tags
- #
- # Collapse the node given the tags. The unique id which is the complete
- # file path name is mixed in with all the tags for the node. So, we'll
- # find it by searching for our SHOWDIR and then doing the collapse.
- # ----------------------------------------------------------------------
- proc collapse_node {tags} {
- global env
-
- set uid [lindex $tags [lsearch -regexp $tags $env(SHOWDIR)]]
-
- .h collapse $uid
- }
-
- # ----------------------------------------------------------------------
- # PROC: expand_recursive
- #
- # Recursively expand all the file nodes in the hierarchy.
- # ----------------------------------------------------------------------
- proc expand_recursive {node} {
- set files [get_files $node]
-
- foreach tagset $files {
- set uid [lindex $tagset 0]
-
- .h expand $uid
-
- if {[get_files $uid] != {}} {
- expand_recursive $uid
- }
- }
- }
-
- # ----------------------------------------------------------------------
- # PROC: expand_all
- #
- # Expand all the file nodes in the hierarchy.
- # ----------------------------------------------------------------------
- proc expand_all {} {
- expand_recursive ""
- }
-
- # ----------------------------------------------------------------------
- # PROC: collapse_all
- #
- # Collapse all the nodes in the hierarchy.
- # ----------------------------------------------------------------------
- proc collapse_all {} {
- .h configure -querycommand "get_files %n"
- }
-
- #
- # Create the hierarchy mega-widget, adding commands to both the item
- # and background popup menus.
- #
- iwidgets::hierarchy .h -querycommand "get_files %n" -visibleitems 30x15 \
- -labeltext $env(SHOWDIR) -selectcommand "select_node %n %s"
- pack .h -side left -expand yes -fill both
-
- .h component itemMenu add command -label "Select" \
- -command {select_node [.h current] 0}
- .h component itemMenu add command -label "Deselect" \
- -command {select_node [.h current] 1}
- .h component itemMenu add separator
- .h component itemMenu add command -label "Expand" \
- -command {expand_node [.h current]}
- .h component itemMenu add command -label "Collapse" \
- -command {collapse_node [.h current]}
-
- .h component bgMenu add command -label "Expand All" -command expand_all
- .h component bgMenu add command -label "Collapse All" -command collapse_all
- .h component bgMenu add command -label "Clear Selections" \
- -command {.h selection clear}
-