--- loncom/homework/drawimage.pm	2024/04/05 04:05:08	1.12
+++ loncom/homework/drawimage.pm	2024/08/06 00:41:33	1.14.2.1
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # programatic image drawing
 #
-# $Id: drawimage.pm,v 1.12 2024/04/05 04:05:08 raeburn Exp $
+# $Id: drawimage.pm,v 1.14.2.1 2024/08/06 00:41:33 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -31,6 +31,7 @@ use strict;
 use Apache::loncommon;
 use Apache::lonnet;
 use Apache::lonxml;
+use Apache::edit;
 use lib '/home/httpd/lib/perl/';
 use Time::HiRes qw(gettimeofday);
 use LONCAPA;
@@ -46,12 +47,28 @@ BEGIN {
 sub start_drawimage {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     &Apache::lonxml::register('Apache::drawimage',('text','line','rectangle','arc','fill','polygon','image'));
+    push(@Apache::lonxml::namespace,'drawimage');
+    my $result;
     if ($target eq 'web' || $target eq 'tex') {
 	my $new_id=&Apache::loncommon::get_cgi_id();
 	if ($cgi_id) { push(@cgi_ids,$cgi_id); } else { undef(%args); }
 	$cgi_id=$new_id;
+    } elsif ($target eq 'edit') {
+        $result .= &Apache::edit::tag_start($target,$token).
+            &Apache::edit::text_arg('Background color:','bgcolor' ,$token,8).
+            &Apache::edit::text_arg('Width(pixel):'    ,'width'   ,$token,6).
+            &Apache::edit::text_arg('Height(pixel):'   ,'height'  ,$token,6).
+            &Apache::edit::text_arg('TeXWidth(mm):'    ,'texwidth',$token,6).
+            &Apache::edit::end_row().&Apache::edit::start_spanning_row();
+    } elsif ($target eq 'modified') {
+        my $constructtag=&Apache::edit::get_new_args($token,$parstack,
+                                                     $safeeval,'bgcolor','width',
+                                                     'height','texwidth');
+        if ($constructtag) {
+            $result = &Apache::edit::rebuild_tag($token);
+        }
     }
-    return '';
+    return $result;
 }
 
 sub end_drawimage {
@@ -100,12 +117,12 @@ sub end_drawimage {
 	    undef($cgi_id);
 	}
     } elsif ($target eq 'edit') {
-    } elsif ($target eq 'modified') {
+        $result.=&Apache::edit::end_table;
     }
-    
-    &Apache::lonxml::register('Apache::drawimage',
-			      ('text','line','rectangle','arc','fill',
-			       'polygon'));
+    pop(@Apache::lonxml::namespace);
+    &Apache::lonxml::deregister('Apache::drawimage',
+			        ('text','line','rectangle','arc','fill',
+			         'polygon'));
     return $result;
 }
 
@@ -114,6 +131,31 @@ sub start_text {
     my $result;
     if ($target eq 'web' || $target eq 'tex') {
 	&Apache::lonxml::startredirection();
+    } elsif ($target eq 'edit') {
+        $result =
+            &Apache::edit::tag_start($target,$token).
+            &Apache::edit::text_arg('x:','x',$token,6).
+            &Apache::edit::text_arg('y:','y',$token,6).
+            &Apache::edit::text_arg('font:','font',$token,12).
+            &Apache::edit::text_arg('color:','color',$token,8).
+            &Apache::edit::select_arg('direction:','direction',
+                                      ['vertical','horizontal'],$token).
+            &Apache::edit::text_arg('rotation:','rotation',$token,6);
+        my $text=&Apache::lonxml::get_all_text('/text',$parser,$style);
+        $result .=
+            &Apache::edit::editfield($token->[1],$text,'Text',60,2).
+            &Apache::edit::end_row();
+    } elsif ($target eq 'modified') {
+        my $constructtag=&Apache::edit::get_new_args($token,$parstack,
+                                                     $safeeval,'x','y',
+                                                     'font','color',
+                                                     'direction','rotation');
+        if ($constructtag) {
+            $result = &Apache::edit::rebuild_tag($token);
+        } else {
+            $result = $token->[4];
+        }
+        $result .= &Apache::edit::modifiedfield('/text',$parser);
     }
     return $result;
 }
@@ -133,6 +175,8 @@ sub end_text {
         $args{"cgi.$cgi_id.OBJTYPE"}.='LABEL:';
 	my $i=$args{"cgi.$cgi_id.OBJCOUNT"}++;
 	$args{"cgi.$cgi_id.OBJ$i"}=join(':',($x,$y,$text,$font,$color,$direction,$rotation));
+    } elsif ($target eq 'edit') {
+        $result=&Apache::edit::end_table();
     }
     return $result;
 }
@@ -150,6 +194,23 @@ sub start_line {
 	my $i=$args{"cgi.$cgi_id.OBJCOUNT"}++;
 	$args{"cgi.$cgi_id.OBJ$i"}=join(':',($x1,$y1,$x2,$y2,$color,$thickness));
 	$args{"cgi.$cgi_id.OBJTYPE"}.='LINE:';
+    } elsif ($target eq 'edit') {
+        $result .=
+            &Apache::edit::tag_start($target,$token).
+            &Apache::edit::text_arg('x1:','x1' ,$token,6).
+            &Apache::edit::text_arg('y1:','y1' ,$token,6).
+            &Apache::edit::text_arg('x2:','x2' ,$token,6).
+            &Apache::edit::text_arg('y2:','y2' ,$token,6).
+            &Apache::edit::text_arg('color:','color',$token,8).
+            &Apache::edit::text_arg('thickness:','thickness',$token,6).
+            &Apache::edit::end_row();
+    } elsif ($target eq 'modified') {
+        my $constructtag=&Apache::edit::get_new_args($token,$parstack,
+                                                     $safeeval,'x1','y1',
+                                                     'x2','y2','color','thickness');
+        if ($constructtag) { 
+            $result = &Apache::edit::rebuild_tag($token);
+        }
     }
     return $result;
 }
@@ -157,6 +218,9 @@ sub start_line {
 sub end_line {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;
+    if ($target eq 'edit') {
+        $result=&Apache::edit::end_table();
+    }
     return $result;
 }
 
@@ -177,6 +241,26 @@ sub start_rectangle {
 	$args{"cgi.$cgi_id.OBJ$i"}=
 	    join(':',($x1,$y1,$x2,$y2,$color,$thickness,$filled));
 	$args{"cgi.$cgi_id.OBJTYPE"}.='RECTANGLE:';
+    } elsif ($target eq 'edit') {
+        $result .=
+            &Apache::edit::tag_start($target,$token).
+            &Apache::edit::text_arg('x1:','x1' ,$token,6).
+            &Apache::edit::text_arg('y1:','y1' ,$token,6).
+            &Apache::edit::text_arg('x2:','x2' ,$token,6).
+            &Apache::edit::text_arg('y2:','y2' ,$token,6).
+            &Apache::edit::text_arg('color:','color',$token,8).
+            &Apache::edit::text_arg('thickness:','thickness',$token,6).
+            &Apache::edit::select_arg('filled:','filled',
+                                      ['no','yes'],$token).
+            &Apache::edit::end_row();
+    } elsif ($target eq 'modified') {
+        my $constructtag=&Apache::edit::get_new_args($token,$parstack,
+                                                     $safeeval,'x1','y1',
+                                                     'x2','y2','color','thickness',
+                                                     'filled');
+        if ($constructtag) {
+            $result = &Apache::edit::rebuild_tag($token);
+        }
     }
     return $result;
 }
@@ -184,6 +268,9 @@ sub start_rectangle {
 sub end_rectangle {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;
+    if ($target eq 'edit') {
+        $result=&Apache::edit::end_table();
+    }
     return $result;
 }
 
@@ -205,6 +292,30 @@ sub start_arc {
 	    join(':',($x,$y,$width,$height,$start,$end,$color,$thickness,
 		      $filled));
 	$args{"cgi.$cgi_id.OBJTYPE"}.='ARC:';
+    } elsif ($target eq 'edit') {
+        $result .=
+            &Apache::edit::tag_start($target,$token).
+            &Apache::edit::text_arg('x:','x',$token,6).
+            &Apache::edit::text_arg('y:','y',$token,6).
+            &Apache::edit::text_arg('width:','width',$token,6).
+            &Apache::edit::text_arg('height:','height',$token,6).
+            &Apache::edit::text_arg('start:','start',$token,6).
+            &Apache::edit::text_arg('end:','end',$token,6).
+            &Apache::edit::text_arg('color:','color',$token,8).
+            &Apache::edit::text_arg('thickness:','thickness',$token,6).
+            &Apache::edit::select_arg('filled:','filled',
+                                      ['no','yes'],$token).
+            &Apache::edit::end_row();
+    } elsif ($target eq 'modified') {
+        my $constructtag=&Apache::edit::get_new_args($token,$parstack,
+                                                     $safeeval,'x','y',
+                                                     'width','height',
+                                                     'start','end',
+                                                     'color','thickness',
+                                                     'filled');
+        if ($constructtag) {
+            $result = &Apache::edit::rebuild_tag($token);
+        }
     }
     return $result;
 }
@@ -212,6 +323,9 @@ sub start_arc {
 sub end_arc {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;
+    if ($target eq 'edit') {
+        $result=&Apache::edit::end_table();
+    }
     return $result;
 }
 
@@ -225,6 +339,20 @@ sub start_fill {
 	my $i=$args{"cgi.$cgi_id.OBJCOUNT"}++;
 	$args{"cgi.$cgi_id.OBJ$i"}=join(':',($x,$y,$color));
 	$args{"cgi.$cgi_id.OBJTYPE"}.='FILL:';
+    } elsif ($target eq 'edit') {
+        $result .=
+            &Apache::edit::tag_start($target,$token).
+            &Apache::edit::text_arg('x:','x' ,$token,6).
+            &Apache::edit::text_arg('y:','y' ,$token,6).
+            &Apache::edit::text_arg('color:','color',$token,8).
+            &Apache::edit::end_row();
+    } elsif ($target eq 'modified') {
+        my $constructtag=&Apache::edit::get_new_args($token,$parstack,
+                                                     $safeeval,'x','y',
+                                                     'color');
+        if ($constructtag) {
+            $result = &Apache::edit::rebuild_tag($token);
+        }
     }
     return $result;
 }
@@ -232,6 +360,9 @@ sub start_fill {
 sub end_fill {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;
+    if ($target eq 'edit') {
+        $result=&Apache::edit::end_table();
+    }
     return $result;
 }
 
@@ -239,9 +370,27 @@ my @polygon;
 sub start_polygon {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;
+    push(@Apache::lonxml::namespace,'polygon');
     &Apache::lonxml::register('Apache::drawimage',('point'));
-    if ($target eq 'web') {
+    if ($target eq 'web' || $target eq 'tex') {
 	undef(@polygon);
+    } elsif ($target eq 'edit') {
+        $result = 
+            &Apache::edit::tag_start($target,$token).
+            &Apache::edit::text_arg('color:','color',$token,8).
+            &Apache::edit::select_arg('Open:','open',
+                                           ['no','yes'],$token).
+            &Apache::edit::select_arg('Filled:','filled',
+                                           ['no','yes'],$token).
+            &Apache::edit::text_arg('thickness:','thickness',$token,6).
+            &Apache::edit::end_row().
+            &Apache::edit::start_spanning_row();
+    } elsif ($target eq 'modified') {
+        my $constructtag=&Apache::edit::get_new_args($token,$parstack,
+                                                     $safeeval,'open','filled');
+        if ($constructtag) {
+            $result = &Apache::edit::rebuild_tag($token);
+        }
     }
     return $result;
 }
@@ -249,7 +398,7 @@ sub start_polygon {
 sub end_polygon {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;    
-    if ($target eq 'web') {
+    if ($target eq 'web' || $target eq 'tex') {
 	my $color=&Apache::lonxml::get_param('color',$parstack,$safeeval);
 	my $filled=&Apache::lonxml::get_param('filled',$parstack,$safeeval);
 	my $open=&Apache::lonxml::get_param('open',$parstack,$safeeval);
@@ -259,7 +408,10 @@ sub end_polygon {
 	$args{"cgi.$cgi_id.OBJTYPE"}.='POLYGON:';
 	$args{"cgi.$cgi_id.OBJ$i"}=join(':',($color,$thickness,$open,$filled));
 	$args{"cgi.$cgi_id.OBJEXTRA$i"}=join('-',@polygon);
+    } elsif ($target eq 'edit') {
+        $result=&Apache::edit::end_table();
     }
+    pop(@Apache::lonxml::namespace);
     &Apache::lonxml::deregister('Apache::drawimage',('point'));
     return $result;
 }
@@ -267,10 +419,22 @@ sub end_polygon {
 sub start_point {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;
-    if ($target eq 'web') {
+    if ($target eq 'web' || $target eq 'tex') {
 	my $x = &Apache::lonxml::get_param('x',$parstack,$safeeval);
         my $y = &Apache::lonxml::get_param('y',$parstack,$safeeval);
 	push (@polygon,"($x,$y)");
+    } elsif ($target eq 'edit') {
+        $result.= 
+            &Apache::edit::tag_start($target,$token).
+            &Apache::edit::text_arg('x:','x' ,$token,6).
+            &Apache::edit::text_arg('y:','y' ,$token,6).
+            &Apache::edit::end_row();
+    } elsif ($target eq 'modified') {
+        my $constructtag=&Apache::edit::get_new_args($token,$parstack,
+                                                     $safeeval,'x','y');
+        if ($constructtag) {
+            $result = &Apache::edit::rebuild_tag($token);
+        }
     }
     return $result;
 }
@@ -278,6 +442,9 @@ sub start_point {
 sub end_point {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;
+    if ($target eq 'edit') {
+        $result=&Apache::edit::end_table();
+    }
     return $result;
 }
 
@@ -286,6 +453,36 @@ sub start_image {
     my $result;
     if ($target eq 'web' || $target eq 'tex') {
 	&Apache::lonxml::startredirection();
+    } elsif ($target eq 'edit') {
+        my $bgimg=&Apache::lonxml::get_all_text('/image',$parser,$style);
+        $Apache::edit::bgimgsrc=$bgimg;
+        $Apache::edit::bgimgsrcdepth=$Apache::lonxml::curdepth;
+        my $only = join(',',&Apache::loncommon::filecategorytypes('Pictures'));
+        $result=&Apache::edit::tag_start($target,$token,'Background Image').
+            &Apache::edit::editline($token->[1],$bgimg,'Image Source File',40).
+	    &Apache::edit::browse(undef,'textnode',undef,$only).' '.
+	    &Apache::edit::search(undef,'textnode').'<br />'.
+            &Apache::edit::text_arg('x:','x',$token,6).
+            &Apache::edit::text_arg('y:','y',$token,6).
+            &Apache::edit::text_arg('clipx:','clipx',$token,6).
+            &Apache::edit::text_arg('clipy:','clipy',$token,6).
+            &Apache::edit::text_arg('Clip width(pixel):','clipwidth',$token,6).
+            &Apache::edit::text_arg('Clip height(pixel):','clipheight',$token,6).
+            &Apache::edit::text_arg('Scaled width:','scaledwidth',$token,6).
+            &Apache::edit::text_arg('Scaled height:','scaledheight',$token,6).
+            &Apache::edit::text_arg('Transparent:','transparent',$token,6).
+            &Apache::edit::end_row();
+    } elsif ($target eq 'modified') {
+        my $constructtag=&Apache::edit::get_new_args($token,$parstack,
+                                                     $safeeval,'x','y',
+                                                     'clipx','clipy','clipwidth','clipheight',
+                                                     'scaledwidth','scaledheight','transparent');
+        if ($constructtag) {
+            $result = &Apache::edit::rebuild_tag($token);
+        } else {
+            $result = $token->[4];
+        }
+        $result .= &Apache::edit::modifiedfield('/image',$parser);
     }
     return $result;
 }
@@ -315,6 +512,8 @@ sub end_image {
 	$args{"cgi.$cgi_id.OBJ$i"} = 
 	    join(':',($x,$y,&escape($bgimg),$transparent,
 		      $clipx,$clipy,$scaledwidth,$scaledheight,$clipwidth,$clipheight));
+    } elsif ($target eq 'edit') {
+        $result=&Apache::edit::end_table();
     }
     return $result;
 }