Bivio::UI::HTML::Widget::InputBase
# Copyright (c) 2008-2009 bivio Software, Inc. All Rights Reserved.
# $Id$
package Bivio::UI::HTML::Widget::InputBase;
use strict;
use Bivio::Base 'XHTMLWidget.Tag';
my($_C) = b_use('IO.Config');
my($_F) = b_use('FacadeComponent.Font');
my($_VS) = b_use('UIHTML.ViewShortcuts');
sub accepts_attribute {
my($proto, $attr) = @_;
return grep($_ eq $attr, @{$proto->internal_attributes}) ? 1 : 0;
}
sub control_on_render {
my($self, $source, $buffer) = @_;
$_C->if_version(
6 => sub {
$self->SUPER::control_on_render($source, $buffer);
return;
},
sub {
my($p, $s) = $_F->format_html('input_field', $source->req);
$$buffer .= $p;
$self->SUPER::control_on_render($source, $buffer);
$$buffer .= $s;
return;
}
);
$self->internal_input_base_post_render($source, $buffer);
return;
}
sub initialize {
my($self) = @_;
$self->initialize_attr('field');
$self->unsafe_initialize_attr('event_handler');
$self->unsafe_initialize_attr('is_read_only');
$self->initialize_attr(tag => 'input');
$self->initialize_attr(value => '');
$self->initialize_attr(tag_if_empty => 1);
return shift->SUPER::initialize(@_);
}
sub internal_as_string {
return shift->unsafe_get('field');
}
sub internal_attributes {
return $_VS->vs_html_attrs_merge([qw(
event_handler
field
form_model
format
is_read_only
)]);
}
sub internal_input_base_post_render {
my($self, $source, $buffer) = @_;
if (my $h = $source->req->unsafe_get("$self")) {
$h->render($source, $buffer);
}
return;
}
sub internal_input_base_render_attrs {
my($self, $form, $field, $source, $buffer) = @_;
my($req) = $source->get_request;
$$buffer .= ' name="' . $form->get_field_name_for_html($field) . '"';
if (my $h = $self->unsafe_resolve_attr('event_handler', $source)) {
$req->put("$self" => $h);
$$buffer .= ' ' . $h->get_html_field_attributes($field, $source);
}
else {
# Just in case there was some transient state
$req->delete("$self");
}
$$buffer .= ' disabled="disabled"'
if $self->render_simple_attr('is_read_only', $source)
|| !$form->is_field_editable($field);
return;
}
sub internal_new_args {
return shift->internal_compute_new_args(['field'], \@_);
}
sub internal_tag_render_attrs {
my($self, $source, $buffer) = @_;
shift->SUPER::internal_tag_render_attrs(@_);
$self->internal_input_base_render_attrs(
$self->resolve_ancestral_attr('form_model', $source->req),
$self->render_simple_attr('field', $source),
$source,
$buffer,
);
return;
}
1;