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

📄 html_tableimpl.cpp

📁 将konqueror浏览器移植到ARM9 2410中
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/** * 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) * * 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. * * $Id: html_tableimpl.cpp,v 1.126 2001/07/27 09:54:06 schlpbch Exp $ */#include "html_tableimpl.h"#include "dom_exception.h"#include "html_documentimpl.h"#include "dom_node.h"using namespace DOM;#include "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 "rendering/render_table.h"using namespace khtml;#include <kdebug.h>HTMLTableElementImpl::HTMLTableElementImpl(DocumentPtr *doc)  : HTMLElementImpl(doc){    tCaption = 0;    head = 0;    foot = 0;    firstBody = 0;    rules = None;    frame = Void;    incremental = false;    m_noBorder = true;    // reset font color and sizes here, if we don't have strict parse mode.    // this is 90% compatible to ie and mozilla, and the by way easiest solution...    // only difference to 100% correct is that in strict mode <font> elements are propagated into tables.    if ( ownerDocument()->parseMode() != DocumentImpl::Strict ) {        addCSSProperty( CSS_PROP_FONT_SIZE, CSS_VAL_MEDIUM );        addCSSProperty( CSS_PROP_COLOR, ownerDocument()->textColor() );        addCSSProperty( CSS_PROP_FONT_FAMILY, "konq_default" );    }}HTMLTableElementImpl::~HTMLTableElementImpl(){}const DOMString HTMLTableElementImpl::nodeName() const{    return "TABLE";}ushort HTMLTableElementImpl::id() const{    return ID_TABLE;}NodeImpl* HTMLTableElementImpl::setCaption( HTMLTableCaptionElementImpl *c ){    int exceptioncode;    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;    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;    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;}HTMLElementImpl *HTMLTableElementImpl::createTHead(  ){    if(!head)    {        int exceptioncode;        head = new HTMLTableSectionElementImpl(docPtr(), ID_THEAD);        if(foot)            insertBefore( head, foot, exceptioncode );        if(firstBody)            insertBefore( head, firstBody, exceptioncode);        else            appendChild(head, exceptioncode);    }    return head;}void HTMLTableElementImpl::deleteTHead(  ){    if(head) {        int exceptioncode;        HTMLElementImpl::removeChild(head, exceptioncode);    }    head = 0;}HTMLElementImpl *HTMLTableElementImpl::createTFoot(  ){    if(!foot)    {        int exceptioncode;        foot = new HTMLTableSectionElementImpl(docPtr(), ID_TFOOT);        if(firstBody)            insertBefore( foot, firstBody, exceptioncode );        else            appendChild(foot, exceptioncode);    }    return foot;}void HTMLTableElementImpl::deleteTFoot(  ){    if(foot) {        int exceptioncode;        HTMLElementImpl::removeChild(foot, exceptioncode);    }    foot = 0;}HTMLElementImpl *HTMLTableElementImpl::createCaption(  ){    if(!tCaption)    {        int exceptioncode;        tCaption = new HTMLTableCaptionElementImpl(docPtr());        insertBefore( tCaption, firstChild(), exceptioncode );    }    return tCaption;}void HTMLTableElementImpl::deleteCaption(  ){    if(tCaption) {        int exceptioncode;        HTMLElementImpl::removeChild(tCaption, exceptioncode);    }    tCaption = 0;}HTMLElementImpl *HTMLTableElementImpl::insertRow( long /*index*/ ){    // ###    return 0;}void HTMLTableElementImpl::deleteRow( long /*index*/ ){    // ###}NodeImpl *HTMLTableElementImpl::addChild(NodeImpl *child){#ifdef DEBUG_LAYOUT    kdDebug( 6030 ) << nodeName().string() << "(Table)::addChild( " << child->nodeName().string() << " )" << endl;#endif    switch(child->id())    {    case ID_CAPTION:        return setCaption(static_cast<HTMLTableCaptionElementImpl *>(child));        break;    case ID_COL:    case ID_COLGROUP:        {        // these have to come before the table definition!        if(head || foot || firstBody)            return 0;        HTMLElementImpl::addChild(child);        // ###        }        return child;    case ID_THEAD:        //      if(incremental && !columnPos[totalCols]);// calcColWidth();        return setTHead(static_cast<HTMLTableSectionElementImpl *>(child));        break;    case ID_TFOOT:        //if(incremental && !columnPos[totalCols]);// calcColWidth();        return setTFoot(static_cast<HTMLTableSectionElementImpl *>(child));        break;    case ID_TBODY:        //if(incremental && !columnPos[totalCols]);// calcColWidth();        if(!firstBody)            firstBody = static_cast<HTMLTableSectionElementImpl *>(child);        return HTMLElementImpl::addChild( child );        break;    }    return 0;}void HTMLTableElementImpl::parseAttribute(AttrImpl *attr){    // ### to CSS!!    switch(attr->attrId)    {    case ATTR_WIDTH:        if (!attr->value().isEmpty())            addCSSLength(CSS_PROP_WIDTH, attr->value());        else            removeCSSProperty(CSS_PROP_WIDTH);        break;    case ATTR_HEIGHT:        if (!attr->value().isEmpty())            addCSSLength(CSS_PROP_HEIGHT, attr->value());        else            removeCSSProperty(CSS_PROP_HEIGHT);        break;    case ATTR_BORDER:    {        int border;        // ### this needs more work, as the border value is not only        //     the border of the box, but also between the cells        if(!attr->val())            border = 0;        else if(attr->val()->l == 0)            border = 1;        else            border = attr->val()->toInt();#ifdef DEBUG_DRAW_BORDER        border=1;#endif        m_noBorder = !border;        addCSSLength(CSS_PROP_BORDER_WIDTH, DOMString( QString::number( border) ) );#if 0        // wanted by HTML4 specs        if(!border)            frame = Void, rules = None;        else            frame = Box, rules = All;#endif        break;    }    case ATTR_BGCOLOR:        if (!attr->value().isEmpty())            addCSSProperty(CSS_PROP_BACKGROUND_COLOR, attr->value());        else            removeCSSProperty(CSS_PROP_BACKGROUND_COLOR);        break;    case ATTR_BORDERCOLOR:        if(!attr->value().isEmpty()) {            addCSSProperty(CSS_PROP_BORDER_COLOR, attr->value());            addCSSProperty(CSS_PROP_BORDER_TOP_STYLE, CSS_VAL_SOLID);            addCSSProperty(CSS_PROP_BORDER_LEFT_STYLE, CSS_VAL_SOLID);            addCSSProperty(CSS_PROP_BORDER_BOTTOM_STYLE, CSS_VAL_SOLID);            addCSSProperty(CSS_PROP_BORDER_RIGHT_STYLE, CSS_VAL_SOLID);        }        break;    case ATTR_BACKGROUND:    {        if (!attr->value().isEmpty()) {            HTMLDocumentImpl *doc = static_cast<HTMLDocumentImpl *>(ownerDocument());            QString url = khtml::parseURL( attr->value() ).string();            if ( doc->view() )                url = doc->view()->part()->completeURL( url ).url();            addCSSProperty(CSS_PROP_BACKGROUND_IMAGE, "url('"+url+"')" );        }        else            removeCSSProperty(CSS_PROP_BACKGROUND_IMAGE);        break;    }    case ATTR_FRAME:#if 0        if ( strcasecmp( attr->value(), "void" ) == 0 )            frame = Void;        else if ( strcasecmp( attr->value(), "border" ) == 0 )            frame = Box;        else if ( strcasecmp( attr->value(), "box" ) == 0 )            frame = Box;        else if ( strcasecmp( attr->value(), "hsides" ) == 0 )            frame = Hsides;        else if ( strcasecmp( attr->value(), "vsides" ) == 0 )            frame = Vsides;        else if ( strcasecmp( attr->value(), "above" ) == 0 )            frame = Above;        else if ( strcasecmp( attr->value(), "below" ) == 0 )            frame = Below;        else if ( strcasecmp( attr->value(), "lhs" ) == 0 )            frame = Lhs;        else if ( strcasecmp( attr->value(), "rhs" ) == 0 )            frame = Rhs;#endif        break;    case ATTR_RULES:#if 0        if ( strcasecmp( attr->value(), "none" ) == 0 )            rules = None;        else if ( strcasecmp( attr->value(), "groups" ) == 0 )            rules = Groups;        else if ( strcasecmp( attr->value(), "rows" ) == 0 )            rules = Rows;        else if ( strcasecmp( attr->value(), "cols" ) == 0 )            rules = Cols;        else if ( strcasecmp( attr->value(), "all" ) == 0 )            rules = All;#endif        break;   case ATTR_CELLSPACING:        if (!attr->value().isEmpty())            addCSSLength(CSS_PROP_BORDER_SPACING, attr->value());        else            removeCSSProperty(CSS_PROP_BORDER_SPACING);        break;    case ATTR_CELLPADDING:        if (!attr->value().isEmpty()) {            addCSSLength(CSS_PROP_PADDING_TOP, attr->value());            addCSSLength(CSS_PROP_PADDING_LEFT, attr->value());            addCSSLength(CSS_PROP_PADDING_BOTTOM, attr->value());            addCSSLength(CSS_PROP_PADDING_RIGHT, attr->value());        }        else {            removeCSSProperty(CSS_PROP_PADDING_TOP);            removeCSSProperty(CSS_PROP_PADDING_LEFT);            removeCSSProperty(CSS_PROP_PADDING_BOTTOM);            removeCSSProperty(CSS_PROP_PADDING_RIGHT);        }        break;    case ATTR_COLS:    {        // ####if 0        int c;        c = attr->val()->toInt();        addColumns(c-totalCols);        break;#endif    }    case ATTR_ALIGN:        if (!attr->value().isEmpty())            addCSSProperty(CSS_PROP_FLOAT, attr->value());        else            removeCSSProperty(CSS_PROP_FLOAT);        break;    case ATTR_VALIGN:        if (!attr->value().isEmpty())            addCSSProperty(CSS_PROP_VERTICAL_ALIGN, attr->value());        else            removeCSSProperty(CSS_PROP_VERTICAL_ALIGN);        break;    case ATTR_NOSAVE:	break;	    default:        HTMLElementImpl::parseAttribute(attr);    }}void HTMLTableElementImpl::attach(){    HTMLElementImpl::attach();}// --------------------------------------------------------------------------void HTMLTablePartElementImpl::parseAttribute(AttrImpl *attr){    switch(attr->attrId)

⌨️ 快捷键说明

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