#!/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);
}
}