Blame view

dompdf/src/FrameReflower/TableCell.php 3.38 KB
670b6d6f8   tuan   2016/09/22 - Copy...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
  <?php
  /**
   * @package dompdf
   * @link    http://dompdf.github.com/
   * @author  Benj Carson <benjcarson@digitaljunkies.ca>
   * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
   */
  namespace Dompdf\FrameReflower;
  
  use Dompdf\FrameDecorator\Block as BlockFrameDecorator;
  use Dompdf\FrameDecorator\Table as TableFrameDecorator;
  
  /**
   * Reflows table cells
   *
   * @package dompdf
   */
  class TableCell extends Block
  {
      function __construct(BlockFrameDecorator $frame)
      {
          parent::__construct($frame);
      }
  
      function reflow(BlockFrameDecorator $block = null)
      {
  
          $style = $this->_frame->get_style();
  
          $table = TableFrameDecorator::find_parent_table($this->_frame);
          $cellmap = $table->get_cellmap();
  
          list($x, $y) = $cellmap->get_frame_position($this->_frame);
          $this->_frame->set_position($x, $y);
  
          $cells = $cellmap->get_spanned_cells($this->_frame);
  
          $w = 0;
          foreach ($cells["columns"] as $i) {
              $col = $cellmap->get_column($i);
              $w += $col["used-width"];
          }
  
          //FIXME?
          $h = $this->_frame->get_containing_block("h");
  
          $left_space = $style->length_in_pt(array($style->margin_left,
              $style->padding_left,
              $style->border_left_width),
              $w);
  
          $right_space = $style->length_in_pt(array($style->padding_right,
              $style->margin_right,
              $style->border_right_width),
              $w);
  
          $top_space = $style->length_in_pt(array($style->margin_top,
              $style->padding_top,
              $style->border_top_width),
              $h);
          $bottom_space = $style->length_in_pt(array($style->margin_bottom,
              $style->padding_bottom,
              $style->border_bottom_width),
              $h);
  
          $style->width = $cb_w = $w - $left_space - $right_space;
  
          $content_x = $x + $left_space;
          $content_y = $line_y = $y + $top_space;
  
          // Adjust the first line based on the text-indent property
          $indent = $style->length_in_pt($style->text_indent, $w);
          $this->_frame->increase_line_width($indent);
  
          $page = $this->_frame->get_root();
  
          // Set the y position of the first line in the cell
          $line_box = $this->_frame->get_current_line_box();
          $line_box->y = $line_y;
  
          // Set the containing blocks and reflow each child
          foreach ($this->_frame->get_children() as $child) {
  
              if ($page->is_full())
                  break;
  
              $child->set_containing_block($content_x, $content_y, $cb_w, $h);
  
              $this->process_clear($child);
  
              $child->reflow($this->_frame);
  
              $this->process_float($child, $x + $left_space, $w - $right_space - $left_space);
          }
  
          // Determine our height
          $style_height = $style->length_in_pt($style->height, $h);
  
          $this->_frame->set_content_height($this->_calculate_content_height());
  
          $height = max($style_height, $this->_frame->get_content_height());
  
          // Let the cellmap know our height
          $cell_height = $height / count($cells["rows"]);
  
          if ($style_height <= $height)
              $cell_height += $top_space + $bottom_space;
  
          foreach ($cells["rows"] as $i)
              $cellmap->set_row_height($i, $cell_height);
  
          $style->height = $height;
  
          $this->_text_align();
  
          $this->vertical_align();
  
      }
  
  }