Diff for /loncom/interface/lonnavmaps.pm between versions 1.93 and 1.96

version 1.93, 2002/10/29 20:26:03 version 1.96, 2002/11/01 19:50:00
Line 837  sub new_handle { Line 837  sub new_handle {
                                           ''));                                            ''));
     $r->print('<script>window.focus();</script>');      $r->print('<script>window.focus();</script>');
     my $desc=$ENV{'course.'.$ENV{'request.course.id'}.'.description'};      my $desc=$ENV{'course.'.$ENV{'request.course.id'}.'.description'};
     if (defined($desc)) { $r->print("<h2>$desc</h2>\n"); }      $r->print('<table border="0" cellpadding="2" cellspacing="0">');
     my $date=localtime;      my $date=localtime;
     $r->print("<h3>$date</h3>\n");      $r->print('<tr><td align="right" valign="bottom">Key:&nbsp;&nbsp;</td>');
     $r->rflush();  
     if ($navmap->{LAST_CHECK}) {      if ($navmap->{LAST_CHECK}) {
         $r->print('<img src="/adm/lonMisc/chat.gif"> New discussion since '.          $r->print('<td align="center" valign="bottom">&nbsp;&nbsp;'.
                     '<img src="/adm/lonMisc/chat.gif"> New discussion since '.
                   strftime("%A, %b %e at %I:%M %P", localtime($navmap->{LAST_CHECK})).                    strftime("%A, %b %e at %I:%M %P", localtime($navmap->{LAST_CHECK})).
                   '<br><img src="/adm/lonMisc/feedback.gif"> New message (click to open)<p>');                     '</td><td align="center" valign="bottom">&nbsp;&nbsp;'.
                     '<img src="/adm/lonMisc/feedback.gif"> New message (click to open)<p>'.
                     '</td>'); 
     } else {      } else {
         $r->print('<img src="/adm/lonMisc/chat.gif"> Discussions'.          $r->print('<td align="center" valign="bottom">&nbsp;&nbsp;'.
                   '<br><img src="/adm/lonMisc/feedback.gif"> New message (click to open)<p>');                     '<img src="/adm/lonMisc/chat.gif"> Discussions</td><td align="center" valign="bottom">'.
                     '&nbsp;&nbsp;<img src="/adm/lonMisc/feedback.gif"> New message (click to open)'.
                     '</td>'); 
       }
       $r->print('</tr></table>');
       my $condition = 0;
       if ($ENV{'form.condition'}) {
           $condition = 1;
     }      }
   
       if ($condition) {
           $r->print('<a href="navmaps?condition=0&filter=">Close All Folders</a>');
       } else {
           $r->print('<a href="navmaps?condition=1&filter=">Open All Folders</a>');
       }
   
       $r->print('<br>&nbsp;');
       $r->rflush();
   
     # Now that we've displayed some stuff to the user, init the navmap      # Now that we've displayed some stuff to the user, init the navmap
     $navmap->init();      $navmap->init();
   
Line 929  sub new_handle { Line 947  sub new_handle {
     my $queryAdd = "postdata=" . &Apache::lonnet::escape($currenturl) .      my $queryAdd = "postdata=" . &Apache::lonnet::escape($currenturl) .
         "&alreadyHere=1";          "&alreadyHere=1";
   
     my $condition = 0;  
     if ($ENV{'form.condition'}) {  
         $condition = 1;  
     }  
   
     if ($condition) {  
         $r->print('<a href="navmaps?condition=0&filter=">Close All Folders</a><br /><br />');  
     } else {  
         $r->print('<a href="navmaps?condition=1&filter=">Open All Folders</a><br /><br />');  
     }  
   
     # Begin the HTML table      # Begin the HTML table
     # four cols: resource + indent, chat+feedback, icon, text string      # four cols: resource + indent, chat+feedback, icon, text string
     $r->print('<table cellspacing="0" cellpadding="3" border="0" bgcolor="#FFFFFF">' ."\n");      $r->print('<table cellspacing="0" cellpadding="3" border="0" bgcolor="#FFFFFF">' ."\n");
Line 950  sub new_handle { Line 957  sub new_handle {
     # Here's a simple example of the iterator.      # Here's a simple example of the iterator.
     # Preprocess the map: Look for current URL, force inlined maps to display      # Preprocess the map: Look for current URL, force inlined maps to display
   
       # This currently does very little...
       my $mapEventualIterator = Apache::lonnavmaps::iterator->new($navmap, undef, undef, {},
                                                                   undef, $condition);
   
     my $mapIterator = $navmap->getIterator(undef, undef, {}, 1);      my $mapIterator = $navmap->getIterator(undef, undef, {}, 1);
     my $found = 0;      my $found = 0;
     my $depth = 1;      my $depth = 1;
Line 961  sub new_handle { Line 972  sub new_handle {
     my $counter = 0;      my $counter = 0;
           
     while ($depth > 0) {      while ($depth > 0) {
         if ($curRes == $mapIterator->BEGIN_MAP()) {          if ($curRes == $mapIterator->BEGIN_MAP()) { $depth++; }
             $depth++;          if ($curRes == $mapIterator->END_MAP()) { $depth--; }
         }  
         if ($curRes == $mapIterator->END_MAP()) {  
             $depth--;  
         }  
   
         if (ref($curRes)) { $counter++; }          if (ref($curRes)) { $counter++; }
   
Line 1051  sub new_handle { Line 1058  sub new_handle {
         if ($curRes == $mapIterator->BEGIN_BRANCH()) {          if ($curRes == $mapIterator->BEGIN_BRANCH()) {
             $isNewBranch = 1;              $isNewBranch = 1;
         }          }
         if ($curRes == $mapIterator->BEGIN_MAP()) {          if ($curRes == $mapIterator->BEGIN_MAP()) { $depth++; }
             $depth++;          if ($curRes == $mapIterator->END_MAP()) { $depth--; }
         }  
         if ($curRes == $mapIterator->END_MAP()) {  
             $depth--;  
         }  
   
         if (ref($curRes)) { $counter++; }          if (ref($curRes)) { $counter++; }
   
Line 1769  sub courseMapDefined { Line 1772  sub courseMapDefined {
   
 sub getIterator {  sub getIterator {
     my $self = shift;      my $self = shift;
     my $iterator = Apache::lonnavmaps::iterator->new($self, shift, shift,      my $iterator = Apache::lonnavmaps::DFSiterator->new($self, shift, shift,
                                                      shift, undef, shift,                                                        shift, undef, shift, 
                                                      $ENV{'form.direction'});                                                       $ENV{'form.direction'});
     return $iterator;      return $iterator;
Line 2028  sub END_BRANCH { return 4; }   # end of Line 2031  sub END_BRANCH { return 4; }   # end of
 sub FORWARD { return 1; }      # go forward  sub FORWARD { return 1; }      # go forward
 sub BACKWARD { return 2; }  sub BACKWARD { return 2; }
   
   sub min {
       (my $a, my $b) = @_;
       if ($a < $b) { return $a; } else { return $b; }
   }
   
   sub new {
       # magic invocation to create a class instance
       my $proto = shift;
       my $class = ref($proto) || $proto;
       my $self = {};
   
       $self->{NAV_MAP} = shift;
       return undef unless ($self->{NAV_MAP});
   
       # Handle the parameters
       $self->{FIRST_RESOURCE} = shift || $self->{NAV_MAP}->firstResource();
       $self->{FINISH_RESOURCE} = shift || $self->{NAV_MAP}->finishResource();
   
       # If the given resources are just the ID of the resource, get the
       # objects
       if (!ref($self->{FIRST_RESOURCE})) { $self->{FIRST_RESOURCE} = 
                $self->{NAV_MAP}->getById($self->{FIRST_RESOURCE}); }
       if (!ref($self->{FINISH_RESOURCE})) { $self->{FINISH_RESOURCE} = 
                $self->{NAV_MAP}->getById($self->{FINISH_RESOURCE}); }
   
       $self->{FILTER} = shift;
   
       # A hash, used as a set, of resource already seen
       $self->{ALREADY_SEEN} = shift;
       if (!defined($self->{ALREADY_SEEN})) { $self->{ALREADY_SEEN} = {} };
       $self->{CONDITION} = shift;
   
       # Now, we need to pre-process the map, by walking forward and backward
       # over the parts of the map we're going to look at.
   
       my $forwardIterator = Apache::lonnavmaps::DFSiterator->new($self->{NAV_MAP}, 
                                                                  $self->{FIRST_RESOURCE},
                                                                  $self->{FINISH_RESOURCE},
                                                                  $self->{FILTER},
                                                                  undef, $self->{CONDITION},
                                                                  FORWARD());
       
       # prime the recursion
       $self->{FIRST_RESOURCE}->{DATA}->{TOP_DOWN_VAL} = 0;
       my $depth = 1;
       $forwardIterator->next();
       my $curRes = $forwardIterator->next();
       while ($depth > 0) {
           if ($curRes == $forwardIterator->BEGIN_MAP()) { $depth++; }
           if ($curRes == $forwardIterator->END_MAP()) { $depth--; }
           
           if (ref($curRes)) {
               my $topDownVal = $curRes->{DATA}->{TOP_DOWN_VAL};
               my $nextResources = $curRes->getNext();
               my $resourceCount = scalar(@{$nextResources});
               
               if ($resourceCount == 1) {
                   my $current = $nextResources->[0]->{DATA}->{TOP_DOWN_VAL} || 999999999;
                   $nextResources->[0]->{DATA}->{TOP_DOWN_VAL} = min($topDownVal, $current);
               }
               
               if ($resourceCount > 1) {
                   foreach my $res (@{$nextResources}) {
                       my $current = $res->{DATA}->{TOP_DOWN_VAL} || 999999999;
                       $res->{DATA}->{TOP_DOWN_VAL} = min($current, $topDownVal + 1);
                   }
               }
           }
           $curRes = $forwardIterator->next();
       }
   
       # Now we're ready to start iterating.
   }
   
   1;
   
   package Apache::lonnavmaps::DFSiterator;
   
   # UNDOCUMENTED: This is a private library, it should not generally be used
   # by the outside world. What it does is walk through the nav map in a 
   # depth-first fashion. This is not appropriate for most uses, but it is
   # used by the main iterator for pre-processing. It also is able to isolate
   # much of the complexity of the main iterator, so the main iterator is much
   # simpler.
   
   # Here are the tokens for the iterator, replicated from iterator for convenience:
   
   sub BEGIN_MAP { return 1; }    # begining of a new map
   sub END_MAP { return 2; }      # end of the map
   sub BEGIN_BRANCH { return 3; } # beginning of a branch
   sub END_BRANCH { return 4; }   # end of a branch
   sub FORWARD { return 1; }      # go forward
   sub BACKWARD { return 2; }
   
 # Params: nav map, start resource, end resource, filter, condition,   # Params: nav map, start resource, end resource, filter, condition, 
 # already seen hash ref  # already seen hash ref
   
Line 2236  sub next { Line 2333  sub next {
         my $finishResource = $self->{HERE}->map_finish();          my $finishResource = $self->{HERE}->map_finish();
   
         $self->{RECURSIVE_ITERATOR} =          $self->{RECURSIVE_ITERATOR} =
           Apache::lonnavmaps::iterator->new ($self->{NAV_MAP}, $firstResource,             Apache::lonnavmaps::DFSiterator->new ($self->{NAV_MAP}, $firstResource, 
                      $finishResource, $self->{FILTER}, $self->{ALREADY_SEEN},                       $finishResource, $self->{FILTER}, $self->{ALREADY_SEEN},
                                              $self->{CONDITION}, $self->{DIRECTION});                                               $self->{CONDITION}, $self->{DIRECTION});
     }      }

Removed from v.1.93  
changed lines
  Added in v.1.96


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>