The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# IUP::Cells example

use strict;
use warnings;

use IUP ':all';

sub height_cb {
  my ($self, $i) = @_;
  return int(30+$i*1.5);
}

sub width_cb {
  my ($self, $j) = @_;
  return int(50+$j*1.5);
}

sub mouseclick_cb {
  my ($self, $b, $m, $i, $j, $x, $y, $r)  = @_;
  printf("CLICK: %d: (%02d, %02d)\n", $b, $i, $j);
  return IUP_DEFAULT;
}

sub scrolling_cb {
  my ($self, $i, $j) = @_;
  printf("SCROLL: (%02d, %02d)\n", $i, $j);
  return IUP_DEFAULT;
}

sub vspan_cb {
  my ($self, $i, $j) = @_;
  return 2 if ($i == 1 && $j == 1);
  return 2 if ($i == 5 && $j == 5);
  return 1;
}

sub hspan_cb {
  my ($self, $i, $j) = @_;
  return 2 if ($i == 1 && $j == 1);
  return 2 if ($i == 5 && $j == 5);
  return 1;
}

sub draw_cb {
  my ($self, $i, $j, $xmin, $xmax, $ymin, $ymax, $canvas) = @_;

  my $xm = ($xmax + $xmin) / 2;
  my $ym = ($ymax + $ymin) / 2;

  return IUP_DEFAULT if ($i == 1 && $j == 2);
  return IUP_DEFAULT if ($i == 2 && $j == 1);
  return IUP_DEFAULT if ($i == 2 && $j == 2);
  return IUP_DEFAULT if ($i == 5 && $j == 6);
  return IUP_DEFAULT if ($i == 6 && $j == 5);
  return IUP_DEFAULT if ($i == 6 && $j == 6);

  if ($i == 1 && $j == 1) {
    $canvas->cdForeground(CD_WHITE);
  }
  else {
    $canvas->cdForeground($canvas->cdEncodeColor($i*20, $j*100, $i+100));
  }
  
  $canvas->cdBox($xmin, $xmax, $ymin, $ymax);
  $canvas->cdTextAlignment(CD_CENTER);
  $canvas->cdForeground(CD_BLACK);  
  $canvas->cdText($xm, $ym, "($i, $j)");

  return IUP_DEFAULT;
}

my $cells = IUP::Cells->new(
              BOXED         => "NO",
              RASTERSIZE    => "395x255",
              MOUSECLICK_CB => \&mouseclick_cb,
              DRAW_CB       => \&draw_cb,
              SCROLLING_CB  => \&scrolling_cb,
              NLINES_CB     => sub {7},
              NCOLS_CB      => sub {7},
              WIDTH_CB      => \&width_cb,
              HEIGHT_CB     => \&height_cb,
              HSPAN_CB      => \&hspan_cb,
              VSPAN_CB      => \&vspan_cb, );

my $box = IUP::Vbox->new( child=>$cells, MARGIN=>"10x10" );
my $dlg = IUP::Dialog->new( child=>$box, TITLE=>"IUP::Cells", RASTERSIZE=>"350x250" );

$dlg->ShowXY(IUP_CENTER, IUP_CENTER);

IUP->MainLoop();