[LON-CAPA-cvs] cvs: loncom /interface lonnavmaps.pm

bowersj2 lon-capa-cvs@mail.lon-capa.org
Mon, 02 Dec 2002 14:04:52 -0000


This is a MIME encoded message

--bowersj21038837892
Content-Type: text/plain

bowersj2		Mon Dec  2 09:04:52 2002 EDT

  Modified files:              
    /loncom/interface	lonnavmaps.pm 
  Log:
  Closes 979, assuming it works right. The "current document" marker and
  the shifting the screen to keep what you just clicked on on the screen
  have been fully dissociated, so that one resource can be labelled as
  "here" (red angle brackets) while another is getting the anchor.
  
  
--bowersj21038837892
Content-Type: text/plain
Content-Disposition: attachment; filename="bowersj2-20021202090452.txt"

Index: loncom/interface/lonnavmaps.pm
diff -u loncom/interface/lonnavmaps.pm:1.117 loncom/interface/lonnavmaps.pm:1.118
--- loncom/interface/lonnavmaps.pm:1.117	Tue Nov 26 12:01:29 2002
+++ loncom/interface/lonnavmaps.pm	Mon Dec  2 09:04:52 2002
@@ -2,7 +2,7 @@
 # The LearningOnline Network with CAPA
 # Navigate Maps Handler
 #
-# $Id: lonnavmaps.pm,v 1.117 2002/11/26 17:01:29 bowersj2 Exp $
+# $Id: lonnavmaps.pm,v 1.118 2002/12/02 14:04:52 bowersj2 Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -48,6 +48,11 @@
 
 sub handler {
     my $r = shift;
+    real_handler($r);
+}
+
+sub real_handler {
+    my $r = shift;
 
     &Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});
 
@@ -84,7 +89,7 @@
     }
 
     $r->print("<html><head>\n");
-    $r->print("<title>Navigate Course Contents</title>");
+    $r->print("<title>Navigate Course Contents</title></head>");
 
     # Header
     $r->print(&Apache::loncommon::bodytag('Navigate Course Contents','',
@@ -116,22 +121,58 @@
         $condition = 1;
     }
 
-    my $currenturl = $ENV{'form.postdata'};
-    $currenturl=~s/^http\:\/\///;
-    $currenturl=~s/^[^\/]+//;
+    # Determine where the "here" marker is and where the screen jumps to.
+    my $SYMB = 1; my $URL = 2; my $NOTHING = 3; # symbolic constants
+    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
     # the current location once, while at the same time remembering
     # the current location. Without that check, the user would never
     # be able to close those maps; the user would close it, and the
     # currenturl scan would re-open it.
-    my $queryAdd = "postdata=" . &Apache::lonnet::escape($currenturl) .
-        "&alreadyHere=1";
+    my $queryAdd = "&alreadyHere=1";
 
     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 {
-        $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;');
@@ -219,37 +260,30 @@
     # Here's a simple example of the iterator.
     # 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 $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
                              # 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
     $mapIterator->next(); # discard the first BEGIN_MAP
     my $curRes = $mapIterator->next();
     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
-    # 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'}) {
         if ($curRes == $mapIterator->BEGIN_MAP()) { $depth++; }
         if ($curRes == $mapIterator->END_MAP()) { $depth--; }
-
-        if (ref($curRes)) { $counter++; }
-
-        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;
+        if (ref($curRes) && !$ENV{'form.alreadyHere'} && 
+            ($hereType == $SYMB && $curRes->symb() eq $here) ||
+            ($hereType == $URL && $curRes->src() eq $here)) {
+            my $mapStack = $mapIterator->getStack();
             
             # Ensure the parent maps are open
             for my $map (@{$mapStack}) {
@@ -261,7 +295,35 @@
             }
             $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();
     }
     
@@ -273,6 +335,7 @@
     my $now = time();
     my $in24Hours = $now + 24 * 60 * 60;
     my $displayedHereMarker = 0;
+    my $displayedJumpMarker = 0;
     
     # We know the first thing is a BEGIN_MAP (see "$self->{STARTED}"
     # code in iterator->next), so ignore the first one
@@ -287,11 +350,6 @@
 
     $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) {
         if ($curRes == $mapIterator->BEGIN_MAP() ||
             $curRes == $mapIterator->BEGIN_BRANCH()) {
@@ -461,7 +519,10 @@
                     $linkopen .= ($nowOpen xor $condition) ? 
                         addToFilter(\%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>";
 
                 }
@@ -492,8 +553,9 @@
                 $r->print("  <tr bgcolor=\"$backgroundColor\"><td align=\"left\" valign=\"center\">\n");
 
                 # Print the anchor if necessary
-                if ($counter == $currentUrlIndex - $currentUrlDelta) {
-                    $r->print('<a name="current" />');
+                if ($counter == $currentJumpIndex - $currentJumpDelta ) {
+                    $r->print('<a name="curloc" />');
+                    $displayedJumpMarker = 1;
                 }
 
                 # print indentation
@@ -507,8 +569,10 @@
                 my $curMarkerEnd = "";
 
                 # Is this the current resource?
-                if ($curRes->src() eq $currenturl && !$displayedHereMarker) {
-                    $curMarkerBegin = '<a name="curloc" /><font color="red" size="+2">&gt; </font>';
+                if (!$displayedHereMarker && 
+                    (($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>';
                     $displayedHereMarker = 1;
                 }
@@ -523,10 +587,10 @@
 
                 $r->print("  $curMarkerBegin<a href=\"$link\">$title$partLabel</a> $curMarkerEnd $nonLinkedText");
 
-                if ($curRes->{RESOURCE_ERROR}) {
-                    $r->print(&Apache::loncommon::help_open_topic ("Navmap_Host_Down",
-                                              '<font size="-1">Host down</font>'));
-                    }
+                #if ($curRes->{RESOURCE_ERROR}) {
+                #    $r->print(&Apache::loncommon::help_open_topic ("Navmap_Host_Down",
+                #                              '<font size="-1">Host down</font>'));
+                #    }
 
                 $r->print("</td>\n");
 
@@ -596,7 +660,14 @@
         $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();
 

--bowersj21038837892--