c316d3cae1277fca367a6f9ee532a5ceedd0d767
[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;
78     int borderRight() const;
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     // overrides
90     virtual int overflowHeight(bool includeInterior = true) const { return height(); }
91     virtual int overflowWidth(bool includeInterior = true) const { return width(); }
92     virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0);
93     virtual void paint(PaintInfo&, int tx, int ty);
94     virtual void paintBoxDecorations(PaintInfo&, int _tx, int _ty);
95     virtual void layout();
96     virtual void calcMinMaxWidth();
97
98     virtual RenderBlock* firstLineBlock() const;
99     virtual void updateFirstLetter();
100     
101     virtual void setCellWidths();
102
103     virtual void calcWidth();
104
105 #ifndef NDEBUG
106     virtual void dump(QTextStream *stream, DeprecatedString ind = "") const;
107 #endif
108     struct ColumnStruct {
109         enum {
110             WidthUndefined = 0xffff
111         };
112         ColumnStruct() {
113             span = 1;
114             width = WidthUndefined;
115         }
116         unsigned short span;
117         unsigned width; // the calculated position of the column
118     };
119
120     DeprecatedArray<int> columnPos;
121     DeprecatedArray<ColumnStruct> columns;
122
123     void splitColumn(int pos, int firstSpan);
124     void appendColumn(int span);
125     int numEffCols() const { return columns.size(); }
126     int spanOfEffCol(int effCol) const { return columns[effCol].span; }
127     int colToEffCol(int col) const {
128         int c = 0;
129         int i = 0;
130         while (c < col && i < (int)columns.size()) {
131             c += columns[i].span;
132             i++;
133         }
134         return i;
135     }
136     int effColToCol(int effCol) const {
137         int c = 0;
138         for (int i = 0; i < effCol; i++)
139             c += columns[i].span;
140         return c;
141     }
142
143     int bordersPaddingAndSpacing() const {
144         return borderLeft() + borderRight() + 
145                (collapseBorders() ? 0 : (paddingLeft() + paddingRight() + (numEffCols() + 1) * hBorderSpacing()));
146     }
147
148     RenderTableCol* colElement(int col);
149
150     void setNeedSectionRecalc() { needSectionRecalc = true; }
151
152     virtual RenderObject* removeChildNode(RenderObject*);
153
154     RenderTableCell* cellAbove(const RenderTableCell*) const;
155     RenderTableCell* cellBelow(const RenderTableCell*) const;
156     RenderTableCell* cellBefore(const RenderTableCell*) const;
157     RenderTableCell* cellAfter(const RenderTableCell*) const;
158  
159     CollapsedBorderValue* currentBorderStyle() { return m_currentBorder; }
160     
161     bool hasSections() const { return head || foot || firstBody; }
162
163     virtual IntRect getOverflowClipRect(int tx, int ty);
164
165     void recalcSectionsIfNeeded();
166
167 private:
168     void recalcSections();
169
170     friend class AutoTableLayout;
171     friend class FixedTableLayout;
172
173     RenderBlock* tCaption;
174     RenderTableSection* head;
175     RenderTableSection* foot;
176     RenderTableSection* firstBody;
177
178     TableLayout* tableLayout;
179
180     CollapsedBorderValue* m_currentBorder;
181     
182     unsigned frame : 4; // Frame
183     unsigned rules : 4; // Rules
184
185     bool has_col_elems : 1;
186     unsigned padding : 22;
187     bool needSectionRecalc : 1;
188     
189     short hspacing;
190     short vspacing;
191 };
192
193 }
194
195 #endif