#!/usr/bin/perl use warnings; use strict; use Gtk2 -init; # mouse buttons 1,2 and 3 all do different actions as demo # hack the col widths by padding header entries my @AoA = ( ['',' Header1 ',' Header2 ',' Header3 ',' Header4 '], ['row0',1,2,3,4], ['row1',5,6,7,8], #example data ['row2',9,10,11,12], ['row3',13,14,15,16], ); # add more random data my $count = 4; foreach my $new(1..100){ my $aref = ['row'.$count, rand_string(), rand_string(),rand_string(), rand_string() ]; push @AoA, $aref; $count++; } my $rows = scalar @AoA; my $cols = scalar @{$AoA[0]}; print "$rows $cols\n"; # override any pixmap based themes so color can show Gtk2::Rc->parse_string(<<__); style "default" { bg_pixmap[NORMAL] = "" bg_pixmap[INSENSITIVE] = "" bg_pixmap[ACTIVE] = "" bg_pixmap[PRELIGHT] = "" }class "GtkWidget" style "default" __ # Create the window my $window = new Gtk2::Window ( "toplevel" ); $window->signal_connect ("delete_event", sub { Gtk2->main_quit; }); $window->set_default_size(500, 300); $window->set_border_width (10); my $white = Gtk2::Gdk::Color->new (0xFFFF,0xFFFF,0xFFFF); $window->modify_bg ('normal', $white); my $vbox = Gtk2::VBox->new( 0, 0 ); #$vbox->modify_bg ('normal', $color); my $title = Gtk2::Label->new("2D Array Table -w- alternate colored rows"); my $font_desc = Gtk2::Pango::FontDescription->from_string ("Times New Roman Italic 20"); $title->modify_font($font_desc); $title->modify_fg('normal',Gtk2::Gdk::Color->parse("#0000ff")); $title->set_size_request(-1, 40); $vbox->pack_start($title,0, 1, 0); my $scwin = Gtk2::ScrolledWindow->new(); $scwin->set_policy('automatic', 'automatic'); my $table = Gtk2::Table->new($rows,$cols); my $header_color = Gtk2::Gdk::Color->parse("#CCFFCC"); my $row_color = Gtk2::Gdk::Color->parse("#DDFFDD"); my $odd_color = Gtk2::Gdk::Color->parse("#FFCC66"); my $even_color = Gtk2::Gdk::Color->parse("#CCFF99"); my $black = Gtk2::Gdk::Color->parse("#000000"); my $red = Gtk2::Gdk::Color->parse("#FFCCCC"); my $font_desc_h = Gtk2::Pango::FontDescription->from_string ("Times New Roman 25"); my $tooltip = Gtk2::Tooltips->new; for (my $row=0; $row < $rows; ++$row) { for (my $col=0; $col < $cols; ++$col) { my $event_box = Gtk2::EventBox->new; my $label = Gtk2::Label->new ( $AoA[$row][$col]); my $length = length( $AoA[$row][$col] ); # add a tooltip my $tip_text = $AoA[$row][$col]; $tooltip->set_tip($event_box, $tip_text, undef); #$event_box->modify_bg (normal => $color); $label->set_alignment(0, 0.5); $label->set_justify('left'); # $label->set_width_chars( $length ); $event_box->add ($label); $label->show; if ($row == 0) { $label->modify_font($font_desc_h); $event_box->modify_bg (normal => $header_color); } elsif ($row %2 ==0) { $event_box->modify_bg (normal => $even_color); } if ($col == 0) { $label->set_width_chars($length + 5); } #$table->attach_defaults ($event_box, $col, $col+1, $row, $row+1); $table->attach($event_box, $col, $col+1, $row, $row+1,'fill','fill',1,2); # add some activities with mouse 1 and 3 on each entry $event_box->signal_connect( 'button_release_event', sub{ my ($item, $event) = @_; #print "$item, $event\n"; my $button_num = $event->button(); #print "$button_num\n"; if( $button_num == 1){ print $label->get_text(),"\n"; } if( $button_num == 2){ $item->modify_bg (normal => $red); } if( $button_num == 3){ $item->modify_bg (normal => $black); } } ); } } $scwin->add_with_viewport( $table ); $vbox->pack_start( $scwin, 1, 1, 0 ); $window->add( $vbox ); $window->show_all(); Gtk2->main; sub rand_string{ my @charset = ('a'..'z','A'..'Z','0'..'9'); my $length_desired = 15; my $random_string; for(1..$length_desired){ $random_string .= $charset[rand @charset]; } return $random_string; } __END__