package Lire::UI::XMLSpecListWidget;
use strict;
use base qw/ Lire::UI::PolyListWidget /;
use Curses::UI::Common qw/keys_to_lowercase/;
use Lire::ReportSpec;
use Lire::Config::XMLSpecListSpec;
use Lire::Utils qw/check_object_param/;
use Carp;
sub new {
my ( $class, %userargs ) = @_;
keys_to_lowercase( \%userargs );
my $value = $userargs{'value'};
check_object_param( $value, 'value', 'Lire::Config::List' );
croak "'value' parameter's spec should be a 'Lire::Config::XMLSpecListSpec' instance, not '", $value->spec(), "'"
unless $value->spec()->isa( 'Lire::Config::XMLSpecListSpec' );
my $self = $class->SUPER::new( %userargs );
$self->set_routine( 'edit-element', \&edit_element );
return $self;
}
sub superservice_filter {
my ( $self, $superservice ) = @_;
if ( @_ == 2 ) {
$self->{'superservice'} = $superservice;
$self->update_type_popupmenu();
$self->getobj( 'type_widget' )->draw(1);
}
return $self->{'superservice'};
}
sub update_type_popupmenu {
my $self = $_[0];
my $popup = $self->getobj( 'type_widget' );
if ( $self->{'superservice'} ) {
my $rx = qr/^$self->{'superservice'}:(.*)/;
my @values = ();
foreach my $spec_id ( $self->{'value'}->spec()->component_names() ) {
my ($type) = $spec_id =~ /$rx/;
next unless $type;
push @values, $type;
}
$popup->{'-values'} = [ sort @values ];
} else {
$popup->{'-values'} = [];
}
$popup->{'-labels'} = {};
return;
}
sub new_value {
my $self = $_[0];
return undef unless $self->{'superservice'};
my $type = $self->getobj( 'type_widget' )->get();
return undef unless defined $type;
return $self->{'value'}->spec()->get( "$self->{'superservice'}:$type" )->instance();
}
sub edit_element {
my $self = $_[0];
my $list_widget = $self->getobj( 'list' );
return unless $list_widget->{'-focusable'};
my $info;
if ( $self->{'value'}->spec()->type() eq 'reports' ) {
my ( $super, $type ) =
$list_widget->get()->name() =~ /$Lire::Config::XMLSpecListSpec::NAME_RE/;
$info = Lire::ReportSpec->load( $super, $type )->create_table_info();
$info->set_variables_indices();
}
$self->SUPER::edit_element();
$info->reset_variables_indices() if $info;
return;
}
1;
syntax highlighted by Code2HTML, v. 0.9.1