--- loncom/homework/edit.pm 2002/11/07 19:45:16 1.39 +++ loncom/homework/edit.pm 2003/10/15 21:19:46 1.57.2.3 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # edit mode helpers # -# $Id: edit.pm,v 1.39 2002/11/07 19:45:16 albertel Exp $ +# $Id: edit.pm,v 1.57.2.3 2003/10/15 21:19:46 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -40,6 +40,9 @@ use HTML::Entities(); # depth of nesting of edit $Apache::edit::colordepth=0; @Apache::edit::inserttag=(); +# image-type responses: active background image and curdepth at definition +$Apache::edit::bgimgsrc=''; +$Apache::edit::bgimgsrccurdepth=''; sub initialize_edit { $Apache::edit::colordepth=0; @@ -72,13 +75,7 @@ sub tag_end { my ($target,$token,$description) = @_; my $result=''; if ($target eq 'edit') { - my $tag=$token->[1]; - if (!defined($description)) { - $result.="</td></tr><tr><td></$tag></td><td colspan=\"2\"> </td>"; - } else { - if ($description ne '') { $result.="</td></tr><tr><td>$description</td><td colspan=\"2\"> </td>"; } - } - $result.="</tr>".&end_table()."\n"; + $result.="</td></tr>".&end_table()."\n"; } return $result; } @@ -99,14 +96,14 @@ sub start_table { } $Apache::edit::colordepth++; push(@Apache::edit::inserttag,$token->[1]); - my $result='<p align="right">'; - $result.='<table bgcolor="'.$color.'" width="99%" border="2">'; + my $result='<div align="right">'; + $result.='<table bgcolor="'.$color.'" width="97%" border="0" cellspacing="5" cellpadding="3">'; return $result; } sub end_table { $Apache::edit::colordepth--; - my $result='</table></p>'; + my $result='</table></div>'; $result.="<table><tr><td>"; my ($tagname,$closingtag); @@ -122,8 +119,8 @@ sub end_table { return $result; } -sub start_spanning_row { return '<tr><td colspan="3">';} -sub start_row { return '<tr><td>'; } +sub start_spanning_row { return '<tr><td colspan="3" bgcolor="#DDDDDD">';} +sub start_row { return '<tr><td bgcolor="#DDDDDD">'; } sub end_row { return '</td></tr>'; } sub movebuttons { @@ -159,7 +156,7 @@ sub handle_delete { } if (!$result) { my $endtag='/'.$token->[1]; - my $bodytext=&Apache::lonxml::get_all_text($endtag,$$parser[$#$parser]); + my $bodytext=&Apache::lonxml::get_all_text($endtag,$parser); $$parser['-1']->get_token(); &Apache::lonxml::debug("Deleting :$bodytext: for $token->[1]"); &Apache::lonxml::end_tag($tagstack,$parstack,$token); @@ -307,6 +304,16 @@ sub insert_essayresponse { </essayresponse>'; } +sub insert_imageresponse { + return ' +<imageresponse max="1"> + <foilgroup> + </foilgroup> + <hintgroup> + </hintgroup> +</imageresponse>'; +} + sub insert_optionresponse { return ' <optionresponse max="10"> @@ -327,6 +334,28 @@ sub insert_radiobuttonresponse { </radiobuttonresponse>'; } +sub insert_rankresponse { + return ' +<rankresponse max="10"> + <foilgroup options=""> + </foilgroup> + <hintgroup> + </hintgroup> +</rankresponse>'; +} + +sub insert_matchresponse { + return ' +<matchresponse max="10"> + <foilgroup options=""> + <itemgroup> + </itemgroup> + </foilgroup> + <hintgroup> + </hintgroup> +</matchresponse>'; +} + sub insert_displayduedate { return '<displayduedate />'; } sub insert_displaytitle { return '<displaytitle />'; } sub insert_hintpart { @@ -343,12 +372,30 @@ sub insert_numericalhint { </numericalhint>'; } +sub insert_stringhint { + return ' +<stringhint> +</stringhint>'; +} + +sub insert_formulahint { + return ' +<formulahint> +</formulahint>'; +} + sub insert_radiobuttonhint { return ' <radiobuttonhint> </radiobuttonhint>'; } +sub insert_optionhint { + return ' +<optionhint> +</optionhint>'; +} + sub insert_startouttext { return "<startouttext />\n<endouttext />"; } @@ -361,9 +408,11 @@ sub textarea_sizes { my ($data)=@_; my $count=0; my $maxlength=-1; - foreach (split ("\n", $$data)) { $count++; - if (length($_) > $maxlength) { $maxlength = length($_); } - } + foreach (split ("\n", $$data)) { + $count+=int(length($_)/79); + $count++; + if (length($_) > $maxlength) { $maxlength = length($_); } + } my $rows = $count; my $cols = $maxlength; return ($rows,$cols); @@ -409,16 +458,21 @@ sub modifiedfield { # Returns a 1 if the token has been modified and you should rebuild the tag # side-effects, will modify the $token if new values are found sub get_new_args { - my ($token,$parstack,$safeeval,@args)=@_; - my $rebuild=0; - foreach my $arg (@args) { + my ($token,$parstack,$safeeval,@args)=@_; + my $rebuild=0; + foreach my $arg (@args) { #just want the string that it was set to my $value=$token->[2]->{$arg}; - my $newvalue=$ENV{"form.$Apache::lonxml::curdepth.$arg"}; + my $element=&html_element_name($arg); + my $newvalue=$ENV{"form.$element"}; &Apache::lonxml::debug(" for:$arg: cur is :$value: new is :$newvalue:"); - if ($value ne $newvalue) { - $token->[2]->{$arg}=$newvalue; - $rebuild=1; + if (defined($newvalue) && $value ne $newvalue) { + if (ref($newvalue) eq 'ARRAY') { + $token->[2]->{$arg}=join(',',@$newvalue); + } else { + $token->[2]->{$arg}=$newvalue; + } + $rebuild=1; } } return $rebuild; @@ -447,14 +501,58 @@ sub rebuild_tag { return $result; } +sub html_element_name { + my ($name) = @_; + return $name.'_'.$Apache::lonxml::curdepth; +} + +sub hidden_arg { + my ($name,$token) = @_; + my $result; + my $arg=$token->[2]{$name}; + $result='<input name="'.&html_element_name($name). + '" type="hidden" value="'.$arg.'" />'; + return $result; +} + +sub checked_arg { + my ($description,$name,$list,$token) = @_; + my $result; + my $optionlist=""; + my $allselected=$token->[2]{$name}; + $result=$description; + foreach my $option (@$list) { + my ($value,$text); + if ( ref($option) eq 'ARRAY') { + $value='value="'.$$option[0].'"'; + $text=$$option[1]; + $option=$$option[0]; + } else { + $text=$option; + $value='value="'.$option.'"'; + } + $result.="<nobr><input type='checkbox' $value name='". + &html_element_name($name)."'"; + foreach my $selected (split(/,/,$allselected)) { + &Apache::lonxml::error("wha $selected $option<br />"); + if ( $selected eq $option ) { + $result.=" checked='on' "; + last; + } + } + $result.=" />$text</nobr>\n"; + } + return $result; +} + sub text_arg { my ($description,$name,$token,$size) = @_; my $result; if (!defined $size) { $size=20; } my $arg=$token->[2]{$name}; - $result=$description.'<input name="'."$Apache::lonxml::curdepth.$name". + $result=$description.' <input name="'.&html_element_name($name). '" type="text" value="'.$arg.'" size="'.$size.'" />'; - return $result; + return '<nobr>'.$result.'</nobr>'; } sub select_arg { @@ -463,23 +561,25 @@ sub select_arg { my $optionlist=""; my $selected=$token->[2]{$name}; foreach my $option (@$list) { - my $value; + my ($text,$value); if ( ref($option) eq 'ARRAY') { $value='value="'.$$option[0].'"'; - $option=$$option[1]; + $text=$$option[1]; + $option=$$option[0]; } else { + $text=$option; $value='value="'.$option.'"'; } if ( $selected eq $option ) { - $optionlist.="<option $value selected=\"on\">$option</option>\n"; + $optionlist.="<option $value selected=\"on\">$text</option>\n"; } else { - $optionlist.="<option $value >$option</option>\n"; + $optionlist.="<option $value >$text</option>\n"; } } - $result.=$description.'<select name="'. - "$Apache::lonxml::curdepth.$name".'"> + $result.='<nobr>'.$description.' <select name="'. + &html_element_name($name).'"> '.$optionlist.' - </select>'; + </select></nobr>'; return $result; } @@ -490,39 +590,106 @@ sub select_or_text_arg { my $found=0; my $selected=$token->[2]{$name}; foreach my $option (@$list) { - my $value; + my ($text,$value); if ( ref($option) eq 'ARRAY') { $value='value="'.$$option[0].'"'; - $option=$$option[1]; + $text=$$option[1]; + $option=$$option[0]; } else { + $text=$option; $value='value="'.$option.'"'; } if ( $selected eq $option ) { - $optionlist.="<option $value selected=\"on\">$option</option>\n"; + $optionlist.="<option $value selected=\"on\">$text</option>\n"; $found=1; } else { - $optionlist.="<option $value>$option</option>\n"; + $optionlist.="<option $value>$text</option>\n"; } } $optionlist.="<option value=\"TYPEDINVALUE\">Type in value</option>\n"; if (($found) || (!$selected)) { - $result.=$description.'<select name="'."$Apache::lonxml::curdepth.$name".'"> + $result.=$description.' <select name="'.&html_element_name($name) + .'"> '.$optionlist.' </select>'; } else { $result.=&text_arg($description,$name,$token,$size); } + return '<nobr>'.$result.'</nobr>'; +} + +#----------------------------------------------------- image coordinates +# single image coordinates, x, y +sub entercoords { + my ($idx,,$idy,$mode,$width,$height) = @_; + unless ($Apache::edit::bgimgsrc) { return ''; } + if ($idx) { $idx.='_'; } + if ($idy) { $idy.='_'; } + my $bgfile=&Apache::lonnet::escape($Apache::edit::bgimgsrc); + my $form = 'lonhomework'; + my $element; + if (! defined($mode) || $mode eq 'attribute') { + $element = &Apache::lonnet::escape("$Apache::lonxml::curdepth"); + } elsif ($mode eq 'textnode') { # for data between <tag> ... </tag> + $element = &Apache::lonnet::escape('homework_edit_'. + $Apache::lonxml::curdepth); + } + my $formheight=''; + if ($height) { + $formheight='&formheight='.$height.'_'.$Apache::edit::bgimgsrccurdepth; + } + my $formwidth=''; + if ($width) { + $formwidth='&formwidth='.$width.'_'.$Apache::edit::bgimgsrccurdepth; + } + my $result = <<"ENDBUTTON"; +<a href="/cgi-bin/imagechoice.pl?formname=$form&file=$bgfile&formx=$idx$element&formy=$idy$element$formheight$formwidth" +target="imagechoice">Click Coordinates</a> +ENDBUTTON return $result; } +# coordinate pair (x1,y1)-(x2,y2) +sub entercoordpair { + my ($id,$mode,$width,$height) = @_; + unless ($Apache::edit::bgimgsrc) { return ''; } + my $bgfile=&Apache::lonnet::escape($Apache::edit::bgimgsrc); + my $form = 'lonhomework'; + my $element; + if (! defined($mode) || $mode eq 'attribute') { + $element = &Apache::lonnet::escape("$id\_$Apache::lonxml::curdepth"); + } elsif ($mode eq 'textnode') { # for data between <tag> ... </tag> + $element = &Apache::lonnet::escape('homework_edit_'. + $Apache::lonxml::curdepth); + } + my $formheight=''; + if ($height) { + $formheight='&formheight='.$height.'_'.$Apache::edit::bgimgsrccurdepth; + } + my $formwidth=''; + if ($width) { + $formwidth='&formwidth='.$width.'_'.$Apache::edit::bgimgsrccurdepth; + } + my $result = <<"ENDBUTTON"; +<a href="/cgi-bin/imagechoice.pl?mode=pair&formname=$form&file=$bgfile$formheight$formwidth&formcoord=$element" +target="imagechoice">Click Coordinate Pair</a> +ENDBUTTON + return $result; +} #----------------------------------------------------- browse sub browse { # insert a link to call up the filesystem browser (lonindexer) - $_ = shift; + my ($id, $mode) = @_; my $form = 'lonhomework'; - my $element = &Apache::lonnet::escape("$Apache::lonxml::curdepth.$_"); + my $element; + if (! defined($mode) || $mode eq 'attribute') { + $element = &Apache::lonnet::escape("$id\_$Apache::lonxml::curdepth"); + } elsif ($mode eq 'textnode') { # for data between <tag> ... </tag> + $element = &Apache::lonnet::escape('homework_edit_'. + $Apache::lonxml::curdepth); + } my $result = <<"ENDBUTTON"; -<a href=\"javascript:openbrowser('$form','$element')\"\>Browse</a> +<a href=\"javascript:openbrowser('$form','$element')\"\>Select</a> ENDBUTTON return $result; } @@ -530,9 +697,15 @@ ENDBUTTON #----------------------------------------------------- browse sub search { # insert a link to call up the filesystem browser (lonindexer) - $_ = shift; + my ($id, $mode) = @_; my $form = 'lonhomework'; - my $element = &Apache::lonnet::escape("$Apache::lonxml::curdepth.$_"); + my $element; + if (! defined($mode) || $mode eq 'attribute') { + $element = &Apache::lonnet::escape("$id\_$Apache::lonxml::curdepth"); + } elsif ($mode eq 'textnode') { # for data between <tag> ... </tag> + $element = &Apache::lonnet::escape('homework_edit_'. + $Apache::lonxml::curdepth); + } my $result = <<"ENDBUTTON"; <a href=\"javascript:opensearcher('$form','$element')\"\>Search</a> ENDBUTTON