#--------------- # DropTree.tcl #--------------- # William J. Giddings, The Flying Facet Animation Company, 2003 # # # This pack provides supportive element manipulation functions for the BWidget tree widget. # Developed from orginal code supplied by Richard Suchenwirth, Tickler's Wiki. # # NB: The widget definition allows for data to be associated with the node. # This entry is used to save text data for inclusion in the notions editor. # # Additional Functions #--------------- # Persistence, enable tree nodes to be saved and loaded. # # Interactive Use: #--------------- # Click on entry label/image and drag to new location, release over: # New Image, move to new location. # New Label, make subordinate # Any other, move to bottom of the list. # package wide # counters # ::$path.tnodes ;# total number of lines #--------------- package require BWidget package provide DropTree 1.0 # set debugging options set DEBUG false if {$DEBUG} { catch {console show} } namespace eval DropTree { set lastnode "0" set lastfont "" #set fontstyle "" set dragimage "" set lastimage "" set image "" set g(x) "" set g(y) "" set current 1 set path "" set cmd "" set pick "" } #--------------- # Debugg assist proc # cp = calling proceedure #--------------- proc DropTree::debug { {cp {?}} } { if {![winfo exists .debug]} { toplevel .debug pack [text .debug.txt -font {Arial 10}] -fill both -expand yes } append str "PROC\t\t$cp\n" # append test vars as required set lst " DropTree::pick DropTree::current DropTree::lastnode DropTree::path ::$DropTree::path.tnodes ::$DropTree::path.pick " foreach v $lst { append str "variable:\t\t$v\n" append str "content:\t\t[set $v]\n" } .debug.txt delete 1.0 end .debug.txt insert end $str } #--------------- # #--------------- proc ttdblock { {i ""} {str NEW} } { if {$i != "" } { set str "$i $str" } return "\ # page styles # paragraph styles # character base styles ttd.tagdef Monospace -font {-family $notions::mono -size 9} ttd.tagdef Heading_1 -font {-family $notions::display -size 14 -weight bold} ttd.tagdef Heading_2 -font {-family $notions::display -size 14 -weight bold} ttd.tagdef Heading_3 -font {-family $notions::display -size 12 -weight bold -slant italic} ttd.tagdef Heading_4 -font {-family $notions::display -size 12 -weight bold -slant italic} ttd.tagdef Default -font {-family $notions::basefont -size 12} ttd.tagdef Quote -font {-family $notions::basefont -size 10} ttd.tagdef Itrans -font {-family {URW Palladio IT} -size 10} ttd.tagdef Devanagri -font {-family {Sanskrit 99} -size 16} ttd.imgdef img_separator \ -data R0lGODlh9AEMAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///ywAAAAA9AEMAAAIwAD/CRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRiK8iKV3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZsuEIrhvHtq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gP3zvKuLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp0yUDAgA7 ttd.tagon Default ttd.tagon Heading_1 ttd.text \{$str\n\} ttd.image -align center -padx 0 -pady 0 -image img_separator ttd.text \{\n\} ttd.tagoff Heading_1 ttd.tagoff Default " ################################################################################ # return "\ # # -*- tcl -*- # # ttd.version 1.0 # ttd.tagdef document -font {-family Helvetica -size 10} # ttd.tagdef body -font {-size 10} -lmargin1 20 -lmargin2 20 # ttd.tagdef header -background lightgray -borderwidth 2 -font {-weight bold} -foreground darkgreen -relief raised # ttd.tagon document # ttd.tagon header # ttd.text \{$str\} # ttd.tagoff header # ttd.tagon body # ttd.text \{\n\nType here..\} # ttd.tagoff body # ttd.tagoff document" ################################################################################ } #--------------- # #--------------- proc DropTree::motion {w x y label} { if {[$w gettags marked] == ""} { set DropTree::image [[winfo parent $w] itemcget $label -image] $w create image [expr $x+18] [expr $y +15] -image $DropTree::image -tag marked } else { $w move marked [expr $x-$DropTree::g(x)] [expr $y-$DropTree::g(y)] } set DropTree::g(x) $x set DropTree::g(y) $y #always restore lastnode settings if {[regexp i: $DropTree::lastnode]} { $w itemconfigure $DropTree::lastnode -image $DropTree::lastimage } elseif [regexp n: $DropTree::lastnode] { $w itemconfigure $DropTree::lastnode -font $DropTree::lastfont } set c [$w gettags [$w find closest $x $y]] foreach i $c { if {[regexp i: $i]} { set DropTree::lastimage [$w itemcget $i -image] #draw a shaded, bounding box around image and text foreach {x1 y1 x2 y2} [$w bbox $i] {} $w delete CURSOR $w create rectangle 0 [expr $y1-2] [winfo width $w] $y2 -tag CURSOR -fill gray95 -outline black ;# -fill pink $w lower CURSOR set DropTree::lastnode $i } elseif [regexp n: $i] { $w delete CURSOR set DropTree::lastfont [$w itemcget $i -font] $w itemconfigure $i -font "[font configure $DropTree::lastfont] -weight bold -underline 1" set DropTree::lastnode $i } } } #--------------- # #--------------- proc DropTree::release {w x y label} { $w delete marked set path [winfo parent $w] #is it text? if [regexp n:(.+) [$w gettags [$w find closest $x $y]] -> target] { if {$label ne $target} { catch { #make sub-ordinate to target $path move $target $label 0 $path opentree $target } ;#end catch } } #or,is it an image? if [regexp i:(.+) [$w gettags [$w find closest $x $y]] -> target] { catch {$path move [$path parent $target] $label [$path index $target] } } # set DropTree::lastnode "" set ::$path.pick $label set DropTree::pick $label if {$::DEBUG} {DropTree::debug DropTree::release} return ::$path.pick } #--------------- # #--------------- proc DropTree::init {path} { set DropTree::path $path #set DropTree::cmd $cmd set ::$path.tnodes "0" set ::$path.pick "" #create default font catch { font create Sans -size 10 -family sans } #set DropTree::fontstyle "bold underline" set DropTree::dragimage im_treepage_2 set DropTree::lastnode "" foreach i {Image Text} { $path bind$i {DropTree::motion %W %x %y} $path bind$i {DropTree::release %W %x %y} } #initialize popup menus, current node appended to the proc call $path bindText _treepopup $path bindImage _treepopup menu .tpopup -tearoff 0 #add new menu options .tpopup insert 0 command \ -label {Insert} \ -command { #insert tree set i [DropTree::insert $notions::tree $DropTree::current] puts "i: $i DropTree::current: $DropTree::current" # if {$::N(version)=="0.6"} { # set ::notions::listing($i) "tagon Heading_1 \"1.0 linestart\" # text \{New $i\n\} 1.0 # tagoff Heading_1 \"1.[string length "New $i"] lineend\" # image img_separator 2.0 # text \{\n\} 2.1" # } #notions::show $i } .tpopup insert 1 command \ -label {Delete} \ -command {\ $notions::tree delete $DropTree::current } .tpopup insert 2 command -label {Rename} -command {DropTree::rename $notions::tree $DropTree::current} # .tpopup add command -label {Insert} -command "_insert $path \$DropTree::current" # .tpopup add command -label {Delete} -command "$path delete \$DropTree::current" # .tpopup add command -label {Rename} -command "_rename $path \$DropTree::current" .tpopup add separator .tpopup add cascade -label {Change} -menu .tpopup.cas menu .tpopup.cas -tearoff 0 .tpopup.cas add command -label {Colour..} -command " $path itemconfigure \$DropTree::current -fill \[tk_chooseColor \ -parent $path \ -initialcolor black \ -title \{Choose Colour..\}\] " .tpopup.cas add command -label {Image..} -command "_selectimage .si $path \"Select Image..\"" .tpopup.cas add command -label {Font..} .tpopup.cas add separator .tpopup.cas add command -label {Hide lines} -command " if \{ \[$path cget -showlines\] \} \{ $path configure -showlines 0 .tpopup.cas entryconfigure 4 -label \{Show Lines\} \} else \{ $path configure -showlines 1 .tpopup.cas entryconfigure 4 -label \{Hide Lines\} \} " } #--------------- # #--------------- proc _treepopup {current} { set DropTree::current $current set DropTree::path [winfo parent [focus]] tk_popup .tpopup [winfo pointerx [focus]] [winfo pointery [focus]] } #--------------- # #--------------- proc DropTree::insert {path node} { incr ::$path.tnodes switch $::N(version) { 0.6 { $path insert 0 $node [set ::$path.tnodes] \ -text "[set ::$path.tnodes] New" \ -image im_treepage \ -font {Sans} } 0.7 { $path insert 0 $node [set ::$path.tnodes] \ -text "[set ::$path.tnodes] New" \ -image im_treepage \ -font {Sans} \ -data [ttdblock [set ::$path.tnodes] "New"] } } $path opentree $node DropTree::rename $path [set ::$path.tnodes] if {$::DEBUG} {DropTree::debug DropTree::insert} return [set ::$path.tnodes] } #--------------- # #--------------- proc DropTree::rename {path node} { $path itemconfigure $node -text [$path edit $node [$path itemcget $node -text]] } #--------------- # #--------------- proc _selectimage {path parent title} { #TREE images, all images are 16x16 pixels. #blue image create photo im_1 -data R0lGODlhDQAQAKIAAP///+Li4rGxsYWO/yAgGwAAAAAAAAAAACwAAAAADQAQAAADNEi6VPCPjDmJcFDSQcLNGwd4mEYxFmCGnBCsofWypwtv8l3PdMvTuZ5PV7GhUC6AYMlsuhIAOw== #cream image create photo im_2 -data R0lGODlhDQAQAKIAAP////781+Li4rGxsSAgGwAAAAAAAAAAACwAAAAADQAQAAADNEi6VPCPhDnJcFDSQMTNGwd4mEYxFmCG3CCsofWypwtv8l3PdMvTuZ5PV7GhUC7AYMlsuhIAOw== #cyan image create photo im_3 -data R0lGODlhDQAQAKIAAP///+Li4rGxsSAgGwD78wAAAAAAAAAAACwAAAAADQAQAAADNDi6U/BvkDmHcFBSMsLNGwd4mEYxFmCGnBCsofWypwtv8l3PdMvTuZ5PV7GhUC6AYMlsuhIAOw== #green image create photo im_4 -data R0lGODlhDQAQAKIAAP///+Li4rGxsX37j05YSgAAAAAAAAAAACwAAAAADQAQAAADNEi6VPCPjDmJcFDSQcLNGwd4mEYxFmCGnBCsofWypwtv8l3PdMvTuZ5PV7GhUC6AYMlsuhIAOw== #grey image create photo im_5 -data R0lGODlhDQAQAKIAAP///+Li4t/e3rGxsSAgGwAAAAAAAAAAACwAAAAADQAQAAADNEi6VPCPiDnJcFBSQcLNGwd4mEYxFmCG3BCsofWypwtv8l3PdMvTuZ5PV7GhUC7AYMlsuhIAOw== #magenta image create photo im_6 -data R0lGODlhDQAQAKIAAP////sA+eLi4rGxsSAgGwAAAAAAAAAAACwAAAAADQAQAAADNEi6VPCPhDnJcFDSQMTNGwd4mEYxFmCG3CCsofWypwtv8l3PdMvTuZ5PV7GhUC7AYMlsuhIAOw== #orange image create photo im_7 -data R0lGODlhDQAQAKIAAP////q2SuLi4rGxsSAgGwAAAAAAAAAAACwAAAAADQAQAAADNEi6VPCPhDnJcFDSQMTNGwd4mEYxFmCG3CCsofWypwtv8l3PdMvTuZ5PV7GhUC7AYMlsuhIAOw== #pink image create photo im_8 -data R0lGODlhDQAQAKIAAP////5/f+Li4rGxsSAgGwAAAAAAAAAAACwAAAAADQAQAAADNEi6VPCPhDnJcFDSQMTNGwd4mEYxFmCG3CCsofWypwtv8l3PdMvTuZ5PV7GhUC7AYMlsuhIAOw== #purple image create photo im_9 -data R0lGODlhDQAQAKIAAP///+Li4rcA+7GxsSAgGwAAAAAAAAAAACwAAAAADQAQAAADNEi6VPCPiDnJcFBSQcLNGwd4mEYxFmCG3BCsofWypwtv8l3PdMvTuZ5PV7GhUC7AYMlsuhIAOw== #white image create photo im_10 -data R0lGODlhDQAQAKIAAP///+Li4rGxsSAgGwAAAAAAAAAAAAAAACwAAAAADQAQAAADMji6Q/BvwCgclHOEeieQm4VdjPB5mRCM6KCynrui10tT8y3DaU7vt8+LQZQBBMikUpUAADs= #yellow image create photo im_11 -data R0lGODlhDQAQAKIAAP/////+heLi4rGxsSAgGwAAAAAAAAAAACwAAAAADQAQAAADNEi6VPCPhDnJcFDSQMTNGwd4mEYxFmCG3CCsofWypwtv8l3PdMvTuZ5PV7GhUC7AYMlsuhIAOw== #book closed image create photo im_12 -data R0lGODlhEAAPAKIAAP////8AAMDAwICAgAAAAAAAAAAAAAAAACwAAAAAEAAPAAADPgi6QMRwuRBeVJNSy7LWXCN8ZCUFYwliVKqahOaWTizTxMDeWw7ou5ZjIAAIHKeNrngMNTbGhvOUQ14kVkgCADs= #book open_1 image create photo im_13 -data R0lGODlhDwAPAKIAAP//////AP8AAMDAwICAgAAAAAAAAAAAACwAAAAADwAPAAADSQhA2u5ksPeKABKSCaya29d4WKgERFF0l1IMQCAKatvBJ0OTdzzXI1xMB3TBZAvATtB6NSLKleXi3OBoLqrVgc0yv+DVSEUuFxIAOw== #book open_2 image create photo im_14 -data R0lGODlhDwANAKIAAP////8AAMbGxoSEhAAAAAAAAAAAAAAAACwAAAAADwANAAADOQhArM5EQRnbgiI+tzLJwCAp4seAQxmWHhgub3cSgQi/pknCdu5tlJbgV/kMIUZPckKpXDSch4WTAAA7 #book page image create photo im_15 -data R0lGODlhCwAPAKIAAP//////AMDAwICAgAAA/wAAAAAAAAAAACwAAAAACwAPAAADMzi6CzAugiAgDGE68aB0RXgRJBFVX0SNpQlUWfahQOvSsgrX7eZJMlQMWBEYj8iQchlKAAA7 #treepage image create photo im_16 im_16 copy im_treepage -to 0 0 [image width im_treepage] [image height im_treepage] #cross image create photo im_17 -data R0lGODlhDgAQAPEAAAAAAOnp6f///wAA/ywAAAAADgAQAEACLpSPFoEB/1gyEYLj4tENbo5Zk2BlgGRKY6MqT3eSXmLFo3nddSuk/YxLqDKrQwEAOw== #tick image create photo im_18 -data R0lGODlhDgAQAPEAAAAAAOrq6v///wAAACwAAAAADgAQAEACKpSPFwENwlyaxoFoqVYNtmBgl2c5YJJtqvCokoeaYmWGmXWSZc6l2qgpAAA7 toplevel $path #wm attributes $path -toolwindow 1 wm transient $path $parent grab $path wm title $path $title wm resizable $path 0 0 focus $path #image frame frame $path.fr1 #create a 4x4 grid of options set pad 2 set ipad 2 set i 1 for {set row 1} {$row <= 5} {incr row} { for {set col 1} {$col <= 5} {incr col} { catch { button $path.fr1.b$row$col \ -image im_$i \ -borderwidth 1 \ -relief sunken \ -bg white \ -overrelief raised \ -command "$parent itemconfigure $DropTree::current -image im_$i ; grab release $path ; destroy $path " #-activebackground white grid $path.fr1.b$row$col -row $row -column $col -ipadx $pad -ipady $pad -padx $ipad -pady $ipad } incr i } } pack $path.fr1 -fill both #buttons frame $path.fr2 button $path.fr2.but1 -text "Ok" -width 10 -command "grab release $path ; destroy $path" button $path.fr2.but2 -text "Cancel" -width 10 -command "grab release $path ; destroy $path" pack $path.fr2.but1 $path.fr2.but2 -side left -anchor w -padx 3 pack $path.fr2 -side bottom -fill x -padx 2 set w [winfo reqwidth $path] set h [winfo reqheight $path] set dx [expr [winfo pointerx $parent] - $w/2] set dy [expr [winfo pointery $parent] - $h/2] wm geometry $path +$dx+$dy } #--------------- # #--------------- proc LoadTree {path args} { set channel 0 set close 0 set filetype "" set file_types { { "All Files" *} } set dir [pwd] set title "Load Tree.." foreach {arg opt} $args { switch -- $arg { -channel {set channel $opt} -types {set types $opt} -dir {set dir $opt} -title {set title $opt} } } if {$channel==0} { set fname [tk_getOpenFile \ -initialdir $dir \ -filetypes $file_types \ -title "LoadTree.." \ -parent .] set channel [open $fname "r"] fconfigure $channel -encoding $::N(encoding) set close 1 } # get total number of nodes # gets $channel data # set ::$path.tnodes $data # for {set i 0} {$i < [set ::$path.tnodes] } {incr i} { # gets $channel data ;#1 # eval $path insert $data # } ReadTree $channel $path if {$close} {close $channel} } #--------------- # # read tree data infrom an openfile #---------------- proc ReadTree {fp path} { switch $::N(version) { 0.6 { #get total number of nodes gets $fp data set ::$path.tnodes $data for {set i 0} {$i < [set ::$path.tnodes] } {incr i} { gets $fp data catch { eval $path insert $data } } } 0.7 { set ::$path.tnodes 0 set data [read $fp] foreach i $data { catch { eval $path insert $i } incr ::$path.tnodes } #set ::$path.tnodes $i } } } #--------------- # #--------------- proc SaveTree {path args} { set channel "" set filetype "" set file_types { { "Notions" .dat} { "All Files" *} } set dir [pwd] set title "Save Tree.." foreach {arg opt} $args { switch -- $arg { -channel {set channel $opt} -types {set types $opt} -dir {set dir $opt} -title {set title $opt} } } if {$channel == ""} { set fname [tk_getSaveFile \ -initialdir $dir \ -filetypes $file_types \ -title "Save Tree.." \ -parent .] if {$fname == "" } {return 0} #add the right file extension if {[file extension $fname]!= ".dat"} { append fname .dat } #backup the file droptree:backup $fname set channel [open $fname "w"] fconfigure $channel -encoding $::N(encoding) set close 1 } if {$::N(version)=="0.6"} { puts $channel "[set ::$path.tnodes]" } for {set i 1 } {$i <= [set ::$path.tnodes]} {incr i} { catch { puts $channel "\ \{[$path index $i] \ [$path parent $i] \ $i \ -text \{[$path itemcget $i -text]\} \ -font \{[$path itemcget $i -font]\} \ -image \{[$path itemcget $i -image]\} \ -fill \{[$path itemcget $i -fill]\} \ -data \{[$path itemcget $i -data]\}\}" } } if {$close} {close $channel} return $fname } #--------------- # #--------------- proc DropTree::dump {path} { set dump "" for {set i 0 } {$i <= [set ::$path.tnodes]} {incr i} { catch { set dump "$dump \{[$path index $i] [$path parent $i] $i -text \{[$path itemcget $i -text]\} -font \{[$path itemcget $i -font]\} -image \{[$path itemcget $i -image]\} -fill \{[$path itemcget $i -fill]\} -data \{[$path itemcget $i -data]\}\}" } } return $dump } #--------------- # #--------------- proc #_nodelist {{node root} {v ::nl} } { set $v "" nodelist $node $v puts $::nl } #--------------- # #--------------- proc nodelist { {node root} {v ::nl} } { # get root list # this value must be kept within the droptree namespace # set l [$notions::tree nodes $node] foreach i $l { if { [llength [$notions::tree nodes $i]] > 0 } { append $v "$i " nodelist $i } else { append $v "$i " } } } #--------------- # #--------------- proc listit {l} { foreach i $l { if {[llength $i] > 1} { puts * listit $i } else { puts $i } } } #--------------- # #--------------- proc droptree:backup { fname { levels 3 } } { if { [ catch { if { [ file exists $fname ] } { set dir [ file dirname $fname ] set files [ glob -nocomplain -path ${fname} .ba* ] set i $levels while { [ incr i -1 ] } { if { [ lsearch -exact $files ${fname}.ba$i ] > -1 } { file rename -force ${fname}.ba$i ${fname}.ba[ incr i ] incr i -1 } } if { [ file exists ${fname}.bak ] } { file rename -force ${fname}.bak ${fname}.ba2 } file rename -force $fname ${fname}.bak } } err ] } { return -code error "bak($fname $levels): $err" } } #--------------- # the ubiquitous demo #--------------- proc demo {} { # 22-jan-06 #change to version 7 set ::N(version) 0.6 set path .t pack [Tree $path -deltax 10 -deltay 20 -showlines 1 -linestipple gray50 -redraw 1] -fill both -expand 1 -side left -anchor nw # CODE STUB, THIS IS EXTRACTED FROM NOTIONS0.7 namespace eval notions {} set notions::tree $path # END STUB DropTree::init $path image create photo im_treepage -data R0lGODlhDQAQAKIAAP////781+Li4rGxsSAgGwAAAAAAAAAAACwAAAAADQAQAAADNEi6VPCPhDnJcFDSQMTNGwd4mEYxFmCG3CCsofWypwtv8l3PdMvTuZ5PV7GhUC7AYMlsuhIAOw== image create photo im_treepage_2 -data R0lGODlhDQAQAKIAAP////7X1+Li4rGxsSAgGwAAAAAAAAAAACwAAAAADQAQAAADNEi6VPCPhDnJcFDSQMTNGwd4mEYxFmCG3CCsofWypwtv8l3PdMvTuZ5PV7GhUC7AYMlsuhIAOw== #set ::$path.tnodes "" #load sample tree set fp [open test.lst "r"] fconfigure $fp -encoding utf-8 LoadTree .t -channel $fp close $fp puts [DropTree::dump .t] } foreach {arg val} $argv { switch -- $arg { -demo { console show ; demo } } } demo ---- [ABU] Please include "test.lst" for running the demo. ---- [WJG] Here you go.. 7 0 root 0 -text {0 Apple} -font {Sans} -image im_treepage -fill SystemWindowText 1 root 1 -text {1 Bannana} -font {Sans} -image im_treepage -fill SystemWindowText 2 root 2 -text {2 Orange} -font {Sans} -image im_treepage -fill SystemWindowText 3 root 3 -text {3 Quince} -font {Sans} -image im_treepage -fill SystemWindowText 4 root 4 -text {4 Cherry} -font {Sans} -image im_treepage -fill SystemWindowText 5 root 5 -text {5 Peach} -font {Sans} -image im_treepage -fill SystemWindowText 6 root 6 -text {6 Pear} -font {Sans} -image im_treepage -fill SystemWindowText ---- [BWidget]