package interactive_newt;

use diagnostics;
use strict;
use vars qw(@ISA);

@ISA = qw(interactive);

use interactive;
use common qw(:common :functional);
use Term::Newt;

my $width = 80;
my $height = 25;

my $n = Term::Newt->new;
$n->init;
$n->cls;

sub ask_from_listW {
    my ($o, $title_, $messages, $l, $def) = @_;
    my ($title, @okcancel) = ref $title_ ? @$title_ : ($title_, _("Ok"), _("Cancel"));
    my $mesg = join("\n", @$messages);

    if (@$l == 1) {
	$n->win_message($title, @$l, $mesg);
	$l->[0];
    } elsif (@$l == 2) {
	$l->[$n->win_choice($title, @$l, $mesg) - 1];
    } elsif (@$l == 3) {
	$l->[$n->win_ternary($title, @$l, $mesg) - 1];
    } else {
	my $i; map_index { $i = $::i if $def eq $_ } @$l;
	my ($r, $e) = $n->newtWinMenu($title, $mesg, 40, 5, 5, 8, $l, $i, @okcancel);
	return if $r > 1;
	$l->[$e];
    }
}

sub ask_many_from_list_refW($$$$$) {
    my ($o, $title, $messages, $list, $val) = @_;
    my $w = my_gtk->new('', %$o);
    my @box = map_index {
	     $n->newtCheckbox(1, $::i + 1, $_, ${$val->[$::i]} ? '*' : ' ', " *", ${$val->[$::i]});
	 } @$list;
    
    my $l = max(22, 2 + max map { length } @$list);
    my $h = max(10, 2 + @$list + @$messages);

    $n->open_window(($width - $l) / 2, ($height - $h) / 2, $l, $h, $title);
    my $form = $n->form(\ (my $ref = 0),'', 0);

    $n->form_add_components($form, @box,
			    $n->button(1,  @$list + 3, _("Ok")),
			    $n->button(10, @$list + 3, _("Cancel")));

    $n->run_form($form);
    $n->form_destroy($form);

    $$_ = $$_ eq "*" foreach @$val;
}


#sub ask_from_entries_refW {
#    my ($o, $title, $messages, $l, $val, %hcallback) = @_;
#    my ($title_, @okcancel) = ref $title ? @$title : $title;
#    my $num_fields = @{$l};
#    my $ignore = 0; #-to handle recursivity
#
#    my $w = my_gtk->new($title_, %$o);
#    #-the widgets
#    my @widgets = map {
#	 if ($_->{type} eq "list") {
#	     my $w = new Gtk::Combo;
#	     $w->set_use_arrows_always(1);
#	     $w->entry->set_editable(!$_->{not_edit});
#	     $w->set_popdown_strings(@{$_->{list}});
#	     $w->disable_activate;
#	     $_->{val} ||= $_->{list}[0];
#	     $w;
#	 } elsif ($_->{type} eq "bool") {
#	     my $w = Gtk::CheckButton->new($_->{text});
#	     $w->set_active(${$_->{val}});
#	     my $i = $_; $w->signal_connect(clicked => sub { $ignore or invbool \${$i->{val}} });
#	     $w;
#	 } else {
#	     new Gtk::Entry;
#	 }
#    } @{$val};
#    my $ok = $w->create_okcancel(@okcancel);
#
#    sub widget {
#	 my ($w, $ref) = @_;
#	 ($ref->{type} eq "list" && @{$ref->{list}}) ? $w->entry : $w
#    }
#    my @updates = mapn {
#	 my ($w, $ref) = @_;
#	 sub {
#	     $ref->{type} eq "bool" and return;
#	     ${$ref->{val}} = widget($w, $ref)->get_text;
#	 };
#    } \@widgets, $val;
#
#    my @updates_inv = mapn {
#	 my ($w, $ref) = @_;
#	 sub { 
#	     $ref->{type} eq "bool" ? 
#	       $w->set_active(${$ref->{val}}) :
#	       widget($w, $ref)->set_text(${$ref->{val}})
#	 };
#    } \@widgets, $val;
#
#
#    for (my $i = 0; $i < $num_fields; $i++) {
#	 my $ind = $i; #-cos lexical bindings pb !!
#	 my $widget = widget($widgets[$i], $val->[$i]);
#	 my $changed_callback = sub {
#	     return if $ignore; #-handle recursive deadlock
#	     &{$updates[$ind]};
#	     if ($hcallback{changed}) {
#		 &{$hcallback{changed}}($ind);
#		 #update all the value
#		 $ignore = 1;
#		 &$_ foreach @updates_inv;
#		 $ignore = 0;
#	     };
#	 };
#	 if ($hcallback{focus_out}) {
#	     my $focusout_callback = sub {
#		 return if $ignore;
#		 &{$hcallback{focus_out}}($ind);
#		 #update all the value
#		 $ignore = 1;
#		 &$_ foreach @updates_inv;
#		 $ignore = 0;
#	     };
#	     $widget->signal_connect(focus_out_event => $focusout_callback);
#	 }
#	 if (ref $widget eq "Gtk::Entry") {
#	     $widget->signal_connect(changed => $changed_callback);
#	     my $go_to_next = sub {
#		 if ($ind == ($num_fields -1)) {
#		     $w->{ok}->grab_focus();
#		 } else {
#		     widget($widgets[$ind+1],$val->[$ind+1])->grab_focus();
#		 }
#	     };
#	     $widget->signal_connect(activate => $go_to_next);
#	     $widget->signal_connect(key_press_event => sub {
#		 my ($w, $e) = @_;
#		 #-don't know why it works, i believe that
#		 #-i must say before &$go_to_next, but with it doen't work HACK!
#		 $w->signal_emit_stop("key_press_event") if chr($e->{keyval}) eq "\x8d";
#	     });
#	     $widget->set_text(${$val->[$i]{val}})  if ${$val->[$i]{val}};
#	     $widget->set_visibility(0) if $val->[$i]{hidden};
#	 }
#	 &{$updates[$i]};
#    }
#
#    my @entry_list = mapn { [($_[0], $_[1])]} $l, \@widgets;
#
#    gtkadd($w->{window},
#	    gtkpack(
#		    create_box_with_title($w, @$messages),
#		    create_packtable({}, @entry_list),
#		    $ok
#		    ));
#    widget($widgets[0],$val->[0])->grab_focus();
#    if ($hcallback{complete}) {
#	 my $callback = sub {
#	     my ($error, $focus) = &{$hcallback{complete}};
#	     #-update all the value
#	     $ignore = 1;
#	     foreach (@updates_inv) { &{$_};}
#	     $ignore = 0;
#	     if ($error) {
#		 $focus ||= 0;
#		 widget($widgets[$focus], $val->[$focus])->grab_focus();
#	     } else {
#		 return 1;
#	     }
#	 };
#	 #$w->{ok}->signal_connect(clicked => $callback)
#	 $w->main($callback);
#    } else {
#	 $w->main();
#    }
#}
#
#
#sub wait_messageW($$$) {
#    my ($o, $title, $message) = @_;
#
#    my $w = my_gtk->new($title, %$o, grab => 1);
#    my $W = pop @$message;
#    gtkadd($w->{window},
#	    gtkpack(new Gtk::VBox(0,0),
#		    @$message,
#		    $w->{wait_messageW} = new Gtk::Label($W)));
#    $w->sync;
#    $w;
#}
#sub wait_message_nextW {
#    my ($o, $message, $w) = @_;
#    $w->{wait_messageW}->set($message);
#    $w->sync;
#}
#sub wait_message_endW {
#    my ($o, $w) = @_;
#    $w->destroy;
#}
#
#sub kill {
#    my ($o) = @_;
#    $o->{before_killing} ||= 0;
#    while (@interactive::objects > $o->{before_killing}) {
#	 my $w = pop @interactive::objects;
#	 $w->destroy;
#    }
#    @my_gtk::grabbed = ();
#    $o->{before_killing} = @interactive::objects;
#}

1;