📄 html_tableimpl.cpp
字号:
#ifdef DEBUG_LAYOUT
kdDebug( 6030 ) << nodeName().string() << "(Tbody)::addChild( " << child->nodeName().string() << " )" << endl;
#endif
if (child->id() == ID_FORM) {
// First add the child.
HTMLElementImpl::addChild(child);
// Now simply return ourselves as the newnode. This has the effect of
// demoting the form to a leaf and moving it safely out of the way.
return this;
}
return HTMLTablePartElementImpl::addChild(child);
}
// these functions are rather slow, since we need to get the row at
// the index... but they aren't used during usual HTML parsing anyway
HTMLElementImpl *HTMLTableSectionElementImpl::insertRow( long index, int& exceptioncode )
{
HTMLTableRowElementImpl *r = 0L;
NodeListImpl *children = childNodes();
int numRows = children ? (int)children->length() : 0;
//kdDebug(6030) << k_funcinfo << "index=" << index << " numRows=" << numRows << endl;
if ( index < -1 || index > numRows ) {
exceptioncode = DOMException::INDEX_SIZE_ERR; // per the DOM
}
else
{
r = new HTMLTableRowElementImpl(docPtr());
if ( numRows == index || index == -1 )
appendChild(r, exceptioncode);
else {
NodeImpl *n;
if(index < 1)
n = firstChild();
else
n = children->item(index);
insertBefore(r, n, exceptioncode );
}
}
delete children;
return r;
}
void HTMLTableSectionElementImpl::deleteRow( long index, int &exceptioncode )
{
NodeListImpl *children = childNodes();
int numRows = children ? (int)children->length() : 0;
if ( index == -1 ) index = numRows - 1;
if( index >= 0 && index < numRows )
HTMLElementImpl::removeChild(children->item(index), exceptioncode);
else
exceptioncode = DOMException::INDEX_SIZE_ERR;
delete children;
}
int HTMLTableSectionElementImpl::numRows() const
{
int rows = 0;
const NodeImpl *n = firstChild();
while (n) {
if (n->id() == ID_TR)
rows++;
n = n->nextSibling();
}
return rows;
}
// -------------------------------------------------------------------------
NodeImpl::Id HTMLTableRowElementImpl::id() const
{
return ID_TR;
}
NodeImpl *HTMLTableRowElementImpl::addChild(NodeImpl *child)
{
#ifdef DEBUG_LAYOUT
kdDebug( 6030 ) << nodeName().string() << "(Trow)::addChild( " << child->nodeName().string() << " )" << endl;
#endif
if (child->id() == ID_FORM) {
// First add the child.
HTMLElementImpl::addChild(child);
// Now simply return ourselves as the newnode. This has the effect of
// demoting the form to a leaf and moving it safely out of the way.
return this;
}
return HTMLTablePartElementImpl::addChild(child);
}
long HTMLTableRowElementImpl::rowIndex() const
{
int rIndex = 0;
NodeImpl *table = parentNode();
if ( !table )
return -1;
table = table->parentNode();
if ( !table || table->id() != ID_TABLE )
return -1;
HTMLTableSectionElementImpl *foot = static_cast<HTMLTableElementImpl *>(table)->tFoot();
NodeImpl *node = table->firstChild();
while ( node ) {
if ( node != foot && (node->id() == ID_THEAD || node->id() == ID_TFOOT || node->id() == ID_TBODY) ) {
HTMLTableSectionElementImpl* section = static_cast<HTMLTableSectionElementImpl *>(node);
const NodeImpl *row = section->firstChild();
while ( row ) {
if ( row == this )
return rIndex;
rIndex++;
row = row->nextSibling();
}
}
node = node->nextSibling();
}
const NodeImpl *row = foot->firstChild();
while ( row ) {
if ( row == this )
return rIndex;
rIndex++;
row = row->nextSibling();
}
// should never happen
return -1;
}
long HTMLTableRowElementImpl::sectionRowIndex() const
{
int rIndex = 0;
const NodeImpl *n = this;
do {
n = n->previousSibling();
if (n && n->isElementNode() && n->id() == ID_TR)
rIndex++;
}
while (n);
return rIndex;
}
HTMLElementImpl *HTMLTableRowElementImpl::insertCell( long index, int &exceptioncode )
{
HTMLTableCellElementImpl *c = 0L;
NodeListImpl *children = childNodes();
int numCells = children ? children->length() : 0;
if ( index < -1 || index > numCells )
exceptioncode = DOMException::INDEX_SIZE_ERR; // per the DOM
else
{
c = new HTMLTableCellElementImpl(docPtr(), ID_TD);
if(numCells == index || index == -1)
appendChild(c, exceptioncode);
else {
NodeImpl *n;
if(index < 1)
n = firstChild();
else
n = children->item(index);
insertBefore(c, n, exceptioncode);
}
}
delete children;
return c;
}
void HTMLTableRowElementImpl::deleteCell( long index, int &exceptioncode )
{
NodeListImpl *children = childNodes();
int numCells = children ? children->length() : 0;
if ( index == -1 ) index = numCells-1;
if( index >= 0 && index < numCells )
HTMLElementImpl::removeChild(children->item(index), exceptioncode);
else
exceptioncode = DOMException::INDEX_SIZE_ERR;
delete children;
}
// -------------------------------------------------------------------------
HTMLTableCellElementImpl::HTMLTableCellElementImpl(DocumentPtr *doc, int tag)
: HTMLTablePartElementImpl(doc)
{
_col = -1;
_row = -1;
cSpan = rSpan = 1;
_id = tag;
rowHeight = 0;
m_solid = false;
}
HTMLTableCellElementImpl::~HTMLTableCellElementImpl()
{
}
bool HTMLTableCellElementImpl::mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const
{
switch(attr) {
case ATTR_NOWRAP:
result = eUniversal;
return false;
case ATTR_WIDTH:
case ATTR_HEIGHT:
result = eCell; // Because of the quirky behavior of ignoring 0 values, cells are special.
return false;
default:
break;
}
return HTMLTablePartElementImpl::mapToEntry(attr, result);
}
void HTMLTableCellElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr)
{
switch(attr->id())
{
case ATTR_ROWSPAN:
rSpan = !attr->isNull() ? attr->value().toInt() : 1;
if (rSpan < 1) rSpan = 1;
if (renderer() && renderer()->isTableCell())
static_cast<RenderTableCell*>(renderer())->updateFromElement();
break;
case ATTR_COLSPAN:
cSpan = !attr->isNull() ? attr->value().toInt() : 1;
if (cSpan < 1) cSpan = 1;
if (renderer() && renderer()->isTableCell())
static_cast<RenderTableCell*>(renderer())->updateFromElement();
break;
case ATTR_NOWRAP:
if (!attr->isNull())
addCSSProperty(attr, CSS_PROP_WHITE_SPACE, CSS_VAL__KHTML_NOWRAP);
break;
case ATTR_WIDTH:
if (!attr->value().isEmpty()) {
int widthInt = attr->value().toInt();
if (widthInt > 0) // width="0" is ignored for compatibility with WinIE.
addCSSLength( attr, CSS_PROP_WIDTH, attr->value() );
}
break;
case ATTR_HEIGHT:
if (!attr->value().isEmpty()) {
int heightInt = attr->value().toInt();
if (heightInt > 0) // height="0" is ignored for compatibility with WinIE.
addCSSLength( attr, CSS_PROP_HEIGHT, attr->value() );
}
break;
case ATTR_NOSAVE:
break;
default:
HTMLTablePartElementImpl::parseHTMLAttribute(attr);
}
}
// used by table cells to share style decls created by the enclosing table.
CSSMutableStyleDeclarationImpl* HTMLTableCellElementImpl::additionalAttributeStyleDecl()
{
HTMLElementImpl* p = static_cast<HTMLElementImpl*>(parentNode());
while(p && p->id() != ID_TABLE)
p = static_cast<HTMLElementImpl*>(p->parentNode());
if (p) {
HTMLTableElementImpl* table = static_cast<HTMLTableElementImpl*>(p);
return table->getSharedCellDecl();
}
return 0;
}
void HTMLTableCellElementImpl::attach()
{
HTMLElementImpl* p = static_cast<HTMLElementImpl*>(parentNode());
while(p && p->id() != ID_TABLE)
p = static_cast<HTMLElementImpl*>(p->parentNode());
HTMLTablePartElementImpl::attach();
}
bool HTMLTableCellElementImpl::isURLAttribute(AttributeImpl *attr) const
{
return attr->id() == ATTR_BACKGROUND;
}
// -------------------------------------------------------------------------
HTMLTableColElementImpl::HTMLTableColElementImpl(DocumentPtr *doc, ushort i)
: HTMLTablePartElementImpl(doc)
{
_id = i;
_span = (_id == ID_COLGROUP ? 0 : 1);
}
NodeImpl::Id HTMLTableColElementImpl::id() const
{
return _id;
}
bool HTMLTableColElementImpl::mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const
{
switch(attr) {
case ATTR_WIDTH:
result = eUniversal;
return false;
default:
break;
}
return HTMLTablePartElementImpl::mapToEntry(attr, result);
}
void HTMLTableColElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr)
{
switch(attr->id())
{
case ATTR_SPAN:
_span = !attr->isNull() ? attr->value().toInt() : 1;
if (renderer() && renderer()->isTableCol())
static_cast<RenderTableCol*>(renderer())->updateFromElement();
break;
case ATTR_WIDTH:
if (!attr->value().isEmpty())
addCSSLength(attr, CSS_PROP_WIDTH, attr->value());
break;
default:
HTMLTablePartElementImpl::parseHTMLAttribute(attr);
}
}
// -------------------------------------------------------------------------
NodeImpl::Id HTMLTableCaptionElementImpl::id() const
{
return ID_CAPTION;
}
bool HTMLTableCaptionElementImpl::mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const
{
if (attr == ATTR_ALIGN) {
result = eCaption;
return false;
}
return HTMLElementImpl::mapToEntry(attr, result);
}
void HTMLTableCaptionElementImpl::parseHTMLAttribute(HTMLAttributeImpl *attr)
{
switch(attr->id())
{
case ATTR_ALIGN:
if (!attr->value().isEmpty())
addCSSProperty(attr, CSS_PROP_CAPTION_SIDE, attr->value());
break;
default:
HTMLElementImpl::parseHTMLAttribute(attr);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -