LayoutTests:
[WebKit-https.git] / WebCore / rendering / RenderTable.h
1 /*
2  * This file is part of the DOM implementation for KDE.
3  *
4  * Copyright (C) 1997 Martin Jones (mjones@kde.org)
5  *           (C) 1997 Torben Weis (weis@kde.org)
6  *           (C) 1998 Waldo Bastian (bastian@kde.org)
7  *           (C) 1999 Lars Knoll (knoll@kde.org)
8  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
9  * Copyright (C) 2003, 2004, 2005, 2006 Apple Computer, Inc.
10  *
11  * This library is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Library General Public
13  * License as published by the Free Software Foundation; either
14  * version 2 of the License, or (at your option) any later version.
15  *
16  * This library is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19  * Library General Public License for more details.
20  *
21  * You should have received a copy of the GNU Library General Public License
22  * along with this library; see the file COPYING.LIB.  If not, write to
23  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24  * Boston, MA 02111-1307, USA.
25  */
26
27 #ifndef RenderTable_H
28 #define RenderTable_H
29
30 #include "DeprecatedArray.h"
31 #include "RenderBlock.h"
32
33 namespace WebCore {
34
35 class RenderTableCol;
36 class RenderTableCell;
37 class RenderTableSection;
38 class TableLayout;
39
40 class RenderTable : public RenderBlock {
41 public:
42     enum Rules {
43         None    = 0x00,
44         RGroups = 0x01,
45         CGroups = 0x02,
46         Groups  = 0x03,
47         Rows    = 0x05,
48         Cols    = 0x0a,
49         All     = 0x0f
50     };
51     enum Frame {
52         Void   = 0x00,
53         Above  = 0x01,
54         Below  = 0x02,
55         Lhs    = 0x04,
56         Rhs    = 0x08,
57         Hsides = 0x03,
58         Vsides = 0x0c,
59         Box    = 0x0f
60     };
61
62     RenderTable(Node*);
63     ~RenderTable();
64
65     virtual const char* renderName() const { return "RenderTable"; }
66
67     virtual void setStyle(RenderStyle*);
68
69     virtual bool isTable() const { return true; }
70
71     int getColumnPos(int col) const { return columnPos[col]; }
72
73     int hBorderSpacing() const { return hspacing; }
74     int vBorderSpacing() const { return vspacing; }
75     
76     bool collapseBorders() const { return style()->borderCollapse(); }
77     int borderLeft() const { return m_borderLeft; }
78     int borderRight() const { return m_borderRight; }
79     int borderTop() const;
80     int borderBottom() const;
81     
82     Rules getRules() const { return static_cast<Rules>(rules); }
83
84     const Color& bgColor() const { return style()->backgroundColor(); }
85
86     unsigned cellPadding() const { return padding; }
87     void setCellPadding(unsigned p) { padding = p; }
88
89     int outerBorderTop() const;
90     int outerBorderBottom() const;
91     int outerBorderLeft() const;
92     int outerBorderRight() const;
93     
94     int calcBorderLeft() const;
95     int calcBorderRight() const;
96     void recalcHorizontalBorders();
97
98     // overrides
99     virtual int overflowHeight(bool includeInterior = true) const { return height(); }
100     virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0);
101     virtual void paint(PaintInfo&, int tx, int ty);
102     virtual void paintBoxDecorations(PaintInfo&, int _tx, int _ty);
103     virtual void layout();
104     virtual void calcMinMaxWidth();
105
106     virtual RenderBlock* firstLineBlock() const;
107     virtual void updateFirstLetter();
108     
109     virtual void setCellWidths();
110
111     virtual void calcWidth();
112
113 #ifndef NDEBUG
114     virtual void dump(QTextStream *stream, DeprecatedString ind = "") const;
115 #endif
116     struct ColumnStruct {
117         enum {
118             WidthUndefined = 0xffff
119         };
120         ColumnStruct() {
121             span = 1;
122             width = WidthUndefined;
123         }
124         unsigned short span;
125         unsigned width; // the calculated position of the column
126     };
127
128     DeprecatedArray<int> columnPos;
129     DeprecatedArray<ColumnStruct> columns;
130
131     void splitColumn(int pos, int firstSpan);
132     void appendColumn(int span);
133     int numEffCols() const { return columns.size(); }
134     int spanOfEffCol(int effCol) const { return columns[effCol].span; }
135     int colToEffCol(int col) const {
136         int c = 0;
137         int i = 0;
138         while (c < col && i < (int)columns.size()) {
139             c += columns[i].span;
140             i++;
141         }
142         return i;
143     }
144     int effColToCol(int effCol) const {
145         int c = 0;
146         for (int i = 0; i < effCol; i++)
147             c += columns[i].span;
148         return c;
149     }
150
151     int bordersPaddingAndSpacing() const {
152         return borderLeft() + borderRight() + 
153                (collapseBorders() ? 0 : (paddingLeft() + paddingRight() + (numEffCols() + 1) * hBorderSpacing()));
154     }
155
156     RenderTableCol* colElement(int col) const;
157
158     void setNeedSectionRecalc() { needSectionRecalc = true; }
159
160     virtual RenderObject* removeChildNode(RenderObject*);
161
162     RenderTableCell* cellAbove(const RenderTableCell*) const;
163     RenderTableCell* cellBelow(const RenderTableCell*) const;
164     RenderTableCell* cellBefore(const RenderTableCell*) const;
165     RenderTableCell* cellAfter(const RenderTableCell*) const;
166  
167     CollapsedBorderValue* currentBorderStyle() { return m_currentBorder; }
168     
169     bool hasSections() const { return head || foot || firstBody; }
170
171     virtual IntRect getOverflowClipRect(int tx, int ty);
172
173     void recalcSectionsIfNeeded();
174
175 private:
176     void recalcSections();
177
178     friend class AutoTableLayout;
179     friend class FixedTableLayout;
180
181     RenderBlock* tCaption;
182     RenderTableSection* head;
183     RenderTableSection* foot;
184     RenderTableSection* firstBody;
185
186     TableLayout* tableLayout;
187
188     CollapsedBorderValue* m_currentBorder;
189     
190     unsigned frame : 4; // Frame
191     unsigned rules : 4; // Rules
192
193     bool has_col_elems : 1;
194     unsigned padding : 22;
195     bool needSectionRecalc : 1;
196     
197     short hspacing;
198     short vspacing;
199     int m_borderRight;
200     int m_borderLeft;
201 };
202
203 }
204
205 #endif