cvsuser     02/03/12 09:03:52

  Modified:    P5EEx/Blue/P5EEx/Blue Context.pm
  Log:
  add widget_exists(), wdelete(), user_agent() methods
  
  Revision  Changes    Path
  1.21      +269 -83   p5ee/P5EEx/Blue/P5EEx/Blue/Context.pm
  
  Index: Context.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/P5EEx/Blue/P5EEx/Blue/Context.pm,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -w -r1.20 -r1.21
  --- Context.pm        6 Mar 2002 23:03:24 -0000       1.20
  +++ Context.pm        12 Mar 2002 17:03:52 -0000      1.21
  @@ -1,6 +1,6 @@
   
   #############################################################################
  -## $Id: Context.pm,v 1.20 2002/03/06 23:03:24 spadkins Exp $
  +## $Id: Context.pm,v 1.21 2002/03/12 17:03:52 spadkins Exp $
   #############################################################################
   
   package P5EEx::Blue::Context;
  @@ -8,6 +8,7 @@
   use strict;
   
   use P5EEx::Blue::P5EE;
  +use P5EEx::Blue::UserAgent;
   
   =head1 NAME
   
  @@ -210,6 +211,8 @@
       $self->{session} = P5EEx::Blue::P5EE->new($session_class, "new", \%args);
       $self->{initconfig} = \%args;
   
  +    $self->{user_agent} = P5EEx::Blue::UserAgent->new($self);
  +
       return $self;
   }
   
  @@ -580,6 +583,51 @@
   sub logchannel      { my $self = shift; return $self->service("LogChannel",@_); }
   
   #############################################################################
  +# widget_exists()
  +#############################################################################
  +
  +=head2 widget_exists()
  +
  +    * Signature: $exists = $context->widget_exists($widget_name);
  +    * Param:  $widget_name     string
  +    * Return: $exists          boolean
  +    * Throws: <none>
  +    * Since:  0.01
  +
  +    Sample Usage: 
  +
  +    if ($context->widget_exists($widget_name)) {
  +        # do something
  +    }
  +
  +The widget_exists() returns whether or not a widget is already known to the
  +Context.  This is true if 
  +
  + * it exists in the Session's widget cache, or
  +   (i.e. it has already been referenced and instantiated in the cache),
  + * it exists in the Session's state, or
  +   (i.e. it was referenced in an earlier request in this session)
  + * it exists in the Config
  +
  +If this method returns FALSE (undef), then any call to the widget() method
  +must specify the widgetClass (at a minimum) and may not simply call it
  +with the $widget_name.
  +
  +This is useful particularly for lightweight widgets which generate events
  +(such as image buttons).  The $context->dispatch_events() method can check
  +that the widget has not yet been defined and automatically passes the
  +event to the widget's container (implied by the name) for handling.
  +
  +=cut
  +
  +sub widget_exists {
  +    my ($self, $widget_name) = @_;
  +    return (defined $self->{session}{cache}{Widget}{$widget_name}{widgetClass} ||
  +            defined $self->{session}{state}{Widget}{$widget_name}{widgetClass} ||
  +            defined $self->{config}{Widget}{$widget_name}{widgetClass});
  +}
  +
  +#############################################################################
   # PUBLIC METHODS
   #############################################################################
   
  @@ -713,15 +761,19 @@
   
       $context->wset("session", "wname", "main_screen");
       $context->wset("main.app.toolbar.calc", "width", 50);
  +    $context->wset("xyz", "{arr}[1][2]",  14);
  +    $context->wset("xyz", "{arr.totals}", 14);
   
   =cut
   
  -# $self->wset("xyz", "{arr}[1][2]",        14);
  -# $self->wset("xyz", "{arr.totals}[1][2]", 14);
   sub wset {
       my ($self, $name, $var, $value) = @_;
       my ($perl);
   
  +    if ($value eq "{:delete:}") {
  +        return $self->wdelete($name,$var);
  +    }
  +
       $self->dbgprint("Context->wset($name,$var,$value)")
           if ($P5EEx::Blue::DEBUG && $self->dbg(3));
   
  @@ -737,25 +789,86 @@
           $self->{session}{cache}{Widget}{$name}{$var} = $value
               if (defined $self->{session}{cache}{Widget}{$name});
           return;
  -    } # match {
  -    elsif ($var =~ /^\{/) {  # i.e. "{columnSelected}{first_name}"
  +    }
  +    elsif ($var =~ /^\{/) {  # { i.e. "{columnSelected}{first_name}"
   
           $var =~ s/\{([^\}]+)\}/\{"$1"\}/g;  # put quotes around hash keys
   
  -        $self->widget($name) if (!defined $self->{session}{cache}{Widget}{$name});
  +        #$self->widget($name) if (!defined $self->{session}{cache}{Widget}{$name});
   
           $perl  = "\$self->{session}{state}{Widget}{\$name}$var = \$value;";
  -        $perl .= "\$self->{session}{cache}{Widget}{\$name}$var = \$value;";
  +        $perl .= "\$self->{session}{cache}{Widget}{\$name}$var = \$value;"
  +            if (defined $self->{session}{cache}{Widget}{$name});
   
           eval $perl;
  -        print STDERR "ERROR: Context->wset($name,$var,$value): eval ($perl): $@\n" 
if ($@);
  +        die "ERROR: Context->wset($name,$var,$value): eval ($perl): $@" if ($@);
       }
  -    # else we do nothing with it!
  +    # } else we do nothing with it!
   
       return $value;
   }
   
   #############################################################################
  +# wdelete()
  +#############################################################################
  +
  +=head2 wdelete()
  +
  +The wdelete() deletes an attribute of a widget in the Session.
  +
  +    * Signature: $context->wdelete($widgetname, $attribute);
  +    * Param:  $widgetname      string
  +    * Param:  $attribute       string
  +    * Return: void
  +    * Throws: <none>
  +    * Since:  0.01
  +
  +    Sample Usage: 
  +
  +    $context->wdelete("session", "wname");
  +    $context->wdelete("main.app.toolbar.calc", "width");
  +    $context->wdelete("xyz", "{arr}[1][2]");
  +    $context->wdelete("xyz", "{arr.totals}");
  +
  +=cut
  +
  +sub wdelete {
  +    my ($self, $name, $var) = @_;
  +    my ($perl);
  +
  +    $self->dbgprint("Context->wdelete($name,$var)")
  +        if ($P5EEx::Blue::DEBUG && $self->dbg(3));
  +
  +    if ($var !~ /[\[\]\{\}]/) {         # no special chars, "foo.bar"
  +        delete $self->{session}{state}{Widget}{$name}{$var};
  +        delete $self->{session}{cache}{Widget}{$name}{$var}
  +            if (defined $self->{session}{cache}{Widget}{$name});
  +        return;
  +    } # match {
  +    elsif ($var =~ /^\{([^\}]+)\}$/) {  # a simple "{foo.bar}"
  +        $var = $1;
  +        delete $self->{session}{state}{Widget}{$name}{$var};
  +        delete $self->{session}{cache}{Widget}{$name}{$var}
  +            if (defined $self->{session}{cache}{Widget}{$name});
  +        return;
  +    }
  +    elsif ($var =~ /^\{/) {  # { i.e. "{columnSelected}{first_name}"
  +
  +        $var =~ s/\{([^\}]+)\}/\{"$1"\}/g;  # put quotes around hash keys
  +
  +        #$self->widget($name) if (!defined $self->{session}{cache}{Widget}{$name});
  +
  +        $perl  = "delete \$self->{session}{state}{Widget}{\$name}$var;";
  +        $perl .= "delete \$self->{session}{cache}{Widget}{\$name}$var;"
  +            if (defined $self->{session}{cache}{Widget}{$name});
  +
  +        eval $perl;
  +        die "ERROR: Context->wdelete($name,$var): eval ($perl): $@" if ($@);
  +    }
  +    # } else we do nothing with it!
  +}
  +
  +#############################################################################
   # PUBLIC METHODS
   #############################################################################
   
  @@ -956,6 +1069,132 @@
   }
   
   #############################################################################
  +# user_agent()
  +#############################################################################
  +
  +=head2 user_agent()
  +
  +The user_agent() method returns a UserAgent objects which is primarily
  +useful to see what capabilities the user agent (browser) supports.
  +
  +    * Signature: $user_agent = $context->user_agent();
  +    * Param:  void
  +    * Return: $user_agent    P5EEx::Blue::UserAgent
  +    * Throws: <none>
  +    * Since:  0.01
  +
  +    Sample Usage: 
  +
  +    $user_agent = $context->user_agent();
  +
  +=cut
  +
  +sub user_agent {
  +    my $self = shift;
  +    $self->{user_agent};
  +}
  +
  +#############################################################################
  +# domain()
  +#############################################################################
  +
  +=head2 domain()
  +
  +The domain() method is called to get the list of valid values in a data
  +domain and the labels that should be used to represent these values to
  +a user.
  +
  +    * Signature: ($values, $labels) = $self->domain($domain_name)
  +    * Param:     $domain_name      string
  +    * Return:    $values           []
  +    * Return:    $labels           {}
  +    * Throws:    P5EEx::Blue::Exception
  +    * Since:     0.01
  +
  +    Sample Usage: 
  +
  +    ($values, $labels) = $self->domain("gender");
  +    foreach (@$values) {
  +        print "$_ => $labels->{$_}\n";
  +    }
  +
  +=cut
  +
  +sub domain {
  +    my ($self, $domain) = @_;
  +    my ($config, $domainref, $repository, $rep);
  +    my ($values, $labels, $needs_loading, $time_to_live, $time);
  +    my ($class, $method, $args, $rows, $row);
  +
  +    $self->dbgprint("Context->domain($domain)")
  +        if ($P5EEx::Blue::DEBUG && $self->dbg(1));
  +
  +    $config    = $self->{config}{Domain}{$domain};
  +    $domainref = $self->{session}{Domain}{$domain};
  +    if (defined $domainref) {
  +        $values = $domainref->{values};
  +        $values = $config->{values} if (!$values);
  +        $labels = $domainref->{labels};
  +        $labels = $config->{labels} if (!$labels);
  +
  +        $needs_loading = 0;
  +        $repository = $config->{repository};
  +        if (defined $repository && $repository ne "") {
  +            if (!defined $values || !defined $labels) {
  +                $needs_loading = 1;
  +            }
  +            else {
  +                $time_to_live = $config->{time_to_live};
  +                if (defined $time_to_live && $time_to_live ne "" && $time_to_live 
>= 0) {
  +                    if ($time_to_live == 0) {
  +                        $needs_loading = 1;
  +                    }
  +                    else {
  +                        if (time() >= $domainref->{time} + $time_to_live) {
  +                            $needs_loading = 1;
  +                        }
  +                    }
  +                }
  +            }
  +        }
  +
  +        $self->dbgprint("Context->domain($domain): needs_loading=$needs_loading")
  +            if ($P5EEx::Blue::DEBUG && $self->dbg(1));
  +
  +        if ($needs_loading) {
  +            $rep = $self->repository($repository);
  +            if (defined $rep) {
  +                #$method = $domainref->{getmethod};
  +                #$method = "get" if (!defined $method);
  +                #$args   = $domainref->{getmethod_args};
  +                #$args   = [ $domain ] if (!defined $args);
  +
  +                #$self->dbgprint("Context->domain($domain): $rep->$method(@$args)")
  +                #    if ($P5EEx::Blue::DEBUG && $self->dbg(1));
  +
  +                #$rows   = ${rep}->${method}(@$args);
  +                #$values = [];
  +                #$labels = {};
  +                #foreach $row (@$rows) {
  +                #    push(@$values, $row->[0]);
  +                #    $labels->{$row->[0]} = $row->[1];
  +                #}
  +                #$domainref->{values} = $values;
  +                #$domainref->{labels} = $labels;
  +                #$time = time();
  +                #$domainref->{time} = $time;
  +            }
  +
  +            $values = $domainref->{values};
  +            $labels = $domainref->{labels};
  +        }
  +    }
  +    $values = [] if (! defined $values);
  +    $labels = {} if (! defined $labels);
  +    return ($values, $labels);
  +}
  +
  +#############################################################################
   # PUBLIC METHODS
   #############################################################################
   
  @@ -1182,6 +1421,27 @@
       );
   }
   
  +#############################################################################
  +# shutdown()
  +#############################################################################
  +
  +=head2 shutdown()
  +
  +The shutdown() method is called when the Context is preparing to exit.
  +This allows for connections to databases, etc. to be closed gracefully.
  +
  +    * Signature: $self->shutdown()
  +    * Param:     void
  +    * Return:    void
  +    * Throws:    P5EEx::Blue::Exception
  +    * Since:     0.01
  +
  +    Sample Usage: 
  +
  +    $self->shutdown();
  +
  +=cut
  +
   sub shutdown {
       my $self = shift;
       my ($config, $repdef, $repname, $instance);
  @@ -1202,80 +1462,6 @@
               delete $repcache->{$repname};
           }
       }
  -}
  -
  -sub domain {
  -    my ($self, $domain) = @_;
  -    my ($config, $domainref, $repository, $rep);
  -    my ($values, $labels, $needs_loading, $time_to_live, $time);
  -    my ($class, $method, $args, $rows, $row);
  -
  -    $self->dbgprint("Context->domain($domain)")
  -        if ($P5EEx::Blue::DEBUG && $self->dbg(1));
  -
  -    $config    = $self->{config}{Domain}{$domain};
  -    $domainref = $self->{session}{Domain}{$domain};
  -    if (defined $domainref) {
  -        $values = $domainref->{values};
  -        $values = $config->{values} if (!$values);
  -        $labels = $domainref->{labels};
  -        $labels = $config->{labels} if (!$labels);
  -
  -        $needs_loading = 0;
  -        $repository = $config->{repository};
  -        if (defined $repository && $repository ne "") {
  -            if (!defined $values || !defined $labels) {
  -                $needs_loading = 1;
  -            }
  -            else {
  -                $time_to_live = $config->{time_to_live};
  -                if (defined $time_to_live && $time_to_live ne "" && $time_to_live 
>= 0) {
  -                    if ($time_to_live == 0) {
  -                        $needs_loading = 1;
  -                    }
  -                    else {
  -                        if (time() >= $domainref->{time} + $time_to_live) {
  -                            $needs_loading = 1;
  -                        }
  -                    }
  -                }
  -            }
  -        }
  -
  -        $self->dbgprint("Context->domain($domain): needs_loading=$needs_loading")
  -            if ($P5EEx::Blue::DEBUG && $self->dbg(1));
  -
  -        if ($needs_loading) {
  -            $rep = $self->repository($repository);
  -            if (defined $rep) {
  -                #$method = $domainref->{getmethod};
  -                #$method = "get" if (!defined $method);
  -                #$args   = $domainref->{getmethod_args};
  -                #$args   = [ $domain ] if (!defined $args);
  -
  -                #$self->dbgprint("Context->domain($domain): $rep->$method(@$args)")
  -                #    if ($P5EEx::Blue::DEBUG && $self->dbg(1));
  -
  -                #$rows   = ${rep}->${method}(@$args);
  -                #$values = [];
  -                #$labels = {};
  -                #foreach $row (@$rows) {
  -                #    push(@$values, $row->[0]);
  -                #    $labels->{$row->[0]} = $row->[1];
  -                #}
  -                #$domainref->{values} = $values;
  -                #$domainref->{labels} = $labels;
  -                #$time = time();
  -                #$domainref->{time} = $time;
  -            }
  -
  -            $values = $domainref->{values};
  -            $labels = $domainref->{labels};
  -        }
  -    }
  -    $values = [] if (! defined $values);
  -    $labels = {} if (! defined $labels);
  -    return ($values, $labels);
   }
   
   1;
  
  
  


Reply via email to