package PDF::FromHTML::Template::Container;
use strict;
BEGIN {
use vars qw(@ISA);
@ISA = qw(PDF::FromHTML::Template::Base);
use PDF::FromHTML::Template::Base;
}
# Containers are objects that can contain arbitrary elements, such as
# PageDefs or Loops.
sub new
{
my $class = shift;
my $self = $class->SUPER::new(@_);
$self->{ELEMENTS} = [] unless UNIVERSAL::isa($self->{ELEMENTS}, 'ARRAY');
return $self;
}
sub _do_page
{
my $self = shift;
my ($context, $method) = @_;
for my $e (@{$self->{ELEMENTS}})
{
$e->enter_scope($context);
$e->$method($context);
$e->exit_scope($context, 1);
}
return 1;
}
sub begin_page { _do_page @_, 'begin_page' }
#{
# my $self = shift;
# my ($context) = @_;
#
# for my $e (@{$self->{ELEMENTS}})
# {
# $e->enter_scope($context);
# $e->begin_page($context);
# $e->exit_scope($context, 1);
# }
#
# return 1;
#}
sub end_page { _do_page @_, 'end_page' }
#{
# my $self = shift;
# my ($context) = @_;
#
# for my $e (@{$self->{ELEMENTS}})
# {
# $e->enter_scope($context);
# $e->end_page($context);
# $e->exit_scope($context, 1);
# }
#
# return 1;
#}
sub reset
{
my $self = shift;
$self->SUPER::reset;
$_->reset for @{$self->{ELEMENTS}};
}
sub iterate_over_children
{
my $self = shift;
my ($context) = @_;
my $continue = 1;
for my $e (grep !$_->has_rendered, @{$self->{ELEMENTS}})
{
$e->enter_scope($context);
my $rc;
if ($rc = $e->render($context))
{
$e->mark_as_rendered;
}
$continue = $rc if $continue;
$e->exit_scope($context);
}
return $continue;
}
sub render
{
my $self = shift;
my ($context) = @_;
return 0 unless $self->should_render($context);
return $self->iterate_over_children($context);
}
sub max_of
{
my $self = shift;
my ($context, $attr) = @_;
my $max = $context->get($self, $attr);
ELEMENT:
foreach my $e (@{$self->{ELEMENTS}})
{
$e->enter_scope($context);
my $v = $e->isa('CONTAINER')
? $e->max_of($context, $attr)
: $e->calculate($context, $attr);
$max = $v if $max < $v;
$e->exit_scope($context, 1);
}
return $max;
}
sub total_of
{
my $self = shift;
my ($context, $attr) = @_;
my $total = 0;
ELEMENT:
foreach my $e (@{$self->{ELEMENTS}})
{
$e->enter_scope($context);
$total += $e->isa('CONTAINER')
? $e->total_of($context, $attr)
: $e->calculate($context, $attr);
$e->exit_scope($context, 1);
}
return $total;
}
1;
__END__