📄 html_tableimpl.cpp
字号:
/** * 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 + -