App-Widget

 view release on metacpan or  search on metacpan

lib/App/Widget/DualListSelect.pm  view on Meta::CPAN

    $self->set_value(\@values);
    return 1;
}

sub unselect {
    my ($self) = @_;
    my $selected = $self->{selected};
    my @values = $self->get_values();
    my (%unselected, @newvalues);
    foreach my $value (@$selected) {
        $unselected{$value} = 1;
    }
    foreach my $value (@values) {
        if (!$unselected{$value}) {
            push(@newvalues, $value);
        }
    }
    $self->set_value(\@newvalues);
    return 1;
}

sub move_up {
    my ($self) = @_;
    my $selected = $self->{selected};
    my @values = $self->get_values();
    my (%moved, @newvalues, $value);
    foreach $value (@$selected) {
        $moved{$value} = 1;
    }
    for (my $i = 0; $i < $#values; $i++) {
        if ($moved{$values[$i+1]} && !$moved{$values[$i]}) {
            $value = $values[$i+1];
            $values[$i+1] = $values[$i];
            $values[$i] = $value;
        }
    }
    $self->set_value(\@values);
    return 1;
}

sub move_down {
    my ($self) = @_;
    my $selected = $self->{selected};
    my @values = $self->get_values();
    my (%moved, @newvalues, $value);
    foreach $value (@$selected) {
        $moved{$value} = 1;
    }
    for (my $i = $#values; $i > 0; $i--) {
        if ($moved{$values[$i-1]} && !$moved{$values[$i]}) {
            $value = $values[$i-1];
            $values[$i-1] = $values[$i];
            $values[$i] = $value;
        }
    }
    $self->set_value(\@values);
    return 1;
}

######################################################################
# OUTPUT METHODS
######################################################################

sub _set_child_widget_values {
    my ($self, $values) = @_;

    my $name = $self->{name};
    my $context = $self->{context};
    my $domain = $self->{domain};
    my $allvalues = $context->value_domain($domain)->values();

    my @selected_list = $self->get_values();
    my @unselected_list = ();
    my ($value, %value_exists, $value_exists);

    foreach $value (@selected_list) {
        if (defined $value) {
            $value_exists{$value} = 1;
            $value_exists = 1;
        }
    }

    for (my $v = 0; $v <= $#$allvalues; $v++) {
        $value = $allvalues->[$v];
        if (!$value_exists{$value}) {
            push(@unselected_list, $value);
        }
    }

    push(@selected_list, $NONE) if ($#selected_list == -1);
    push(@unselected_list, $NONE) if ($#unselected_list == -1);

    $context->widget("$name-selected")->{values}   = \@selected_list;
    $context->widget("$name-unselected")->{values} = \@unselected_list;
    $context->so_delete($name, "selected");
    $context->so_delete($name, "unselected");
}

sub html {
    my $self = shift;

    my $context  = $self->{context};
    my $name     = $self->{name};

    $self->_set_child_widget_values();

    my $unselected_list = $context->widget("${name}-unselected")->html();
    my $selected_list   = $context->widget("${name}-selected")->html();
    my $select_button   = $context->widget("${name}-select_button")->html();
    my $unselect_button = $context->widget("${name}-unselect_button")->html();
    my $up_button       = $context->widget("${name}-up_button")->html();
    my $dn_button       = $context->widget("${name}-dn_button")->html();

    my $html = <<EOF;
<table border=0 cellspacing=3>
<tr>
   <td align=center valign=middle rowspan=2>$unselected_list</td>
   <td align=center valign=bottom>$select_button</td>
   <td align=center valign=middle rowspan=2>$selected_list</td>
   <td align=center valign=bottom>$up_button</td>
</tr>



( run in 0.523 second using v1.01-cache-2.11-cpan-39bf76dae61 )