1 /* 2 * Copyright (C) 1997 Martin Jones (mjones (at) kde.org) 3 * (C) 1997 Torben Weis (weis (at) kde.org) 4 * (C) 1998 Waldo Bastian (bastian (at) kde.org) 5 * (C) 1999 Lars Knoll (knoll (at) kde.org) 6 * (C) 1999 Antti Koivisto (koivisto (at) kde.org) 7 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009 Apple Inc. All rights reserved. 8 * 9 * This library is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU Library General Public 11 * License as published by the Free Software Foundation; either 12 * version 2 of the License, or (at your option) any later version. 13 * 14 * This library is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * Library General Public License for more details. 18 * 19 * You should have received a copy of the GNU Library General Public License 20 * along with this library; see the file COPYING.LIB. If not, write to 21 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 22 * Boston, MA 02110-1301, USA. 23 */ 24 25 #ifndef RenderTableCell_h 26 #define RenderTableCell_h 27 28 #include "RenderTableSection.h" 29 30 namespace WebCore { 31 32 class RenderTableCell : public RenderBlock { 33 public: 34 explicit RenderTableCell(Node*); 35 36 // FIXME: need to implement cellIndex 37 int cellIndex() const { return 0; } 38 void setCellIndex(int) { } 39 40 int colSpan() const { return m_columnSpan; } 41 void setColSpan(int c) { m_columnSpan = c; } 42 43 int rowSpan() const { return m_rowSpan; } 44 void setRowSpan(int r) { m_rowSpan = r; } 45 46 int col() const { return m_column; } 47 void setCol(int col) { m_column = col; } 48 int row() const { return m_row; } 49 void setRow(int row) { m_row = row; } 50 51 RenderTableSection* section() const { return toRenderTableSection(parent()->parent()); } 52 RenderTable* table() const { return toRenderTable(parent()->parent()->parent()); } 53 54 Length styleOrColLogicalWidth() const; 55 56 virtual void computePreferredLogicalWidths(); 57 58 void updateLogicalWidth(int); 59 60 virtual int borderLeft() const; 61 virtual int borderRight() const; 62 virtual int borderTop() const; 63 virtual int borderBottom() const; 64 virtual int borderStart() const; 65 virtual int borderEnd() const; 66 virtual int borderBefore() const; 67 virtual int borderAfter() const; 68 69 int borderHalfLeft(bool outer) const; 70 int borderHalfRight(bool outer) const; 71 int borderHalfTop(bool outer) const; 72 int borderHalfBottom(bool outer) const; 73 74 int borderHalfStart(bool outer) const; 75 int borderHalfEnd(bool outer) const; 76 int borderHalfBefore(bool outer) const; 77 int borderHalfAfter(bool outer) const; 78 79 CollapsedBorderValue collapsedStartBorder() const; 80 CollapsedBorderValue collapsedEndBorder() const; 81 CollapsedBorderValue collapsedBeforeBorder() const; 82 CollapsedBorderValue collapsedAfterBorder() const; 83 84 CollapsedBorderValue collapsedLeftBorder() const; 85 CollapsedBorderValue collapsedRightBorder() const; 86 CollapsedBorderValue collapsedTopBorder() const; 87 CollapsedBorderValue collapsedBottomBorder() const; 88 89 typedef Vector<CollapsedBorderValue, 100> CollapsedBorderStyles; 90 void collectBorderStyles(CollapsedBorderStyles&) const; 91 static void sortBorderStyles(CollapsedBorderStyles&); 92 93 virtual void updateFromElement(); 94 95 virtual void layout(); 96 97 virtual void paint(PaintInfo&, int tx, int ty); 98 99 void paintBackgroundsBehindCell(PaintInfo&, int tx, int ty, RenderObject* backgroundObject); 100 101 int cellBaselinePosition() const; 102 103 void setIntrinsicPaddingBefore(int p) { m_intrinsicPaddingBefore = p; } 104 void setIntrinsicPaddingAfter(int p) { m_intrinsicPaddingAfter = p; } 105 void setIntrinsicPadding(int before, int after) { setIntrinsicPaddingBefore(before); setIntrinsicPaddingAfter(after); } 106 void clearIntrinsicPadding() { setIntrinsicPadding(0, 0); } 107 108 int intrinsicPaddingBefore() const { return m_intrinsicPaddingBefore; } 109 int intrinsicPaddingAfter() const { return m_intrinsicPaddingAfter; } 110 111 virtual int paddingTop(bool includeIntrinsicPadding = true) const; 112 virtual int paddingBottom(bool includeIntrinsicPadding = true) const; 113 virtual int paddingLeft(bool includeIntrinsicPadding = true) const; 114 virtual int paddingRight(bool includeIntrinsicPadding = true) const; 115 116 // FIXME: For now we just assume the cell has the same block flow direction as the table. It's likely we'll 117 // create an extra anonymous RenderBlock to handle mixing directionality anyway, in which case we can lock 118 // the block flow directionality of the cells to the table's directionality. 119 virtual int paddingBefore(bool includeIntrinsicPadding = true) const; 120 virtual int paddingAfter(bool includeIntrinsicPadding = true) const; 121 122 virtual void setOverrideSize(int); 123 void setOverrideSizeFromRowHeight(int); 124 125 bool hasVisualOverflow() const { return m_overflow && !borderBoxRect().contains(m_overflow->visualOverflowRect()); } 126 127 virtual void scrollbarsChanged(bool horizontalScrollbarChanged, bool verticalScrollbarChanged); 128 129 bool cellWidthChanged() const { return m_cellWidthChanged; } 130 void setCellWidthChanged(bool b = true) { m_cellWidthChanged = b; } 131 132 protected: 133 virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle); 134 virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle); 135 136 private: 137 virtual const char* renderName() const { return isAnonymous() ? "RenderTableCell (anonymous)" : "RenderTableCell"; } 138 139 virtual bool isTableCell() const { return true; } 140 141 virtual void destroy(); 142 143 virtual void computeLogicalWidth(); 144 145 virtual void paintBoxDecorations(PaintInfo&, int tx, int ty); 146 virtual void paintMask(PaintInfo&, int tx, int ty); 147 148 virtual IntSize offsetFromContainer(RenderObject*, const IntPoint&) const; 149 virtual IntRect clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer); 150 virtual void computeRectForRepaint(RenderBoxModelObject* repaintContainer, IntRect&, bool fixed = false); 151 152 void paintCollapsedBorder(GraphicsContext*, int x, int y, int w, int h); 153 154 int m_row; 155 int m_column; 156 int m_rowSpan; 157 int m_columnSpan : 31; 158 bool m_cellWidthChanged : 1; 159 int m_intrinsicPaddingBefore; 160 int m_intrinsicPaddingAfter; 161 }; 162 163 inline RenderTableCell* toRenderTableCell(RenderObject* object) 164 { 165 ASSERT(!object || object->isTableCell()); 166 return static_cast<RenderTableCell*>(object); 167 } 168 169 inline const RenderTableCell* toRenderTableCell(const RenderObject* object) 170 { 171 ASSERT(!object || object->isTableCell()); 172 return static_cast<const RenderTableCell*>(object); 173 } 174 175 // This will catch anyone doing an unnecessary cast. 176 void toRenderTableCell(const RenderTableCell*); 177 178 } // namespace WebCore 179 180 #endif // RenderTableCell_h 181