Mercurial > pub > Impl
diff Lib/Form/ValueItem/List.pm @ 49:16ada169ca75
migrating to the Eclipse IDE
author | wizard@linux-odin.local |
---|---|
date | Fri, 26 Feb 2010 10:49:21 +0300 |
parents | 03e58a454b20 |
children | 76515373dac0 |
line wrap: on
line diff
--- a/Lib/Form/ValueItem/List.pm Fri Feb 26 01:43:42 2010 +0300 +++ b/Lib/Form/ValueItem/List.pm Fri Feb 26 10:49:21 2010 +0300 @@ -1,107 +1,107 @@ -package Form::ValueItem::List; -use Common; -use base qw(Form::ValueItem); - -BEGIN { - DeclareProperty ListValues => ACCESS_READ; - DeclareProperty CurrentItem => ACCESS_READ; -} - -sub CTOR { - my $this = shift; - $this->SUPER::CTOR(@_); - - $this->{$ListValues} = []; - - my $source = $this->Form->Bindings->{$this->Attributes->{source}}; - - if (ref $source eq 'CODE') { - $this->LoadList($source->()); - } elsif (ref $source and (UNIVERSAL::isa($source,'HASH') or UNIVERSAL::isa($source,'ARRAY'))){ - $this->LoadList($source); - } else { - if (not $source) { - warn "a source isn't specified for the listvalue ".$this->Id->Canonical; - } else { - warn "an unsupported source type ".(ref $source)." for the listvalue".$this->Id->Canonical; - } - } -} - -sub Value { - my $this = shift; - - if (@_) { - my $newValue = shift; - - $this->{$CurrentItem}->{active} = 0 if $this->{$CurrentItem}; - - my ($item) = (defined $newValue ? grep {defined $_->{id} and $_->{id} eq $newValue} @{$this->{$ListValues}} : undef); - - if ($item) { - $this->{$CurrentItem} = $item; - $item->{active} = 1; - return $this->SUPER::Value($newValue); - } else { - undef $this->{$CurrentItem}; - return $this->SUPER::Value(undef); - } - } else { - return $this->SUPER::Value; - } -} - -sub LoadList { - my ($this,$refList) = @_; - - if (ref $refList and UNIVERSAL::isa($refList,'HASH')) { - $this->{$CurrentItem} = undef; - $this->{$ListValues} = [ sort { $a->{name} cmp $b->{name} } map { Form::ValueItem::List::Item->new($_,ref $refList->{$_} eq 'ARRAY' ? @{$refList->{$_}} : $refList->{$_})} keys %{$refList}]; - $this->SUPER::Value(undef); - } elsif (ref $refList and UNIVERSAL::isa($refList,'ARRAY')) { - $this->{$CurrentItem} = undef; - $this->{$ListValues} = [map { Form::ValueItem::List::Item->new(ref $_ eq 'ARRAY' ? @$_ : $_ )} @$refList]; - $this->SUPER::Value(undef); - } else { - die new Exception('An unexpected list type'); - } -} - -package Form::ValueItem::List::Item; -use fields qw( - id - description - name - active -); - -sub new { - my ($class,$id,$name,$desc) = @_; - - my $this=fields::new($class); - $this->{id} = $id; - $this->{name} = $name; - $this->{description} = $desc; - - return $this; -} - -#compatibility with TToolkit - -sub Id { - $_[0]->{id}; -} - -sub Description { - $_[0]->{description}; -} - -sub Active { - $_[0]->{active}; -} - -sub Name { - $_[0]->{name}; -} - -1; +package Form::ValueItem::List; +use Common; +use base qw(Form::ValueItem); + +BEGIN { + DeclareProperty ListValues => ACCESS_READ; + DeclareProperty CurrentItem => ACCESS_READ; +} + +sub CTOR { + my $this = shift; + $this->SUPER::CTOR(@_); + + $this->{$ListValues} = []; + + my $source = $this->Form->Bindings->{$this->Attributes->{source}}; + + if (ref $source eq 'CODE') { + $this->LoadList($source->()); + } elsif (ref $source and (UNIVERSAL::isa($source,'HASH') or UNIVERSAL::isa($source,'ARRAY'))){ + $this->LoadList($source); + } else { + if (not $source) { + warn "a source isn't specified for the listvalue ".$this->Id->Canonical; + } else { + warn "an unsupported source type ".(ref $source)." for the listvalue".$this->Id->Canonical; + } + } +} + +sub Value { + my $this = shift; + + if (@_) { + my $newValue = shift; + + $this->{$CurrentItem}->{active} = 0 if $this->{$CurrentItem}; + + my ($item) = (defined $newValue ? grep {defined $_->{id} and $_->{id} eq $newValue} @{$this->{$ListValues}} : undef); + + if ($item) { + $this->{$CurrentItem} = $item; + $item->{active} = 1; + return $this->SUPER::Value($newValue); + } else { + undef $this->{$CurrentItem}; + return $this->SUPER::Value(undef); + } + } else { + return $this->SUPER::Value; + } +} + +sub LoadList { + my ($this,$refList) = @_; + + if (ref $refList and UNIVERSAL::isa($refList,'HASH')) { + $this->{$CurrentItem} = undef; + $this->{$ListValues} = [ sort { $a->{name} cmp $b->{name} } map { Form::ValueItem::List::Item->new($_,ref $refList->{$_} eq 'ARRAY' ? @{$refList->{$_}} : $refList->{$_})} keys %{$refList}]; + $this->SUPER::Value(undef); + } elsif (ref $refList and UNIVERSAL::isa($refList,'ARRAY')) { + $this->{$CurrentItem} = undef; + $this->{$ListValues} = [map { Form::ValueItem::List::Item->new(ref $_ eq 'ARRAY' ? @$_ : $_ )} @$refList]; + $this->SUPER::Value(undef); + } else { + die new Exception('An unexpected list type'); + } +} + +package Form::ValueItem::List::Item; +use fields qw( + id + description + name + active +); + +sub new { + my ($class,$id,$name,$desc) = @_; + + my $this=fields::new($class); + $this->{id} = $id; + $this->{name} = $name; + $this->{description} = $desc; + + return $this; +} + +#compatibility with TToolkit + +sub Id { + $_[0]->{id}; +} + +sub Description { + $_[0]->{description}; +} + +sub Active { + $_[0]->{active}; +} + +sub Name { + $_[0]->{name}; +} + +1;