Bivio::UI::Widget::Join
# Copyright (c) 1999-2007 bivio Software, Inc. All rights reserved. # $Id$ package Bivio::UI::Widget::Join; use strict; use Bivio::Base 'Widget.ControlBase'; # C<Bivio::UI::Widget::Join> is a sequence of widgets and literal text. # # join_separator : any [] # # Widget which renders between values which render successfully # (unsafe_render_value returns true). # # values : array_ref (required) # # The widgets, text, and widget_values which will be rendered as a part of the # sequence. The rendered values are unmodified. If all the values are constant, # the result of this widget will be constant. sub initialize { my($self, $source) = @_; # Initializes widget state and children. my($name) = 0; foreach my $v (@{$self->get('values')}) { $self->initialize_value($name++, $v, $source); } $self->unsafe_initialize_attr('join_separator', $source); return shift->SUPER::initialize(@_); } sub internal_as_string { my($self) = @_; my($values) = $self->unsafe_get('values'); # A little bit of safety. Don't want to crash in "as_string". return ($values) unless ref($values) eq 'ARRAY'; my(@res) = @$values; return int(@res) > 2 ? (splice(@res, 0, 2), '...') : @res; } sub internal_new_args { my(undef, $values, $join_separator, $attributes) = @_; # Implements positional argument parsing for L<new|"new">. return '"values" attribute must be an array_ref' unless ref($values) eq 'ARRAY'; if (ref($join_separator) eq 'HASH') { $attributes = $join_separator; $join_separator = undef; } return { values => $values, ($join_separator ? (join_separator => $join_separator) : ()), ($attributes ? %$attributes : ()), }; } sub control_on_render { my($self, $source, $buffer) = @_; my($name) = 0; if ($self->has_keys('join_separator')) { my($need_sep) = 0; foreach my $v (@{$self->get('values')}) { my($b) = ''; my($next_sep) = $self->unsafe_render_value($name++, $v, $source, \$b) && length($b); if ($need_sep && $next_sep) { $self->unsafe_render_attr('join_separator', $source, $buffer); } $need_sep ||= $next_sep; $$buffer .= $b; } } else { foreach my $v (@{$self->get('values')}) { $self->unsafe_render_value($name++, $v, $source, $buffer); } } return; } 1;