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

use strict;
use warnings;

use IUP ':all';

my $img_bits1 = [
  [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1],
  [1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1],
  [1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1],
  [1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1],
  [1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1],
  [1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1],
  [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1],
  [1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1],
  [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
  [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
  [2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
  [2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
  [2,2,2,0,2,0,2,0,2,2,0,2,2,2,0,0,0,2,2,2,0,0,2,0,2,2,0,0,0,2,2,2],
  [2,2,2,0,2,0,0,2,0,0,2,0,2,0,2,2,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2],
  [2,2,2,0,2,0,2,2,0,2,2,0,2,2,2,2,2,0,2,0,2,2,2,0,2,0,2,2,2,0,2,2],
  [2,2,2,0,2,0,2,2,0,2,2,0,2,2,0,0,0,0,2,0,2,2,2,0,2,0,0,0,0,0,2,2],
  [2,2,2,0,2,0,2,2,0,2,2,0,2,0,2,2,2,0,2,0,2,2,2,0,2,0,2,2,2,2,2,2],
  [2,2,2,0,2,0,2,2,0,2,2,0,2,0,2,2,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2],
  [2,2,2,0,2,0,2,2,0,2,2,0,2,2,0,0,0,0,2,2,0,0,2,0,2,2,0,0,0,2,2,2],
  [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2],
  [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,0,2,2,2,2,2,2,2,2],
  [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,2,2,2,2,2,2],
  [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
  [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
  [1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1],
  [1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1],
  [1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1],
  [1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
  [1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
  [1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
  [1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
  [2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
];

my $img_bits2= [
  [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2],
  [2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2],
  [2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2],
  [2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2],
  [2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2],
  [2,2,2,2,2,2,2,2,2,2,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2],
  [2,2,2,2,2,2,2,2,2,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2],
  [2,2,2,2,2,2,2,2,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2],
  [3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],
  [3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],
  [3,3,3,0,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],
  [3,3,3,0,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],
  [3,3,3,0,3,0,3,0,3,3,0,3,3,3,1,1,0,3,3,3,0,0,3,0,3,3,0,0,0,3,3,3],
  [3,3,3,0,3,0,0,3,0,0,3,0,3,0,1,1,3,0,3,0,3,3,0,0,3,0,3,3,3,0,3,3],
  [3,3,3,0,3,0,3,3,0,3,3,0,3,3,1,1,3,0,3,0,3,3,3,0,3,0,3,3,3,0,3,3],
  [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
  [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
  [3,3,3,0,3,0,3,3,0,3,3,0,3,0,1,1,3,0,3,0,3,3,0,0,3,0,3,3,3,0,3,3],
  [3,3,3,0,3,0,3,3,0,3,3,0,3,3,1,1,0,0,3,3,0,0,3,0,3,3,0,0,0,3,3,3],
  [3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3],
  [3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,0,3,3,3,0,3,3,3,3,3,3,3,3],
  [3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,0,0,0,3,3,3,3,3,3,3,3,3],
  [3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],
  [3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],
  [2,2,2,2,2,2,2,3,3,3,3,3,3,3,1,1,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2],
  [2,2,2,2,2,2,3,3,3,3,3,3,3,3,1,1,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2],
  [2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2],
  [2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
  [2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
  [2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
  [2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
  [3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2],
];

# global elements
my $img1 = IUP::Image->new( pixels=>$img_bits1, 0=>"0 0 0", 1=>"BGCOLOR", 2=>"255 0 0" );
my $img2 = IUP::Image->new( pixels=>$img_bits2, 0=>"0 0 0", 1=>"0 255 0", 2=>"BGCOLOR", 3=>"255 0 0" );
my $mdiFrame; #global window
my @elements;

# global counters
my $line = 0;
my $id = 1;

sub getfocus_cb {
  my $self = shift;
  printf STDERR "$line-getfocus(%s#%s)\n",
         $self->GetClassName(), 
         ($self->GetAttribute("CINDEX") || 'n.a.');
  $line++;
  return IUP_DEFAULT;
}

sub killfocus_cb {
  my $self = shift;
  printf STDERR "$line-killfocus(%s#%s)\n",
         $self->GetClassName(), 
         ($self->GetAttribute("CINDEX") || 'n.a.');         
  $line++;
  return IUP_DEFAULT;
}

sub action {
  my $self = shift;
  printf STDERR "$line-action(%s#%s) Value=%s\n", 
         $self->GetClassName(), 
         ($self->GetAttribute("CINDEX") || 'n.a.'),
         ($self->GetAttribute("VALUE") || 'n.a.');
  $line++;
  return IUP_DEFAULT;
}

sub set_callbacks {
  my $ctrl = shift;
  $ctrl->SetCallback("GETFOCUS_CB", \&getfocus_cb);
  $ctrl->SetCallback("KILLFOCUS_CB", \&killfocus_cb);  
  $ctrl->SetCallback("ACTION", \&action) if $ctrl->IsValidCallbackName('ACTION');  
  my $child; #passing undef to GetNextChild gives the first child 
  while($child = $ctrl->GetNextChild($child)) {
    set_callbacks($child);  
  }
}

sub createDialog {
  my $frm_1 = IUP::Frame->new( child=>
                IUP::Vbox->new( child=>[
                  IUP::Button->new( TITLE=>"Button Text", CINDEX=>1 ),
                  IUP::Button->new( TITLE=>"", CINDEX=>2, BGCOLOR=>"255 128 0", RASTERSIZE=>"30x30" ),
                  IUP::Button->new( TITLE=>"", IMAGE=>$img1, CINDEX=>3 ),
                  IUP::Button->new( TITLE=>"", IMAGE=>$img1, CINDEX=>4, FLAT=>"YES" ),
                  IUP::Button->new( TITLE=>"", IMAGE=>$img1, IMPRESS=>$img2, CINDEX=>5 ),
                ]), TITLE=>"IupButton" );

  my $frm_2 = IUP::Frame->new( child=>
                IUP::Vbox->new( child=>[
                  IUP::Label->new( TITLE=>"Label Text\nLine 2\nLine 3", CINDEX=>1 ),
                  IUP::Label->new( TITLE=>"", SEPARATOR=>"HORIZONTAL", CINDEX=>2 ),
                  IUP::Label->new( TITLE=>"", IMAGE=>$img1, CINDEX=>3 ),
                ]), TITLE=>"IupLabel" );

  my $frm_3 = IUP::Frame->new( child=>
                IUP::Vbox->new( child=>[
                  IUP::Toggle->new( TITLE=>"Toggle Text", VALUE=>"ON", CINDEX=>1 ),
                  IUP::Toggle->new( TITLE=>"3State Text", VALUE=>"NOTDEF", CINDEX=>2, '3STATE'=>"YES" ),
                  IUP::Toggle->new( TITLE=>"", IMAGE=>$img1, IMPRESS=>$img2, CINDEX=>3 ),
                  IUP::Frame->new( child=>
                    IUP::Radio->new( TITLE=>"IupRadio", child=>
                      IUP::Vbox->new( child=>[
                        IUP::Toggle->new( TITLE=>"Toggle Text", CINDEX=>4 ),
                        IUP::Toggle->new( TITLE=>"Toggle Text", CINDEX=>5 ),
                      ]),                      
                    ),
                  )
                ]), TITLE=>"IupToggle" );

  my $text_1 = IUP::Text->new(
                 VALUE=>"IupText Text",
                 #SIZE=>"80x",
                 CINDEX=>1 );

  my $ml_1 = IUP::Text->new(
               MULTILINE=>1,
               VALUE=>"IupMultiline Text\nSecond Line\nThird Line",
               #SIZE=>"50x30",
               #EXPAND=>"YES",
               #SIZE=>"80x60",
               CINDEX=>1 );
               
  my $frm_4 = IUP::Frame->new( TITLE=>"IupText/IupMultiline", child=>IUP::Vbox->new( child=>[$text_1, $ml_1,]) );

  my $list_1 = IUP::List->new(
                 EXPAND=>"YES",
                 #SIZE=>"50x40",
                 VALUE=>1,
                 MULTIPLE=>"YES",
                 1=>"Item 1 Text",
                 2=>"Item 2 Text",
                 3=>"Item 3 Text Big Item",
                 4=>"Item 4 Text",
                 5=>"Item 5 Text",
                 6=>"Item 6 Text",
                 CINDEX=>1 );        

  my $list_2 = IUP::List->new(
                 DROPDOWN=>"YES",
                 EXPAND=>"YES",
                 VISIBLE_ITEMS=>3,
                 SIZE=>"50x",
                 VALUE=>2,
                 1=>"Item 1 Text",
                 2=>"Item 2 Text Big Item",
                 3=>"Item 3 Text",
                 4=>"Item 4 Text",
                 5=>"Item 5 Text",
                 6=>"Item 6 Text",
                 CINDEX=>2 );

  my $list_3 = IUP::List->new(
                 EDITBOX=>"YES",
                 EXPAND=>"YES",
                 SIZE=>"50x40",
                 VALUE=>"Test Value",
                 1=>"Item 1 Text",
                 2=>"Item 2 Text Big Item",
                 3=>"Item 3 Text",
                 4=>"Item 4 Text",
                 5=>"Item 5 Text",
                 6=>"Item 6 Text",
                 CINDEX=>3 );

  my $list_4 = IUP::List->new(
                 EDITBOX=>"YES",
                 DROPDOWN=>"YES",
                 EXPAND=>"YES",
                 VISIBLE_ITEMS=>3,
                 SIZE=>"50x10",
                 VALUE=>"Test Value",
                 1=>"Item 1 Text",
                 2=>"Item 2 Text Big Item",
                 3=>"Item 3 Text",
                 4=>"Item 4 Text",
                 5=>"Item 5 Text",
                 6=>"Item 6 Text",
                 CINDEX=>4 );
 
  my $frm_5 = IUP::Frame->new( child=>IUP::Vbox->new( child=>[$list_1, $list_2, $list_3, $list_4] ), TITLE=>"IupList" );

  my $hbox_1 = IUP::Hbox->new( child=>[$frm_1, $frm_2, $frm_3, $frm_4, $frm_5] );

  my $cnv_1 = IUP::Canvas->new( BGCOLOR=>"128 255 0" );

  my $vbox_1 = IUP::Vbox->new( child=>[$hbox_1, $cnv_1], MARGIN=>"5x5", ALIGNMENT=>"ARIGHT", GAP=>5 );
 
  set_callbacks($vbox_1);  
  
  my $dlg = IUP::Dialog->new( child=>$vbox_1, TITLE=>"MDI Child $id" );
  $id++;
  
#  $dlg->SetAttribute(
#          SHRINK=>"YES",
#          SIZE=>"500x200",
#          BGCOLOR=>"255 0 255",
#          FONT=>"Times New Roman:ITALIC:10",
#          FONT=>IUP_TIMES_BOLD_14,
#          COMPOSITED=>"YES",
#          OPACITY=>192 );
  
  return $dlg;
}

sub mdi_tilehoriz {
  my $self = shift;
  $self->GetDialog->MDIARRANGE("TILEHORIZONTAL");
  return IUP_DEFAULT;
}

sub mdi_tilevert {
  my $self = shift;
  $self->GetDialog->MDIARRANGE("TILEVERTICAL");
  return IUP_DEFAULT;
}

sub mdi_cascade {
  my $self = shift;
  $self->GetDialog->MDIARRANGE("CASCADE");
  return IUP_DEFAULT;
}

sub mdi_icon {
  my $self = shift;
  $self->GetDialog->MDIARRANGE("ICON");
  return IUP_DEFAULT;
}

sub mdi_next {
  my $self = shift;
  $self->GetDialog->MDIACTIVATE("NEXT");
  return IUP_DEFAULT;
}

sub mdi_previous {
  my $self = shift;
  $self->GetDialog->MDIACTIVATE("PREVIOUS");
  return IUP_DEFAULT;
}

sub mdi_closeall {
  my $self = shift;
  $self->GetDialog->MDICLOSEALL(undef);
  return IUP_DEFAULT;
}

sub mdi_activate {
  my $self = shift;
  printf STDERR "$line-mdi_activate(%s)\n", $self->GetName();
  $line++;
  return IUP_DEFAULT;
}

sub mdi_new {
  my $self = shift;
  my $dlg = createDialog();
  $dlg->SetAttribute( MDICHILD=>"YES", PARENTDIALOG=>$mdiFrame);
  $dlg->SetCallback( MDIACTIVATE_CB=>\&mdi_activate );
  #$dlg->PLACEMENT("MAXIMIZED");
  $dlg->Show();
  return IUP_DEFAULT;
}

sub createMenu {
  my $mnu = IUP::Menu->new( name=>"mnu", child=>[
              IUP::Submenu->new( TITLE=>"MDI", child=>
                IUP::Menu->new( child=>
                  IUP::Item->new( TITLE=>"New", ACTION=>\&mdi_new ),
                ),
              ),                
              IUP::Submenu->new( TITLE=>"Window", , child=> 
                IUP::Menu->new( name=>"winmenu", child=>[
                  IUP::Item->new( TITLE=>"Tile Horizontal", ACTION=>\&mdi_tilehoriz ), 
                  IUP::Item->new( TITLE=>"Tile Vertical", ACTION=>\&mdi_tilevert ), 
                  IUP::Item->new( TITLE=>"Cascade", ACTION=>\&mdi_cascade ), 
                  IUP::Item->new( TITLE=>"Icon Arrange", ACTION=>\&mdi_icon ), 
                  IUP::Item->new( TITLE=>"Close All", ACTION=>\&mdi_closeall ), 
                  IUP::Separator->new(),
                  IUP::Item->new( TITLE=>"Next", ACTION=>\&mdi_next ), 
                  IUP::Item->new( TITLE=>"Previous", ACTION=>\&mdi_previous ), 
                ]),
              ),
            ]);  
  return $mnu;
}

sub createFrame {
  my $menu = shift;
  my $mdiMenu = IUP->GetByName("winmenu");
  my $cnv = IUP::Canvas->new( MDICLIENT=>"YES", MDIMENU=>$mdiMenu );
  my $dlg = IUP::Dialog->new( name=>"mdiFrame", child=>$cnv, 
                              MENU=>$menu, TITLE=>"MDI Frame", 
                              MDIFRAME=>"YES", RASTERSIZE=>"800x600" );
  return $dlg;
}

### main ###

if (IUP->GetGlobal('DRIVER') ne 'Win32') {
  IUP->Message('BEWARE: MDI demo app works just with MS Windows GUI driver!');
}
else {
  $mdiFrame = createFrame( createMenu() );
  #$mdiFrame->PLACEMENT("MAXIMIZED");
  $mdiFrame->ShowXY(IUP_CENTER, IUP_CENTER);
  IUP->MainLoop();
}