From: dpvc v. a. <we...@ma...> - 2005-10-20 00:58:13
|
Log Message: ----------- A new parser object that handles popup menus. Mainly this is so that you can use them with the MultiPart object, which requires all the objects to be Value objects. See the comments in the file for documentation and examples. Added Files: ----------- pg/macros: parserPopUp.pl Revision Data ------------- --- /dev/null +++ macros/parserPopUp.pl @@ -0,0 +1,70 @@ +loadMacros('Parser.pl','contextString.pl'); + +Context("Numeric"); + +sub _parserPopUp_init {}; # don't reload this file + +#################################################################### +# +# This file implements a pop-up menu object that is compatible +# with Value objects, and in particular, with the MultiPart object. +# +# To create a PopUp object, use +# +# $popup = PopUp([choices,...],correct); +# +# where "choices" are the strings for the items in the popup menu, +# and "correct" is the choice that is the correct answer for the +# popup. +# +# To insert the popup menu into the problem text, use +# +# BEGIN_TEXT +# \{$popup->menu\} +# END_TEXT +# +# and then +# +# ANS($popup->cmp); +# +# to get the answer checker for the popup. +# +# You can use the PopUp menu object in MultiPart objects. This is +# the reason for the pop-up menu's ans_rule method (since that is what +# MultiPart calls to get answer rules). +# + +sub PopUp {parserPopUp->new(@_)} + +# +# The package that implements pop-up menus +# +package parserPopUp; +our @ISA = qw(Value::String); + +sub new { + my $self = shift; my $class = ref($self) || $self; + my $choices = shift; my $value = shift; + Value::Error("A PopUp's first argument should be a list of menu items") + unless ref($choices) eq 'ARRAY'; + Value::Error("A PopUp's second argument should be the correct menu choice") + unless defined($value) && $value ne ""; + my $oldContext = main::Context(); + my $context = $main::context{String}->copy; + main::Context($context); + $context->strings->add(map {$_=>{}} @{$choices}); + my $self = bless Value::String->new($value), $class; + $self->{isValue} = 1; $self->{choices} = $choices; + $self->{context} = $context; + main::Context($oldContext); + return $self; +} + +sub menu { + my $self = shift; + main::pop_up_list($self->{choices}); +} + +sub ans_rule {shift->menu(@_)} + +1; |