Home | History | Annotate | Download | only in html
      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, 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 
     40 inline HTMLTableSectionElement::HTMLTableSectionElement(const QualifiedName& tagName, Document* document)
     41     : HTMLTablePartElement(tagName, document)
     42 {
     43 }
     44 
     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.
     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
     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 
     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 
     99 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 
    112 String HTMLTableSectionElement::align() const
    113 {
    114     return getAttribute(alignAttr);
    115 }
    116 
    117 void HTMLTableSectionElement::setAlign(const String &value)
    118 {
    119     setAttribute(alignAttr, value);
    120 }
    121 
    122 String HTMLTableSectionElement::ch() const
    123 {
    124     return getAttribute(charAttr);
    125 }
    126 
    127 void HTMLTableSectionElement::setCh(const String &value)
    128 {
    129     setAttribute(charAttr, value);
    130 }
    131 
    132 String HTMLTableSectionElement::chOff() const
    133 {
    134     return getAttribute(charoffAttr);
    135 }
    136 
    137 void HTMLTableSectionElement::setChOff(const String &value)
    138 {
    139     setAttribute(charoffAttr, value);
    140 }
    141 
    142 String HTMLTableSectionElement::vAlign() const
    143 {
    144     return getAttribute(valignAttr);
    145 }
    146 
    147 void HTMLTableSectionElement::setVAlign(const String &value)
    148 {
    149     setAttribute(valignAttr, value);
    150 }
    151 
    152 PassRefPtr<HTMLCollection> HTMLTableSectionElement::rows()
    153 {
    154     return HTMLCollection::create(this, TSectionRows);
    155 }
    156 
    157 }
    158