--- loncom/xml/lontable.pm 2008/11/24 11:56:53 1.1 +++ loncom/xml/lontable.pm 2008/11/25 12:27:34 1.2 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Generating TeX tables. # -# $Id: lontable.pm,v 1.1 2008/11/24 11:56:53 foxr Exp $ +# $Id: lontable.pm,v 1.2 2008/11/25 12:27:34 foxr Exp $ # # # Copyright Michigan State University Board of Trustees @@ -239,7 +239,7 @@ sub new { my $self = { alignment => "left", outer_border => 0, - inner_borders => 0, + inner_border => 0, caption => "", theme => "Zurich", column_count => 0, @@ -259,7 +259,234 @@ sub new { #------------------------------------------------------------------------- # # Methods that get/set table global configuration. +# + +=pod + +=head2 Gets/set alignment. + +If the method is passed a new alignment value, that replaces the current one. +Regardless, the current alignment is used: + +=head3 Examples: + + my $align = $table->alignment(); # Return current alignment + $table->alignment("center"); # Attempt centered alignment. + +=cut + +sub alignment { + my ($self, $new_value) = @_; + + if (defined($new_value)) { + $self->{alignment} = $new_value; + } + return $self->{alignment}; +} + +=pod + +=head2 table_border + +Set or get the presence of an outer border in the table. +If passed a parameter, that parameter replaces the current request +for or not for an outer border. Regardless, the function returns +the final value of the outer_border request. + +=head3 Examples: + + $table->table_border(1); # Request an outer border. + my $outer_requested = $table->table_border(); + +=cut + +sub table_border { + my ($self, $new_value) = @_; + + if (defined($new_value)) { + $self->{outer_border} = $new_value; + } + return $self->{outer_border}; +} + + +=pod + +=head2 cell_border + +Set or get the presence of a request for cells to have borders +drawn around them. If a paramter is passed, it will be treated as +a new value for the cell border configuration. Regardless,the final +value of that configuration parameter is returned. + +=head3 Examples: + + my $cell_borders = $table->cell_border(); # ask if cell borders are requested. + $table->cell_border(1); # Request cell borders. + +=cut + +sub cell_borders { + my ($self, $new_value) = @_; + + if (defined($new_value)) { + $self->{inner_border} = $new_value; + } + reurn $self->{inner_border}; +} + +=pod + +=head2 caption + +Gets and/or sets the caption string for the table. The caption string appears to label +the table. If a parameter is supplied it will become the new caption string.k + +=head3 Examples: + + + $my caption = $table->caption(); + $table->caption("This is the new table caption"); + +=cut + +sub caption { + my ($self, $new_value) = @_; + + if (defined($new_value)) { + $self->catpion = $new_value; + } + + return $self->caption; +} + +=pod + +=head2 theme + +Gets and optionally sets the table theme. The table theme describes how the +table will be typset by the table package. If a parameter is supplied it +will be the new theme selection. + +=head3 Examples: + my $theme = $table->theme(); + $table->theme("Dresden"); + +=cut + +sub theme { + my ($self, $new_value) = @_; + + if (defined($new_value)) { + $self->theme = $new_value; + } + return $self->theme; +} + +=pod + +=head2 start_row + +Begins a new row in the table. If a row is already open, that row is +closed off prior to starting the new row. Rows can have the following attributes +which are specified by an optional hash passed in to this function. + +=over 3 + +=item default_halign + +The default horizontal alignment of the row. This can be "left", "center", or "right" + +=item default_valign + +The default vertical alignment of the row. This can be "top", "center", or "bottom" + +=back + +=head3 Examples: + + $table_start_row(); # no attributes. + $table_start({default_halign => "center", + default_valign => "bottom"}); # Create setting the attrbutes. + +=cut + +sub start_row { + my ($self, %config) = @_; + + if ($self->row_open) { + $self->end_row; + } + my $row_hash = { + is_header => 0, + default_halign => "left", + default_valign => "top", + cells => [] + }; + + # Override the defaults if the config hash is present: + + if (defined(%config)) { + foreach my $key (keys %config) { + $row_hash->{$key} = $config{$key}; + } + } + + my $rows = $self->{rows}; + push(@$rows, $row_hash); + + $self->row_open = 1; # Row is now open and ready for business. +} + +=pod + +=head2 end_row + +Closes off a row. Once closed, cells cannot be added to this row again. + +=head3 Examples: + + $table->close_row(); + + +=cut + +sub close_row { + my ($self) = @_; + + if ($self->row_open) { + + # Mostly we need to determine if this row has the maximum + # cell count of any row in existence in the table: + + my $row = $self->{rows}[-1]; + my $cells = $row->{cells}; + my $cell_count = scalar(@$cells); + if ($cell_count > $self->{column_count}) { + $self->{column_count} = $cell_count; + } + + $self->row_closed; + } +} + +=pod + +=head2 start_header + +Starts a row that is a header. This is the same as start_row,but the is_header flag +is set to true. + + +=cut + +sub start_header { + my ($self, %config) = @_; + + $self->start_row(%config); + $self->{rows}[-1]->is_header = 1; +}