--- loncom/homework/functionplotresponse.pm 2010/09/27 22:15:32 1.1 +++ loncom/homework/functionplotresponse.pm 2010/10/04 20:47:29 1.5 @@ -1,7 +1,7 @@ # LearningOnline Network with CAPA # option list style responses # -# $Id: functionplotresponse.pm,v 1.1 2010/09/27 22:15:32 www Exp $ +# $Id: functionplotresponse.pm,v 1.5 2010/10/04 20:47:29 www Exp $ # # Copyright Michigan State University Board of Trustees # @@ -33,30 +33,208 @@ use Apache::lonlocal; use Apache::lonnet; BEGIN { - &Apache::lonxml::register('Apache::functionplotresponse',('functionplotresponse')); + &Apache::lonxml::register('Apache::functionplotresponse',('functionplotresponse','backgroundplot')); } +# +# There can be a number of applets on a page, each called ggbApplet_$id, +# where $id is the "_"-concatenated part and responseid +# + sub geogebra_startcode { + my ($id)=@_; return (< ENDSTARTCODE } sub geogebra_endcode { - return "\n\n"; + return &Apache::lonhtmlcommon::java_not_enabled()."\n"; +} + +# +# This is the internal GeoGebra bytecode which defines the spline functions +# +sub geogebra_spline_program { + return (< +ENDSPLINEPROGRAM +} + +# +# The standard set of parameters inside +# +sub geogebra_default_parameters { + my ($id)=@_; + return(< + + + + + + + + + + + + + + + + + + + + +ENDDEFAULTPARAMETERS +} + +# +# This subroutine is called by LON-CAPA at +# Each applet on the page will call function ggbOnInit when it is done loading +# This function in turn will call the respective function registered by start_init_script +# Which one of the registered functions is called is determined by ggbOnInitParam, which GeoGebra passes to ggbOnInit +# + +sub init_script { + if ($Apache::functionplotresponse::callscripts) { + return (< +// + +ENDGGBINIT + } +} + +# +# Each Geogebra applet is supposed to call this when parameters change +# +sub update_script { + my ($id)=@_; + return (< +// + +ENDUPDATESCRIPT +} + +# +# Register the above update-handler for a variable +# + +sub update_register { + my ($id,$variable)=@_; + return "document.ggbApplet_$id.registerObjectUpdateListener('$variable','updatePointCoordinates_$id')"; +} + +# +# This registers the init-function call for ggbOnInit, which LON-CAPA will place at +# It then starts the right headers +# +sub start_init_script { + my ($id)=@_; +# Add a line to ggbOnInit-function which calls the right function based on parameter passed from GeoGebra + $Apache::functionplotresponse::callscripts.="if (param=='applet_$id') { ggbInit_$id(); }\n"; +# ... and open this function + return (< +// +# +sub start_backgroundplot { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $result=''; + my $internalid = $Apache::inputtags::part.'_'.$Apache::inputtags::response[-1]; + my $function=&Apache::lonxml::get_param('function',$parstack,$safeeval); + unless ($function) { $function="0"; } + if ($target eq 'web') { + $result.=&plot_script($internalid,$function); + } + return $result; +} + +sub end_backgroundplot { +} + +sub end_init_script { + return (< + +ENDENDINIT } sub start_functionplotresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - #when in a option response use these -# &Apache::lonxml::register('Apache::optionresponse',('foilgroup','foil','conceptgroup','drawoptionlist')); - push (@Apache::lonxml::namespace,'optionresponse'); - my $id = &Apache::response::start_response($parstack,$safeeval); + my $internalid = $Apache::inputtags::part.'_'.&Apache::response::start_response($parstack,$safeeval); + my $xmin=&Apache::lonxml::get_param('xmin',$parstack,$safeeval); + $xmin=($xmin?$xmin:-10); + my $xmax=&Apache::lonxml::get_param('xmax',$parstack,$safeeval); + $xmax=($xmax?$xmax:10); + my $ymin=&Apache::lonxml::get_param('ymin',$parstack,$safeeval); + $ymin=($ymin?$ymin:-10); + my $ymax=&Apache::lonxml::get_param('ymax',$parstack,$safeeval); + $ymax=($ymax?$ymax:10); + my $xaxisvisible=(&Apache::lonxml::get_param('xaxisvisible',$parstack,$safeeval)=~/on|true|1/i?'true':'false'); + my $yaxisvisible=(&Apache::lonxml::get_param('yaxisvisible',$parstack,$safeeval)=~/on|true|1/i?'true':'false'); + my $gridvisible=(&Apache::lonxml::get_param('gridvisible',$parstack,$safeeval)=~/on|true|1/i?'true':'false'); + if ($target eq 'web') { - $result.=&geogebra_startcode(); +# paste in the update routine to receive stuff back from the applet + $result.=&update_script($internalid); +# start the initscript for this applet + $result.=&start_init_script($internalid); +# put the axis commands inside + $result.=&axes_script($internalid,$xmin,$xmax,$ymin,$ymax,$xaxisvisible,$yaxisvisible,$gridvisible); +# init script is left open } return $result; } @@ -64,11 +242,21 @@ sub start_functionplotresponse { sub end_functionplotresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; &Apache::response::end_response; - pop @Apache::lonxml::namespace; -# &Apache::lonxml::deregister('Apache::optionresponse',('foilgroup','foil','conceptgroup','drawoptionlist')); + my $result; + my $internalid = $Apache::inputtags::part.'_'.$Apache::inputtags::response[-1]; + # if ($target eq 'edit') { $result=&Apache::edit::end_table(); } if ($target eq 'web') { +# close the init script + $result.=&end_init_script(); +# actually start the -tag + $result.=&geogebra_startcode($internalid); +# load the spline bytecode + $result.=&geogebra_spline_program(); +# set default parameters + $result.=&geogebra_default_parameters($internalid); +# close the -tag $result.=&geogebra_endcode(); } return $result;