comparison Lib/Form/ValueItem/List.pm @ 0:03e58a454b20

Создан репозитарий
author Sergey
date Tue, 14 Jul 2009 12:54:37 +0400
parents
children 16ada169ca75
comparison
equal deleted inserted replaced
-1:000000000000 0:03e58a454b20
1 package Form::ValueItem::List;
2 use Common;
3 use base qw(Form::ValueItem);
4
5 BEGIN {
6 DeclareProperty ListValues => ACCESS_READ;
7 DeclareProperty CurrentItem => ACCESS_READ;
8 }
9
10 sub CTOR {
11 my $this = shift;
12 $this->SUPER::CTOR(@_);
13
14 $this->{$ListValues} = [];
15
16 my $source = $this->Form->Bindings->{$this->Attributes->{source}};
17
18 if (ref $source eq 'CODE') {
19 $this->LoadList($source->());
20 } elsif (ref $source and (UNIVERSAL::isa($source,'HASH') or UNIVERSAL::isa($source,'ARRAY'))){
21 $this->LoadList($source);
22 } else {
23 if (not $source) {
24 warn "a source isn't specified for the listvalue ".$this->Id->Canonical;
25 } else {
26 warn "an unsupported source type ".(ref $source)." for the listvalue".$this->Id->Canonical;
27 }
28 }
29 }
30
31 sub Value {
32 my $this = shift;
33
34 if (@_) {
35 my $newValue = shift;
36
37 $this->{$CurrentItem}->{active} = 0 if $this->{$CurrentItem};
38
39 my ($item) = (defined $newValue ? grep {defined $_->{id} and $_->{id} eq $newValue} @{$this->{$ListValues}} : undef);
40
41 if ($item) {
42 $this->{$CurrentItem} = $item;
43 $item->{active} = 1;
44 return $this->SUPER::Value($newValue);
45 } else {
46 undef $this->{$CurrentItem};
47 return $this->SUPER::Value(undef);
48 }
49 } else {
50 return $this->SUPER::Value;
51 }
52 }
53
54 sub LoadList {
55 my ($this,$refList) = @_;
56
57 if (ref $refList and UNIVERSAL::isa($refList,'HASH')) {
58 $this->{$CurrentItem} = undef;
59 $this->{$ListValues} = [ sort { $a->{name} cmp $b->{name} } map { Form::ValueItem::List::Item->new($_,ref $refList->{$_} eq 'ARRAY' ? @{$refList->{$_}} : $refList->{$_})} keys %{$refList}];
60 $this->SUPER::Value(undef);
61 } elsif (ref $refList and UNIVERSAL::isa($refList,'ARRAY')) {
62 $this->{$CurrentItem} = undef;
63 $this->{$ListValues} = [map { Form::ValueItem::List::Item->new(ref $_ eq 'ARRAY' ? @$_ : $_ )} @$refList];
64 $this->SUPER::Value(undef);
65 } else {
66 die new Exception('An unexpected list type');
67 }
68 }
69
70 package Form::ValueItem::List::Item;
71 use fields qw(
72 id
73 description
74 name
75 active
76 );
77
78 sub new {
79 my ($class,$id,$name,$desc) = @_;
80
81 my $this=fields::new($class);
82 $this->{id} = $id;
83 $this->{name} = $name;
84 $this->{description} = $desc;
85
86 return $this;
87 }
88
89 #compatibility with TToolkit
90
91 sub Id {
92 $_[0]->{id};
93 }
94
95 sub Description {
96 $_[0]->{description};
97 }
98
99 sub Active {
100 $_[0]->{active};
101 }
102
103 sub Name {
104 $_[0]->{name};
105 }
106
107 1;