App-Widget

 view release on metacpan or  search on metacpan

lib/App/Widget/IconPaneSelector.pm  view on Meta::CPAN


######################################################################
## $Id: IconPaneSelector.pm 7850 2006-09-21 16:49:54Z spadkins $
######################################################################

package App::Widget::IconPaneSelector;
$VERSION = (q$Revision: 7850 $ =~ /(\d[\d\.]*)/)[0];  # VERSION numbers generated by svn

use App;
use App::Widget::HierSelector;
@ISA = ( "App::Widget::HierSelector" );

use strict;

=head1 NAME

App::Widget::IconPaneSelector - A screen selector widget

=head1 SYNOPSIS

   use App::Widget::IconPaneSelector;

   $name = "get_data";
   $w = App::Widget::IconPaneSelector->new($name);
   print $w->html();

=cut

=head1 DESCRIPTION

This class implements a screen selector view such as is used in
M$ Outlook.

=cut

######################################################################
# INITIALIZATION
######################################################################

sub _init {
    my $self = shift;
    $self->SUPER::_init(@_);
    if (! $self->get("selected")) {
        $self->select_first();
    }
}

######################################################################
# OUTPUT METHODS
######################################################################

sub html {
    my $self = shift;
    my ($html, $label, $icon);
    my $context = $self->{context};
    my $name    = $self->{name};
    my $node    = $self->node_list();

    my ($bgcolor, $fontface, $fontsize, $fontcolor, $fontbegin, $fontend);

    $bgcolor   = $self->get("bgcolor",   "#888888");
    $fontface  = $self->get("fontface",  "verdana,geneva,arial,sans-serif");
    $fontsize  = $self->get("fontsize",  "-2");
    $fontcolor = $self->get("fontcolor", "#ffffff");

    $fontbegin = "<font face=\"$fontface\" size=\"$fontsize\" color=\"$fontcolor\">";
    $fontend   = "</font>";

    my ($nodebase, $nodeidx, $nodenumber, $nodelabel, $parentnodenumber, $nodelevel, $opennodenumber);
    my (@nextnodebase, @nextnodeidx, @nextnodelevel);

    @nextnodebase  = ("");   # the next nodenumber to check is "$nodebase$nodeidx" (nodenumber = "1" is first)
    @nextnodeidx   = (1);    # check nodenumber "1" next
    @nextnodelevel = (1);    # index into the resulting table that the folder icon will go

    $html = <<EOF;
<table border="0" cellpadding="0" cellspacing="0" height="100%" width="1%">
  <tr>
    <td bgcolor="$bgcolor" align="center" valign="top">$fontbegin
EOF

    $opennodenumber = 9999;

    while ($#nextnodebase > -1) {
        $nodebase  = pop(@nextnodebase);   # get info about next node to check
        $nodeidx   = pop(@nextnodeidx);
        $nodelevel = pop(@nextnodelevel);
        $nodenumber = "$nodebase$nodeidx"; # create its node number

        if (defined $node->{$nodenumber}) {      # if the node exists...

            if ($nodelevel == 1) {
                
                $opennodenumber = $nodenumber if ($node->{$nodenumber}{open});
                if ($nodenumber == $opennodenumber+1) {
                    $html .= <<EOF;
    <p>&nbsp;$fontend</td>
  </tr>
  <tr>
    <td bgcolor="$bgcolor" align="center" valign="bottom">$fontbegin
EOF
                }

                $label = $node->{$nodenumber}{label};
                $label = $node->{$nodenumber}{value} if (!defined $label);
                $label = "" if (!defined $label);
                $html .= $context->widget("$name-button$nodenumber",
                    class => "App::Widget::ImageButton",
                    image_script => "app-button",



( run in 0.468 second using v1.01-cache-2.11-cpan-39bf76dae61 )