⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 html_tableimpl.cpp

📁 khtml在gtk上的移植版本
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/** * This file is part of the DOM implementation for KDE. * * Copyright (C) 1997 Martin Jones (mjones@kde.org) *           (C) 1997 Torben Weis (weis@kde.org) *           (C) 1998 Waldo Bastian (bastian@kde.org) *           (C) 1999 Lars Knoll (knoll@kde.org) *           (C) 1999 Antti Koivisto (koivisto@kde.org) * Copyright (C) 2003 Apple Computer, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB.  If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */#include "html/html_documentimpl.h"#include "html/html_tableimpl.h"#include "dom/dom_exception.h"#include "dom/dom_node.h"#include "misc/htmlhashes.h"#include "khtmlview.h"#include "khtml_part.h"#include "css/cssstyleselector.h"#include "css/cssproperties.h"#include "css/cssvalues.h"#include "css/csshelper.h"#include "css_valueimpl.h"#include "css/css_stylesheetimpl.h"#include "rendering/render_table.h"#include <kdebug.h>#include <kglobal.h>using namespace khtml;using namespace DOM;HTMLTableElementImpl::HTMLTableElementImpl(DocumentPtr *doc)  : HTMLElementImpl(doc){    tCaption = 0;    head = 0;    foot = 0;    firstBody = 0;#if 0    rules = None;    frame = Void;#endif     padding = 1;        m_noBorder = true;    m_solid = false;}HTMLTableElementImpl::~HTMLTableElementImpl(){}NodeImpl::Id HTMLTableElementImpl::id() const{    return ID_TABLE;}NodeImpl* HTMLTableElementImpl::setCaption( HTMLTableCaptionElementImpl *c ){    int exceptioncode = 0;    NodeImpl* r;    if(tCaption) {        replaceChild ( c, tCaption, exceptioncode );        r = c;    }    else        r = insertBefore( c, firstChild(), exceptioncode );    tCaption = c;    return r;}NodeImpl* HTMLTableElementImpl::setTHead( HTMLTableSectionElementImpl *s ){    int exceptioncode = 0;    NodeImpl* r;    if(head) {        replaceChild( s, head, exceptioncode );        r = s;    }    else if( foot )        r = insertBefore( s, foot, exceptioncode );    else if( firstBody )        r = insertBefore( s, firstBody, exceptioncode );    else        r = appendChild( s, exceptioncode );    head = s;    return r;}NodeImpl* HTMLTableElementImpl::setTFoot( HTMLTableSectionElementImpl *s ){    int exceptioncode = 0;    NodeImpl* r;    if(foot) {        replaceChild ( s, foot, exceptioncode );        r = s;    } else if( firstBody )        r = insertBefore( s, firstBody, exceptioncode );    else        r = appendChild( s, exceptioncode );    foot = s;    return r;}NodeImpl* HTMLTableElementImpl::setTBody( HTMLTableSectionElementImpl *s ){    int exceptioncode = 0;    NodeImpl* r;    if(firstBody) {        replaceChild ( s, firstBody, exceptioncode );        r = s;    } else        r = appendChild( s, exceptioncode );    firstBody = s;    return r;}HTMLElementImpl *HTMLTableElementImpl::createTHead(  ){    if(!head)    {        int exceptioncode = 0;        head = new HTMLTableSectionElementImpl(docPtr(), ID_THEAD, true /* implicit */);        if(foot)            insertBefore( head, foot, exceptioncode );        else if(firstBody)            insertBefore( head, firstBody, exceptioncode);        else            appendChild(head, exceptioncode);    }    return head;}void HTMLTableElementImpl::deleteTHead(  ){    if(head) {        int exceptioncode = 0;        HTMLElementImpl::removeChild(head, exceptioncode);    }    head = 0;}HTMLElementImpl *HTMLTableElementImpl::createTFoot(  ){    if(!foot)    {        int exceptioncode = 0;        foot = new HTMLTableSectionElementImpl(docPtr(), ID_TFOOT, true /*implicit */);        if(firstBody)            insertBefore( foot, firstBody, exceptioncode );        else            appendChild(foot, exceptioncode);    }    return foot;}void HTMLTableElementImpl::deleteTFoot(  ){    if(foot) {        int exceptioncode = 0;        HTMLElementImpl::removeChild(foot, exceptioncode);    }    foot = 0;}HTMLElementImpl *HTMLTableElementImpl::createCaption(  ){    if(!tCaption)    {        int exceptioncode = 0;        tCaption = new HTMLTableCaptionElementImpl(docPtr());        insertBefore( tCaption, firstChild(), exceptioncode );    }    return tCaption;}void HTMLTableElementImpl::deleteCaption(  ){    if(tCaption) {        int exceptioncode = 0;        HTMLElementImpl::removeChild(tCaption, exceptioncode);    }    tCaption = 0;}HTMLElementImpl *HTMLTableElementImpl::insertRow( long index, int &exceptioncode ){    // The DOM requires that we create a tbody if the table is empty    // (cf DOM2TS HTMLTableElement31 test)    // (note: this is different from "if the table has no sections", since we can have    // <TABLE><TR>)    if(!firstBody && !head && !foot && !hasChildNodes())        setTBody( new HTMLTableSectionElementImpl(docPtr(), ID_TBODY, true /* implicit */) );    //kdDebug(6030) << k_funcinfo << index << endl;    // IE treats index=-1 as default value meaning 'append after last'    // This isn't in the DOM. So, not implemented yet.    HTMLTableSectionElementImpl* section = 0L;    HTMLTableSectionElementImpl* lastSection = 0L;    NodeImpl *node = firstChild();    bool append = (index == -1);    bool found = false;    for ( ; node && (index>=0 || append) ; node = node->nextSibling() )    {	// there could be 2 tfoot elements in the table. Only the first one is the "foot", that's why we have the more	// complicated if statement below.        if ( node != foot && (node->id() == ID_THEAD || node->id() == ID_TFOOT || node->id() == ID_TBODY) )        {            section = static_cast<HTMLTableSectionElementImpl *>(node);            lastSection = section;            //kdDebug(6030) << k_funcinfo << "section id=" << node->id() << " rows:" << section->numRows() << endl;            if ( !append )            {                int rows = section->numRows();                if ( rows > index ) {		    found = true;                    break;                } else                    index -= rows;                //kdDebug(6030) << "       index is now " << index << endl;            }        }    }    if ( !found && foot )        section = static_cast<HTMLTableSectionElementImpl *>(foot);    // Index == 0 means "insert before first row in current section"    // or "append after last row" (if there's no current section anymore)    if ( !section && ( index == 0 || append ) )    {        section = lastSection;        index = section ? section->numRows() : 0;    }    if ( section && (index >= 0 || append) ) {        //kdDebug(6030) << "Inserting row into section " << section << " at index " << index << endl;        return section->insertRow( index, exceptioncode );    } else {        // No more sections => index is too big        exceptioncode = DOMException::INDEX_SIZE_ERR;        return 0L;    }}void HTMLTableElementImpl::deleteRow( long index, int &exceptioncode ){    HTMLTableSectionElementImpl* section = 0L;    NodeImpl *node = firstChild();    bool lastRow = index == -1;    HTMLTableSectionElementImpl* lastSection = 0L;    bool found = false;    for ( ; node ; node = node->nextSibling() )    {        if ( node != foot && (node->id() == ID_THEAD || node->id() == ID_TFOOT || node->id() == ID_TBODY) )        {            section = static_cast<HTMLTableSectionElementImpl *>(node);            lastSection = section;            int rows = section->numRows();            if ( !lastRow )            {                if ( rows > index ) {                    found = true;                    break;                } else                    index -= rows;            }        }        section = 0L;    }    if ( !found && foot )        section = static_cast<HTMLTableSectionElementImpl *>(foot);    if ( lastRow )        lastSection->deleteRow( -1, exceptioncode );    else if ( section && index >= 0 && index < section->numRows() )        section->deleteRow( index, exceptioncode );    else        exceptioncode = DOMException::INDEX_SIZE_ERR;}NodeImpl *HTMLTableElementImpl::addChild(NodeImpl *child){#ifdef DEBUG_LAYOUT    kdDebug( 6030 ) << nodeName().string() << "(Table)::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;    }        int exceptioncode = 0;    NodeImpl *retval = appendChild( child, exceptioncode );    if ( retval ) {	switch(child->id()) {	case ID_CAPTION:	    if ( !tCaption )		tCaption = static_cast<HTMLTableCaptionElementImpl *>(child);	    break;	case ID_COL:	case ID_COLGROUP:	    break;	case ID_THEAD:	    if ( !head )		head = static_cast<HTMLTableSectionElementImpl *>(child);	    break;	case ID_TFOOT:	    if ( !foot )		foot = static_cast<HTMLTableSectionElementImpl *>(child);	    break;	case ID_TBODY:	    if ( !firstBody )		firstBody = static_cast<HTMLTableSectionElementImpl *>(child);	    break;	}    }    return retval;}bool HTMLTableElementImpl::mapToEntry(NodeImpl::Id attr, MappedAttributeEntry& result) const{    switch(attr) {        case ATTR_WIDTH:        case ATTR_HEIGHT:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -