version 1.94, 2002/11/01 18:24:45
|
version 1.97, 2002/11/03 21:05:03
|
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: </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"> '. |
|
'<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"> '. |
|
'<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"> '. |
'<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">'. |
|
' <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> '); |
|
$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 1287 sub new_handle {
|
Line 1290 sub new_handle {
|
} |
} |
|
|
$r->print(" $curMarkerBegin<a href=\"$link\">$title$partLabel</a> $curMarkerEnd $nonLinkedText"); |
$r->print(" $curMarkerBegin<a href=\"$link\">$title$partLabel</a> $curMarkerEnd $nonLinkedText"); |
|
$r->print(" TDV:" . $curRes->{DATA}->{TOP_DOWN_VAL}); # temp |
|
$r->print(" BUV:" . $curRes->{DATA}->{BOT_UP_VAL}); # temp |
|
$r->print(" DD:" . $curRes->{DATA}->{DISPLAY_DEPTH}); # temp |
|
|
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", |
Line 2028 sub END_BRANCH { return 4; } # end of
|
Line 2034 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 { |
sub new { |
# magic invocation to create a class instance |
# magic invocation to create a class instance |
my $proto = shift; |
my $proto = shift; |
Line 2058 sub new {
|
Line 2069 sub new {
|
# Now, we need to pre-process the map, by walking forward and backward |
# 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. |
# over the parts of the map we're going to look at. |
|
|
|
# The processing steps are exactly the same, except for a few small |
|
# changes, so I bundle those up in the following list of two elements: |
|
# (direction_to_iterate, VAL_name, next_resource_method_to_call, |
|
# first_resource). |
|
# This prevents writing nearly-identical code twice. |
|
my @iterations = ( [FORWARD(), 'TOP_DOWN_VAL', 'getNext', |
|
'FIRST_RESOURCE'], |
|
[BACKWARD(), 'BOT_UP_VAL', 'getPrevious', |
|
'FINISH_RESOURCE'] ); |
|
|
|
foreach my $pass (@iterations) { |
|
my $direction = $pass->[0]; |
|
my $valName = $pass->[1]; |
|
my $nextResourceMethod = $pass->[2]; |
|
my $firstResourceName = $pass->[3]; |
|
|
|
my $iterator = Apache::lonnavmaps::DFSiterator->new($self->{NAV_MAP}, |
|
$self->{FIRST_RESOURCE}, |
|
$self->{FINISH_RESOURCE}, |
|
{}, undef, 0, $direction); |
|
|
|
# prime the recursion |
|
$self->{$firstResourceName}->{DATA}->{$valName} = 0; |
|
my $depth = 1; |
|
$iterator->next(); |
|
my $curRes = $iterator->next(); |
|
while ($depth > 0) { |
|
if ($curRes == $iterator->BEGIN_MAP()) { $depth++; } |
|
if ($curRes == $iterator->END_MAP()) { $depth--; } |
|
|
|
if (ref($curRes)) { |
|
my $resultingVal = $curRes->{DATA}->{$valName}; |
|
my $nextResources = $curRes->$nextResourceMethod(); |
|
my $resourceCount = scalar(@{$nextResources}); |
|
|
|
if ($resourceCount == 1) { |
|
my $current = $nextResources->[0]->{DATA}->{$valName} || 999999999; |
|
$nextResources->[0]->{DATA}->{$valName} = min($resultingVal, $current); |
|
} |
|
|
|
if ($resourceCount > 1) { |
|
foreach my $res (@{$nextResources}) { |
|
my $current = $res->{DATA}->{$valName} || 999999999; |
|
$res->{DATA}->{$valName} = min($current, $resultingVal + 1); |
|
} |
|
} |
|
} |
|
if (ref($curRes) && $curRes->is_map() && $direction == FORWARD()) { |
|
my $firstResource = $curRes->map_start(); |
|
my $finishResource = $curRes->map_finish(); |
|
my $newIterator = Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, |
|
$firstResource, |
|
$finishResource, |
|
$self->{FILTER}, |
|
$self->{ALREADY_SEEN}, |
|
$self->{CONDITION}); |
|
} |
|
|
|
# Assign the final val |
|
if (ref($curRes) && $direction == BACKWARD()) { |
|
$curRes->{DATA}->{DISPLAY_DEPTH} = min($curRes->{DATA}->{TOP_DOWN_VAL}, |
|
$curRes->{DATA}->{BOT_UP_VAL}); |
|
} |
|
$curRes = $iterator->next(); |
|
} |
|
} |
|
|
# Now we're ready to start iterating. |
# Now we're ready to start iterating. |
} |
} |
|
|
Line 2071 package Apache::lonnavmaps::DFSiterator;
|
Line 2149 package Apache::lonnavmaps::DFSiterator;
|
# used by the main iterator for pre-processing. It also is able to isolate |
# 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 |
# much of the complexity of the main iterator, so the main iterator is much |
# simpler. |
# simpler. |
|
# There is no real benefit in merging the main iterator and this one into one class... |
|
# all the logic in DFSiterator would need to be replicated, you gain no performance, |
|
# at best, you just make one massively complicated iterator in place of two |
|
# somewhat complicated ones. ;-) - Jeremy |
|
|
# Here are the tokens for the iterator, replicated from iterator for convenience: |
# Here are the tokens for the iterator, replicated from iterator for convenience: |
|
|