1 /*
2 * Copyright (C) 1997 Martin Jones (mjones@kde.org)
3 * (C) 1997 Torben Weis (weis@kde.org)
4 * (C) 1998 Waldo Bastian (bastian@kde.org)
5 * (C) 1999 Lars Knoll (knoll@kde.org)
6 * (C) 1999 Antti Koivisto (koivisto@kde.org)
7 * Copyright (C) 2003, 2004, 2005, 2006, 2010 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 #include "config.h"
26 #include "HTMLTableSectionElement.h"
27
28 #include "ExceptionCode.h"
29 #include "HTMLCollection.h"
30 #include "HTMLNames.h"
31 #include "HTMLTableRowElement.h"
32 #include "HTMLTableElement.h"
33 #include "NodeList.h"
34 #include "Text.h"
35
36 namespace WebCore {
37
38 using namespace HTMLNames;
39
HTMLTableSectionElement(const QualifiedName & tagName,Document * document)40 inline HTMLTableSectionElement::HTMLTableSectionElement(const QualifiedName& tagName, Document* document)
41 : HTMLTablePartElement(tagName, document)
42 {
43 }
44
create(const QualifiedName & tagName,Document * document)45 PassRefPtr<HTMLTableSectionElement> HTMLTableSectionElement::create(const QualifiedName& tagName, Document* document)
46 {
47 return adoptRef(new HTMLTableSectionElement(tagName, document));
48 }
49
50 // used by table row groups to share style decls created by the enclosing table.
additionalAttributeStyleDecls(Vector<CSSMutableStyleDeclaration * > & results)51 void HTMLTableSectionElement::additionalAttributeStyleDecls(Vector<CSSMutableStyleDeclaration*>& results)
52 {
53 ContainerNode* p = parentNode();
54 while (p && !p->hasTagName(tableTag))
55 p = p->parentNode();
56 if (!p)
57 return;
58 static_cast<HTMLTableElement*>(p)->addSharedGroupDecls(true, results);
59 }
60
61 // these functions are rather slow, since we need to get the row at
62 // the index... but they aren't used during usual HTML parsing anyway
insertRow(int index,ExceptionCode & ec)63 PassRefPtr<HTMLElement> HTMLTableSectionElement::insertRow(int index, ExceptionCode& ec)
64 {
65 RefPtr<HTMLTableRowElement> row;
66 RefPtr<HTMLCollection> children = rows();
67 int numRows = children ? (int)children->length() : 0;
68 if (index < -1 || index > numRows)
69 ec = INDEX_SIZE_ERR; // per the DOM
70 else {
71 row = HTMLTableRowElement::create(trTag, document());
72 if (numRows == index || index == -1)
73 appendChild(row, ec);
74 else {
75 Node* n;
76 if (index < 1)
77 n = firstChild();
78 else
79 n = children->item(index);
80 insertBefore(row, n, ec);
81 }
82 }
83 return row.release();
84 }
85
deleteRow(int index,ExceptionCode & ec)86 void HTMLTableSectionElement::deleteRow(int index, ExceptionCode& ec)
87 {
88 RefPtr<HTMLCollection> children = rows();
89 int numRows = children ? (int)children->length() : 0;
90 if (index == -1)
91 index = numRows - 1;
92 if (index >= 0 && index < numRows) {
93 RefPtr<Node> row = children->item(index);
94 HTMLElement::removeChild(row.get(), ec);
95 } else
96 ec = INDEX_SIZE_ERR;
97 }
98
numRows() const99 int HTMLTableSectionElement::numRows() const
100 {
101 int rows = 0;
102 const Node *n = firstChild();
103 while (n) {
104 if (n->hasTagName(trTag))
105 rows++;
106 n = n->nextSibling();
107 }
108
109 return rows;
110 }
111
align() const112 String HTMLTableSectionElement::align() const
113 {
114 return getAttribute(alignAttr);
115 }
116
setAlign(const String & value)117 void HTMLTableSectionElement::setAlign(const String &value)
118 {
119 setAttribute(alignAttr, value);
120 }
121
ch() const122 String HTMLTableSectionElement::ch() const
123 {
124 return getAttribute(charAttr);
125 }
126
setCh(const String & value)127 void HTMLTableSectionElement::setCh(const String &value)
128 {
129 setAttribute(charAttr, value);
130 }
131
chOff() const132 String HTMLTableSectionElement::chOff() const
133 {
134 return getAttribute(charoffAttr);
135 }
136
setChOff(const String & value)137 void HTMLTableSectionElement::setChOff(const String &value)
138 {
139 setAttribute(charoffAttr, value);
140 }
141
vAlign() const142 String HTMLTableSectionElement::vAlign() const
143 {
144 return getAttribute(valignAttr);
145 }
146
setVAlign(const String & value)147 void HTMLTableSectionElement::setVAlign(const String &value)
148 {
149 setAttribute(valignAttr, value);
150 }
151
rows()152 PassRefPtr<HTMLCollection> HTMLTableSectionElement::rows()
153 {
154 return HTMLCollection::create(this, TSectionRows);
155 }
156
157 }
158