&::PukeSendMessage($::PUKE_WIDGET_LOAD,
                     $::PUKE_CONTROLLER,
                     $::PWIDGET_LISTBOX,
                     "plistbox.so",
                     sub { my %ARG = %{shift()};
                     if($ARG{'iArg'} == 1){
                       print "*E* PListBox Load failed!\n";
                     }
                     }
                  );


package PListBox; 
@ISA = qw(PTableView);
use strict;

if($PListBox::usage == undef){
    $PListBox::usage = 0;
}

sub new { 
  my $class = shift;
  my $self = $class->SUPER::new($class, @_);

  $self->{widgetType} = $::PWIDGET_LISTBOX;

  if($class eq 'PListBox'){
    $self->create();
  }

  $self->{count} = 0;
  $self->{items} = ();

  $self->installHandler($::PUKE_LISTBOX_SELECTED_ACK, sub{$self->selected(@_)});

  return $self;

}

sub DESTROY { 
    my $self = shift;
    $self->SUPER::DESTROY(@_);
    $PListBox::usage--;
    if($PListBox::usage == 0){
        &::PukeSendMessage($::PUKE_WIDGET_UNLOAD,
                           0,
                           $::PWIDGET_LISTBOX,
                           "",
                           sub {}
                          );

    }
}

sub insertText { 
  my $self = shift;
  
  my $text = shift;
  my $index = shift;
  my $rindex = $index;
  
  if($index < 0 || $index >= $self->{count}){
    $rindex = $self->{count};
  }

  $self->{count} ++;

  # Don't need the ouput since GET_TEXT_ACK will be called and
  # we'll set it there
  $self->sendMessage('iCommand' => $::PUKE_LISTBOX_INSERT,
                     'iArg' => $rindex,
		     'cArg' => $text,
                     'CallBack' => sub {});

}

sub text { 
  my $self = shift;
  my $index = shift;

  my %arg = $self->sendMessage('iCommand' => $::PUKE_LISTBOX_GETTEXT,
			       'iArg' => $index,
			       'WaitFor' => 1);

  if($arg{'iArg'} != 1){
    return undef;
  }
  $arg{'cArg'} =~ s/\000//g;
  return $arg{'cArg'};
}

sub insertPixmap { 
  my $self = shift;
  
  my $file = shift;
  my $index = shift;
  my $rindex = $index;
  
  if($index < 0 || $index >= $self->{count}){
    $rindex = $self->{count};
  }
  #  $self->{items}->[$rindex] = "***PIXMAP***" . $file;
  $self->{count} ++;


  # Don't need the ouput since GET_TEXT_ACK will be called and
  # we'll set it there
  $self->sendMessage('iCommand' => $::PUKE_LISTBOX_INSERT_PIXMAP,
                     'iArg' => $rindex,
		     'cArg' => $file,
                     'CallBack' => sub {});

}
sub selected {
  my $self = shift;
  my %ARGS = %{shift()};

  $self->{current} = $ARGS{'iArg'};
  $ARGS{'cArg'} =~ s/\000//g;
  $self->{currentText} = $ARGS{'cArg'};
}

sub current {
    my $self = shift;
    return   $self->{current};
}

sub currentText {
    my $self = shift;
    return $self->text($self->{current});
}

sub setCurrentItem {
  my $self = shift;

  my $index = shift;
  my $rindex = $index;

  # Async call be default, no need to wait result
  $self->sendMessage('iCommand' => $::PUKE_LISTBOX_HIGHLIGHT,
                     'iArg' => $index,
                     'CallBack' => sub {});


}

sub removeItem {
  my $self = shift;

  my $index = shift;

  $self->{count} --;

  # Async call be default, no need to wait result
  $self->sendMessage('iCommand' => $::PUKE_LISTBOX_REMOVE,
                     'iArg' => $index,
                     'CallBack' => sub {});


}

sub setScrollBar {
  my $self = shift;

  $self->sendMessage('iCommand' => $::PUKE_LISTBOX_SET_SCROLLBAR,
                     'iArg' => shift(),
                     'CallBack' => sub {});

}

sub setAutoScrollBar {
  my $self = shift;

  $self->sendMessage('iCommand' => $::PUKE_LISTBOX_SET_AUTO_SCROLLBAR,
                     'iArg' => shift(),
                     'CallBack' => sub {});

}

sub clear {
  my $self = shift;

  $self->{count} = 0;
  $self->{items} = ();
  
  $self->sendMessage('iCommand' => $::PUKE_LISTBOX_CLEAR,
                     'CallBack' => sub {});

}



package main; 

1;