<?php
/*
* Copyright 2008 Sam Barnett-Cormack
*
* This file is part of PHPTables.
*
* PHPTables is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Foobar is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
*/
class Table {
private $num_columns;
private $rows = array();
private $headings;
public $style_class = NULL;
private function update_state() {
if (isset($this->headings)) {
$this->num_columns = $this->headings->get_width();
} else {
$this->num_columns = 0;
}
}
function __construct(Row $headings = NULL) {
if (isset($headings)) {
$this->headings = $headings;
} else {
$this->headings = new Row();
}
$this->update_state();
}
function empty_headings() {
$this->headings->empty_row();
}
function add_heading(Cell $heading) {
$this->headings->add_cell($heading);
$this->update_state();
}
function set_headings(Row $headings) {
$this->headings = $headings;
$this->update_state();
}
function num_rows() {
return count($this->rows);
}
function num_cols() {
return $this->num_columns;
}
function clear_rows() {
$this->rows = array();
}
function add_row(Row $row, $index = NULL) {
if ($row->get_width() != $this->num_columns) {
throw new Exception("Row does not have correct number of columns (want " . $this->num_columns . ", row has " . $row->get_width() . ")");
}
if (isset($index)) {
if (!is_int($index)) {
throw new InvalidArgumentException("Index must be an integer");
}
if (isset($this->rows[$index])) {
$rkeys = rsort(array_keys($this->rows));
for ($i = $rkeys[0]; i >= $index; $i++) {
$this->rows[$i+1] = $this->rows[$i];
}
}
$this->rows[$index] = &$row;
$this->condense_rows();
} else {
$this->rows[] = &$row;
}
}
function set_row(Row $row, $index) {
if ($row->get_width() != $this->num_columns) {
throw new Exception("Row does not have correct number of columns");
}
if (!is_int($index)) {
throw new InvalidArgumentException("Index must be an integer");
}
$this->rows[$index] = $row;
$this->condense_rows();
}
private function condense_rows() {
$newrows = array();
foreach ($this->rows as $row) {
$newrows[] = $row;
}
$this->rows = $newrows;
}
function get_cell_at($rowindex,$columnindex) {
if (!is_int($rowindex)) {
throw new InvalidArgumentException("Row index must be an integer");
}
if (!is_int($columnindex)) {
throw new InvalidArgumentException("Column index must be an integer");
}
if ($columnindex >= $this->num_columns) {
throw new InvalidArgumentException("Column index out of bounds");
}
if (isset($this->rows[$rowindex])) {
return $this->rows[$rowindex]->get_cell_at_column($columnindex);
} else {
throw new InvalidArgumentException("Row index out of bounds");
}
}
function get_html() {
$output = "<!-- PHPTables generated table follows: -->\n";
$output .= "<table";
if (isset($this->style_class)) {
$output .= " class=\"" . $this->style_class . "\" ";
}
$output .= ">\n";
// fill in headings
if (isset($this->headings->style_class)) {
$output .= "\t<tr class=\"" . $this->headings->style_class . "\" >\n";
} else {
$output .= "\t<tr>\n";
}
foreach ($this->headings as $head) {
if (isset($head->style_class)) {
$output .= "\t\t<th class=\"" . $head->style_class . "\" >\n";
} else {
$output .= "\t\t<th>\n";
}
$output .= "\t\t\t" . $head->get_content() . "\n";
$output .= "\t\t</th>\n";
}
$output .= "\t</tr>\n";
// fill in everything else
foreach ($this->rows as $row) {
if (isset($row->style_class)) {
$output .= "\t<tr class=\"" . $row->style_class . "\" >\n";
} else {
$output .= "\t<tr>\n";
}
foreach ($row as $cell) {
if (isset($cell->style_class)) {
$output .= "\t\t<td class=\"" . $cell->style_class . "\" >\n";
} else {
$output .= "\t\t<td>\n";
}
$output .= "\t\t\t" . $cell->get_content() . "\n";
$output .= "\t\t</td>\n";
}
$output .= "\t</tr>\n";
}
// and finish
$output .= "</table>";
return $output;
}
}
?>
|