File size: 3,767 Bytes
ba2f5d6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# -*-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
}