#
# Chart::Graph::Xmgrace::Axis_Options.pm contains all the fundamental options
# for an axis.
#
# Options included:
#                  1) Chart::Graph::Xmgrace::Bar_Options
#                  2) Chart::Graph::Xmgrace::Label_Options
#                  3) Chart::Graph::Xmgrace::Tickmark
#                  4) Chart::Graph::Xmgrace::Tick_Options
#                  5) Chart::Graph::Xmgrace::Ticklabel_Options
#                 
## This software product is developed by Esmond Lee and David Moore,
## and copyrighted(C) 1998 by the University of California, San Diego
## (UCSD), with all rights reserved. UCSD administers the CAIDA grant,
## NCR-9711092, under which part of this code was developed.
##
## There is no charge for this software. You can redistribute it and/or
## modify it under the terms of the GNU General Public License, v. 2 dated
## June 1991 which is incorporated by reference herein. This software is
## distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, OF MERCHANTABILITY
## OR FITNESS FOR A PARTICULAR PURPOSE or that the use of it will not
## infringe on any third party's intellectual property rights.
##
## You should have received a copy of the GNU GPL along with this program.
##
##
## IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY
## PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
## DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS
## SOFTWARE, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF
## THE POSSIBILITY OF SUCH DAMAGE.
##
## THE SOFTWARE PROVIDED HEREIN IS ON AN "AS IS" BASIS, AND THE
## UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE,
## SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. THE UNIVERSITY
## OF CALIFORNIA MAKES NO REPRESENTATIONS AND EXTENDS NO WARRANTIES
## OF ANY KIND, EITHER IMPLIED OR EXPRESS, INCLUDING, BUT NOT LIMITED
## TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
## PARTICULAR PURPOSE, OR THAT THE USE OF THE SOFTWARE WILL NOT INFRINGE
## ANY PATENT, TRADEMARK OR OTHER RIGHTS.
##
##
## Contact: graph-dev@caida.org
##
##

$VERSION = 3.2;

use Chart::Graph::Xmgrace::Axis_Option;		
use Carp;

package  Chart::Graph::Xmgrace::Bar_Options;
@ISA = qw(Chart::Graph::Xmgrace::Axis_Option);		# derived from Axis_Option

sub _init {
    my $self = shift;
    $self->{name} = "bar";
    $self->{print_order} = ["status","color","linestyle","linewidth"];
    $self->{length} = 4;
    $self->{options} = {
			"status" => "on",
			"color" => "1",
			"linestyle" => "1",
			"linewidth" => "1.0",
		       };
}

package Chart::Graph::Xmgrace::Label_Options;
@ISA = qw(Chart::Graph::Xmgrace::Axis_Option);

sub _init {
    my $self = shift;
    $self->{name} = "label";
    $self->{print_order} = ["label","layout","place","char size",
			    "font", "color", "place"];
    $self->{length} = 4;
    $self->{options} = {
			"label" => "",
			"layout" => "para",
			"place" => "auto",
			"char size" => "1.000000",
			"font" => "0",
			"color" => "1",
			"place" => "auto",
		       };
}

sub char_size ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"char size"} = $val;
    return 1;
}

sub print ($$$ ) {
    my $self = shift;
    my ($handle, $name) = @_;
    my $string = "";
    my $substr = "";
  
    foreach $option (@{ $self->{"print_order"} }) {
	my $option_ref = $self->{"options"};
	    
	if ($option eq "label") {
	    $string = "$name  $option \"$option_ref->{$option}\"\n";
	} else {
#	    if ($option eq "place") {
#		if (ref($option_ref->{$option} eq ARRAY) {
#		    print $handle "$name  $self->{name} $option spec\n"; 
#		    $substr = join (", ", (@{ $option_ref->{$option} })); 
#		    $string = "$name  $self->{name} $option " 
#		}
#	    }
	    
	    # print function handles both scalars and lists
	    if (ref($option_ref->{$option}) eq ARRAY) {
		if ($option eq "place") {
		    $self->_printline($handle,"$name  $self->{name} $option spec\n", $self->{"length"}); 
		}

		$substr = join (", ", (@{ $option_ref->{$option} })); 
		$string = "$name  $self->{name} $option $substr\n";
	    } else {
		$string = "$name  $self->{name} $option $option_ref->{$option}\n";
	    }
	}
	$self->_printline($handle, $string, $self->{"length"}); 
    }
}

package Chart::Graph::Xmgrace::Tickmark;
@ISA = qw(Chart::Graph::Xmgrace::Axis_Option);

sub _init {
    my $self = shift;
    my $type_of_mark = shift;	# major or minor
    $self->{name} = "$type_of_mark";
    $self->{print_order} = ["size","color","linewidth","linestyle",
			    "grid"];
    $self->{length} = 4;
    $self->{options} = {
			"size" => "1",
			"color" => "1",
			"linewidth" => "1.0",
			"linestyle" => "1.000000",
			"grid" => "off",
		       };
}

sub print ($$$$ ) {
    my $self = shift;
    my ($handle, $name, $subname) = @_;
    my $string = "";
    my $substr = "";
  
    foreach $option (@{ $self->{"print_order"} }) {
	my $option_ref = $self->{"options"};
	
	# print function handles both scalars and lists
	if (!ref($option_ref->{$option})) {
	    $string = "$name  $subname $self->{name} $option $option_ref->{$option}\n";
	    $self->_printline($handle, $string, $self->{"length"});       
	} elsif (ref($option_ref->{$option}) eq ARRAY) {
	    $substr = join (", ", (@{ $option_ref->{$option} })); 
	    $string = "$name  $subname $self->{name} $option $substr\n";
	    $self->_printline($handle, $string, $self->{"length"}); 
	} else { # a blessed object, uses Axis Option printline
	    print "shouldn't be in here\n";
	}
    }
}

package Chart::Graph::Xmgrace::Tick_Options;
@ISA = qw(Chart::Graph::Xmgrace::Axis_Option);

sub _init {
    my $self = shift;
    $self->{name} = "tick";
    $self->{print_order} = ["status","default","place rounded","major",
			    "minor","in_out_status","place","type"];
    $self->{length} = 4;
    $self->{options} = {
			"status" => "on",
			"default" => "6",
			"place rounded" => "true",
			"major" => new Chart::Graph::Xmgrace::Tickmark("major"),
			"minor" => new Chart::Graph::Xmgrace::Tickmark("minor"),
			"in_out_status" => "in",
			"place" => "both",
			"type" => "auto",
		       };
}

sub place_rounded ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"place rounded"} = $val;
    return 1;
}

sub print ($$$$ ) {
    my $self = shift;
    my ($handle, $name) = @_;
    my $string = "";
    my $substr = "";
  
    foreach $option (@{ $self->{"print_order"} }) {
	my $option_ref = $self->{"options"};	
	# special case for "status" and "in_out_status"
	if ($option eq "status" or $option eq "in_out_status") {   
	    $string = "$name  $self->{name} $option_ref->{$option}\n";
	    $self->_printline($handle, $string, $self->{"length"});       
	} else {

	# print function handles both scalars and lists
	    if (!ref($option_ref->{$option})) {
		$string = "$name  $self->{name} $option $option_ref->{$option}\n";
		$self->_printline($handle, $string, $self->{"length"});       
	    } elsif (ref($option_ref->{$option}) eq ARRAY) {
		$substr = join (", ", (@{ $option_ref->{$option} })); 
		$string = "$name  $self->{name} $option $substr\n";
		$self->_printline($handle, $string, $self->{"length"}); 
	    } else { # a blessed object, uses Tickmark print
		$option_ref->{$option}->print($handle, $name, $self->{name});
	    }
	}
    }
}



package Chart::Graph::Xmgrace::Ticklabel_Options;
@ISA = qw(Chart::Graph::Xmgrace::Axis_Option);

sub _init {
    my $self = shift;
    $self->{name} = "ticklabel";
    $self->{ticklabels} = undef; # user can put in a ref of array of arrays of ticklabels
    # i.e. [ ["small\\nfoo", 10], ["medium\\nfoo", 20], ["large\\nfoo", 30] ]
    $self->{print_order} = ["status", "prec", "format", "append", "prepend", 
			    "angle", "skip", "stagger", "place", "offset",
			    "sign", "start type", "start", "stop type", "stop",
			    "char size", "font", "color", "type"];
    $self->{length} = 4;
    $self->{options} = {
			"status" => "on",
			"prec" => "5",
			"format" => "general",
			"append" => "",
			"prepend" => "",
			"angle" => "0",
			"skip" => "0",
			"stagger" => "0",
			"place" => "normal",
			"offset" => ["0.000000", "0.000000"],
			"sign" => "normal",
			"start type" => "auto",
			"start" => "0.000000",
			"stop type" => "auto",
			"stop" => "0.000000",
			"char size" => "1.000000",
			"font" => "0",
			"color" => "1",
			"type" => "auto",
		       };
}

sub ticklabels ($$) {
    $self = shift;
    $val = shift;
    $self->{ticklabels} = $val;
    return 1;
}

sub char_size ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"char size"} = $val;
    return 1;
}

sub start_type ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"start type"} = $val;
    return 1;
}

sub stop_type ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"stop type"} = $val;
    return 1;
}

sub print ($$$ ) {
    my $self = shift;
    my ($handle, $name) = @_;
    my $string = "";
    my $substr = "";
  
    foreach $option (@{ $self->{"print_order"} }) {
	my $option_ref = $self->{"options"};

	if ($option eq "status" or $option eq "in_out_status") {   
	  
	    # we first check the status of the option, whether it's on/off
	    # if it's off, we don't print it out
	    if ($option_ref->{"status"} eq "off") {
		$string = "$name  $self->{name} $option_ref->{$option}\n";
		$self->_printline($handle, $string, $self->{"length"});
		last;
	    }
	    $string = "$name  $self->{name} $option_ref->{$option}\n";
	    $self->_printline($handle, $string, $self->{"length"});

	} elsif ($option eq "type" and $self->{ticklabels}) {

	    $string = "$name  $self->{name} $option $option_ref->{$option}\n";
	    $self->_printline($handle, $string, $self->{"length"});
	    my @ticks = @{$self->{"ticklabels"}};
	    my $index;
	    my $count = $#ticks+1;
	    $string = "$name  tick spec $count\n";
	    $self->_printline($handle, $string, $self->{"length"});
	    # print out the tick labels
	    foreach $index (0..$#ticks) {
		my ($label, $value) = @{$ticks[$index]};
		my $ticklabel = "$name  tick major $index,\t\t$value\n";
		$self->_printline($handle, $ticklabel, $self->{"length"});
		$ticklabel = "$name  $self->{name} $index, \"$label\"\n";
		$self->_printline($handle, $ticklabel, $self->{"length"});
	    }
	} else {
	    if ($option eq "append" or $option eq "prepend") {
		$string = "$name  $self->{name} $option \"$option_ref->{$option}\"\n";
	    } else {
		# print function handles both scalars and lists
		if (ref($option_ref->{$option}) eq ARRAY) {
		    $substr = join (", ", (@{ $option_ref->{$option} })); 
		    $string = "$name  $self->{name} $option $substr\n";
		} else {
		    $string = "$name  $self->{name} $option $option_ref->{$option}\n";
		}
	    }
	    $self->_printline($handle, $string, $self->{"length"}); 
	}
    }
}

1;