package HTML::Widgets::NavMenu::Iterator::NavMenu;
use strict;
use warnings;
use base qw(HTML::Widgets::NavMenu::Iterator::Html);
use HTML::Widgets::NavMenu::EscapeHtml;
=head1 NAME
HTML::Widgets::NavMenu::Iterator::NavMenu - navmenu iterator.
=head1 SYNOPSIS
For internal use only.
=head1 METHODS
=cut
sub _init
{
my $self = shift;
$self->SUPER::_init(@_);
my %args = (@_);
my $ul_classes = $args{'ul_classes'};
# Make a fresh copy just to be on the safe side.
$self->{'ul_classes'} = [ @$ul_classes ];
return 0;
}
=head2 $self->gen_ul_tag(depth => $depth);
Generate a UL tag of depth $depth.
=cut
# Depth is 1 for the uppermost depth.
sub gen_ul_tag
{
my $self = shift;
my %args = (@_);
my $depth = $args{'depth'};
my $class = $self->_get_ul_class('depth' => $depth);
return "
";
}
sub _get_ul_class
{
my $self = shift;
my %args = (@_);
my $depth = $args{'depth'};
return $self->{'ul_classes'}->[$depth-1];
}
=head2 get_currently_active_text ( $node )
Calculates the highlighted text for the node C<$node>. Normally surrounds it
with C<<< ... >>> tags.
=cut
sub get_currently_active_text
{
my $self = shift;
my $node = shift;
return "" . $node->text() . "";
}
=head2 $self->get_link_tag()
Gets the tag for the link - an item in the menu.
=cut
sub get_link_tag
{
my $self = shift;
my $node = $self->top->_node();
if ($node->CurrentlyActive())
{
return $self->get_currently_active_text($node);
}
else
{
return $self->get_a_tag();
}
}
sub _start_root
{
my $self = shift;
$self->_add_tags($self->gen_ul_tag('depth' => $self->stack->len()));
}
sub _start_sep
{
my $self = shift;
$self->_add_tags("
");
}
sub _start_handle_role
{
my $self = shift;
return $self->_start_handle_non_role();
}
=head2 my @tags = $self->get_open_sub_menu_tags()
Gets the tags to open a new sub menu.
=cut
sub get_open_sub_menu_tags
{
my $self = shift;
return ("
", $self->gen_ul_tag('depth' => $self->stack->len()));
}
sub _start_handle_non_role
{
my $self = shift;
my $top_item = $self->top;
my @tags_to_add = ("", $self->get_link_tag());
if ($top_item->_num_subs_to_go() && $self->_is_expanded())
{
push @tags_to_add, ($self->get_open_sub_menu_tags());
}
$self->_add_tags(@tags_to_add);
}
sub _start_regular
{
my $self = shift;
my $top_item = $self->top;
my $node = $self->top->_node();
if ($self->_is_hidden())
{
# Do nothing
}
else
{
if ($self->_is_role_specified())
{
$self->_start_handle_role();
}
else
{
$self->_start_handle_non_role();
}
}
}
sub _end_sep
{
my $self = shift;
$self->_add_tags($self->gen_ul_tag('depth' => $self->stack->len()-1));
}
sub _end_handle_role
{
my $self = shift;
return $self->_end_handle_non_role();
}
sub _end_handle_non_role
{
my $self = shift;
return $self->SUPER::_end_regular();
}
sub _end_regular
{
my $self = shift;
if ($self->_is_hidden())
{
# Do nothing
}
elsif ($self->_is_role_specified())
{
$self->_end_handle_role();
}
else
{
$self->_end_handle_non_role();
}
}
sub _is_hidden
{
my $self = shift;
return $self->top->_node()->hide();
}
sub _is_expanded
{
my $self = shift;
my $node = $self->top->_node();
return ($node->expanded() || $self->top->_accum_state->{'show_always'});
}
=head2 $self->get_role()
Retrieves the current role.
=cut
sub get_role
{
my $self = shift;
return $self->top->_node->role();
}
sub _is_role_specified
{
my $self = shift;
return defined($self->get_role());
}
1;