WJG (17/05/17) I was recently supplied with a list of concept headings which were tagged with incremental node strings. Getting the gnocl::tree widget to list the hierarchy of the nodes was a simple task of counting up the separators and modifying the point of table insertion.
#!/bin/sh # the next line restarts using tclsh \ exec tclsh "$0" "$@" package require Gnocl namespace eval pkg {} #--------------- # Set Markup based upon level of node elements #--------------- # Arguments: # n level # Returns: # list of tag on and off values # proc pkg::markup { n } { if { $n == 1 } { set res [list <b> </b>] } if { $n == 2 } { set res [list "<span foreground='red'>" </span>] } if { $n == 3 } { set res [list "<span foreground='blue'>" </span>] } if { $n >= 4 } { set res [list "" ""] } return $res } #--------------- # Covert tree path to node #--------------- # Arguments: # path path # separator default = . # Returns: # node # proc pkg::path2node { path {separator .}} { foreach n [split [lindex $path 0]] { if { [incr n] < 10 } {set pad 0} append res "$pad$n$separator" } return [string range $res 0 end-1] } #--------------- # Create tree displaying heirarchy based upon nodes #--------------- # Arguments: # data list of data to display # separator node level separator, default = . # Returns: # widget-id of completed tree # proc pkg::create { {data HTC.tcl} {separator .} } { set wid [gnocl::tree \ -types [list markup markup ] \ -titles [list Level Description ] \ -headersClickable 0 \ -treeLines 1 \ -ruleHint 1 \ -onSelectionChanged { puts [pkg::path2node %p] } ] $wid columnConfigure 0 -width 150 source $data foreach {ref cat} $htc { set n [split $ref $separator] set len [ llength $n ] lassign [pkg::markup $len] tagOn tagOff set ref $tagOn$ref$tagOff ; set cat $tagOn$cat$tagOff if { $len == 1} { set row [$wid add "" [list [list $ref $cat]] ] } else { set end [expr $len -2] set row [$wid addEnd [lrange [lindex $row 0] 0 $end] [list [list $ref $cat]] ] } } return $wid } #--------------- # Script Main Function #--------------- # Arguments: # args # Returns: # none # proc main { args } { gnocl::window -child [pkg::create HTC_.tcl] -setSize 0.5 -title "Hierachy Numbering" } main
Here’s a representative node list, file HTC_.tcl.
set htc { 01 {England} 01.01 {London} 01.01.01 {Westminster} 01.01.02 {Kensington} 01.01.03 {Hampstead} 01.02 {West Midlands} 01.02.01 {Birmingham} 01.02.02 {Coventry} 01.02.03 {Wolverhampton} 01.02.03.01 {Pendeford} 01.02.03.02 {Oxley} 01.02.03.03 {Fordhouses} 01.02.03.04 {Penn} 01.02.03.05 {Wightwick} 01.02.03.06 {Finchfield} 01.02.03.07 {Bilston} 01.02.03.08 {Wednesfield} 01.02.03.09 {Tettenhall} 01.02.03.10 {Bushbury} 01.02.03.11 {Compton} 01.02.03.12 {Graisely Hill} 01.02.03.13 {Merridale} 01.02.03.14 {Blackenhall} 01.02.04 {Walsall} 01.02.05 {Solihull} 01.02.06 {Sandwell} 01.02.07 {Dudley} 01.03 {Manchester} 02 {Wales} 02.01 {Cardif} 02.01 {Swansea} 03 {Scotland} 03.01 {Edinburgh} 03.02 {Glasgow} 04 {Northern Ireland} 04.01 {Belfast} }
And this is what it looks like...