--- loncom/xml/lonplot.pm	2002/03/22 14:48:00	1.59
+++ loncom/xml/lonplot.pm	2002/04/23 15:21:36	1.65
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Dynamic plot
 #
-# $Id: lonplot.pm,v 1.59 2002/03/22 14:48:00 matthew Exp $
+# $Id: lonplot.pm,v 1.65 2002/04/23 15:21:36 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -91,16 +91,14 @@ my %linestyles =
      yerrorbars	    => [3,4],
      xyerrorbars    => [4,6],
      boxes          => 3,
-#     boxerrorbars   => [3,4,5],
-#     boxxyerrorbars => [4,6,7],
-#     financebars    => 5,
-#     candlesticks   => 5,
      vector	    => 4
     );		    
 
 my $int_test       = sub {$_[0]=~s/\s+//g;$_[0]=~/^\d+$/};
 my $real_test      = 
     sub {$_[0]=~s/\s+//g;$_[0]=~/^[+-]?\d*\.?\d*([eE][+-]\d+)?$/};
+my $pos_real_test  =
+    sub {$_[0]=~s/\s+//g;$_[0]=~/^[+]?\d*\.?\d*([eE][+-]\d+)?$/};
 my $color_test     = sub {$_[0]=~s/\s+//g;$_[0]=~/^x[\da-f]{6}$/};
 my $onoff_test     = sub {$_[0]=~/^(on|off)$/};
 my $key_pos_test   = sub {$_[0]=~/^(top|bottom|right|left|outside|below| )+$/};
@@ -114,7 +112,7 @@ my $words_test     = sub {$_[0]=~s/\s+/
 ##                                                               ##
 ###################################################################
 my @gnuplot_edit_order = 
-    qw/bgcolor fgcolor height width font transparent grid border align/;
+    qw/alttag bgcolor fgcolor height width font transparent grid border align/;
 
 my $gnuplot_help_text = <<"ENDPLOTHELP";
 <p>
@@ -150,15 +148,22 @@ ENDPLOTHELP
 
 my %gnuplot_defaults = 
     (
+     alttag       => {
+	 default     => 'dynamically generated plot',
+	 test        => $words_test,
+	 description => 'brief description of the plot',
+      	 edit_type   => 'entry',
+	 size        => '40'
+	 },
      height       => {
-	 default     => 200,
+	 default     => 300,
 	 test        => $int_test,
 	 description => 'height of image (pixels)',
       	 edit_type   => 'entry',
 	 size        => '10'
 	 },
      width        => {
-	 default     => 200,
+	 default     => 400,
 	 test        => $int_test,
 	 description => 'width of image (pixels)',
 	 edit_type   => 'entry',
@@ -185,7 +190,7 @@ my %gnuplot_defaults =
 	 edit_type   => 'onoff'
 	 },
      grid         => {
-	 default     => 'off',
+	 default     => 'on',
 	 test        => $onoff_test, 
 	 description => 'Display grid',
 	 edit_type   => 'onoff'
@@ -204,7 +209,7 @@ my %gnuplot_defaults =
 	 choices     => ['small','medium','large']
 	 },
      align        => {
-	 default     => 'left',
+	 default     => 'center',
 	 test        => sub {$_[0]=~/^(left|right|center)$/},
 	 description => 'alignment for image in html',
 	 edit_type   => 'choice',
@@ -301,6 +306,7 @@ my %tic_defaults =
 	 },
      );
 
+my @axis_edit_order = ('color','xmin','xmax','ymin','ymax');
 my %axis_defaults = 
     (
      color   => {
@@ -371,6 +377,8 @@ is an error in your <b>function</b> tag.
 </dl>
 ENDCURVEHELP
 
+my @curve_edit_order = ('color','name','linestyle','pointtype','pointsize');
+
 my %curve_defaults = 
     (
      color     => {
@@ -393,7 +401,29 @@ my %curve_defaults =
 	 description => 'Line style',
 	 edit_type   => 'choice',
 	 choices     => [keys(%linestyles)]
-	 }
+	 },
+# gnuplots term=gif driver does not handle linewidth :(
+#     linewidth => {
+#         default     => 1,
+#         test        => $int_test,
+#         description => 'Line width (may not apply to all line styles)',
+#         edit_type   => 'choice',
+#         choices     => [1,2,3,4,5,6,7,8,9,10]
+#         },
+     pointsize => {
+         default     => 1,
+         test        => $pos_real_test,
+         description => 'point size (may not apply to all line styles)',
+         edit_type   => 'entry',
+         size        => '5'
+         },
+     pointtype => {
+         default     => 1,
+         test        => $int_test,
+         description => 'point type (may not apply to all line styles)',
+         edit_type   => 'choice',
+         choices     => [0,1,2,3,4,5,6]
+         }
      );
 
 ###################################################################
@@ -462,10 +492,10 @@ sub end_gnuplot {
 	if ($target eq 'web') {
 	    $result .= <<"ENDIMAGE";
 <img src    = "/cgi-bin/plot.gif?file=$filename&output=gif" 
-     width  = "$plot{'width'}" 
+     width  = "$plot{'width'}"
      height = "$plot{'height'}"
      align  = "$plot{'align'}"
-     alt    = "image should be /cgi-bin/plot.gif?$filename" />
+     alt    = "$plot{'alttag'}" />
 ENDIMAGE
         } elsif ($target eq 'tex') {
 	    &Apache::lonnet::ssi('cgi-bin/plot.gif?file=$filename'.
@@ -588,7 +618,7 @@ sub start_title {
 	my $text=&Apache::lonxml::get_all_text("/title",$$parser[-1]);
 	$result.=&Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::textfield('',$text,'',60);
+	    &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	my $text=$$parser[-1]->get_text("/title");
 	$result.=&Apache::edit::rebuild_tag($token);
@@ -622,7 +652,7 @@ sub start_xlabel {
 	my $text=&Apache::lonxml::get_all_text("/xlabel",$$parser[-1]);
 	$result.=&Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::textfield('',$text,'',60);
+	    &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	my $text=$$parser[-1]->get_text("/xlabel");
 	$result.=&Apache::edit::rebuild_tag($token);	
@@ -657,7 +687,7 @@ sub start_ylabel {
 	my $text = &Apache::lonxml::get_all_text("/ylabel",$$parser[-1]);
 	$result .= &Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::textfield('',$text,'',60);
+	    &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	my $text=$$parser[-1]->get_text("/ylabel");
 	$result.=&Apache::edit::rebuild_tag($token);
@@ -696,7 +726,7 @@ sub start_label {
 	my $text = &Apache::lonxml::get_all_text("/label",$$parser[-1]);
 	$result .= &Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::textfield('',$text,'',60);
+	    &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	&Apache::edit::get_new_args
 	    ($token,$parstack,$safeeval,keys(%label_defaults));
@@ -731,7 +761,8 @@ sub start_curve {
     } elsif ($target eq 'edit') {
 	$result .= &Apache::edit::tag_start($target,$token,'Curve');
 	$result .= &help_win($curve_help_text);
-	$result .= &edit_attributes($target,$token,\%curve_defaults);
+	$result .= &edit_attributes($target,$token,\%curve_defaults,
+                                    \@curve_edit_order);
     } elsif ($target eq 'modified') {
 	my $constructtag=&Apache::edit::get_new_args
 	    ($token,$parstack,$safeeval,keys(%curve_defaults));
@@ -772,7 +803,7 @@ sub start_function {
 	my $text = &Apache::lonxml::get_all_text("/function",$$parser[-1]);
 	$result .= &Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::textfield('',$text,'',60);
+	    &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	$result.=&Apache::edit::rebuild_tag($token);
 	my $text=$$parser[-1]->get_text("/function");
@@ -848,7 +879,7 @@ sub start_data {
 	my $text = &Apache::lonxml::get_all_text("/data",$$parser[-1]);
 	$result .= &Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::textfield('',$text,'',60);
+	    &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	$result.=&Apache::edit::rebuild_tag($token);
 	my $text=$$parser[-1]->get_text("/data");
@@ -876,7 +907,8 @@ sub start_axis {
 			$tagstack->[-1]);
     } elsif ($target eq 'edit') {
 	$result .= &Apache::edit::tag_start($target,$token,'Plot Axes');
-	$result .= &edit_attributes($target,$token,\%axis_defaults);
+	$result .= &edit_attributes($target,$token,\%axis_defaults,
+				    \@axis_edit_order);
     } elsif ($target eq 'modified') {
 	my $constructtag=&Apache::edit::get_new_args
 	    ($token,$parstack,$safeeval,keys(%axis_defaults));
@@ -1018,6 +1050,19 @@ sub write_gnuplot_file {
 		$curve->{'function'}.' title "'.
 		$curve->{'name'}.'" with '.
 		$curve->{'linestyle'};
+#
+# gnuplot's term=gif driver does not handle linewidths :(
+# . ' linewidth '. $curve->{'linewidth'};
+#
+            if (($curve->{'linestyle'} eq 'points')      ||
+                ($curve->{'linestyle'} eq 'linespoints') ||
+                ($curve->{'linestyle'} eq 'errorbars')   ||
+                ($curve->{'linestyle'} eq 'xerrorbars')  ||
+                ($curve->{'linestyle'} eq 'yerrorbars')  ||
+                ($curve->{'linestyle'} eq 'xyerrorbars')) {
+                $gnuplot_input.=' pointtype '.$curve->{'pointtype'};
+                $gnuplot_input.=' pointsize '.$curve->{'pointsize'};
+            }
 	} elsif (exists($curve->{'data'})) {
 	    # Store data values in $datatext
 	    my $datatext = '';
@@ -1041,6 +1086,15 @@ sub write_gnuplot_file {
 	    $gnuplot_input.= '"'.$datafilename.'" title "'.
 		$curve->{'name'}.'" with '.
 		$curve->{'linestyle'};
+            if (($curve->{'linestyle'} eq 'points')      ||
+                ($curve->{'linestyle'} eq 'linespoints') ||
+                ($curve->{'linestyle'} eq 'errorbars')   ||
+                ($curve->{'linestyle'} eq 'xerrorbars')  ||
+                ($curve->{'linestyle'} eq 'yerrorbars')  ||
+                ($curve->{'linestyle'} eq 'xyerrorbars')) {
+                $gnuplot_input.=' pointtype '.$curve->{'pointtype'};
+                $gnuplot_input.=' pointsize '.$curve->{'pointsize'};
+            }
 	}
     }
     # Write the output to a file.
@@ -1114,11 +1168,11 @@ sub edit_attributes {
 sub insert_gnuplot {
     my $result = '';
     #  plot attributes
-    $result .= "<gnuplot \n";
+    $result .= "\n<gnuplot ";
     foreach my $attr (keys(%gnuplot_defaults)) {
-	$result .= "     $attr=\"$gnuplot_defaults{$attr}->{'default'}\"\n";
+	$result .= "\n     $attr=\"$gnuplot_defaults{$attr}->{'default'}\"";
     }
-    $result .= ">\n";
+    $result .= ">";
     # Add the components (most are commented out for simplicity)
     # $result .= &insert_key();
     # $result .= &insert_axis();
@@ -1127,7 +1181,7 @@ sub insert_gnuplot {
     # $result .= &insert_ylabel();    
     $result .= &insert_curve();
     # close up the <gnuplot>
-    $result .= "</gnuplot>\n";
+    $result .= "\n</gnuplot>";
     return $result;
 }
 
@@ -1141,9 +1195,9 @@ sub insert_xtics {
     my $result;
     $result .= "\n    <xtics ";
     foreach my $attr (keys(%tic_defaults)) {
-	$result .= "$attr=\"$tic_defaults{$attr}->{'default'}\" ";
+	$result .= "\n        $attr=\"$tic_defaults{$attr}->{'default'}\" ";
     }
-    $result .= "/>\n";
+    $result .= "/>";
     return $result;
 }
 
@@ -1151,19 +1205,19 @@ sub insert_ytics {
     my $result;
     $result .= "\n    <ytics ";
     foreach my $attr (keys(%tic_defaults)) {
-	$result .= "$attr=\"$tic_defaults{$attr}->{'default'}\" ";
+	$result .= "\n        $attr=\"$tic_defaults{$attr}->{'default'}\" ";
     }
-    $result .= "/>\n";
+    $result .= "/>";
     return $result;
 }
 
 sub insert_key {
     my $result;
-    $result .= "\n    <key \n";
+    $result .= "\n    <key ";
     foreach my $attr (keys(%key_defaults)) {
-	$result .= "         $attr=\"$key_defaults{$attr}->{'default'}\"\n";
+	$result .= "\n         $attr=\"$key_defaults{$attr}->{'default'}\"";
     }
-    $result .= "   />\n";
+    $result .= " />";
     return $result;
 }
 
@@ -1171,24 +1225,24 @@ sub insert_axis{
     my $result;
     $result .= "\n    <axis ";
    foreach my $attr (keys(%axis_defaults)) {
-	$result .= "         $attr=\"$axis_defaults{$attr}->{'default'}\"\n";
+	$result .= "\n         $attr=\"$axis_defaults{$attr}->{'default'}\"";
     }
-    $result .= "   />\n";
+    $result .= " />";
     return $result;
 }
 
-sub insert_title { return "\n    <title></title>\n"; }
-sub insert_xlabel { return "\n    <xlabel></xlabel>\n"; }
-sub insert_ylabel { return "\n    <ylabel></ylabel>\n"; }
+sub insert_title  { return "\n    <title></title>"; }
+sub insert_xlabel { return "\n    <xlabel></xlabel>"; }
+sub insert_ylabel { return "\n    <ylabel></ylabel>"; }
 
 sub insert_label {
     my $result;
     $result .= "\n    <label ";
     foreach my $attr (keys(%label_defaults)) {
-	$result .= '         '.$attr.'="'.
-	    $label_defaults{$attr}->{'default'}."\"\n";
+	$result .= "\n         $attr=\"".
+            $label_defaults{$attr}->{'default'}."\"";
     }
-    $result .= "   ></label>\n";
+    $result .= "></label>";
     return $result;
 }
 
@@ -1196,22 +1250,22 @@ sub insert_curve {
     my $result;
     $result .= "\n    <curve ";
     foreach my $attr (keys(%curve_defaults)) {
-	$result .= '         '.$attr.'="'.
-	    $curve_defaults{$attr}->{'default'}."\"\n";
+	$result .= "\n         $attr=\"".
+	    $curve_defaults{$attr}->{'default'}."\"";
     }
-    $result .= "    >\n";
-    $result .= &insert_data().&insert_data()."</curve>\n";
+    $result .= " >";
+    $result .= &insert_data().&insert_data()."\n    </curve>";
 }
 
 sub insert_function {
     my $result;
-    $result .= "<function></function>\n";
+    $result .= "\n        <function></function>";
     return $result;
 }
 
 sub insert_data {
     my $result;
-    $result .= "     <data></data>\n";
+    $result .= "\n        <data></data>";
     return $result;
 }