154 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
	
		
			4.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| # ----------------------------------------------------------------------
 | |
| #  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}
 |