#
# Graph_Options.pm contains all the different options (objects) for a particular graph
#
# options included:
#                  1) Chart::Graph::Xmgrace::Graph_Global_Options
#                  2) Chart::Graph::Xmgrace::Global_Options
#                  3) Chart::Graph::Xmgrace::Stack_Options
#                  4) Chart::Graph::Xmgrace::View_Options
#                  5) Chart::Graph::Xmgrace::Title_Options
#                  6) Chart::Graph::Xmgrace::Subtitle_Options
#                  7) Chart::Graph::Xmgrace::Legend_Options
#                  8) Chart::Graph::Xmgrace::Frame_Options
#                  9) Chart::Graph::Xmgrace::Extra_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.1;

use Chart::Graph::Xmgrace::Base_Option;
use Carp;
package Chart::Graph::Xmgrace::Graph_Global_Options;
@ISA = qw(Chart::Graph::Xmgrace::Base_Option);

sub _init {
    my $self = shift;
    my $graph_number = shift;

    $self->{name} = $graph_number;
    $self->{print_order} = ["stacked","hidden","type","bar hgap","fixedpoint",
			    "fixedpoint type","fixedpoint xy","fixedpoint format",
			    "fixedpoint prec","with"];
    $self->{length} = 0;
    $self->{options} = {
			"stacked" => "false",
			"hidden" => "false",
			"type" => "XY",
			"bar hgap" => '0.000000',
			"fixedpoint" => "off",
			"fixedpoint type" => "0",
			"fixedpoint xy" => ["0.000000","0.000000"],
			"fixedpoint format" => "general general",
			"fixedpoint prec" => ["6","6"],
			"with" => $graph_number,
		       };
}

sub print($$ ) {
    my $self = shift;
    my $handle = shift;
    my $string = "";
    my $substr = "";		# for making arrays into a string

    foreach $option (@{ $self->{"print_order"} }) {
	my $option_ref = $self->{"options"};

	# print function handles both scalars and lists
	if ($self->{name}) {
	    if (ref($option_ref->{$option}) eq ARRAY) {
		$substr = join (", ", (@{ $option_ref->{$option} })); 
		$string = "$self->{name} $option $substr\n";
	    } elsif ($option eq "with") {
		$string = "$option $option_ref->{$option}\n";
	    } else {
		$string = "$self->{name} $option $option_ref->{$option}\n";
	    }
	} else {		# global options don't have a name field
	    if (ref($option_ref->{$option}) eq ARRAY) {
		$substr = join (", ", (@{ $option_ref->{$option} })); 
		$string = "$option $substr\n";
	    } else {
		$string = "$option $option_ref->{$option}\n";
	    }	    
	}
	$self->_printline($handle, $string, $self->{"length"}); 
    }
}


package Chart::Graph::Xmgrace::Global_Options;
@ISA = qw(Chart::Graph::Xmgrace::Base_Option);

sub _init {
    my $self = shift;
    $self->{print_order} = ["version","page size","page scroll","page inout",
			    "link page","reference date","date wrap",
			    "date wrap year"];
    $self->{length} = 0;
    $self->{options} = {
			"version" => "50005",
			"page size" => ["640", "480"],
			"page scroll" => "5\%",
			"page inout" => "5\%",
			"link page" => "off",
			"reference date" => "0",
			"date wrap" => "off",
			"date wrap year" => "1950",
		       };
}

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

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

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

sub link_page ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"link page"} = $val;
    return 1;
}

sub reference_date ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"reference date"} = $val;
    return 1;
}

sub date_wrap ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"date wrap"} = $val;
    return 1;
}

sub date_wrap_year ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"date wrap year"} = $val;
    return 1;
}

package Chart::Graph::Xmgrace::World_Options;
@ISA = qw(Chart::Graph::Xmgrace::Base_Option);

my %def_world_options = (
			);

sub _init {
    my $self = shift;
    $self->{name} = "world";
    $self->{print_order} = ["xmin","xmax","ymin","ymax"];
    $self->{length} = 4;
    $self->{options} = {
			"xmin" => "0",
			"xmax" => "1",
			"ymin" => "0",
			"ymax" => "1",
		       };
}

package Chart::Graph::Xmgrace::Stack_Options;
@ISA = qw(Chart::Graph::Xmgrace::Base_Option);

my %def_stack_options = (
			 
			);

sub _init {
    my $self = shift;  
    $self->{name} = "stack";
    $self->{print_order} = ["world"];
    $self->{length} = 4;
    $self->{options} = {
			"world" => ["0","0","0","0"],
		       };
}

package Chart::Graph::Xmgrace::View_Options;
@ISA = qw(Chart::Graph::Xmgrace::Base_Option);

sub _init {
    my $self = shift;  
    $self->{name} = "view";
    $self->{print_order} = ["xmin","xmax","ymin","ymax"];
    $self->{length} = 4;
    $self->{options} = {
			"xmin" => "0.150000",
			"xmax" => "1.150000",			
			"ymin" => "0.150000",
			"ymax" => "0.850000",
		       };
}

package Chart::Graph::Xmgrace::Title_Options;
@ISA = qw(Chart::Graph::Xmgrace::Base_Option);

sub _init {
    my $self = shift;  
    $self->{name} = "title";
    $self->{print_order} = ["title","font","size","color"];
    $self->{length} = 4;
    $self->{options} = {
			"title" => '""',
			"font" => "0",
			"size" => "1.250000",
			"color" => "1",					
		       };
}

sub print($$ ) {
    my $self = shift;
    my $handle = shift;
    my $string = "";
    my $substr = "";		# for making arrays into a string

    foreach $option (@{ $self->{"print_order"} }) {
	my $option_ref = $self->{"options"};
	
	if ($option eq "title") {
	    $string = "$self->{name} \"$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 = "$self->{name} $option $substr\n";
	    } else {
		$string = "$self->{name} $option $option_ref->{$option}\n";
	    }
	}	
    $self->_printline($handle, $string, $self->{"length"}); 
    }
}

package Chart::Graph::Xmgrace::Subtitle_Options;
@ISA = qw(Chart::Graph::Xmgrace::Title_Options);

sub _init {
    my $self = shift;  
    $self->{name} = "subtitle";
    $self->{print_order} = ["title","font","size","color"];
    $self->{length} = 4;
    $self->{options} = {
			"title" => '""',
			"font" => "0",
			"size" => "1.000000",
			"color" => "1",		
		       };
}

package Chart::Graph::Xmgrace::Legend_Options;
@ISA = qw(Chart::Graph::Xmgrace::Base_Option);

sub _init {
    my $self = shift;  
    $self->{name} = "legend";
    $self->{print_order} = ["status","loctype","x1","y1","box color",
			    "box pattern","box linewidth","box linestyle",
			    "box fill color","box fill pattern","font",
			    "char size","color","length","vgap","hgap",
			    "invert"];
    $self->{length} = 4;
    $self->{options} = {
			"status" => "on",
			"loctype" => "view",
			"x1" => "0.85",
			"y1" => "0.8",
			"box color" => "1",
			"box pattern" => "1",
			"box linewidth" => "1.0",
			"box linestyle" => "1",
			"box fill color" => "0",
			"box fill pattern" => "1",
			"font" => "0",
			"char size" => "1.000000",
			"color" => "1",
			"length" => "4",
			"vgap" => "1",
			"hgap" => "1",
			"invert" => "false",
		       };
}

sub box_color ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"box color"} = $val;
    return 1;
}

sub box_linewidth ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"box linewidth"} = $val;
    return 1;
}

sub box_linestyle ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"box linestyle"} = $val;
    return 1;
}

sub box_fill_color ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"box fill color"} = $val;
    return 1;
}

sub box_fill_pattern ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"box fill pattern"} = $val;
    return 1;
}

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

package Chart::Graph::Xmgrace::Frame_Options;
@ISA = qw(Chart::Graph::Xmgrace::Base_Option);

sub _init {
    my $self = shift;  
    $self->{name} = "frame";
    $self->{print_order} = ["type","linestyle","linewidth","color",
			    "pattern","background color","background pattern"];
    $self->{length} = 4;
    $self->{options} = {
			"type" => "0",
			"linestyle" => "1",
			"linewidth" => "1.0",
			"color" => "1",		
			"pattern" => "1",
			"background color" => "0",
			"background pattern" => "0",
		       };
}

sub background_color ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"background color"} = $val;
    return 1;
}

sub background_pattern ($$) {
    $self = shift;
    $val = shift;
    $self->{options}->{"background pattern"} = $val;
    return 1;
}


package Chart::Graph::Xmgrace::Extra_Options;
@ISA = qw(Chart::Graph::Xmgrace::Base_Option);

sub _init {
    my $self = shift;  
    $self->{name} = "extra options";
    $self->{length} = 4;
    $self->{options} = {"extras" => undef,};	# extra options are \n delimited
}


# just dumps, verbatim, whatever the user inputs
sub print($$ ) {
    my $self = shift;
    my $handle = shift;
    my $string = "";
    my @xtra_opts;
    my $pre_sub = $self->{options}->{extras};
    if ($pre_sub) {
	@xtra_opts = split(/;\n*\s*/, $pre_sub);
    
	foreach $option (@xqtra_opts) {
	    $self->_printline($handle, "$option\n", $self->{"length"});
	}
    }
}

1;
