<?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; 
    } 
} 
?> 
 
 |