Diff for /loncom/interface/lonnavmaps.pm between versions 1.117 and 1.118

version 1.117, 2002/11/26 17:01:29 version 1.118, 2002/12/02 14:04:52
Line 48  use POSIX qw (floor strftime); Line 48  use POSIX qw (floor strftime);
   
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
       real_handler($r);
   }
   
   sub real_handler {
       my $r = shift;
   
     &Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});      &Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});
   
Line 84  sub handler { Line 89  sub handler {
     }      }
   
     $r->print("<html><head>\n");      $r->print("<html><head>\n");
     $r->print("<title>Navigate Course Contents</title>");      $r->print("<title>Navigate Course Contents</title></head>");
   
     # Header      # Header
     $r->print(&Apache::loncommon::bodytag('Navigate Course Contents','',      $r->print(&Apache::loncommon::bodytag('Navigate Course Contents','',
Line 116  sub handler { Line 121  sub handler {
         $condition = 1;          $condition = 1;
     }      }
   
     my $currenturl = $ENV{'form.postdata'};      # Determine where the "here" marker is and where the screen jumps to.
     $currenturl=~s/^http\:\/\///;      my $SYMB = 1; my $URL = 2; my $NOTHING = 3; # symbolic constants
     $currenturl=~s/^[^\/]+//;      my $hereType; # the type of marker, $SYMB, $URL, or $NOTHING
       my $here; # the actual URL or SYMB for the here marker
       my $jumpType; # The type of the thing we have a jump for, $SYMB or $URL
       my $jump; # the SYMB/URL of the resource we need to jump to
   
       if ( $ENV{'form.alreadyHere'} ) { # we came from a user's manipulation of the nav page
           # If this is a click on a folder or something, we want to preserve the "here"
           # from the querystring, and get the new "jump" marker
           $hereType = $ENV{'form.hereType'};
           $here = $ENV{'form.here'};
           $jumpType = $ENV{'form.jumpType'} || $NOTHING;
           $jump = $ENV{'form.jump'};
       } else { # the user is visiting the nav map from the remote
           # We're coming from the remote. We have either a url, a symb, or nothing,
           # and we need to figure out what.
           # Preference: Symb
           
           if ($ENV{'form.symb'}) {
               $hereType = $jumpType = $SYMB;
               $here = $jump = $ENV{'form.symb'};
           } elsif ($ENV{'form.postdata'}) {
               # couldn't find a symb, is there a URL?
               my $currenturl = $ENV{'form.postdata'};
               $currenturl=~s/^http\:\/\///;
               $currenturl=~s/^[^\/]+//;
   
               $hereType = $jumpType = $URL;
               $here = $jump = $currenturl;
           } else {
               # Nothing
               $hereType = $jumpType = $NOTHING;
           }
       }
   
       
     # alreadyHere allows us to only open the maps necessary to view      # alreadyHere allows us to only open the maps necessary to view
     # the current location once, while at the same time remembering      # the current location once, while at the same time remembering
     # the current location. Without that check, the user would never      # the current location. Without that check, the user would never
     # be able to close those maps; the user would close it, and the      # be able to close those maps; the user would close it, and the
     # currenturl scan would re-open it.      # currenturl scan would re-open it.
     my $queryAdd = "postdata=" . &Apache::lonnet::escape($currenturl) .      my $queryAdd = "&alreadyHere=1";
         "&alreadyHere=1";  
   
     if ($condition) {      if ($condition) {
         $r->print("<a href=\"navmaps?condition=0&filter=&$queryAdd\">Close All Folders</a>");          $r->print("<a href=\"navmaps?condition=0&filter=&$queryAdd" .
                     "&hereType=$hereType&here=" . Apache::lonnet::escape($here) .
                     "\">Close All Folders</a>");
     } else {      } else {
         $r->print("<a href=\"navmaps?condition=1&filter=&$queryAdd\">Open All Folders</a>");          $r->print("<a href=\"navmaps?condition=1&filter=&$queryAdd" .
                     "&hereType=$hereType&here=" . Apache::lonnet::escape($here) . 
                     "\">Open All Folders</a>");
     }      }
   
     $r->print('<br>&nbsp;');      $r->print('<br>&nbsp;');
Line 219  sub handler { Line 260  sub handler {
     # 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
   
     my $mapIterator = $navmap->getIterator(undef, undef, \%filterHash, 1);      my $mapIterator = $navmap->getIterator(undef, undef, undef, 1);
     my $found = 0;      my $found = 0;
     my $depth = 1;      my $depth = 1;
     my $currentUrlIndex = 0; # keeps track of when the current resource is found,      my $currentJumpIndex = 0; # keeps track of when the current resource is found,
                              # so we can back up a few and put the anchor above the                               # so we can back up a few and put the anchor above the
                              # current resource                               # current resource
     my $currentUrlDelta = 5; # change this to change how many resources are displayed      my $currentJumpDelta = 2; # change this to change how many resources are displayed
                              # before the current resource when using #current                               # before the current resource when using #current
     $mapIterator->next(); # discard the first BEGIN_MAP      $mapIterator->next(); # discard the first BEGIN_MAP
     my $curRes = $mapIterator->next();      my $curRes = $mapIterator->next();
     my $counter = 0;      my $counter = 0;
       my $foundJump = ($jumpType == $NOTHING); # look for jump point if we have one
       my $looped = 0; 
   
     # We only need to do this if we need to open the maps to show the      # We only need to do this if we need to open the maps to show the
     # current position      # current position. This will change the counter so we can't count
       # for the jump marker with this loop.
     while ($depth > 0 && !$ENV{'form.alreadyHere'}) {      while ($depth > 0 && !$ENV{'form.alreadyHere'}) {
         if ($curRes == $mapIterator->BEGIN_MAP()) { $depth++; }          if ($curRes == $mapIterator->BEGIN_MAP()) { $depth++; }
         if ($curRes == $mapIterator->END_MAP()) { $depth--; }          if ($curRes == $mapIterator->END_MAP()) { $depth--; }
           if (ref($curRes) && !$ENV{'form.alreadyHere'} && 
         if (ref($curRes)) { $counter++; }              ($hereType == $SYMB && $curRes->symb() eq $here) ||
               ($hereType == $URL && $curRes->src() eq $here)) {
         my $mapStack = $mapIterator->getStack();              my $mapStack = $mapIterator->getStack();
         if ($currenturl && !$ENV{'form.alreadyHere'} && ref($curRes) &&   
             $curRes->src() eq $currenturl) {  
             # If this is the correct resource, be sure to   
             # show it by making sure the containing maps  
             # are open.  
   
             # This is why we have to use the main iterator instead of the  
             # potentially faster DFS: The count has to be the same, so  
             # the order has to be the same, which DFS won't give us.  
             $currentUrlIndex = $counter;  
                           
             # Ensure the parent maps are open              # Ensure the parent maps are open
             for my $map (@{$mapStack}) {              for my $map (@{$mapStack}) {
Line 261  sub handler { Line 295  sub handler {
             }              }
             $ENV{'form.alreadyHere'} = 1;              $ENV{'form.alreadyHere'} = 1;
         }          }
                       $looped = 1;
   
           $curRes = $mapIterator->next();
       }            
       
       $mapIterator = $navmap->getIterator(undef, undef, \%filterHash, 0);
       $depth = 1;
       $mapIterator->next();
       $curRes = $mapIterator->next();
   
       while ($depth > 0 && !$foundJump) {
           if ($curRes == $mapIterator->BEGIN_MAP()) { $depth++; }
           if ($curRes == $mapIterator->END_MAP()) { $depth--; }
           if (ref($curRes)) { $counter++; }
   
           if (ref($curRes) && 
               (($jumpType == $SYMB && $curRes->symb() eq $jump) ||
               ($jumpType == $URL && $curRes->src() eq $jump))) {
               # If this is the correct resource, be sure to 
               # show it by making sure the containing maps
               # are open.
   
               # This is why we have to use the main iterator instead of the
               # potentially faster DFS: The count has to be the same, so
               # the order has to be the same, which DFS won't give us.
               $currentJumpIndex = $counter;
               $foundJump = 1;
           }
   
         $curRes = $mapIterator->next();          $curRes = $mapIterator->next();
     }      }
           
Line 273  sub handler { Line 335  sub handler {
     my $now = time();      my $now = time();
     my $in24Hours = $now + 24 * 60 * 60;      my $in24Hours = $now + 24 * 60 * 60;
     my $displayedHereMarker = 0;      my $displayedHereMarker = 0;
       my $displayedJumpMarker = 0;
           
     # We know the first thing is a BEGIN_MAP (see "$self->{STARTED}"      # We know the first thing is a BEGIN_MAP (see "$self->{STARTED}"
     # code in iterator->next), so ignore the first one      # code in iterator->next), so ignore the first one
Line 287  sub handler { Line 350  sub handler {
   
     $counter = 0;      $counter = 0;
   
     # Print the 'current' anchor here if it would fall off the top  
     if ($currentUrlIndex - $currentUrlDelta < 0) {  
         $r->print('<a name="current" />');  
     }  
   
     while ($depth > 0) {      while ($depth > 0) {
         if ($curRes == $mapIterator->BEGIN_MAP() ||          if ($curRes == $mapIterator->BEGIN_MAP() ||
             $curRes == $mapIterator->BEGIN_BRANCH()) {              $curRes == $mapIterator->BEGIN_BRANCH()) {
Line 461  sub handler { Line 519  sub handler {
                     $linkopen .= ($nowOpen xor $condition) ?                       $linkopen .= ($nowOpen xor $condition) ? 
                         addToFilter(\%filterHash, $mapId) :                          addToFilter(\%filterHash, $mapId) :
                         removeFromFilter(\%filterHash, $mapId);                          removeFromFilter(\%filterHash, $mapId);
                     $linkopen .= "&condition=$condition&$queryAdd\">";                      $linkopen .= "&condition=$condition&$queryAdd" . 
                           "&hereType=$hereType&here=" . 
                           Apache::lonnet::escape($here) . "&jumpType=$SYMB&" .
                           "jump=" . Apache::lonnet::escape($curRes->symb()) ."\">";
                     $linkclose = "</a>";                      $linkclose = "</a>";
   
                 }                  }
Line 492  sub handler { Line 553  sub handler {
                 $r->print("  <tr bgcolor=\"$backgroundColor\"><td align=\"left\" valign=\"center\">\n");                  $r->print("  <tr bgcolor=\"$backgroundColor\"><td align=\"left\" valign=\"center\">\n");
   
                 # Print the anchor if necessary                  # Print the anchor if necessary
                 if ($counter == $currentUrlIndex - $currentUrlDelta) {                  if ($counter == $currentJumpIndex - $currentJumpDelta ) {
                     $r->print('<a name="current" />');                      $r->print('<a name="curloc" />');
                       $displayedJumpMarker = 1;
                 }                  }
   
                 # print indentation                  # print indentation
Line 507  sub handler { Line 569  sub handler {
                 my $curMarkerEnd = "";                  my $curMarkerEnd = "";
   
                 # Is this the current resource?                  # Is this the current resource?
                 if ($curRes->src() eq $currenturl && !$displayedHereMarker) {                  if (!$displayedHereMarker && 
                     $curMarkerBegin = '<a name="curloc" /><font color="red" size="+2">&gt; </font>';                      (($hereType == $SYMB && $curRes->symb eq $here) ||
                       ($hereType == $URL && $curRes->src eq $here))) {
                       $curMarkerBegin = '<font color="red" size="+2">&gt; </font>';
                     $curMarkerEnd = '<font color="red" size="+2"> &lt;</font>';                      $curMarkerEnd = '<font color="red" size="+2"> &lt;</font>';
                     $displayedHereMarker = 1;                      $displayedHereMarker = 1;
                 }                  }
Line 523  sub handler { Line 587  sub handler {
   
                 $r->print("  $curMarkerBegin<a href=\"$link\">$title$partLabel</a> $curMarkerEnd $nonLinkedText");                  $r->print("  $curMarkerBegin<a href=\"$link\">$title$partLabel</a> $curMarkerEnd $nonLinkedText");
   
                 if ($curRes->{RESOURCE_ERROR}) {                  #if ($curRes->{RESOURCE_ERROR}) {
                     $r->print(&Apache::loncommon::help_open_topic ("Navmap_Host_Down",                  #    $r->print(&Apache::loncommon::help_open_topic ("Navmap_Host_Down",
                                               '<font size="-1">Host down</font>'));                  #                              '<font size="-1">Host down</font>'));
                     }                  #    }
   
                 $r->print("</td>\n");                  $r->print("</td>\n");
   
Line 596  sub handler { Line 660  sub handler {
         $curRes = $mapIterator->next();          $curRes = $mapIterator->next();
     }      }
   
     $r->print("</table></body></html>");      $r->print("</table>");
   
       # Print out the part that jumps to #curloc if it exists
       if ($displayedJumpMarker) {
           $r->print('<script>location += "#curloc";</script>');
       }
   
       $r->print("</body></html>");
   
     $navmap->untieHashes();      $navmap->untieHashes();
   

Removed from v.1.117  
changed lines
  Added in v.1.118


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