readCSS($pipeline->get_current_css_state()); $child = $root->first_child(); while ($child) { $child_box =& create_pdf_box($child, $pipeline); $box->add_child($child_box); $child = $child->next_sibling(); }; return $box; } function add_child(&$item) { if ($item->isCell()) { GenericContainerBox::add_child($item); }; } function TableRowBox() { // Call parent constructor $this->GenericContainerBox(); } // Normalize colspans by adding fake cells after the "colspanned" cell // Say, if we've got the following row: // 12 // we should get row containing four cells after normalization; // first contains "1" // second and third are completely empty // fourth contains "2" function normalize(&$pipeline) { for ($i=0, $size = count($this->content); $i < $size; $i++) { for ($j=1; $j<$this->content[$i]->colspan; $j++) { $this->add_fake_cell_after($i, $pipeline); // Note that add_fake_cell_after will increase the length of current row by one cell, // so we must increase $size variable $size++; }; }; } function add_fake_cell_after($index, &$pipeline) { array_splice($this->content, $index+1, 0, array(FakeTableCellBox::create($pipeline))); } function add_fake_cell_before($index, &$pipeline) { array_splice($this->content, $index, 0, array(FakeTableCellBox::create($pipeline))); } function append_fake_cell(&$pipeline) { $this->content[] = FakeTableCellBox::create($pipeline); } // Table specific function table_resize_row($height, $top) { // Do cell vertical-align // Calculate row baseline $baseline = $this->get_row_baseline(); // Process cells contained in current row for ($i=0, $size = count($this->content); $i<$size; $i++) { $cell =& $this->content[$i]; // Offset cell if needed $cell->offset(0, $top - $cell->get_top_margin()); // Vertical-align cell (do not apply to rowspans) if ($cell->rowspan == 1) { $va = $cell->get_css_property(CSS_VERTICAL_ALIGN); $va_fun = CSSVerticalAlign::value2pdf($va); $va_fun->apply_cell($cell, $height, $baseline); // Expand cell to full row height $cell->put_full_height($height); } } } function get_row_baseline() { $baseline = 0; for ($i=0, $size = count($this->content); $i<$size; $i++) { $cell = $this->content[$i]; if ($cell->rowspan == 1) { $baseline = max($baseline, $cell->get_cell_baseline()); }; } return $baseline; } function get_colspans($row_index) { $colspans = array(); for ($i=0, $size = count($this->content); $i<$size; $i++) { // Check if current colspan will run off the right table edge if ($this->content[$i]->colspan > 1) { $colspan = new CellSpan; $colspan->row = $row_index; $colspan->column = $i; $colspan->size = $this->content[$i]->colspan; $colspans[] = $colspan; } } return $colspans; } function get_rowspans($row_index) { $spans = array(); for ($i=0; $icontent); $i++) { if ($this->content[$i]->rowspan > 1) { $rowspan = new CellSpan; $rowspan->row = $row_index; $rowspan->column = $i; $rowspan->size = $this->content[$i]->rowspan; $spans[] = $rowspan; } } return $spans; } // Column widths function get_table_columns_max_widths(&$context) { $widths = array(); for ($i=0; $icontent); $i++) { // For now, colspans are treated as zero-width; they affect // column widths only in parent *_fit function if ($this->content[$i]->colspan > 1) { $widths[] = 0; } else { $widths[] = $this->content[$i]->get_max_width($context); } } return $widths; } function get_table_columns_min_widths(&$context) { $widths = array(); for ($i=0; $icontent); $i++) { // For now, colspans are treated as zero-width; they affect // column widths only in parent *_fit function if ($this->content[$i]->colspan > 1) { $widths[] = 0; } else { $widths[] = $this->content[$i]->get_min_width($context); }; } return $widths; } function row_height() { // Calculate height of each cell contained in this row $height = 0; for ($i=0; $icontent); $i++) { if ($this->content[$i]->rowspan <= 1) { $height = max($height, $this->content[$i]->get_full_height()); } } return $height; } /** * Note that we SHOULD owerride the show method inherited from GenericContainerBox, * as it MAY draw row background in case it was set via CSS rules. As row box * is a "fake" box and will never have reasonable size and/or position in the layout, * we should prevent this */ function show(&$viewport) { // draw content $size = count($this->content); for ($i=0; $i < $size; $i++) { /** * We'll check the visibility property here * Reason: all boxes (except the top-level one) are contained in some other box, * so every box will pass this check. The alternative is to add this check into every * box class show member. * * The only exception of absolute positioned block boxes which are drawn separately; * their show method is called explicitly; the similar check should be performed there */ $cell =& $this->content[$i]; $visibility = $cell->get_css_property(CSS_VISIBILITY); if ($visibility === VISIBILITY_VISIBLE) { if (is_null($cell->show($viewport))) { return null; }; }; } return true; } function isTableRow() { return true; } } ?>