cvs commit: p5ee/App-Widget/lib/App/Widget FileTreeSelector.pm HierSelector.pm IconPaneSelector.pm TabbedSelector.pm TreeSelector.pm HierView.pm SelectorView.pm TabbedView.pm TreeView.pm

[email protected] (Stephen Adkins)
Newsgroups perl.cvs.p5ee
Message-ID <[email protected]>
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 .= ("&nbsp;&nbsp;" 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;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.