221ee6a4168a9a681f9b34850ddc2975869fca2b
[WebKit-https.git] / WebCore / khtml / html / html_tableimpl.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 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 HTML_TABLEIMPL_H
28 #define HTML_TABLEIMPL_H
29
30 #include "html/html_elementimpl.h"
31
32 namespace DOM {
33
34 class DOMString;
35 class HTMLTableElementImpl;
36 class HTMLTableSectionElementImpl;
37 class HTMLTableSectionElement;
38 class HTMLTableRowElementImpl;
39 class HTMLTableRowElement;
40 class HTMLTableCellElementImpl;
41 class HTMLTableCellElement;
42 class HTMLTableColElementImpl;
43 class HTMLTableColElement;
44 class HTMLTableCaptionElementImpl;
45 class HTMLTableCaptionElement;
46 class HTMLElement;
47 class HTMLCollection;
48 class CSSStyleDeclarationImpl;
49
50 class HTMLTableElementImpl : public HTMLElementImpl
51 {
52 public:
53     enum Rules {
54         None    = 0x00,
55         RGroups = 0x01,
56         CGroups = 0x02,
57         Groups  = 0x03,
58         Rows    = 0x05,
59         Cols    = 0x0a,
60         All     = 0x0f
61     };
62     enum Frame {
63         Void   = 0x00,
64         Above  = 0x01,
65         Below  = 0x02,
66         Lhs    = 0x04,
67         Rhs    = 0x08,
68         Hsides = 0x03,
69         Vsides = 0x0c,
70         Box    = 0x0f
71     };
72
73     HTMLTableElementImpl(DocumentPtr *doc);
74     ~HTMLTableElementImpl();
75
76     virtual Id id() const;
77
78     HTMLTableCaptionElementImpl *caption() const { return tCaption; }
79     NodeImpl *setCaption( HTMLTableCaptionElementImpl * );
80
81     HTMLTableSectionElementImpl *tHead() const { return head; }
82     NodeImpl *setTHead( HTMLTableSectionElementImpl * );
83
84     HTMLTableSectionElementImpl *tFoot() const { return foot; }
85     NodeImpl *setTFoot( HTMLTableSectionElementImpl * );
86
87     NodeImpl *setTBody( HTMLTableSectionElementImpl * );
88
89     HTMLElementImpl *createTHead (  );
90     void deleteTHead (  );
91     HTMLElementImpl *createTFoot (  );
92     void deleteTFoot (  );
93     HTMLElementImpl *createCaption (  );
94     void deleteCaption (  );
95     HTMLElementImpl *insertRow ( long index, int &exceptioncode );
96     void deleteRow ( long index, int &exceptioncode );
97
98     // overrides
99     virtual NodeImpl *addChild(NodeImpl *child);
100     
101     virtual bool mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const;
102     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
103
104     // Used to obtain either a solid or outset border decl.
105     virtual CSSMutableStyleDeclarationImpl* additionalAttributeStyleDecl();
106     CSSMutableStyleDeclarationImpl* getSharedCellDecl();
107
108     virtual void attach();
109     
110     virtual bool isURLAttribute(AttributeImpl *attr) const;
111
112 protected:
113     HTMLTableSectionElementImpl *head;
114     HTMLTableSectionElementImpl *foot;
115     HTMLTableSectionElementImpl *firstBody;
116     HTMLTableCaptionElementImpl *tCaption;
117
118 #if 0
119     Frame frame;
120     Rules rules;
121 #endif
122   
123     bool m_noBorder     : 1;
124     bool m_solid        : 1;
125     uint unused         : 14;
126     ushort padding      : 16;
127     friend class HTMLTableCellElementImpl;
128 };
129
130 // -------------------------------------------------------------------------
131
132 class HTMLTablePartElementImpl : public HTMLElementImpl
133
134 {
135 public:
136     HTMLTablePartElementImpl(DocumentPtr *doc)
137         : HTMLElementImpl(doc)
138         { }
139
140     virtual bool mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const;
141     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
142 };
143
144 // -------------------------------------------------------------------------
145
146 class HTMLTableSectionElementImpl : public HTMLTablePartElementImpl
147 {
148 public:
149     HTMLTableSectionElementImpl(DocumentPtr *doc, ushort tagid, bool implicit);
150
151     ~HTMLTableSectionElementImpl();
152
153     virtual Id id() const;
154
155     virtual NodeImpl *addChild(NodeImpl *child);
156     
157     HTMLElementImpl *insertRow ( long index, int& exceptioncode );
158     void deleteRow ( long index, int& exceptioncode );
159
160     int numRows() const;
161
162 protected:
163     ushort _id;
164 };
165
166 // -------------------------------------------------------------------------
167
168 class HTMLTableRowElementImpl : public HTMLTablePartElementImpl
169 {
170 public:
171     HTMLTableRowElementImpl(DocumentPtr *doc)
172         : HTMLTablePartElementImpl(doc) {}
173
174     virtual Id id() const;
175
176     virtual NodeImpl *addChild(NodeImpl *child);
177     
178     long rowIndex() const;
179     long sectionRowIndex() const;
180
181     HTMLElementImpl *insertCell ( long index, int &exceptioncode );
182     void deleteCell ( long index, int &exceptioncode );
183
184 protected:
185     int ncols;
186 };
187
188 // -------------------------------------------------------------------------
189
190 class HTMLTableCellElementImpl : public HTMLTablePartElementImpl
191 {
192 public:
193     HTMLTableCellElementImpl(DocumentPtr *doc, int tagId);
194     ~HTMLTableCellElementImpl();
195
196     // ### FIX these two...
197     long cellIndex() const { return 0; }
198
199     int col() const { return _col; }
200     void setCol(int col) { _col = col; }
201     int row() const { return _row; }
202     void setRow(int r) { _row = r; }
203
204     int colSpan() const { return cSpan; }
205     int rowSpan() const { return rSpan; }
206     
207     virtual Id id() const { return _id; }
208     
209     virtual bool mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const;
210     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
211
212     virtual void attach();
213
214     // used by table cells to share style decls created by the enclosing table.
215     virtual CSSMutableStyleDeclarationImpl* additionalAttributeStyleDecl();
216     
217     virtual bool isURLAttribute(AttributeImpl *attr) const;
218
219 protected:
220     int _row;
221     int _col;
222     int rSpan;
223     int cSpan;
224     int _id;
225     int rowHeight;
226     bool m_solid        : 1;
227 };
228
229 // -------------------------------------------------------------------------
230
231 class HTMLTableColElementImpl : public HTMLTablePartElementImpl
232 {
233 public:
234     HTMLTableColElementImpl(DocumentPtr *doc, ushort i);
235
236     virtual Id id() const;
237
238     void setTable(HTMLTableElementImpl *t) { table = t; }
239
240     // overrides
241     virtual bool mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const;
242     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
243
244     int span() const { return _span; }
245
246 protected:
247     // could be ID_COL or ID_COLGROUP ... The DOM is not quite clear on
248     // this, but since both elements work quite similar, we use one
249     // DOMElement for them...
250     ushort _id;
251     int _span;
252     HTMLTableElementImpl *table;
253 };
254
255 // -------------------------------------------------------------------------
256
257 class HTMLTableCaptionElementImpl : public HTMLTablePartElementImpl
258 {
259 public:
260     HTMLTableCaptionElementImpl(DocumentPtr *doc)
261         : HTMLTablePartElementImpl(doc) {}
262
263     virtual Id id() const;
264     
265     virtual bool mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const;
266     virtual void parseHTMLAttribute(HTMLAttributeImpl *attr);
267 };
268
269 }; //namespace
270
271 #endif
272