--- loncom/interface/lonnavmaps.pm 2002/11/01 18:47:26 1.95 +++ loncom/interface/lonnavmaps.pm 2002/11/01 19:50:00 1.96 @@ -2,7 +2,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.95 2002/11/01 18:47:26 bowersj2 Exp $ +# $Id: lonnavmaps.pm,v 1.96 2002/11/01 19:50:00 bowersj2 Exp $ # # Copyright Michigan State University Board of Trustees # @@ -957,6 +957,10 @@ sub new_handle { # Here's a simple example of the iterator. # 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 $found = 0; my $depth = 1; @@ -968,12 +972,8 @@ sub new_handle { my $counter = 0; while ($depth > 0) { - if ($curRes == $mapIterator->BEGIN_MAP()) { - $depth++; - } - if ($curRes == $mapIterator->END_MAP()) { - $depth--; - } + if ($curRes == $mapIterator->BEGIN_MAP()) { $depth++; } + if ($curRes == $mapIterator->END_MAP()) { $depth--; } if (ref($curRes)) { $counter++; } @@ -1058,12 +1058,8 @@ sub new_handle { if ($curRes == $mapIterator->BEGIN_BRANCH()) { $isNewBranch = 1; } - if ($curRes == $mapIterator->BEGIN_MAP()) { - $depth++; - } - if ($curRes == $mapIterator->END_MAP()) { - $depth--; - } + if ($curRes == $mapIterator->BEGIN_MAP()) { $depth++; } + if ($curRes == $mapIterator->END_MAP()) { $depth--; } if (ref($curRes)) { $counter++; } @@ -2035,6 +2031,11 @@ sub END_BRANCH { return 4; } # end of sub FORWARD { return 1; } # go forward sub BACKWARD { return 2; } +sub min { + (my $a, my $b) = @_; + if ($a < $b) { return $a; } else { return $b; } +} + sub new { # magic invocation to create a class instance my $proto = shift; @@ -2065,6 +2066,42 @@ sub new { # 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. + my $forwardIterator = Apache::lonnavmaps::DFSiterator->new($self->{NAV_MAP}, + $self->{FIRST_RESOURCE}, + $self->{FINISH_RESOURCE}, + $self->{FILTER}, + undef, $self->{CONDITION}, + FORWARD()); + + # prime the recursion + $self->{FIRST_RESOURCE}->{DATA}->{TOP_DOWN_VAL} = 0; + my $depth = 1; + $forwardIterator->next(); + my $curRes = $forwardIterator->next(); + while ($depth > 0) { + if ($curRes == $forwardIterator->BEGIN_MAP()) { $depth++; } + if ($curRes == $forwardIterator->END_MAP()) { $depth--; } + + if (ref($curRes)) { + my $topDownVal = $curRes->{DATA}->{TOP_DOWN_VAL}; + my $nextResources = $curRes->getNext(); + my $resourceCount = scalar(@{$nextResources}); + + if ($resourceCount == 1) { + my $current = $nextResources->[0]->{DATA}->{TOP_DOWN_VAL} || 999999999; + $nextResources->[0]->{DATA}->{TOP_DOWN_VAL} = min($topDownVal, $current); + } + + if ($resourceCount > 1) { + foreach my $res (@{$nextResources}) { + my $current = $res->{DATA}->{TOP_DOWN_VAL} || 999999999; + $res->{DATA}->{TOP_DOWN_VAL} = min($current, $topDownVal + 1); + } + } + } + $curRes = $forwardIterator->next(); + } + # Now we're ready to start iterating. }