A very rudimentary skeleton of an application using BWidgets.
2005-03-06, SB: The application, when run, looks for a config file with the same name as the program file and extension .cfg. If the code is saved as tkInfo.tcl, then it will look for tkInfo.cfg in the same directory. The format of the .cfg file is quite simple:
Parent: the name of the parent node. The topmost node is 'root' Node: The name of this node, must be unique over the whole file. File: (optional) the absolute path and file name to 'watch'
Example of such a .cfg file:
Parent: root Node: Config Parent: Config Node: .bash_login File: /home/n00b3/.bash_login Parent: Config Node: .xinitrc File: /home/n00b3/.xinitrc
The program itself is very very simple. No bells and whistles because major focus was a simple example on some BWidgets. It can be extended with menu, toolbar and statusline showing the filename with a BWidget::MainFrame. The simple showing of file contents in a text widget can be extended to become a text editor. The tree nodes should be made drag-and-drop'able to reorganize and save them like one of those two pane outliners. The possibilities are infinite
package require BWidget set dirname [file dirname [info script $argv0]] set prgname [file rootname [info script $argv0]] set filename [file join $dirname $prgname.cfg] puts "open $filename" set infile [open $filename] set pw [PanedWindow .pw] set pf [$pw add] set tf [$pw add] pack $pw -expand 1 -fill both set sw [ScrolledWindow $pf.sw] set tw [ScrolledWindow $tf.tw] pack $sw -expand 1 -fill both pack $tw -expand 1 -fill both set swt [Tree $sw.t] pack $swt $sw setwidget $swt set t [text $tf.t -wrap none] pack $t $tw setwidget $t update proc data'show {args} { $::t delete 1.0 end set filename [$::swt itemcget [lindex $args 0] -data] if {[string equal $filename ""]} {return} set data [read [open $filename]] $::t insert end $data } while 1 { unset -nocomplain parent node file if {[eof $infile]} {break} while {[gets $infile line] > 0} { regexp {Parent:\s+(.+)$} $line -> parent regexp {Node:\s+(.+)$} $line -> node regexp {File:\s+(.+)$} $line -> file } if {[info exists file]} { $::swt insert end $parent $node -text $node -data $file } else { $::swt insert end $parent $node -text $node } } $swt bindText <1> +data'show