home *** CD-ROM | disk | FTP | other *** search
/ Inter.Net 55-2 / Inter.Net 55-2.iso / Mandrake / mdkinst / usr / bin / perl-install / interactive_newt.pm < prev    next >
Encoding:
Perl POD Document  |  2000-01-12  |  5.6 KB  |  222 lines

  1. package interactive_newt;
  2.  
  3.  
  4.  
  5.  
  6.  
  7. @ISA = qw(interactive);
  8.  
  9. use interactive;
  10. use common qw(:common :functional);
  11. use log;
  12. use Newt::Newt;
  13.  
  14. my $width = 80;
  15. my $height = 25;
  16. my @wait_messages;
  17.  
  18. sub new() {
  19.     Newt::Init;
  20.     Newt::changeColors;
  21.     Newt::Cls;
  22.     Newt::SetSuspendCallback;
  23.     open STDERR,">/dev/null" if $::isStandalone;
  24.     bless {}, $_[0];
  25. }
  26.  
  27. sub suspend { Newt::Suspend }
  28. sub resume { Newt::Resume }
  29. sub end() { Newt::Finished }
  30. sub exit() { end; exit($_[0]) }
  31. END { end() }
  32.  
  33. sub myTextbox {
  34.     my @l = map { split "\n" } @_;
  35.     my $mess = Newt::Component::Textbox(1, 0, my $w = max(map { length } @l) + 1, my $h = @l, 1 << 6);
  36.     $mess->TextboxSetText(join("\n", @_));
  37.     $mess, $w + 1, $h;
  38. }
  39.  
  40. sub separator($$) {
  41.     my $blank = Newt::Component::Form(\undef, '', 0);
  42.     $blank->FormSetWidth ($_[0]);
  43.     $blank->FormSetHeight($_[1]);
  44.     $blank;
  45. }
  46. sub checkval($) { $_[0] && $_[0] ne ' '  ? '*' : ' ' }
  47.  
  48. sub ask_from_listW {
  49.     my ($o, $title_, $messages, $l, $def) = @_;
  50.     my ($title, @okcancel) = ref $title_ ? @$title_ : ($title_, _("Ok"), _("Cancel"));
  51.  
  52.     my $mesg = join("\n", @$messages);
  53.     my $len = 0; $len += length($_) foreach @$l;
  54.  
  55.     if (@$l == 1) {
  56.     Newt::WinMessage($title, @$l, $mesg);
  57.     $l->[0];
  58.  
  59.     } elsif (@$l == 2 && $len < 64) {
  60.     $l->[Newt::WinChoice($title, @$l, $mesg) - 1];
  61.  
  62.     } elsif (@$l == 3 && $len < 64) {
  63.     $l->[Newt::WinTernary($title, @$l, $mesg) - 1];
  64.     } else {
  65.     my $special = !@okcancel;
  66.     if ($special) {
  67.         $l = [ @$l ];
  68.         @okcancel = pop @$l;
  69.     }
  70.     my $i; map_index { $i = $::i if $def eq $_ } @$l;
  71.     my ($r, $e) = Newt::WinMenu($title, $mesg, 40, 5, 5, 8, $l, $i, @okcancel);
  72.     $r > 1 and die "ask_from_list cancel";
  73.     if ($special) {
  74.         $r ? $okcancel[0] : $l->[$e];
  75.     } else {
  76.         $l->[$e];
  77.     }
  78.     }
  79. }
  80.  
  81. sub ask_many_from_list_refW($$$$$) {
  82.     my ($o, $title, $messages, $list, $val) = @_;
  83.     my $height = min(int @$list, 18);
  84.     
  85.     my $sb = Newt::Component::VerticalScrollbar(-1, -1, $height, 9, 10);
  86.     my $checklist = $sb->Form('', 0);
  87.     $checklist->FormSetHeight($height);
  88.     $checklist->FormSetBackground(9);
  89.  
  90.     my @l = map_index {    
  91.     Newt::Component::Checkbox(1, $::i + 1, $_, checkval(${$val->[$::i]} ||= ''), " *");
  92.     } @$list;
  93.     $checklist->FormAddComponent($_) foreach @l;
  94.  
  95.     my $listg = Newt::Grid::HCloseStacked($checklist, $height < @$list ? (separator(1, $height), $sb) : ());
  96.  
  97.     my ($buttons, $ok, $cancel) = Newt::Grid::ButtonBar(_("Ok"), _("Cancel"));
  98.  
  99.     my $form = Newt::Component::Form(\undef, '', 0);
  100.     my $window = Newt::Grid::GridBasicWindow(first(myTextbox(@$messages)), $listg, $buttons);
  101.     $window->GridWrappedWindow($title);
  102.     $window->GridAddComponentsToForm($form, 1);
  103.     my $r = $form->RunForm;
  104.  
  105.     $form->FormDestroy;
  106.     Newt::PopWindow;
  107.  
  108.     $$r == $$cancel and return;
  109.  
  110.     mapn {
  111.     my ($a, $b) = @_;
  112.     $$a = $b->CheckboxGetValue == ord '*';
  113.     } $val, \@l;
  114.  
  115.     1;
  116. }
  117.  
  118.  
  119. sub ask_from_entries_refW {
  120.     my ($o, $title, $messages, $l, $val, %hcallback) = @_;
  121.     my ($title_, @okcancel) = deref($title);
  122.     my $ignore = 0; 
  123.  
  124.     
  125.     my @widgets = map {
  126.     $_->{type} = "entry" if $_->{type} eq "list" && !$_->{not_edit};
  127.     ${$_->{val}} ||= '';
  128.     if ($_->{type} eq "list" && $_->{not_edit}) {         
  129.         $_->{val} ||= $_->{list}[0];
  130.         my $w = Newt::Component::Listbox(-1, -1, 1, 0);
  131.         $w->ListboxSetWidth(20);
  132.         map_index { $w->ListboxAddEntry($_, $_) } @{$_->{list}};
  133.         $w;
  134.     } elsif ($_->{type} eq "bool") {
  135.         Newt::Component::Checkbox(-1, -1, $_->{text} || '', checkval(${$_->{val}}), " *");
  136.     } else {
  137.         Newt::Component::Entry(-1, -1, '', 20, ($_->{hidden} && 1 << 1) | 1 << 2);
  138.     }
  139.     } @$val;
  140.  
  141.     my @updates = mapn {
  142.      my ($w, $ref) = @_;
  143.      sub {
  144.          ${$ref->{val}} = 
  145.            $ref->{type} eq "bool" ?
  146.              $w->CheckboxGetValue == ord '*' :
  147.            $ref->{type} eq "list" ?
  148.              $w->ListboxGetCurrent :
  149.          $w->EntryGetValue;
  150.      };
  151.     } \@widgets, $val;
  152.  
  153.     my @updates_inv = mapn {
  154.      my ($w, $ref) = @_;
  155.      my $val = ${$ref->{val}};
  156.      sub {
  157.          $ref->{type} eq "bool" ?
  158.            $w->CheckboxSetValue(checkval($val)) :
  159.          $ref->{type} eq "list" ?
  160.            $w->ListboxSetCurrentByKey($val) :
  161.            $w->EntrySet($val, 1);
  162.      };
  163.     } \@widgets, $val;
  164.  
  165.     map { &{$updates_inv[$_]} } 0..$#widgets;
  166.  
  167.     my $grid = Newt::Grid::CreateGrid(3, int @$l);
  168.     map_index {
  169.     $grid->GridSetField(0, $::i, 1, ${Newt::Component::Label(-1, -1, $_)}, 0, 0, 1, 0, 1, 0);
  170.     $grid->GridSetField(1, $::i, 1, ${$widgets[$::i]}, 0, 0, 0, 0, 1, 0);
  171.     } @$l;
  172.  
  173.     my ($buttons, $ok, $cancel) = Newt::Grid::ButtonBar(@okcancel);
  174.  
  175.     my $form = Newt::Component::Form(\undef, '', 0);
  176.     my $window = Newt::Grid::GridBasicWindow(first(myTextbox(@$messages)), $grid, $buttons);
  177.     $window->GridWrappedWindow($title_);
  178.     $window->GridAddComponentsToForm($form, 1);
  179.     my $r = $form->RunForm;
  180.     map { &{$updates[$_]} } 0..$#widgets;
  181.     $form->FormDestroy;
  182.     Newt::PopWindow;
  183.     $$r != $$cancel;
  184. }
  185.  
  186.  
  187. sub waitbox($$) {
  188.     my ($title, $messages) = @_;
  189.     my ($t, $w, $h) = myTextbox(@$messages);
  190.     my $f = Newt::Component::Form(\undef, '', 0);
  191.     Newt::CenteredWindow($w, $h, $title);
  192.     $f->FormAddComponent($t);
  193.     $f->DrawForm;
  194.     Newt::Refresh;
  195.     $f->FormDestroy;
  196.     push @wait_messages, $f;
  197.     $f;
  198. }
  199.  
  200.  
  201. sub wait_messageW($$$) {
  202.     my ($o, $title, $messages) = @_;
  203.     { form => waitbox($title, $messages), title => $title };
  204. }
  205.  
  206. sub wait_message_nextW {
  207.     my ($o, $messages, $w) = @_;
  208.     $o->wait_message_endW($w);
  209.     $o->wait_messageW($w->{title}, $messages);
  210. }
  211. sub wait_message_endW {
  212.     my ($o, $w) = @_;
  213.     log::l("interactive_newt does not handle none stacked wait-messages") if $w->{form} != pop @wait_messages;
  214.     Newt::PopWindow;
  215. }
  216.  
  217. sub kill {
  218. }
  219.  
  220.  
  221. 1;
  222.