#!/usr/bin/perl -w
use strict;

use Win32::GUI;

my $mw = new Win32::GUI::Window(
 	-name   => "Main",
	-width 	=> 900,
	-height => 400,
	-tabstop=>1,
);
#$mw->DialogUI( 1 );

my @edit = ();
my $dimX = 4;
my $dimY = 4;

for ( my $i = 0; $i < $dimY; $i++ ) {
	for ( my $j = 0; $j < $dimX; $j++ ) {
		$edit[$i][$j] = $mw->AddTextfield (
			-text => $i.'x'.$j,
 			-name 		=> 'edit'.$i.$j,
	 		-left 		=>  50 + 100*$j,
			-top     	=>  50 +  20*$i,
			-width 		=>  99,
			-height 	=>  20,
			-tabstop    =>   1,
#			-dialogui => 1,
		);

		eval ('sub edit'.$i.$j.'_KeyDown { what_to_do( '.$i.','.$j.' ) }');
	}
}

sub what_to_do {
	my ( $i, $j ) = ( shift, shift );

	my $hash_EVENT = Win32::GUI::GetKeyboardState;
	my $_EVENT     = what_event( $hash_EVENT );

	my $nextX = $j + 1; $nextX = 0 if $nextX >= $dimX;
	my $prevX = $j - 1; $prevX = $dimX-1 if $prevX < 0;
	my $nextY = $i + 1; $nextY = $dimY-1 if $nextY >= $dimY;
	my $prevY = $i - 1; $prevY = 0 if $prevY < 0;

	if ( $_EVENT eq 'Tab'      ) { $edit[$i][$nextX]->SetFocus() }
	if ( $_EVENT eq 'ShiftTab' ) { $edit[$i][$prevX]->SetFocus() }
	if ( $_EVENT eq 'Up'       ) { $edit[$prevY][$j]->SetFocus() }
	if ( $_EVENT eq 'Down'     ) { $edit[$nextY][$j]->SetFocus() }
}

$edit[0][0]->SetFocus();

$mw->Show();

Win32::GUI::Dialog();

sub Main_Terminate { -1; }

sub what_event {
	my $_EVENT = shift;
	my $result = '';
	my $SHIFT  = '';

	if (( $_EVENT->[160] )||( $_EVENT->[161] )) { $SHIFT = 'Shift' }

	for ( my $i = 0; $i < 256; $i++ ) {
		if ( $_EVENT->[$i] ) {
			if    ( $i ==  9 ) { $result = $SHIFT.'Tab' }
			elsif ( $i == 38 ) { $result = $SHIFT.'Up'  }
			elsif ( $i == 40 ) { $result = $SHIFT.'Down'}
		}
    }

	return $result;
}

__END__

