//
// Table.cpp
//

#include "Poco/PDF/Table.h"


namespace Poco {
namespace PDF {


Table::Table(int columnCount, int rowCount, const std::string& name, Cell::FontMapPtr pFontMap):
	_name(name), _cells(rowCount, TableRow(columnCount))
{
	setFonts(pFontMap);
}


Table::~Table()
{
}


void Table::addRow()
{
	_cells.push_back(TableRow(columns()));
}


void Table::addRow(const TableRow& row)
{
	if (_cells.empty())
	{
		_cells.push_back(row);
	}
	else
	{
		_cells.push_back(row);
		_cells.back().resize(_cells.front().size());
	}
}


void Table::setCell(int col, int row, const Cell& cell)
{
	_cells[row][col] = cell;
	if (_pFontMap && !cell.getFonts()) _cells[row][col].setFonts(_pFontMap);
}


void Table::setColumnWidth(int col, double width)
{
}


void Table::setFonts(Cell::FontMapPtr pFontMap)
{
	_pFontMap = pFontMap;
	if (_pFontMap) { poco_assert(_pFontMap->size() == 4); }
}


void Table::draw(Page& page, float x, float y, float width, float height)
{
	if (_cells.size())
	{
		int rows = static_cast<int>(_cells.size());
		int cols = static_cast<int>(_cells[0].size());
		int r = 0;
		for (Cells::iterator it = _cells.begin(); it != _cells.end(); ++it)
		{
			TableRow& row(*it);
			float h = height / rows;
			int c = 0;
			float lastX = x;
			for (TableRow::iterator itr = row.begin(); itr != row.end(); ++itr)
			{
				Cell& cell(*itr);
				float w = width / cols;
				if (!cell.hasWidth())
				{
					cell.draw(page, x + (w * c), y - (h * r), w, h);
					lastX += (w * c);
				}
				else
				{
					w = width * cell.getWidthAsPct() / 100.0f;
					cell.draw(page, lastX, y - (h * r), w, h);
					lastX += w;
				}

				++c;
			}
			++r;
		}
	}
}


} } // namespace Poco::PDF
