## buttons.tcl
##
## demonstrates the simulation of a button array
##
## ellson@lucent.com
## modifications made by jeff.hobbs@acm.org
## Mdofied by John Cerney for perl/tk
use Tk;
use Tk::TableMatrix;
use Data::Dumper qw( DumperX);
my $top = MainWindow->new;
my $tab = {};
my ($rows,$cols) = (10,10); # number of rows/cols
# create the table
my $t = $top->Scrolled('TableMatrix', -rows => $rows, -cols => $cols,
-titlerows => 1, -titlecols => 1 ,
-roworigin => -1, -colorigin => -1 ,
-colwidth => 4 ,
-width => 8, -height => 8 ,
-variable => $tab ,
-flashmode => 'off',
-cursor => 'top_left_arrow' ,
-borderwidth => 2 ,
-state => 'disabled'
);
$t->pack;
# set up tags for the various states of the buttons
$t->tagConfigure('OFF', -bg => 'red', -relief => 'raised');
$t->tagConfigure('ON', -bg => 'green', -relief => 'sunken');
$t->tagConfigure('sel', -bg => 'gray75', -relief => 'flat');
# clean up if mouse leaves the widget
$t->bind('<FocusOut>',sub{
my $w = shift;
$w->selectionClear('all');
});
# highlight the cell under the mouse
$t->bind('<Motion>', sub{
my $w = shift;
my $Ev = $w->XEvent;
if( $w->selectionIncludes('@' . $Ev->x.",".$Ev->y)){
Tk->break;
}
$w->selectionClear('all');
$w->selectionSet('@' . $Ev->x.",".$Ev->y);
Tk->break;
## "break" prevents the call to TableMatrixCheckBorder
});
# mousebutton 1 toggles the value of the cell
# use of "selection includes" would work here
$t->bind('<1>', sub {
my $w = shift;
$w->focus;
my $dude = $w->curselection;
my ($rc) = @{$w->curselection};
my $var = $w->cget(-var);
if( $var->{$rc} =~ /ON/ ){
$var->{$rc} = 'OFF';
$w->tagCell('OFF',$rc);
}
else{
$var->{$rc} = 'ON';
$w->tagCell('ON',$rc);
}
});
# inititialize the array, titles, and celltags
for( $i = 0; $i < $rows; $i++){
$tab->{"$i,-1"} = $i;
for( $j = 0; $j < $cols; $j++){
unless($i) { $tab->{"-1,$j"}= $j;};
$tab->{"$i,$j"} = "OFF";
$t->tagCell('OFF', "$i,$j");
}
}
Tk::MainLoop;