RenderDataGrid.cpp [plain text]
#include "config.h"
#if ENABLE(DATAGRID)
#include "RenderDataGrid.h"
#include "CSSStyleSelector.h"
#include "FocusController.h"
#include "Frame.h"
#include "GraphicsContext.h"
#include "Page.h"
#include "RenderView.h"
#include "Scrollbar.h"
using std::min;
namespace WebCore {
static const int cDefaultWidth = 300;
RenderDataGrid::RenderDataGrid(Element* elt)
: RenderBlock(elt)
{
}
RenderDataGrid::~RenderDataGrid()
{
}
void RenderDataGrid::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
{
RenderBlock::styleDidChange(diff, oldStyle);
recalcStyleForColumns();
}
void RenderDataGrid::recalcStyleForColumns()
{
DataGridColumnList* columns = gridElement()->columns();
unsigned length = columns->length();
for (unsigned i = 0; i < length; ++i)
recalcStyleForColumn(columns->item(i));
}
void RenderDataGrid::recalcStyleForColumn(DataGridColumn* column)
{
if (!column->columnStyle())
column->setColumnStyle(document()->styleSelector()->pseudoStyleForDataGridColumn(column, style()));
if (!column->headerStyle())
column->setHeaderStyle(document()->styleSelector()->pseudoStyleForDataGridColumnHeader(column, style()));
}
RenderStyle* RenderDataGrid::columnStyle(DataGridColumn* column)
{
if (!column->columnStyle())
recalcStyleForColumn(column);
return column->columnStyle();
}
RenderStyle* RenderDataGrid::headerStyle(DataGridColumn* column)
{
if (!column->headerStyle())
recalcStyleForColumn(column);
return column->headerStyle();
}
void RenderDataGrid::calcPrefWidths()
{
m_minPrefWidth = 0;
m_maxPrefWidth = 0;
if (style()->width().isFixed() && style()->width().value() > 0)
m_minPrefWidth = m_maxPrefWidth = calcContentBoxWidth(style()->width().value());
else
m_maxPrefWidth = calcContentBoxWidth(cDefaultWidth);
if (style()->minWidth().isFixed() && style()->minWidth().value() > 0) {
m_maxPrefWidth = max(m_maxPrefWidth, calcContentBoxWidth(style()->minWidth().value()));
m_minPrefWidth = max(m_minPrefWidth, calcContentBoxWidth(style()->minWidth().value()));
} else if (style()->width().isPercent() || (style()->width().isAuto() && style()->height().isPercent()))
m_minPrefWidth = 0;
else
m_minPrefWidth = m_maxPrefWidth;
if (style()->maxWidth().isFixed() && style()->maxWidth().value() != undefinedLength) {
m_maxPrefWidth = min(m_maxPrefWidth, calcContentBoxWidth(style()->maxWidth().value()));
m_minPrefWidth = min(m_minPrefWidth, calcContentBoxWidth(style()->maxWidth().value()));
}
int toAdd = paddingLeft() + paddingRight() + borderLeft() + borderRight();
m_minPrefWidth += toAdd;
m_maxPrefWidth += toAdd;
setPrefWidthsDirty(false);
}
void RenderDataGrid::layout()
{
RenderBlock::layout();
layoutColumns();
}
void RenderDataGrid::layoutColumns()
{
}
void RenderDataGrid::paintObject(PaintInfo& paintInfo, int tx, int ty)
{
if (style()->visibility() != VISIBLE)
return;
RenderBlock::paintObject(paintInfo, tx, ty);
if (paintInfo.phase != PaintPhaseForeground)
return;
paintColumnHeaders(paintInfo, tx, ty);
}
void RenderDataGrid::paintColumnHeaders(PaintInfo& paintInfo, int tx, int ty)
{
DataGridColumnList* columns = gridElement()->columns();
unsigned length = columns->length();
for (unsigned i = 0; i < length; ++i) {
DataGridColumn* column = columns->item(i);
RenderStyle* columnStyle = headerStyle(column);
if (!columnStyle || columnStyle->display() == NONE || columnStyle->visibility() != VISIBLE)
continue;
IntRect columnRect(column->rect());
columnRect.move(tx, ty);
if (columnRect.intersects(paintInfo.rect))
paintColumnHeader(column, paintInfo, tx, ty);
}
}
void RenderDataGrid::paintColumnHeader(DataGridColumn*, PaintInfo&, int, int)
{
}
void RenderDataGrid::valueChanged(Scrollbar*)
{
}
void RenderDataGrid::invalidateScrollbarRect(Scrollbar*, const IntRect&)
{
}
bool RenderDataGrid::isActive() const
{
Page* page = document()->frame()->page();
return page && page->focusController()->isActive();
}
IntRect RenderDataGrid::convertFromScrollbarToContainingView(const Scrollbar* scrollbar, const IntRect& scrollbarRect) const
{
RenderView* view = this->view();
if (!view)
return scrollbarRect;
IntRect rect = scrollbarRect;
int scrollbarLeft = width() - borderRight() - scrollbar->width();
int scrollbarTop = borderTop();
rect.move(scrollbarLeft, scrollbarTop);
return view->frameView()->convertFromRenderer(this, rect);
}
IntRect RenderDataGrid::convertFromContainingViewToScrollbar(const Scrollbar* scrollbar, const IntRect& parentRect) const
{
RenderView* view = this->view();
if (!view)
return parentRect;
IntRect rect = view->frameView()->convertToRenderer(this, parentRect);
int scrollbarLeft = width() - borderRight() - scrollbar->width();
int scrollbarTop = borderTop();
rect.move(-scrollbarLeft, -scrollbarTop);
return rect;
}
IntPoint RenderDataGrid::convertFromScrollbarToContainingView(const Scrollbar* scrollbar, const IntPoint& scrollbarPoint) const
{
RenderView* view = this->view();
if (!view)
return scrollbarPoint;
IntPoint point = scrollbarPoint;
int scrollbarLeft = width() - borderRight() - scrollbar->width();
int scrollbarTop = borderTop();
point.move(scrollbarLeft, scrollbarTop);
return view->frameView()->convertFromRenderer(this, point);
}
IntPoint RenderDataGrid::convertFromContainingViewToScrollbar(const Scrollbar* scrollbar, const IntPoint& parentPoint) const
{
RenderView* view = this->view();
if (!view)
return parentPoint;
IntPoint point = view->frameView()->convertToRenderer(this, parentPoint);
int scrollbarLeft = width() - borderRight() - scrollbar->width();
int scrollbarTop = borderTop();
point.move(-scrollbarLeft, -scrollbarTop);
return point;
}
}
#endif