--- loncom/interface/lonnavmaps.pm 2002/10/29 20:26:03 1.93 +++ loncom/interface/lonnavmaps.pm 2002/11/01 18:24:45 1.94 @@ -2,7 +2,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.93 2002/10/29 20:26:03 bowersj2 Exp $ +# $Id: lonnavmaps.pm,v 1.94 2002/11/01 18:24:45 bowersj2 Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1769,7 +1769,7 @@ sub courseMapDefined { sub getIterator { my $self = shift; - my $iterator = Apache::lonnavmaps::iterator->new($self, shift, shift, + my $iterator = Apache::lonnavmaps::DFSiterator->new($self, shift, shift, shift, undef, shift, $ENV{'form.direction'}); return $iterator; @@ -2028,6 +2028,59 @@ sub END_BRANCH { return 4; } # end of sub FORWARD { return 1; } # go forward sub BACKWARD { return 2; } +sub new { + # magic invocation to create a class instance + my $proto = shift; + my $class = ref($proto) || $proto; + my $self = {}; + + $self->{NAV_MAP} = shift; + return undef unless ($self->{NAV_MAP}); + + # Handle the parameters + $self->{FIRST_RESOURCE} = shift || $self->{NAV_MAP}->firstResource(); + $self->{FINISH_RESOURCE} = shift || $self->{NAV_MAP}->finishResource(); + + # If the given resources are just the ID of the resource, get the + # objects + if (!ref($self->{FIRST_RESOURCE})) { $self->{FIRST_RESOURCE} = + $self->{NAV_MAP}->getById($self->{FIRST_RESOURCE}); } + if (!ref($self->{FINISH_RESOURCE})) { $self->{FINISH_RESOURCE} = + $self->{NAV_MAP}->getById($self->{FINISH_RESOURCE}); } + + $self->{FILTER} = shift; + + # A hash, used as a set, of resource already seen + $self->{ALREADY_SEEN} = shift; + if (!defined($self->{ALREADY_SEEN})) { $self->{ALREADY_SEEN} = {} }; + $self->{CONDITION} = shift; + + # 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. + + # Now we're ready to start iterating. +} + +1; + +package Apache::lonnavmaps::DFSiterator; + +# UNDOCUMENTED: This is a private library, it should not generally be used +# by the outside world. What it does is walk through the nav map in a +# depth-first fashion. This is not appropriate for most uses, but it is +# 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 +# simpler. + +# Here are the tokens for the iterator, replicated from iterator for convenience: + +sub BEGIN_MAP { return 1; } # begining of a new map +sub END_MAP { return 2; } # end of the map +sub BEGIN_BRANCH { return 3; } # beginning of a branch +sub END_BRANCH { return 4; } # end of a branch +sub FORWARD { return 1; } # go forward +sub BACKWARD { return 2; } + # Params: nav map, start resource, end resource, filter, condition, # already seen hash ref @@ -2236,7 +2289,7 @@ sub next { my $finishResource = $self->{HERE}->map_finish(); $self->{RECURSIVE_ITERATOR} = - Apache::lonnavmaps::iterator->new ($self->{NAV_MAP}, $firstResource, + Apache::lonnavmaps::DFSiterator->new ($self->{NAV_MAP}, $firstResource, $finishResource, $self->{FILTER}, $self->{ALREADY_SEEN}, $self->{CONDITION}, $self->{DIRECTION}); }