#!/usr/local/bin.sun4/perl5 -w
use Tk;
use Tk::Tree;
use Sun::Solaris::Kstat;

my $kstat = Sun::Solaris::Kstat->new();

$main=MainWindow->new;
$main->geometry('=600x400');
my $progname = lc($main->title());
$main->title($progname);

my $tree = $main->Scrolled('Tree', -separator=>':', -scrollbars=>'osoe',-font=>'arial',-bg=>'white');
$tree->pack(-side=>'left',-fill=>'both',-expand=>'1');
$tree->configure(-opencmd=>sub{expand( $tree, @_); } );
$tree->configure(-browsecmd=>sub{browse( $tree, @_); } );
$tree->configure(-closecmd=>sub{contract( $tree, @_); } );
$tree->add("kstat", -text=>'kstat',-image=>$main->Getimage("folder"));
$tree->setmode("kstat", "open");

my $valwin = $main->Scrolled('HList', -header=>'1',-columns=>'2', -scrollbars=>'osoe',-font=>'arial',-bg=>'white');
$valwin->pack(-side=>'right',-fill=>'both',-expand=>'1');

$valwin->header('create', 0, -text=>'key');
$valwin->header('create', 1, -text=>'value');

my $leaf = "";

$main->repeat(100, \&update_labels);

MainLoop;

sub expand {
    my ($tree, $dir) = @_;

    $tree->entryconfigure($dir, -image=>$main->Getimage("openfolder"));

    if (my @kids = $tree->infoChildren( $dir ) ) {
        for my $kid (@kids) {
            $tree->show(-entry=>$kid);
        }
        return;
    }

    ($kpath = $dir) =~ s/^kstat:?//;
    my $blarf = $kstat;
    for $foo (split(/:/, $kpath)) {
        $blarf = $$blarf{$foo};
    }

    for $foo (sort keys %$blarf) {
        $path = "${dir}:${foo}";
        if (ref($$blarf{$foo})) {
            $tree->add($path, -text=>${foo},-image=>$main->Getimage("folder"));
            $isparent=0;
            $spinge = $$blarf{$foo};
            for $bar (sort values %$spinge) {
                $isparent=1 if (ref($bar));
            }
            $tree->setmode($path, ($isparent)?"open":"none");
        }
    }


}


sub contract {
    my ($tree, $dir) = @_;
    $tree->entryconfigure($dir, -image=>$main->Getimage("folder"));

    Tk::Tree::CloseCmd($tree,$dir);
}

sub browse {
    my ($tree, $dir) = @_;

    $leaf = $dir;
}


sub update_labels {
    if ($leaf) {

        ($kpath = $leaf) =~ s/^kstat:?//;
        $main->title($progname." - ".$kpath) if ($kpath);
        $kstat->update();
        my $blarf = $kstat;
        for $foo (split(/:/, $kpath)) {
            $blarf = $$blarf{$foo};
        }
        $valwin->delete('all');
        for $foo (sort keys %$blarf) {
            if (!ref($$blarf{$foo})) {
                $bogus = $valwin->addchild("");
                $valwin->itemCreate($bogus, 0, -text=>$foo);
                $valwin->itemCreate($bogus, 1, -text=>$$blarf{$foo});
            }
        }
    } else {
        $main->title($progname);
    }
}