Image-Upload neuer Typ für VK-Lieferschein
[kivitendo-erp.git] / modules / override / PDF / Table.pm
index 990a2c6..602c887 100755 (executable)
@@ -134,8 +134,8 @@ sub text_block
     # 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
@@ -211,8 +211,12 @@ sub text_block
         }
 
         # 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));
         }
@@ -459,7 +463,7 @@ sub table
 
     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
@@ -501,8 +505,12 @@ sub table
                 $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;
             }
@@ -610,11 +618,9 @@ sub table
 
             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;
             }
@@ -667,10 +673,15 @@ sub table
 
             # 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;
@@ -742,9 +753,9 @@ sub table
                                        //  $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};
                 }
 
@@ -842,7 +853,7 @@ sub table
                 }
 
                 # 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;
 
@@ -856,7 +867,7 @@ sub table
 
                 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....
@@ -935,32 +946,11 @@ sub CalcColumnWidths
         $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);