## 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;