package PDF::FromHTML::Template::Container::Loop;
use strict;
BEGIN {
use vars qw(@ISA);
@ISA = qw(PDF::FromHTML::Template::Container);
use PDF::FromHTML::Template::Container;
}
sub new
{
my $class = shift;
my $self = $class->SUPER::new(@_);
if (exists $self->{MAXITERS} && $self->{MAXITERS} < 1)
{
die " MAXITERS must be greater than or equal to 1", $/;
}
else
{
$self->{MAXITERS} = 0;
}
return $self;
}
sub _do_page
{
my $self=shift;
my ($context) = @_;
return 0 unless $self->should_render($context);
unless ($self->{ITERATOR} && $self->{ITERATOR}->more_params)
{
$self->{ITERATOR} = $self->make_iterator($context);
}
my $iterator = $self->{ITERATOR};
$iterator->enter_scope;
while ($iterator->can_continue)
{
$iterator->next;
$self->SUPER::begin_page($context);
}
$iterator->exit_scope;
return 1;
}
sub begin_page
{
_do_page(@_,'begin_page');
}
sub end_page
{
_do_page(@_,'end_page');
}
sub make_iterator
{
my $self = shift;
my ($context) = @_;
return PDF::FromHTML::Template::Factory->create('ITERATOR',
NAME => $context->get($self, 'NAME'),
MAXITERS => $context->get($self, 'MAXITERS'),
CONTEXT => $context,
);
}
sub render
{
my $self = shift;
my ($context) = @_;
return 0 unless $self->should_render($context);
unless ($self->{ITERATOR} && $self->{ITERATOR}->more_params)
{
$self->{ITERATOR} = $self->make_iterator($context);
}
my $iterator = $self->{ITERATOR};
$iterator->enter_scope;
while ($iterator->can_continue)
{
$iterator->next;
unless ($self->iterate_over_children($context))
{
$iterator->back_up;
last;
}
$self->reset;
}
$iterator->exit_scope;
if ($iterator->more_params) {
splice(@{$iterator->{DATA}}, 0, $iterator->{INDEX}+1);
$iterator->{MAX_INDEX} = $#{$iterator->{DATA}};
return 0;
}
return 1;
}
sub total_of
{
my $self = shift;
my ($context, $attr) = @_;
my $iterator = $self->make_iterator($context);
my $total = 0;
$iterator->enter_scope;
while ($iterator->can_continue)
{
$iterator->next;
$total += $self->SUPER::total_of($context, $attr);
}
$iterator->exit_scope;
return $total;
}
sub max_of
{
my $self = shift;
my ($context, $attr) = @_;
my $iterator = $self->make_iterator($context);
my $max = $context->get($self, $attr);
$iterator->enter_scope;
while ($iterator->can_continue)
{
$iterator->next;
my $v = $self->SUPER::max_of($context, $attr);
$max = $v if $max < $v;
}
$iterator->exit_scope;
return $max;
}
1;
__END__
=head1 NAME
PDF::FromHTML::Template::Container::Loop
=head1 PURPOSE
To provide a looping construct
=head1 NODE NAME
LOOP
=head1 INHERITANCE
PDF::FromHTML::Template::Container
=head1 ATTRIBUTES
=over 4
=item * NAME - the name of a parameter that points to an array of hashes.
=back
=head1 CHILDREN
None
=head1 AFFECTS
Nothing
=head1 DEPENDENCIES
FOOTER - indicates where to pagebreak
=head1 USAGE
... Children here ...
The children tags will have access to the values specified in LOOPY, as well as
the parameters specifed outside.
=head1 AUTHOR
Rob Kinyon (rkinyon@columbus.rr.com)
=head1 SEE ALSO
HTML::Template, FOOTER
=cut