--- loncom/xml/lonplot.pm	2002/01/08 21:41:20	1.34
+++ loncom/xml/lonplot.pm	2002/01/10 19:45:51	1.38
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Dynamic plot
 #
-# $Id: lonplot.pm,v 1.34 2002/01/08 21:41:20 matthew Exp $
+# $Id: lonplot.pm,v 1.38 2002/01/10 19:45:51 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -28,7 +28,14 @@
 # 12/15/01 Matthew
 # 12/17 12/18 12/19 12/20 12/21 12/27 12/28 12/30 12/31 Matthew
 # 01/01/02 Matthew
-# 01/02 01/03 01/04 Matthew
+# 01/02 01/03 01/04 01/07 01/08 01/09 Matthew
+
+# Current issues
+#   1. Gnuplot is unable to vary the color or linestyle of <data> plots.
+#      The key does not know this so it is misleading for the user.
+#      Multiple <function>s can be plotted with varying line styles and
+#      colors.
+#
 package Apache::lonplot;
 
 use strict;
@@ -87,13 +94,13 @@ my %linestyles =
      errorbars	    => 3,
      xerrorbars	    => [3,4],
      yerrorbars	    => [3,4],
-     xyerrorbars    => [4,6,7],
+     xyerrorbars    => [4,6],
      boxes          => 3,
-     boxerrorbars   => [3,4,5],
-     boxxyerrorbars => [4,6,7],
-     financebars    => 5,
-     candlesticks   => 5,
-     vector	    => 2
+#     boxerrorbars   => [3,4,5],
+#     boxxyerrorbars => [4,6,7],
+#     financebars    => 5,
+#     candlesticks   => 5,
+     vector	    => 4
     );		    
 
 my $int_test       = sub {$_[0]=~s/\s+//g;$_[0]=~/^\d+$/};
@@ -112,32 +119,36 @@ my $words_test     = sub {$_[0]=~s/\s+/
 ##                                                               ##
 ###################################################################
 my @plot_edit_order = 
-    qw/bgcolor fgcolor height width font transparent grid border/;
+    qw/bgcolor fgcolor height width font transparent grid border align/;
 my %plot_defaults = 
     (
      height       => {
 	 default     => 200,
 	 test        => $int_test,
 	 description => 'height of image (pixels)',
-	 edit_type   => 'entry' 
+      	 edit_type   => 'entry',
+	 size        => '10'
 	 },
      width        => {
 	 default     => 200,
 	 test        => $int_test,
 	 description => 'width of image (pixels)',
-	 edit_type   => 'entry'
+	 edit_type   => 'entry',
+	 size        => '10'
 	 },
      bgcolor      => {
 	 default     => 'xffffff',
 	 test        => $color_test, 
 	 description => 'background color of image (xffffff)',
-	 edit_type   => 'entry'
+	 edit_type   => 'entry',
+	 size        => '10'
 	 },
      fgcolor      => {
 	 default     => 'x000000',
 	 test        => $color_test,
 	 description => 'foreground color of image (x000000)',
-	 edit_type   => 'entry' 
+	 edit_type   => 'entry',
+	 size        => '10'
 	 },
      transparent  => {
 	 default     => 'off',
@@ -179,7 +190,8 @@ my %key_defaults =
 	 default => '',
 	 test => $words_test,
 	 description => 'Title of key',
-	 edit_type   => 'entry'
+	 edit_type   => 'entry',
+	 size        => '40'
 	 },
      box   => { 
 	 default => 'off',
@@ -203,13 +215,15 @@ my %label_defaults =
 	 default => 0,
 	 test => $real_test,
 	 description => 'x position of label (graph coordinates)',
-	 edit_type   => 'entry'
+	 edit_type   => 'entry',
+	 size        => '10'
 	 },
      ypos    => {
 	 default => 0, 
 	 test => $real_test,
 	 description => 'y position of label (graph coordinates)',
-	 edit_type   => 'entry'
+	 edit_type   => 'entry',
+	 size        => '10'
 	 },
      justify => {
 	 default => 'left',    
@@ -226,31 +240,36 @@ my %axis_defaults =
 	 default => 'x000000', 
 	 test => $color_test,
 	 description => 'color of axes (x000000)',
-	 edit_type   => 'entry'
+	 edit_type   => 'entry',
+	 size        => '10'
 	 },
      xmin      => {
 	 default => '-10.0',
 	 test => $real_test,
 	 description => 'minimum x-value shown in plot',
-	 edit_type   => 'entry'
+	 edit_type   => 'entry',
+	 size        => '10'
 	 },
      xmax      => {
 	 default => ' 10.0',
 	 test => $real_test,
 	 description => 'maximum x-value shown in plot',	 
-	 edit_type   => 'entry'
+	 edit_type   => 'entry',
+	 size        => '10'
 	 },
      ymin      => {
 	 default => '-10.0',
 	 test => $real_test,
 	 description => 'minimum y-value shown in plot',	 
-	 edit_type   => 'entry'
+	 edit_type   => 'entry',
+	 size        => '10'
 	 },
      ymax      => {
 	 default => ' 10.0',
 	 test => $real_test,
 	 description => 'maximum y-value shown in plot',	 
-	 edit_type   => 'entry'
+	 edit_type   => 'entry',
+	 size        => '10'
 	 }
      );
 
@@ -260,24 +279,22 @@ my %curve_defaults =
 	 default => 'x000000',
 	 test => $color_test,
 	 description => 'color of curve (x000000)',
-	 edit_type   => 'entry'
+	 edit_type   => 'entry',
+	 size        => '10'
 	 },
      name      => {
 	 default => '',
 	 test => $words_test,
 	 description => 'name of curve to appear in key',
-	 edit_type   => 'entry'
+	 edit_type   => 'entry',
+	 size        => '20'
 	 },
      linestyle => {
 	 default => 'lines',
 	 test => $linestyle_test,
-	 description => 'Style of the axis lines',
+	 description => 'Line style',
 	 edit_type   => 'choice',
-	 choices     => ['lines','linespoints','dots','points','steps',
-			 'fsteps','histeps','errorbars','xerrorbars',
-			 'yerrorbars','xyerrorbars','boxes','boxerrorbars',
-			 'boxxyerrorbars','financebars','candlesticks',
-			 'vector']
+	 choices     => [keys(%linestyles)]
 	 }
      );
 
@@ -531,7 +548,7 @@ sub start_curve {
 	$result .= &edit_attributes($target,$token,\%curve_defaults);
     } elsif ($target eq 'modified') {
 	my $constructtag=&Apache::edit::get_new_args
-	    ($token,$parstack,$safeeval,keys(%label_defaults));
+	    ($token,$parstack,$safeeval,keys(%curve_defaults));
 	if ($constructtag) {
 	    $result = &Apache::edit::rebuild_tag($token);
 	    $result.= &Apache::edit::handle_insert();
@@ -564,7 +581,7 @@ sub start_function {
 	$curves[-1]->{'function'} = 
 	    &Apache::lonxml::get_all_text("/function",$$parser[-1]);
     } elsif ($target eq 'edit') {
-	$result .= &Apache::edit::tag_start($target,$token,'Curve Function');
+	$result .= &Apache::edit::tag_start($target,$token,'Gnuplot compatible curve function');
 	my $text = &Apache::lonxml::get_all_text("/function",$$parser[-1]);
 	$result .= '</td></tr><tr><td colspan="3">'.
 	    &Apache::edit::editfield('',$text,'',60,1);
@@ -603,7 +620,7 @@ sub start_data {
 	# make sure it's all numbers and make sure each array 
 	# is of the same length.
 	my @data;
-	if ($datatext =~ /,/) {
+	if ($datatext =~ /,/) { # comma deliminated
 	    @data = split /,/,$datatext;
 	} else { # Assume it's space seperated.
 	    @data = split / /,$datatext;
@@ -624,9 +641,16 @@ sub start_data {
 		$data[$i] = 1.15572734979092;
 	    }
 	}
+	# complain if the number of data points is not the same as
+	# in previous sets of data.
+	if (($curves[-1]->{'data'}) && ($#data != $#{@{$curves[-1]->{'data'}->[0]}})){
+	    &Apache::lonxml::warning
+		('Number of data points is not consistent with previous '.
+		 'number of data points');
+	}
 	push  @{$curves[-1]->{'data'}},\@data;
     } elsif ($target eq 'edit') {
-	$result .= &Apache::edit::tag_start($target,$token,'Curve Data');
+	$result .= &Apache::edit::tag_start($target,$token,'Comma or space deliminated curve data');
 	my $text = &Apache::lonxml::get_all_text("/data",$$parser[-1]);
 	$result .= '</td></tr><tr><td colspan="3">'.
 	    &Apache::edit::editfield('',$text,'',60,1);
@@ -829,23 +853,19 @@ sub edit_attributes {
 	@keys = sort(keys(%$defaults));
     }
     foreach my $attr (@keys) {
+	# append a ' ' to the description if it doesn't have one already.
+	my $description = $defaults->{$attr}->{'description'};
+	$description .= ' ' if ($description !~ / $/);
 	if ($defaults->{$attr}->{'edit_type'} eq 'entry') {
-	    $result .= &Apache::edit::text_arg(
-                 $defaults->{$attr}->{'description'},
-		 $attr,
-		 $token);
+	    $result .= &Apache::edit::text_arg
+		($description,$attr,$token,
+		 $defaults->{$attr}->{'size'});
 	} elsif ($defaults->{$attr}->{'edit_type'} eq 'choice') {
-	    $result .= &Apache::edit::select_arg(
-		 $defaults->{$attr}->{'description'},
-		 $attr,
-		 $defaults->{$attr}->{'choices'},
-		 $token);
+	    $result .= &Apache::edit::select_arg
+		($description,$attr,$defaults->{$attr}->{'choices'},$token);
 	} elsif ($defaults->{$attr}->{'edit_type'} eq 'on_off') {
-	    $result .= &Apache::edit::select_arg(
-		 $defaults->{$attr}->{'description'},
-		 $attr,
-		 ['on','off'],
-		 $token);
+	    $result .= &Apache::edit::select_arg
+		($description,$attr,['on','off'],$token);
 	}
 	$result .= '<br />';
     }