[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> ');
@@ -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">> </font>';
+ if (!$displayedHereMarker &&
+ (($hereType == $SYMB && $curRes->symb eq $here) ||
+ ($hereType == $URL && $curRes->src eq $here))) {
+ $curMarkerBegin = '<font color="red" size="+2">> </font>';
$curMarkerEnd = '<font color="red" size="+2"> <</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--