X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/ccf94c5dca76b164beeba398d4c493018a9b535b..2dfa3a4c75b6f68ab75df739a3e82ceb1b61dcff:/SL/Layout/ActionBar.pm diff --git a/SL/Layout/ActionBar.pm b/SL/Layout/ActionBar.pm index 3d9e4093a..3279ba8dc 100644 --- a/SL/Layout/ActionBar.pm +++ b/SL/Layout/ActionBar.pm @@ -3,40 +3,77 @@ package SL::Layout::ActionBar; use strict; use parent qw(SL::Layout::Base); +use Carp; +use Scalar::Util qw(blessed); +use SL::Layout::ActionBar::Action; +use SL::Layout::ActionBar::ComboBox; +use SL::Layout::ActionBar::Link; +use SL::Layout::ActionBar::Separator; + use constant HTML_CLASS => 'layout-actionbar'; use Rose::Object::MakeMethods::Generic ( 'scalar --get_set_init' => [ qw(actions) ], ); +my %class_descriptors = ( + action => { class => 'SL::Layout::ActionBar::Action', num_params => 1, }, + combobox => { class => 'SL::Layout::ActionBar::ComboBox', num_params => 1, }, + link => { class => 'SL::Layout::ActionBar::Link', num_params => 1, }, + separator => { class => 'SL::Layout::ActionBar::Separator', num_params => 0, }, +); ###### Layout overrides sub pre_content { - $::request->presenter->html_tag('div', '', class => HTML_CLASS); + my ($self) = @_; + + my $content = join '', map { $_->render } @{ $self->actions }; + return if !$content; + $::request->presenter->html_tag('div', $content, class => HTML_CLASS); } -sub inline_javascript { - # data for bar +sub javascripts_inline { + join '', map { $_->script } @{ $_[0]->actions }; } sub javascripts { - + 'kivi.ActionBar.js' } ###### interface -sub add_actions { +sub add { my ($self, @actions) = @_; - push @{ $self->actions }, @actions; -} -sub init_actions { - [] + push @{ $self->actions }, $self->parse_actions(@actions); + + return $self->actions->[-1]; } +sub parse_actions { + my ($self_or_class, @actions) = @_; + + my @parsed; + + while (my $type = shift(@actions)) { + if (blessed($type) && $type->isa('SL::Layout::ActionBar::Action')) { + push @parsed, $type; + next; + } + my $descriptor = $class_descriptors{lc $type} || croak("Unknown action type '${type}'"); + my @params = splice(@actions, 0, $descriptor->{num_params}); + push @parsed, $descriptor->{class}->from_params(@params); + } + + return @parsed; +} + +sub init_actions { + [] +} 1; @@ -78,22 +115,17 @@ Arrangement utility =over 4 -=item C - -Dispatches each each argument to C - -=item C +=item C +to be documented -=item C - -=item Clayout->actionbar + $::request->layout->get('actionbar') =head1 DOM MODEL