Bivio::UI::Widget::Director
# Copyright (c) 1999-2001 bivio Software, Inc. All rights reserved. # $Id$ package Bivio::UI::Widget::Director; use strict; use Bivio::Base 'UI.Widget'; my($_R) = b_use('Type.Regexp'); sub execute { my($self, $req) = @_; my($w) = _select($self, $req); b_die('Director did not select a widget; no content type') unless defined($w); return $w->execute($req); } sub initialize { my($self) = @_; $self->initialize_attr('control'); $self->unsafe_initialize_attr('default_value'); $self->unsafe_initialize_attr('undef_value'); my($values) = $self->get('values'); $self->put(_value_array => [map({ my($k) = $_; my($r) = $_R->is_stringified_regexp($k) ? $_R->from_literal_or_die($k) : (); ($r || $k => $self->initialize_value($k, $values->{$_})); } sort(keys(%$values)))]); return; } sub internal_as_string { my($self) = @_; return $self->unsafe_get('control'); } sub internal_new_args { my(undef, $control, $values, $default_value, $undef_value, $attrs) = @_; return '"control" attribute must be defined' unless defined($control); return { control => $control, values => $values ? $values : {}, default_value => $default_value, undef_value => $undef_value, ($attrs ? %$attrs : ()), }; } sub render { my($self, $source, $buffer) = @_; my($v, $n) = _select($self, $source); $self->unsafe_render_value($n, $v, $source, $buffer) if defined($v); return; } sub _select { my($self, $source) = @_; my($ctl) = ''; my($n) = 'undef_value'; if ($self->unsafe_render_attr('control', $source, \$ctl)) { my($x) = $self->map_by_two( sub { my($k, $v) = @_; return unless (ref($k) ? $ctl =~ $k : $k eq $ctl) && defined($v); return ($v || undef, $k); }, $self->get('_value_array'), ); if (@$x) { b_die($x, ': control matches too many keys') if @$x > 2; return @$x; } $n = 'default_value'; } my($v) = $self->unsafe_get($n); return ($v || undef, $n) if defined($v); b_die( $self->get('control'), '=', $ctl, ": control matches $n value, but not specified", ); # DOES NOT RETURN } 1;