# Check if any text to display
unless( defined( $text) and length($text) > 0 )
{
- carp "Warning: No input text found. Trying to add dummy '-' and not to break everything.\n";
- $text = '-';
+# carp "Warning: No input text found. Trying to add dummy '-' and not to break everything.\n";
+ $text = ' ';
}
# Strip any <CR> and Split the text into paragraphs
}
# Lets take from paragraph as many words as we can put into $width - $indent;
- while ( @paragraph and $text_object->advancewidth( join("\x20", @line)."\x20" . $paragraph[0]) +
- $line_width < $width )
+ # Always take at least one word; otherwise we'd end up in an infinite loop.
+ while ( !scalar(@line) || (
+ @paragraph && (
+ $text_object->advancewidth( join("\x20", @line)."\x20" . $paragraph[0]) + $line_width < $width
+ )
+ ))
{
push(@line, shift(@paragraph));
}
for( my $row_idx = 0; $row_idx < scalar(@$data) ; $row_idx++ )
{
- push @header_row_widths, [] if $row_idx < $header_props->{num_header_rows};
+ #push @header_row_widths, [] if $row_idx < $header_props->{num_header_rows};
my $column_widths = []; #holds the width of each column
# Init the height for this row
$rows_height->[$row_idx] = $cell_font_size;
}
+ if (!defined $data->[$row_idx][$column_idx]) {
+ $data->[$row_idx][$column_idx] = ' ';
+ }
+
# This should fix a bug with very long words like serial numbers etc.
- if( $max_word_len > 0 )
+ if( $max_word_len > 0 && $data->[$row_idx][$column_idx])
{
$data->[$row_idx][$column_idx] =~ s#(\S{$max_word_len})(?=\S)#$1 #g;
}
if( ref $header_props and $header_props->{'repeat'})
{
- for my $idx (0 .. $header_props->{num_header_rows} - 1) {
- unshift @$data, [ @{ $header_rows[$idx] } ];
- unshift @$row_col_widths, [ @{ $header_row_widths[$idx] } ];
- unshift @$rows_height, $header_row_heights[$idx];
- }
+ unshift @$data, @header_rows;
+ unshift @$row_col_widths, @header_row_widths;
+ unshift @$rows_height, @header_row_heights;
$remaining_header_rows = $header_props->{num_header_rows};
$first_row = 1;
}
# Row cell props - TODO in another commit
+ # Added to resolve infite loop bug with returned undef values
+ for(my $d = 0; $d < scalar(@{$record}) ; $d++)
+ {
+ $record->[$d] = ' ' unless( defined $record->[$d]);
+ }
# Choose colors for this row
- $background_color = $row_index % 2 ? $background_color_even : $background_color_odd;
- $font_color = $row_index % 2 ? $font_color_even : $font_color_odd;
+ $background_color = ($row_index - $header_props->{num_header_rows}) % 2 ? $background_color_even : $background_color_odd;
+ $font_color = ($row_index - $header_props->{num_header_rows}) % 2 ? $font_color_even : $font_color_odd;
#Determine current row height
my $current_row_height = $pad_top + $pre_calculated_row_height + $pad_bot;
// $default_text;
my $this_width;
- if (!$remaining_header_rows && $cell_props->[$row_index][$column_idx]->{colspan}) {
- $colspan = $cell_props->[$row_index][$column_idx]->{colspan};
- } elsif ($remaining_header_rows && $header_row_cell_props[$header_props->{num_header_rows} - $remaining_header_rows][$column_idx]->{colspan}) {
+ if (!$remaining_header_rows && $cell_props->[$row_index + $header_props->{num_header_rows}][$column_idx]->{colspan}) {
+ $colspan = $cell_props->[$row_index + $header_props->{num_header_rows}][$column_idx]->{colspan};
+ } elsif ($remaining_header_rows && ($header_row_cell_props[$header_props->{num_header_rows} - $remaining_header_rows][$column_idx]->{colspan})) {
$colspan = $header_row_cell_props[$header_props->{num_header_rows} - $remaining_header_rows][$column_idx]->{colspan};
}
}
# Get the most specific value if none was already set from header_props
- $cell_bg_color ||= $cell_props->[$row_index][$column_idx]->{'background_color'}
+ $cell_bg_color ||= $cell_props->[$row_index + $header_props->{num_header_rows}][$column_idx]->{'background_color'}
|| $col_props->[$column_idx]->{'background_color'}
|| $background_color;
if ($line_w && $vertical_lines[$column_idx] && ($column_idx != (scalar(@{ $record }) - 1))) {
$gfx->move($cur_x, $cur_y);
- $gfx->vline($cur_y - $row_h);
+ $gfx->vline($cur_y - $current_row_height);
$gfx->fillcolor($border_color);
}
}#End of for(my $column_idx....
$calc_widths->[$j] = $col_props->[$j]->{min_w} || 0;;
}
- # Allow columns to expand to max_w before applying extra space equally.
- my $is_last_iter;
- for (;;)
- {
- my $span = ($avail_width - $min_width) / scalar( @$col_props);
- last if $span <= 0;
-
- $min_width = 0;
- my $next_will_be_last_iter = 1;
- for(my $j = 0; $j < scalar(@$col_props); $j++ )
- {
- my $new_w = $calc_widths->[$j] + $span;
-
- if (!$is_last_iter && $new_w > $col_props->[$j]->{max_w})
- {
- $new_w = $col_props->[$j]->{max_w}
- }
- if ($calc_widths->[$j] != $new_w )
- {
- $calc_widths->[$j] = $new_w;
- $next_will_be_last_iter = 0;
- }
- $min_width += $new_w;
- }
- last if $is_last_iter;
- $is_last_iter = $next_will_be_last_iter;
+ my $span = 0;
+ # Calculate how much can be added to every column to fit the available width
+ $span = ($avail_width - $min_width) / scalar( @$col_props);
+ for (my $j = 0; $j < scalar(@$col_props); $j++ ) {
+ $calc_widths->[$j] = $col_props->[$j]->{min_w} + $span;
}
return ($calc_widths,$avail_width);