BWidget example: info organizer

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  $]
    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

    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

Category Widget