📄 html_tableimpl.cpp
字号:
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 anywayHTMLElementImpl *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; // limit this to something not causing an overflow with short int if(rSpan < 1 || rSpan > 1024) rSpan = 1; break; case ATTR_COLSPAN: // ### cSpan = !attr->isNull() ? attr->value().toInt() : 1; // limit this to something not causing an overflow with short int if(cSpan < 1 || cSpan > 1024) cSpan = 1; 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.CSSStyleDeclarationImpl* 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; 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 + -