version 1.2, 2004/01/12 19:53:54
|
version 1.15, 2008/10/13 14:06:47
|
Line 25
|
Line 25
|
package Apache::imagechoice; |
package Apache::imagechoice; |
use strict; |
use strict; |
use Apache::Constants qw(:common :http); |
use Apache::Constants qw(:common :http); |
|
use Apache::lonnet; |
|
use Apache::lonlocal; |
|
use LONCAPA; |
|
|
|
|
sub deletedata { |
sub deletedata { |
my ($id)=@_; |
my ($id)=@_; |
&Apache::lonnet::delenv("imagechoice\\.$id"); |
&Apache::lonnet::delenv("imagechoice\\.$id\\.coords"); |
} |
} |
|
|
sub closewindow { |
sub closewindow { |
my ($r,$output,$filename)=@_; |
my ($r,$output,$filename,$needimage,$display)=@_; |
$r->print(<<"ENDSUBM"); |
if ($needimage) { |
<html> |
$needimage="<img name=\"pickimg\" src=\"$filename\" />"; |
<script> |
} |
|
my $js=<<"ENDSUBM"; |
|
<script type="text/javascript"> |
function submitthis() { |
function submitthis() { |
$output |
$output |
self.close(); |
self.close(); |
} |
} |
</script> |
</script> |
<body bgcolor="#FFFFFF" onLoad="submitthis()"> |
ENDSUBM |
|
|
|
my $start_page = |
|
&Apache::loncommon::start_page('Close Window',$js, |
|
{'bgcolor' => '#FFFFFF', |
|
'only_body' => 1, |
|
'add_entries' => { |
|
onload => 'submitthis();'},}); |
|
|
|
my $end_page = |
|
&Apache::loncommon::end_page(); |
|
|
|
$r->print(<<"ENDSUBM"); |
|
$start_page |
<h3>Position Selected</h3> |
<h3>Position Selected</h3> |
<!--<img name="pickimg" src="$filename" />--> |
$display |
</body> |
$needimage |
</html> |
$end_page |
ENDSUBM |
ENDSUBM |
} |
} |
|
|
sub storedata { |
sub storedata { |
my ($r,$mode,$filename,$id)=@_; |
my ($r,$type,$filename,$id)=@_; |
|
|
my (undef,@coords)=split(':',$ENV{"imagechoice.$id.coords"}); |
my (undef,@coords)=split(':',$env{"imagechoice.$id.coords"}); |
|
|
my $output; |
my ($output,$needimage); |
|
|
if ($ENV{"imagechoice.$id.formwidth"}) { |
if ($env{"imagechoice.$id.formwidth"}) { |
$output.='opener.document.forms.'.$ENV{"imagechoice.$id.formname"}.'.'.$ENV{"imagechoice.$id.formwidth"}.'.value=document.pickimg.width;'; |
$output.='opener.document.forms.'.$env{"imagechoice.$id.formname"}.'.'.$env{"imagechoice.$id.formwidth"}.'.value=document.pickimg.width;'; |
|
$needimage=1; |
} |
} |
if ($ENV{"imagechoice.$id.formheight"}) { |
if ($env{"imagechoice.$id.formheight"}) { |
$output.='opener.document.forms.'.$ENV{"imagechoice.$id.formname"}.'.'.$ENV{"imagechoice.$id.formheight"}.'.value=document.pickimg.height;'; |
$output.='opener.document.forms.'.$env{"imagechoice.$id.formname"}.'.'.$env{"imagechoice.$id.formheight"}.'.value=document.pickimg.height;'; |
|
$needimage=1; |
} |
} |
|
|
if ((defined($ENV{"imagechoice.$id.x"})) && (defined($ENV{"imagechoice.$id.y"})) && |
my $display; |
($mode ne 'pairtwo') && ($mode ne 'pairthree')) { |
if ($type eq 'point') { |
my $output=''; |
my (undef,$x,$y)=split(':',$env{"imagechoice.$id.coords"}); |
if ($ENV{"imagechoice.$id.formx"}) { |
if ($env{"imagechoice.$id.formx"}) { |
$output.='opener.document.forms.'.$ENV{"imagechoice.$id.formname"}.'.'.$ENV{"imagechoice.$id.formx"}. |
$output.='opener.document.forms.'.$env{"imagechoice.$id.formname"}.'.'.$env{"imagechoice.$id.formx"}.'.value='.$x.';'; |
'.value='.$ENV{"imagechoice.$id.x"}.';'; |
$display.="<p>The X coordinate is $x</p>\n"; |
} |
|
if ($ENV{"imagechoice.$id.formy"}) { |
|
$output.='opener.document.forms.'.$ENV{"imagechoice.$id.formname"}.'.'.$ENV{"imagechoice.$id.formy"}. |
|
'.value='.$ENV{"imagechoice.$id.y"}.';'; |
|
} |
} |
} elsif ($mode eq 'pairthree') { |
if ($env{"imagechoice.$id.formy"}) { |
my $output=''; |
$output.='opener.document.forms.'.$env{"imagechoice.$id.formname"}.'.'.$env{"imagechoice.$id.formy"}.'.value='.$y.';'; |
my $outputpair='('.$ENV{"imagechoice.$id.selx"}.','.$ENV{"imagechoice.$id.sely"}.')-('.$ENV{"imagechoice.$id.x"}.','.$ENV{"imagechoice.$id.y"}.')'; |
$display.="<p>The Y coordinate is $y</p>\n"; |
|
|
if ($ENV{"imagechoice.$id.formcoord"}) { |
|
$output.='opener.document.forms.'.$ENV{"imagechoice.$id.formname"}.'.'.$ENV{"imagechoice.$id.formcoord"}. |
|
'.value="'.$outputpair.'";'; |
|
} |
} |
} elsif ($mode eq 'polygon') { |
} elsif ($type eq 'polygon' or $type eq 'box') { |
my $coordstr; |
my $coordstr; |
while (@coords) { |
while (@coords) { |
$coordstr.='('.shift(@coords).','.shift(@coords).')-'; |
$coordstr.='('.shift(@coords).','.shift(@coords).')-'; |
} |
} |
chop($coordstr); |
chop($coordstr); |
$output.='opener.document.forms.'.$ENV{"imagechoice.$id.formname"}.'.'.$ENV{"imagechoice.$id.formcoord"}.'.value="'.$coordstr.'";'; |
$display.="<p>The selected coordinates are <tt>$coordstr</tt></p>\n"; |
|
$output.='opener.document.forms.'.$env{"imagechoice.$id.formname"}.'.'.$env{"imagechoice.$id.formcoord"}.'.value="'.$coordstr.'";'; |
|
} |
|
if ($display) { |
|
$display.="<p>If this window fails to close you may need to manually replace the old coordinates with the above value.</p>\n"; |
} |
} |
&deletedata($id); |
&deletedata($id); |
&closewindow($r,$output,$filename); |
&closewindow($r,$output,$filename,$needimage,$display); |
} |
} |
|
|
sub getcoord { |
sub getcoord { |
my ($r,$mode,$filename,$id)=@_; |
my ($r,$type,$filename,$id)=@_; |
my $heading='Position'; |
my $heading=&mt('Select Position on Image'); |
my $nextstage=''; |
my $nextstage=''; |
if ($mode eq 'pair') { |
if ($type eq 'box') { |
$heading='First Coordinate'; |
my (undef,@coords)=split(':',$env{"imagechoice.$id.coords"}); |
$nextstage='<input type="hidden" name="mode" value="pairtwo" />'; |
my $step=scalar(@coords)/2; |
} elsif ($mode eq 'pairtwo') { |
if ($step == 0) { |
$heading='Second Coordinate'; |
$heading=&mt('Select First Coordinate on Image'); |
$nextstage='<input type="hidden" name="mode" value="pairthree" />'; |
#$nextstage='<input type="hidden" name="type" value="pairtwo" />'; |
} elsif ($mode eq 'polygon') { |
} elsif ($step == 1) { |
$heading='Enter Coordinate or click finish to close Polygon'; |
$heading=&mt('Select Second Coordinate on Image'); |
$nextstage='<input type="submit" name="finish" value="Finish" />'; |
#$nextstage='<input type="hidden" name="type" value="pairthree" />'; |
} |
} else { |
|
$heading=&mt('Select Finish to save selection'); |
|
$nextstage='<input type="submit" name="finish" value="'.&mt('Finish').'" />'; |
|
} |
|
} elsif ($type eq 'polygon') { |
|
$heading=&mt('Enter Coordinate or click finish to close Polygon'); |
|
$nextstage='<input type="submit" name="finish" value="'.&mt('Finish').'" />'; |
|
} elsif ($type eq 'point') { |
|
$heading=&mt('Click to select a Coordinate or click Finish to save current selection'); |
|
$nextstage='<input type="submit" name="finish" value="'.&mt('Finish').'" />'; |
|
} |
|
|
|
my $start_page = |
|
&Apache::loncommon::start_page('Get Coordinates',undef, |
|
{'bgcolor' => '#FFFFFF', |
|
'only_body' => 1,}); |
|
|
|
my $end_page = |
|
&Apache::loncommon::end_page(); |
|
my $canceltext=&mt('Cancel'); |
$r->print(<<"END"); |
$r->print(<<"END"); |
<html> |
$start_page |
<body bgcolor="#FFFFFF"> |
<h3>$heading</h3> |
<h3>Select $heading on Image</h3> |
|
<form method="POST" action="/adm/imagechoice?token=$id"> |
<form method="POST" action="/adm/imagechoice?token=$id"> |
$nextstage |
$nextstage |
<input type="submit" name="cancel" value="Cancel" /> |
<input type="submit" name="cancel" value="$canceltext" /> |
<br /> |
<br /> |
<input name="image" type="image" src="$filename" /> |
<input name="image" type="image" src="$filename" /> |
</form> |
</form> |
</body> |
$end_page |
</html> |
|
END |
END |
} |
} |
|
|
sub savecoord { |
sub savecoord { |
my ($id)=@_; |
my ($id,$type)=@_; |
if (defined($ENV{"form.image.x"}) && defined($ENV{"form.image.y"})) { |
if (defined($env{"form.image.x"}) && defined($env{"form.image.y"})) { |
my $data=join(':',($ENV{"imagechoice.$id.coords"},$ENV{"form.image.x"}, |
my $data; |
$ENV{"form.image.y"})); |
if ($type eq 'point') { |
&Apache::lonnet::appenv("imagechoice.$id.coords"=>$data); |
$data=join(':',(undef,$env{"form.image.x"},$env{"form.image.y"})); |
|
} else { |
|
$data=join(':',($env{"imagechoice.$id.coords"}, |
|
$env{"form.image.x"},$env{"form.image.y"})); |
|
} |
|
&Apache::lonnet::appenv({"imagechoice.$id.coords"=>$data}); |
} |
} |
|
return int(scalar(split(':',$env{"imagechoice.$id.coords"}))/2); |
|
} |
|
|
|
sub add_obj { |
|
my ($x,$id,$type,$args,$extra)=@_; |
|
|
|
$$x{"cgi.$id.OBJTYPE"}.=$type.':'; |
|
my $i=$$x{"cgi.$id.OBJCOUNT"}++; |
|
$$x{"cgi.$id.OBJ$i"}=$args; |
|
if (defined($extra)) { $$x{"cgi.$id.OBJEXTRA$i"}=$extra; } |
} |
} |
|
|
sub drawX { |
sub drawX { |
my ($imid,$x,$y)=@_; |
my ($data,$imid,$x,$y)=@_; |
my %x; |
|
$x{"cgi.$imid.LINECOUNT"}=4; |
|
my $length = 6; |
my $length = 6; |
my $width = 1; |
my $width = 1; |
my $extrawidth = 2; |
my $extrawidth = 2; |
$x{"cgi.$imid.LINE0"}= |
&add_obj($data,$imid,'LINE', |
join(':',(($x-$length),($y-$length),($x+$length),($y+$length), |
join(':',(($x-$length),($y-$length),($x+$length),($y+$length), |
"FFFFFF",($width+$extrawidth))); |
"FFFFFF",($width+$extrawidth)))); |
$x{"cgi.$imid.LINE1"}= |
&add_obj($data,$imid,'LINE', |
join(':',(($x-$length),($y+$length),($x+$length),($y-$length), |
join(':',(($x-$length),($y+$length),($x+$length),($y-$length), |
"FFFFFF",($width+$extrawidth))); |
"FFFFFF",($width+$extrawidth)))); |
$x{"cgi.$imid.LINE2"}= |
&add_obj($data,$imid,'LINE', |
join(':',(($x-$length),($y-$length),($x+$length),($y+$length), |
join(':',(($x-$length),($y-$length),($x+$length),($y+$length), |
"FF0000",($width))); |
"FF0000",($width)))); |
$x{"cgi.$imid.LINE3"}= |
&add_obj($data,$imid,'LINE', |
join(':',(($x-$length),($y+$length),($x+$length),($y-$length), |
join(':',(($x-$length),($y+$length),($x+$length),($y-$length), |
"FF0000",($width))); |
"FF0000",($width)))); |
return %x; |
|
} |
} |
|
|
sub drawPolygon { |
sub drawPolygon { |
my ($id,$imid)=@_; |
my ($data,$id,$imid)=@_; |
my (undef,@coords)=split(':',$ENV{"imagechoice.$id.coords"}); |
my (undef,@coords)=split(':',$env{"imagechoice.$id.coords"}); |
my $coordstr; |
my $coordstr; |
while (@coords) { |
while (@coords) { |
$coordstr.='('.shift(@coords).','.shift(@coords).')-'; |
$coordstr.='('.shift(@coords).','.shift(@coords).')-'; |
} |
} |
chop($coordstr); |
chop($coordstr); |
my %x; |
|
my $width = 1; |
my $width = 1; |
my $extrawidth = 2; |
my $extrawidth = 2; |
my $i=$x{"cgi.$imid.POLYCOUNT"}++; |
&add_obj($data,$imid,'POLYGON', |
$x{"cgi.$imid.POLYOPT$i"}=join(':',("FFFFFF",($width+$extrawidth)),'1'); |
join(':',("FFFFFF",($width+$extrawidth)),'1'),$coordstr); |
$x{"cgi.$imid.POLY$i"}=$coordstr; |
&add_obj($data,$imid,'POLYGON', |
$i=$x{"cgi.$imid.POLYCOUNT"}++; |
join(':',("00FF00",($width)),'1'),$coordstr); |
$x{"cgi.$imid.POLYOPT$i"}=join(':',("00FF00",$width),'1'); |
} |
$x{"cgi.$imid.POLY$i"}=$coordstr; |
|
return %x; |
sub drawBox { |
|
my ($data,$id,$imid)=@_; |
|
my (undef,@coords)=split(':',$env{"imagechoice.$id.coords"}); |
|
if (scalar(@coords) < 4) { return ''; } |
|
my $width = 1; |
|
my $extrawidth = 2; |
|
&add_obj($data,$imid,'RECTANGLE', |
|
join(':',(@coords,"FFFFFF",($width+$extrawidth)))); |
|
&add_obj($data,$imid,'RECTANGLE',join(':',(@coords,"00FF00",$width))); |
} |
} |
|
|
sub drawimage { |
sub drawimage { |
my ($r,$mode,$filename,$id)=@_; |
my ($r,$type,$filename,$id)=@_; |
my $imid=&Apache::loncommon::get_cgi_id(); |
my $imid=&Apache::loncommon::get_cgi_id(); |
my (undef,@coords)=split(':',$ENV{"imagechoice.$id.coords"}); |
my (undef,@coords)=split(':',$env{"imagechoice.$id.coords"}); |
if (scalar(@coords) < 2) { return &Apache::lonnet::hreflocation('',$filename); } |
if (scalar(@coords) < 2) { return &Apache::lonnet::hreflocation('',$filename); } |
my %data; |
my %data; |
$data{"cgi.$imid.BGIMG"}=$filename; |
$data{"cgi.$imid.BGIMG"}=$filename; |
my $x=@coords[-2]; |
my $x=$coords[-2]; |
my $y=@coords[-1]; |
my $y=$coords[-1]; |
%data=(%data,&drawX($imid,$x,$y)); |
&drawX(\%data,$imid,$x,$y); |
if ($mode eq "polygon") { %data=(%data,&drawPolygon($id,$imid)); } |
if ($type eq "polygon") { &drawPolygon(\%data,$id,$imid); } |
&Apache::lonnet::appenv(%data); |
if ($type eq "box") { &drawBox(\%data,$id,$imid); } |
|
&Apache::lonnet::appenv(\%data); |
return "/adm/randomlabel.png?token=$imid" |
return "/adm/randomlabel.png?token=$imid" |
} |
} |
|
|
sub handler { |
sub handler { |
my ($r)=@_; |
my ($r)=@_; |
$r->content_type('text/html'); |
&Apache::loncommon::content_type($r,'text/html'); |
|
$r->send_http_header; |
my %data; |
my %data; |
my (undef,$id) = split(/=/,$ENV{'QUERY_STRING'}); |
my (undef,$id) = split(/=/,$ENV{'QUERY_STRING'}); |
my $filename = &Apache::lonnet::unescape($ENV{"imagechoice.$id.file"}); |
my $filename = &unescape($env{"imagechoice.$id.file"}); |
my $formname = $ENV{"imagechoice.$id.formname"}; |
my $formname = $env{"imagechoice.$id.formname"}; |
my $mode=$ENV{"imagechoice.$id.mode"}; |
if ($env{'form.cancel'} eq &mt('Cancel')) { |
if ($ENV{'form.cancel'} eq 'Cancel') { |
|
&deletedata($id); |
&deletedata($id); |
&closewindow($r,'',$filename); |
&closewindow($r,'',$filename); |
|
return OK; |
} |
} |
&savecoord($id); |
my $type=$env{"imagechoice.$id.type"}; |
my $imurl=&drawimage($r,$mode,$filename,$id); |
if (defined($env{'form.type'})) { $type=$env{'form.type'}; } |
if ($ENV{'form.finish'} eq 'Finish') { |
my $numcoords=&savecoord($id,$type); |
&storedata($r,$mode,$imurl,$id); |
my $imurl=&drawimage($r,$type,$filename,$id); |
|
if ($env{'form.finish'} eq &mt('Finish')) { |
|
&storedata($r,$type,$imurl,$id); |
|
} else { |
|
&getcoord($r,$type,$imurl,$id); |
} |
} |
&getcoord($r,$mode,$imurl,$id); |
|
return OK; |
return OK; |
} |
} |
|
|