--- loncom/interface/lonnavmaps.pm 2002/11/08 20:58:13 1.101 +++ loncom/interface/lonnavmaps.pm 2002/11/14 16:51:03 1.105 @@ -2,7 +2,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.101 2002/11/08 20:58:13 bowersj2 Exp $ +# $Id: lonnavmaps.pm,v 1.105 2002/11/14 16:51:03 bowersj2 Exp $ # # Copyright Michigan State University Board of Trustees # @@ -37,15 +37,13 @@ # 3/1/1,6/1,17/1,29/1,30/1,2/8,9/21,9/24,9/25 Gerd Kortemeyer # YEAR=2002 # 1/1 Gerd Kortemeyer -# +# Oct-Nov Jeremy Bowers package Apache::lonnavmaps; use strict; use Apache::Constants qw(:common :http); -use Apache::lonnet(); use Apache::loncommon(); -use GDBM_File; use POSIX qw (floor strftime); sub handler { @@ -1355,7 +1353,7 @@ sub new { 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); @@ -1441,7 +1439,7 @@ sub next { my $here; while ( $i >= 0 && !$found ) { if ( scalar(@{$self->{STACK}->[$i]}) > 0 ) { - $here = $self->{HERE} = shift @{$self->{STACK}->[$i]}; + $here = pop @{$self->{STACK}->[$i]}; $found = 1; $newDepth = $i; } @@ -1459,6 +1457,18 @@ sub next { } } + # If this is not a resource, it must be an END_BRANCH marker we want + # to return directly. + if (!ref($here)) { + if ($here == END_BRANCH()) { # paranoia, in case of later extension + $self->{CURRENT_DEPTH}--; + return $here; + } + } + + # Otherwise, it is a resource and it's safe to store in $self->{HERE} + $self->{HERE} = $here; + # Get to the right level if ( $self->{CURRENT_DEPTH} > $newDepth ) { push @{$self->{STACK}->[$newDepth]}, $here; @@ -1478,14 +1488,29 @@ sub next { # So we need to look at all the resources we can get to from here, # categorize them if we haven't seen them, remember if we have a new my $nextUnfiltered = $here->getNext(); - + my $maxDepthAdded = -1; + for (@$nextUnfiltered) { if (!defined($self->{ALREADY_SEEN}->{$_->{ID}})) { - push @{$self->{STACK}->[$_->{DATA}->{DISPLAY_DEPTH}]}, $_; + my $depth = $_->{DATA}->{DISPLAY_DEPTH}; + push @{$self->{STACK}->[$depth]}, $_; $self->{ALREADY_SEEN}->{$_->{ID}} = 1; + if ($maxDepthAdded < $depth) { $maxDepthAdded = $depth; } } } - + + # Is this the end of a branch? If so, all of the resources examined above + # led to lower levels then the one we are currently at, so we push a END_BRANCH + # marker onto the stack so we don't forget. + # Example: For the usual A(BC)(DE)F case, when the iterator goes down the + # BC branch and gets to C, it will see F as the only next resource, but it's + # one level lower. Thus, this is the end of the branch, since there are no + # more resources added to this level or above. + my $isEndOfBranch = $maxDepthAdded < $self->{CURRENT_DEPTH}; + if ($isEndOfBranch) { + push @{$self->{STACK}->[$self->{CURRENT_DEPTH}]}, END_BRANCH(); + } + # That ends the main iterator logic. Now, do we want to recurse # down this map (if this resource is a map)? if ($self->{HERE}->is_map() && @@ -2414,7 +2439,7 @@ sub getNext { # Don't remember it if the student doesn't have browse priviledges # future note: this may properly belong in the client of the resource my $browsePriv = &Apache::lonnet::allowed('bre', $self->src); - if ($browsePriv ne '2' && $browsePriv ne 'F') { + if (!($browsePriv ne '2' && $browsePriv ne 'F')) { push @branches, $next; } } @@ -2433,7 +2458,7 @@ sub getPrevious { # Don't remember it if the student doesn't have browse priviledges # future note: this may properly belong in the client of the resource my $browsePriv = &Apache::lonnet::allowed('bre', $self->src); - if ($browsePriv ne '2' && $browsePriv ne 'F') { + if (!($browsePriv ne '2' && $browsePriv ne 'F')) { push @branches, $prev; } }