cvsuser     05/08/09 12:26:19

  Added:       App-Widget/lib/App/Widget FileTreeSelector.pm
                        HierSelector.pm IconPaneSelector.pm
                        TabbedSelector.pm TreeSelector.pm
  Removed:     App-Widget/lib/App/Widget HierView.pm SelectorView.pm
                        TabbedView.pm TreeView.pm
  Log:
  Views renamed as Selectors
  
  Revision  Changes    Path
  1.1                  p5ee/App-Widget/lib/App/Widget/FileTreeSelector.pm
  
  Index: FileTreeSelector.pm
  ===================================================================
  
  ######################################################################
  ## $Id: FileTreeSelector.pm,v 1.1 2005/08/09 19:26:19 spadkins Exp $
  ######################################################################
  
  package App::Widget::FileTreeSelector;
  $VERSION = do { my @r=(q$Revision: 1.1 $=~/\d+/g); sprintf 
"%d."."%02d"x$#r,@r};
  
  use App;
  use App::Widget::TreeSelector;
  @ISA = ( "App::Widget::TreeSelector" );
  
  use strict;
  
  =head1 NAME
  
  App::Widget::FileTreeSelector - An HTML tree view
  
  =head1 SYNOPSIS
  
     use App::Widget::FileTreeSelector;
  
     $name = "get_data";
     $w = App::Widget::FileTreeSelector->new($name);
     print $w->html();
  
  =cut
  
  =head1 DESCRIPTION
  
  This class implements a graphical tree view such as is used in
  Windows Explorer.
  
  =cut
  
  ######################################################################
  # INITIALIZATION
  ######################################################################
  
  sub _init {
     my $self = shift;
     $self->set_default("curr_dir", "/");
     $self->{selected} = "1.1";
     $self->{node} = {
          1 =>       { open => 0, value => 'root',           },
          # 1.1 =>     { open => 1, value => 'Criteria',       },
          # 1.2 =>     { open => 0, value => 'Rate Comparison',},
          # 1.3 =>     { open => 0, value => 'Rate Detail',    },
          # 1.4 =>     { open => 0, value => 'Profiles',       },
          # 1.5 =>     { open => 0, value => 'Request Queue',  },
     };
  
     $self->SUPER::_init(@_);
  }
  
  1;
  
  
  
  
  1.1                  p5ee/App-Widget/lib/App/Widget/HierSelector.pm
  
  Index: HierSelector.pm
  ===================================================================
  
  ######################################################################
  ## $Id: HierSelector.pm,v 1.1 2005/08/09 19:26:19 spadkins Exp $
  ######################################################################
  
  package App::Widget::HierSelector;
  $VERSION = do { my @r=(q$Revision: 1.1 $=~/\d+/g); sprintf 
"%d."."%02d"x$#r,@r};
  
  use App;
  use App::Widget;
  @ISA = ( "App::Widget" );
  
  use strict;
  
  =head1 NAME
  
  App::Widget::HierSelector - A generic hierarchical view
  
  =head1 SYNOPSIS
  
     use App::Widget::HierSelector;
  
     $name = "tree";
     $w = App::Widget::HierSelector->new($name);
     print $w->html();
  
  =cut
  
  ######################################################################
  # CONSTANTS
  ######################################################################
  
  ######################################################################
  # ATTRIBUTES
  ######################################################################
  # {node}{number}{type}       # whether open or closed
  # {node}{number}{open}       # 1=open 0=closed
  # {node}{number}{value}      #
  # {node}{number}{label}      #
  # {node}{number}{icon}       # icon to use (default, closed)
  # {node}{number}{openicon}   # icon to use when open (optional)
  # {node}{number}{hovericon}  # icon to use when cursor over icon
  
  # INPUTS FROM THE ENVIRONMENT
  
  =head1 DESCRIPTION
  
  This class implements a generic hierarchical view such as is useful
  for a TreeSelector, a Menu, a ToolbarSet, or an IconPaneSelector.
  The main function of a HierSelector is to display a hierarchical set of
  data and allow the user to generate events based on that view.
  
  =cut
  
  ######################################################################
  # INITIALIZATION
  ######################################################################
  
  # uncomment this when I need to do more than just call SUPER::_init()
  sub _init {
      my $self = shift;
      $self->SUPER::_init(@_);
  }
  
  ######################################################################
  # EVENTS
  ######################################################################
  
  # Usage: $widget->handle_event($wname, $event, @args);
  sub handle_event {
      my ($self, $wname, $event, @args) = @_;
      my ($node, $nodenumber, $x, $y);
  
      $node = $self->get("node");
      $self->set("node", $node);
  
      if ($event eq "open") {
          ($nodenumber, $x, $y) = @args;
          $node->{$nodenumber}{open} = 1;
      }
      elsif ($event eq "open_exclusively") {
          ($nodenumber, $x, $y) = @args;
          $self->open_exclusively($nodenumber);
      }
      elsif ($event eq "close") {
          ($nodenumber, $x, $y) = @args;
          $node->{$nodenumber}{open} = 0;
      }
      elsif ($event eq "select") {
          ($nodenumber, $x, $y) = @args;
          $self->set("selected", $nodenumber);  # save node number
          # intentionally bubble "select" event to the container
          if ($wname =~ /^(.*)-([^.]+)$/) {
              my $parent = $1;
              my $result = 
$self->{context}->widget($parent)->handle_event($wname, $event, @args);
              return $result;
          }
      }
      else {
          return $self->SUPER::handle_event($wname, $event, @args);
      }
      return 1;
  }
  
  sub select_first {
      my $self = shift;
      my $node = $self->get("node");
      
      my ($nodebase, $nodeidx, $nodenumber, $nodenumberfound, $nodelevel);
      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
  
      $nodenumberfound = "";
      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) {                # we have found the first 
node below the uppermost level
                  $nodenumberfound = $nodenumber;
                  last;
              }
  
              push(@nextnodebase,    $nodebase);   #   let's search for the 
node's brother (same depth, next idx)
              push(@nextnodeidx,     $nodeidx+1);  #   (next idx)
              push(@nextnodelevel,   $nodelevel);  #   (same level)
  
              push(@nextnodebase,  "${nodenumber}."); #   let's search for the 
node's children (1 deeper, idx 1)
              push(@nextnodeidx,   1);                #   (idx is 1)
              push(@nextnodelevel, $nodelevel+1);     #   (1 deeper)
          }
      }
      if ($nodenumberfound) {
          $self->set("selected", $nodenumberfound);
          my $basenodenumber = $nodenumberfound;
          $basenodenumber =~ s/\..*//;
          $self->open_exclusively($basenodenumber);
      }
      else {
          $self->open_exclusively("1");
      }
  }
  
  sub select {
      my ($self, $nodeattrib, $value) = @_;
      my $node = $self->get("node");
      my $success = 0;
      foreach my $nodenumber (keys %$node) {
          if ($node->{$nodenumber}{$nodeattrib} eq $value) {
              $self->set("selected", $nodenumber);
              $success = 1;
              last;
          }
      }
      return($success);
  }
  
  sub open_selected_exclusively {
      my ($self) = @_;
      $self->open_exclusively($self->{selected});
  }
  
  sub open_exclusively {
      my ($self, $opennodenumber) = @_;
      my ($nodebase, $nodeidx, $nodenumber);
      my $node = $self->get("node");
      $self->set("node", $node);
  
      $nodebase = $opennodenumber;
      if ($nodebase =~ /(.*)\.[^\.]+$/) {
          $nodebase = $1 . ".";
      }
      else {
          $nodebase = "";
      }
      $nodeidx = 1;
  
      while (1) {
          $nodenumber = "$nodebase$nodeidx";
          last if (!defined $node->{$nodenumber});
          $node->{$nodenumber}{open} = 0;
          $nodeidx++;
      }
  
      if (defined $node->{$opennodenumber}) {
          $node->{$opennodenumber}{open} = 1;
      }
  
      if (!defined $node->{"$opennodenumber.1"}) {
          $self->set("selected", $opennodenumber);
      }
  }
  
  ######################################################################
  # METHODS
  ######################################################################
  
  sub get_selected {
      my ($self, $nodeattrib) = @_;
      my ($node, $nodenumber);
  
      $nodenumber = $self->get("selected");
      return undef if (!defined $nodenumber);
      return $nodenumber if (!defined $nodeattrib);
  
      $node = $self->get("node");
      return $node->{$nodenumber}{$nodeattrib};
  }
  
  ######################################################################
  # OUTPUT METHODS
  ######################################################################
  
  sub html {
      my $self = shift;
      my ($node, $html, $label);
  
      $node    = $self->get("node");
  
      my ($nodebase, $nodeidx, $nodenumber, $nodelevel);
      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 = "";
      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...
              $label = $node->{$nodenumber}{label};
              $label = $node->{$nodenumber}{value} if (!defined $label);
              $label = "" if (!defined $label);
              $html .= ("  " x ($nodelevel-1)) if ($nodelevel > 1);
              $html .= $label;
              $html .= $node->{$nodenumber}{open} ? " (open)" : " (closed)";
              $html .= "<br>\n";
  
              push(@nextnodebase,    $nodebase);   #   let's search for the 
node's brother (same depth, next idx)
              push(@nextnodeidx,     $nodeidx+1);  #   (next idx)
              push(@nextnodelevel,   $nodelevel);  #   (same level)
  
              push(@nextnodebase,  "${nodenumber}."); #   let's search for the 
node's children (1 deeper, idx 1)
              push(@nextnodeidx,   1);                #   (idx is 1)
              push(@nextnodelevel, $nodelevel+1);     #   (1 deeper)
          }
      }
  
      $html;
  }
  
  1;
  
  
  
  
  1.1                  p5ee/App-Widget/lib/App/Widget/IconPaneSelector.pm
  
  Index: IconPaneSelector.pm
  ===================================================================
  
  ######################################################################
  ## $Id: IconPaneSelector.pm,v 1.1 2005/08/09 19:26:19 spadkins Exp $
  ######################################################################
  
  package App::Widget::IconPaneSelector;
  $VERSION = do { my @r=(q$Revision: 1.1 $=~/\d+/g); sprintf 
"%d."."%02d"x$#r,@r};
  
  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 ($context, $name, $node, $html, $label, $icon);
      $context      = $self->{context};
      $name    = $self->{name};
      $node    = $self->get("node");
  
      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",
                      volatile     => 1,
                      height       => "19",
                      width        => "98",
                      bevel        => "2",
                      label        => $label,
                      event_target => $name,
                      event        => "open_exclusively",
                      args         => $nodenumber,
                  )->html();
                  $html .= "<br>\n";
  
              }
              else {
  
                  $icon = $node->{$nodenumber}{icon};
                  if (!defined $icon) {
                      $parentnodenumber = $nodenumber;
                      $parentnodenumber =~ s/\.[^.]+$//;
                      $icon = $node->{$parentnodenumber}{icon};
                  }
                  $icon = "notes.gif" if (!defined $icon);
  
                  $label = $node->{$nodenumber}{label};
                  $label = $node->{$nodenumber}{value} if (!defined $label);
                  $label = "" if (!defined $label);
                  $nodelabel = $nodenumber;
                  $nodelabel =~ s/\./_/g;
  
                  $html .= "<p>";
                  $html .= $context->widget("$name-button$nodelabel",
                      class        => "App::Widget::ImageButton",
                      image        => "images/IconPaneSelector/$icon",
                      height       => "36",
                      width        => "36",
                      label        => $label,
                      event        => "select",
                      event_target => $name,
                      args         => $nodenumber,
                  )->html();
                  $html .= "<br>$label\n";
              }
  
              push(@nextnodebase,    $nodebase);   #   let's search for the 
node's brother (same depth, next idx)
              push(@nextnodeidx,     $nodeidx+1);  #   (next idx)
              push(@nextnodelevel,   $nodelevel);  #   (same level)
  
              if ($node->{$nodenumber}{open} || $nodelevel > 1) {
                  push(@nextnodebase,  "${nodenumber}."); #   let's search for 
the node's children (1 deeper, idx 1)
                  push(@nextnodeidx,   1);                #   (idx is 1)
                  push(@nextnodelevel, $nodelevel+1);     #   (1 deeper)
              }
          }
      }
  
      $html .= <<EOF;
      $fontend</td>
    </tr>
  </table>
  EOF
  
      $html;
  }
  
  1;
  
  
  
  
  1.1                  p5ee/App-Widget/lib/App/Widget/TabbedSelector.pm
  
  Index: TabbedSelector.pm
  ===================================================================
  
  ######################################################################
  ## $Id: TabbedSelector.pm,v 1.1 2005/08/09 19:26:19 spadkins Exp $
  ######################################################################
  
  package App::Widget::TabbedSelector;
  $VERSION = do { my @r=(q$Revision: 1.1 $=~/\d+/g); sprintf 
"%d."."%02d"x$#r,@r};
  
  use App;
  use App::Widget::HierSelector;
  @ISA = ( "App::Widget::HierSelector" );
  
  use strict;
  
  =head1 NAME
  
  App::Widget::TabbedSelector - A screen selector widget
  
  =head1 SYNOPSIS
  
     use App::Widget::TabbedSelector;
  
     $name = "get_data";
     $w = App::Widget::TabbedSelector->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();
      }
  }
  
  sub select {
      my ($self, $nodeattrib, $value) = @_;
      my $success = $self->SUPER::select($nodeattrib, $value);
      $self->open_selected_exclusively();
      return($success);
  }
  
  ######################################################################
  # OUTPUT METHODS
  ######################################################################
  
  sub html {
      my $self = shift;
      my ($context, $name, $node, $html, $label, $icon);
      $context = $self->{context};
      $name    = $self->{name};
      $node    = $self->get("node");
  
      my ($bgcolor, $width, $fontface, $fontsize, $fontcolor, $fontbegin, 
$fontend);
      my ($html_url_dir, $xgif);
  
      $bgcolor   = $self->get("bgcolor",   "#888888");
      $width     = $self->get("width",     "100%");
      $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 (@nodeidx, $selected_nodenumber, $w);
  
      $selected_nodenumber = $self->{selected};
      @nodeidx = split(/\./,$selected_nodenumber);
  
      $html_url_dir = $context->get_option("html_url_dir");
      $xgif = "$html_url_dir/images/Widget/dot_clear.gif";
  
      $html = "";
  
      $nodelevel = 0;
      $nodebase = "";
      if (defined $node->{1} && !defined $node->{2}) {
          $nodelevel = 1;
          $nodebase = "1.";
      }
      for (; $nodelevel <= $#nodeidx; $nodelevel++) {
          $html .= '<table border="0" cellpadding="0" cellspacing="0" 
width="100%">' . "\n";
          $html .= "  <tr><td rowspan=\"3\" width=\"1%\" height=\"19\" nowrap>";
  
          $nodeidx = 1;
          $nodenumber = "$nodebase$nodeidx"; # create its node number
          while (defined $node->{$nodenumber}) {
  
              $label = $node->{$nodenumber}{label};
              $label = $node->{$nodenumber}{value} if (!defined $label);
              $label = "" if (!defined $label);
  
              $w = $context->widget("$name-button$nodenumber",
                  class => "App::Widget::ImageButton",
                  image_script => "app-button",
                  volatile     => 1,
                  height       => "19",
                  width        => "127",
                  bevel        => "2",
                  label        => $label,
                  event_target => $name,
                  event        => "open_exclusively",
                  args         => $nodenumber,
                  type         => "tab",
              );
              #$w->set("selected", $node->{$nodenumber}{open} ? 1 : 0);
              if ($node->{$nodenumber}{open}) {
                  $w->set("selected", 1);
              }
              else {
                  $w->set("selected", 0);
              }
              $html .= $w->html();
              $html .= "<!--\n    -->";
  
              $nodeidx++;
              $nodenumber = "$nodebase$nodeidx"; # create its node number
          }
          $nodebase .= "$nodeidx[$nodelevel].";
          $html .= "</td>\n";
          $html .= "    <td height=16 width=\"99%\"><img src=transp.gif 
height=16 width=1></td>\n";
          $html .= "    <td height=\"16\" width=\"99%\"></td>\n";
          $html .= "  </tr>\n";
          $html .= "  <tr>\n";
          $html .= "    <td height=\"1\" width=\"99%\" bgcolor=\"#000000\"><img 
src=\"$xgif\" height=\"1\" width=\"1\"></td>\n";
          $html .= "  </tr>\n";
          $html .= "  <tr>\n";
          $html .= "    <td height=\"2\" width=\"99%\" bgcolor=\"#ffffff\"><img 
src=\"$xgif\" height=\"2\" width=\"1\"></td>\n";
          $html .= "  </tr>\n";
          $html .= "</table>\n";
      }
  
      $html;
  }
  
  1;
  
  
  
  
  1.1                  p5ee/App-Widget/lib/App/Widget/TreeSelector.pm
  
  Index: TreeSelector.pm
  ===================================================================
  
  ######################################################################
  ## $Id: TreeSelector.pm,v 1.1 2005/08/09 19:26:19 spadkins Exp $
  ######################################################################
  
  package App::Widget::TreeSelector;
  $VERSION = do { my @r=(q$Revision: 1.1 $=~/\d+/g); sprintf 
"%d."."%02d"x$#r,@r};
  
  use App;
  use App::Widget::HierSelector;
  @ISA = ( "App::Widget::HierSelector" );
  
  use strict;
  
  =head1 NAME
  
  App::Widget::TreeSelector - An HTML tree view
  
  =head1 SYNOPSIS
  
     use App::Widget::TreeSelector;
  
     $name = "get_data";
     $w = App::Widget::TreeSelector->new($name);
     print $w->html();
  
  =cut
  
  =head1 DESCRIPTION
  
  This class implements a graphical tree view such as is used in
  Windows Explorer.
  
  =cut
  
  ######################################################################
  # INITIALIZATION
  ######################################################################
  
  # uncomment this when I need to do more than just call SUPER::_init()
  #sub _init {
  #   my $self = shift;
  #   $self->SUPER::_init(@_);
  #}
  
  ######################################################################
  # OUTPUT METHODS
  ######################################################################
  
  sub html {
      my $self = shift;
      my ($context, $name, $node);
      $context      = $self->{context};
      $name    = $self->{name};
      $node    = $self->get("node");
  
      my ($nodebase, $nodeidx, $nodenumber, $nodelevel, $maxnodelevel);
      my (@nextnodebase, @nextnodeidx, @nextnodelevel, @shownnodenumber, 
@shownnodelevel);
  
      @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
      @shownnodenumber = ();   # list of the nodenumbers which are to be shown
      @shownnodelevel  = ();   # the levels at which those shown nodes exist
      $maxnodelevel    = 0;
  
      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...
              push(@shownnodenumber, $nodenumber); #   take note that it exists 
so that we can display it
              push(@shownnodelevel,  $nodelevel);  #   take note of its depth 
(so we display it properly)
              push(@nextnodebase,    $nodebase);   #   let's search for the 
node's brother (same depth, next idx)
              push(@nextnodeidx,     $nodeidx+1);  #   (next idx)
              push(@nextnodelevel,   $nodelevel);  #   (same level)
              $maxnodelevel = $nodelevel+1 if ($nodelevel+1 > $maxnodelevel);  
# maxnodelevel will be # cols in table
  
              if ($node->{$nodenumber}{open}) {           # if the node is 
open...
                  push(@nextnodebase,  "${nodenumber}."); #   let's search for 
the node's children (1 deeper, idx 1)
                  push(@nextnodeidx,   1);                #   (idx is 1)
                  push(@nextnodelevel, $nodelevel+1);     #   (1 deeper)
              }
          }
      }
  
      my ($row, $col, $row2, @colislink);
      my ($html_url_dir, $imgstart, $imgend, $imgbuttonstart, $imgbuttonend);
      my ($html, $label, $colspan, $isparent, $open);
  
      for ($row = $#shownnodenumber; $row >= 0; $row--) {
          $nodenumber = $shownnodenumber[$row];
          $nodelevel  = $shownnodelevel[$row];
          $col = $nodelevel - 1;
          for ($row2 = $row-1; $row2 >= 0; $row2--) {
              $colislink[$row2][$col] = 1;
              last if ($shownnodelevel[$row2] == $nodelevel - 1);
          }
      }
  
      $html_url_dir   = $self->{context}->get_option("html_url_dir");
      $imgstart       = "<img src=\"$html_url_dir/images/TreeSelector/";
      $imgend         = "\" width=\"19\" height=\"16\" border=\"0\"/>";
      $imgbuttonstart = "<input type=\"image\" 
src=$html_url_dir/images/TreeSelector/";
      $imgbuttonend   = " width=\"19\" height=\"16\" border=\"0\"/>";
  
      $html = "";
      $html .= "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n";
  
      for ($row = 0; $row <= $#shownnodenumber; $row++) {
          $nodenumber = $shownnodenumber[$row];
          $nodelevel  = $shownnodelevel[$row];
          $html      .= "  <tr>\n";
          for ($col = 0; $col <= $maxnodelevel+1; $col++) {
              if ($col < $nodelevel-1) {
                  if ($colislink[$row][$col]) {
                      $html .= "    <td>${imgstart}vbar.gif${imgend}</td>\n";
                  }
                  else {
                      $html .= "    <td></td>\n";
                  }
              }
              elsif ($col == $nodelevel-1) {
                  $isparent = (defined $node->{"$nodenumber.1"});
                  $open = $node->{$nodenumber}{open};
                  if ($isparent) {
                      if ($open) {
                          $html .= "    <td>${imgbuttonstart}minus.gif 
name=\"app.event.$name.close($nodenumber)\" ${imgbuttonend}</td>\n";
                      }
                      else {
                          $html .= "    <td>${imgbuttonstart}plus.gif 
name=\"app.event.$name.open($nodenumber)\" ${imgbuttonend}</td>\n";
                      }
                  }
                  else {
                      if ($colislink[$row][$col]) {
                          $html .= "    <td>${imgstart}tee.gif${imgend}</td>\n";
                      }
                      else {
                          $html .= "    <td>${imgstart}ell.gif${imgend}</td>\n";
                      }
                  }
              }
              elsif ($col == $nodelevel) {
                  if ($node->{$nodenumber}{open}) {
                      $html .= "    <td>${imgbuttonstart}ofolder.gif 
name=\"app.event.$name.select($nodenumber)\" ${imgbuttonend}</td>\n";
                  }
                  else {
                      $html .= "    <td>${imgbuttonstart}cfolder.gif 
name=\"app.event.$name.select($nodenumber)\" ${imgbuttonend}</td>\n";
                  }
              }
              else {
                  $colspan = $maxnodelevel - $nodelevel;
                  $label = $node->{$nodenumber}{label};
                  $label = $node->{$nodenumber}{value} if (!defined $label);
                  $label = "" if (!defined $label);
                  $html .= "    <td nowrap colspan=\"$colspan\"><font 
face=\"verdana,geneva,arial,sans-serif\" size=\"-2\">$label</font></td>\n";
                  last;
              }
          }
          $html .= "  </tr>\n";
      }
  
      $html .= "</table>\n";
      $html;
  }
  
  1;
  
  
  
  

Reply via email to