#ifndef RenderTable_H
#define RenderTable_H
#include "RenderBlock.h"
#include <wtf/Vector.h>
namespace WebCore {
class RenderTableCol;
class RenderTableCell;
class RenderTableSection;
class TableLayout;
class RenderTable : public RenderBlock {
public:
enum Rules {
None = 0x00,
RGroups = 0x01,
CGroups = 0x02,
Groups = 0x03,
Rows = 0x05,
Cols = 0x0a,
All = 0x0f
};
enum Frame {
Void = 0x00,
Above = 0x01,
Below = 0x02,
Lhs = 0x04,
Rhs = 0x08,
Hsides = 0x03,
Vsides = 0x0c,
Box = 0x0f
};
RenderTable(Node*);
~RenderTable();
virtual const char* renderName() const { return "RenderTable"; }
virtual void setStyle(RenderStyle*);
virtual bool isTable() const { return true; }
int getColumnPos(int col) const { return columnPos[col]; }
int hBorderSpacing() const { return hspacing; }
int vBorderSpacing() const { return vspacing; }
bool collapseBorders() const { return style()->borderCollapse(); }
int borderLeft() const { return m_borderLeft; }
int borderRight() const { return m_borderRight; }
int borderTop() const;
int borderBottom() const;
Rules getRules() const { return static_cast<Rules>(rules); }
const Color& bgColor() const { return style()->backgroundColor(); }
unsigned cellPadding() const { return padding; }
void setCellPadding(unsigned p) { padding = p; }
int outerBorderTop() const;
int outerBorderBottom() const;
int outerBorderLeft() const;
int outerBorderRight() const;
int calcBorderLeft() const;
int calcBorderRight() const;
void recalcHorizontalBorders();
virtual int overflowHeight(bool includeInterior = true) const { return height(); }
virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0);
virtual void paint(PaintInfo&, int tx, int ty);
virtual void paintBoxDecorations(PaintInfo&, int _tx, int _ty);
virtual void layout();
virtual void calcMinMaxWidth();
virtual RenderBlock* firstLineBlock() const;
virtual void updateFirstLetter();
virtual void setCellWidths();
virtual void calcWidth();
#ifndef NDEBUG
virtual void dump(TextStream *stream, DeprecatedString ind = "") const;
#endif
struct ColumnStruct {
enum {
WidthUndefined = 0xffff
};
ColumnStruct() {
span = 1;
width = WidthUndefined;
}
unsigned short span;
unsigned width; };
Vector<int> columnPos;
Vector<ColumnStruct> columns;
void splitColumn(int pos, int firstSpan);
void appendColumn(int span);
int numEffCols() const { return columns.size(); }
int spanOfEffCol(int effCol) const { return columns[effCol].span; }
int colToEffCol(int col) const
{
int i = 0;
int effCol = numEffCols();
for (int c = 0; c < col && i < effCol; ++i)
c += columns[i].span;
return i;
}
int effColToCol(int effCol) const
{
int c = 0;
for (int i = 0; i < effCol; i++)
c += columns[i].span;
return c;
}
int bordersPaddingAndSpacing() const {
return borderLeft() + borderRight() +
(collapseBorders() ? 0 : (paddingLeft() + paddingRight() + (numEffCols() + 1) * hBorderSpacing()));
}
RenderTableCol* colElement(int col) const;
void setNeedSectionRecalc() { needSectionRecalc = true; }
virtual RenderObject* removeChildNode(RenderObject*);
RenderTableSection* sectionAbove(const RenderTableSection*, bool skipEmptySections = false) const;
RenderTableSection* sectionBelow(const RenderTableSection*, bool skipEmptySections = false) const;
RenderTableCell* cellAbove(const RenderTableCell*) const;
RenderTableCell* cellBelow(const RenderTableCell*) const;
RenderTableCell* cellBefore(const RenderTableCell*) const;
RenderTableCell* cellAfter(const RenderTableCell*) const;
CollapsedBorderValue* currentBorderStyle() { return m_currentBorder; }
bool hasSections() const { return head || foot || firstBody; }
virtual IntRect getOverflowClipRect(int tx, int ty);
void recalcSectionsIfNeeded();
private:
void recalcSections();
friend class AutoTableLayout;
friend class FixedTableLayout;
RenderBlock* tCaption;
RenderTableSection* head;
RenderTableSection* foot;
RenderTableSection* firstBody;
TableLayout* tableLayout;
CollapsedBorderValue* m_currentBorder;
unsigned frame : 4; unsigned rules : 4;
bool has_col_elems : 1;
unsigned padding : 22;
bool needSectionRecalc : 1;
short hspacing;
short vspacing;
int m_borderRight;
int m_borderLeft;
};
}
#endif