15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1997 Martin Jones (mjones@kde.org) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1997 Torben Weis (weis@kde.org) 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1998 Waldo Bastian (bastian@kde.org) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999 Lars Knoll (knoll@kde.org) 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 1999 Antti Koivisto (koivisto@kde.org) 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2004, 2005, 2006, 2009, 2010 Apple Inc. All rights reserved. 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef RenderTable_h 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define RenderTable_h 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "CSSPropertyNames.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderBlock.h" 3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/CollapsedBorderValue.h" 3102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "wtf/Vector.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderTableCol; 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderTableCaption; 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderTableCell; 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderTableSection; 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class TableLayout; 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum SkipEmptySectionsValue { DoNotSkipEmptySections, SkipEmptySections }; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)class RenderTable FINAL : public RenderBlock { 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) explicit RenderTable(Element*); 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual ~RenderTable(); 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Per CSS 3 writing-mode: "The first and second values of the 'border-spacing' property represent spacing between columns 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and rows respectively, not necessarily the horizontal and vertical spacing respectively". 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int hBorderSpacing() const { return m_hSpacing; } 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int vBorderSpacing() const { return m_vSpacing; } 5202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool collapseBorders() const { return style()->borderCollapse(); } 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int borderStart() const { return m_borderStart; } 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int borderEnd() const { return m_borderEnd; } 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int borderBefore() const; 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int borderAfter() const; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int borderLeft() const 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->isHorizontalWritingMode()) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isLeftToRightDirection() ? borderStart() : borderEnd(); 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isFlippedBlocksWritingMode() ? borderAfter() : borderBefore(); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int borderRight() const 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->isHorizontalWritingMode()) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isLeftToRightDirection() ? borderEnd() : borderStart(); 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isFlippedBlocksWritingMode() ? borderBefore() : borderAfter(); 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int borderTop() const 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->isHorizontalWritingMode()) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isFlippedBlocksWritingMode() ? borderAfter() : borderBefore(); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isLeftToRightDirection() ? borderStart() : borderEnd(); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int borderBottom() const 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->isHorizontalWritingMode()) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isFlippedBlocksWritingMode() ? borderBefore() : borderAfter(); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isLeftToRightDirection() ? borderEnd() : borderStart(); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 887757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch Color bgColor() const { return resolveColor(CSSPropertyBackgroundColor); } 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int outerBorderBefore() const; 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int outerBorderAfter() const; 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int outerBorderStart() const; 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int outerBorderEnd() const; 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int outerBorderLeft() const 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->isHorizontalWritingMode()) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isLeftToRightDirection() ? outerBorderStart() : outerBorderEnd(); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isFlippedBlocksWritingMode() ? outerBorderAfter() : outerBorderBefore(); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int outerBorderRight() const 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->isHorizontalWritingMode()) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isLeftToRightDirection() ? outerBorderEnd() : outerBorderStart(); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isFlippedBlocksWritingMode() ? outerBorderBefore() : outerBorderAfter(); 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int outerBorderTop() const 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->isHorizontalWritingMode()) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isFlippedBlocksWritingMode() ? outerBorderAfter() : outerBorderBefore(); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isLeftToRightDirection() ? outerBorderStart() : outerBorderEnd(); 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int outerBorderBottom() const 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (style()->isHorizontalWritingMode()) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isFlippedBlocksWritingMode() ? outerBorderBefore() : outerBorderAfter(); 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return style()->isLeftToRightDirection() ? outerBorderEnd() : outerBorderStart(); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int calcBorderStart() const; 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int calcBorderEnd() const; 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void recalcBordersInRowDirection(); 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void addChild(RenderObject* child, RenderObject* beforeChild = 0); 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) struct ColumnStruct { 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit ColumnStruct(unsigned initialSpan = 1) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : span(initialSpan) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned span; 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void forceSectionsRecalc() 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setNeedsSectionRecalc(); 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) recalcSections(); 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Vector<ColumnStruct>& columns() const { return m_columns; } 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const Vector<int>& columnPositions() const { return m_columnPos; } 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setColumnPosition(unsigned index, int position) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Note that if our horizontal border-spacing changed, our position will change but not 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // our column's width. In practice, horizontal border-spacing won't change often. 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_columnLogicalWidthChanged |= m_columnPos[index] != position; 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_columnPos[index] = position; 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTableSection* header() const { return m_head; } 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTableSection* footer() const { return m_foot; } 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTableSection* firstBody() const { return m_firstBody; } 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This function returns 0 if the table has no section. 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTableSection* topSection() const; 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTableSection* bottomSection() const; 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This function returns 0 if the table has no non-empty sections. 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTableSection* topNonEmptySection() const; 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned lastColumnIndex() const { return numEffCols() - 1; } 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void splitColumn(unsigned position, unsigned firstSpan); 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void appendColumn(unsigned span); 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned numEffCols() const { return m_columns.size(); } 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned spanOfEffCol(unsigned effCol) const { return m_columns[effCol].span; } 17102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned colToEffCol(unsigned column) const 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned effColumn = 0; 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned numColumns = numEffCols(); 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned c = 0; effColumn < numColumns && c + m_columns[effColumn].span - 1 < column; ++effColumn) 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c += m_columns[effColumn].span; 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return effColumn; 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 18002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned effColToCol(unsigned effCol) const 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned c = 0; 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned i = 0; i < effCol; i++) 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) c += m_columns[i].span; 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return c; 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit borderSpacingInRowDirection() const 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (unsigned effectiveColumnCount = numEffCols()) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return static_cast<LayoutUnit>(effectiveColumnCount + 1) * hBorderSpacing(); 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) // Override paddingStart/End to return pixel values to match behavor of RenderTableCell. 198926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual LayoutUnit paddingEnd() const OVERRIDE { return static_cast<int>(RenderBlock::paddingEnd()); } 199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual LayoutUnit paddingStart() const OVERRIDE { return static_cast<int>(RenderBlock::paddingStart()); } 200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit bordersPaddingAndSpacingInRowDirection() const 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 'border-spacing' only applies to separate borders (see 17.6.1 The separated borders model). 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return borderStart() + borderEnd() + (collapseBorders() ? LayoutUnit() : (paddingStart() + paddingEnd() + borderSpacingInRowDirection())); 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Return the first column or column-group. 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTableCol* firstColumn() const; 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTableCol* colElement(unsigned col, bool* startEdge = 0, bool* endEdge = 0) const 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // The common case is to not have columns, make that case fast. 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_hasColElements) 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return slowColElement(col, startEdge, endEdge); 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool needsSectionRecalc() const { return m_needsSectionRecalc; } 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setNeedsSectionRecalc() 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (documentBeingDestroyed()) 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_needsSectionRecalc = true; 224d24c94b5090b6aa121f0f82325c9379004dc3196Ben Murdoch setNeedsLayout(); 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTableSection* sectionAbove(const RenderTableSection*, SkipEmptySectionsValue = DoNotSkipEmptySections) const; 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTableSection* sectionBelow(const RenderTableSection*, SkipEmptySectionsValue = DoNotSkipEmptySections) const; 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTableCell* cellAbove(const RenderTableCell*) const; 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTableCell* cellBelow(const RenderTableCell*) const; 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTableCell* cellBefore(const RenderTableCell*) const; 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTableCell* cellAfter(const RenderTableCell*) const; 23402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) typedef Vector<CollapsedBorderValue> CollapsedBorderValues; 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void invalidateCollapsedBorders() 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_collapsedBordersValid = false; 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_collapsedBorders.clear(); 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const CollapsedBorderValue* currentBorderValue() const { return m_currentBorder; } 24202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool hasSections() const { return m_head || m_foot || m_firstBody; } 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void recalcSectionsIfNeeded() const 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_needsSectionRecalc) 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) recalcSections(); 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static RenderTable* createAnonymousWithParentRenderer(const RenderObject*); 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual RenderBox* createAnonymousBoxWithSameTypeAs(const RenderObject* parent) const OVERRIDE 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return createAnonymousWithParentRenderer(parent); 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const BorderValue& tableStartBorderAdjoiningCell(const RenderTableCell*) const; 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const BorderValue& tableEndBorderAdjoiningCell(const RenderTableCell*) const; 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void addCaption(const RenderTableCaption*); 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void removeCaption(const RenderTableCaption*); 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void addColumn(const RenderTableCol*); 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void removeColumn(const RenderTableCol*); 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle); 26753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) virtual void simplifiedNormalFlowLayout(); 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual const char* renderName() const { return "RenderTable"; } 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool isTable() const { return true; } 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool avoidsFloats() const { return true; } 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void paint(PaintInfo&, const LayoutPoint&); 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void paintObject(PaintInfo&, const LayoutPoint&); 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void paintBoxDecorations(PaintInfo&, const LayoutPoint&); 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void paintMask(PaintInfo&, const LayoutPoint&); 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void layout(); 281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual void computeIntrinsicLogicalWidths(LayoutUnit& minWidth, LayoutUnit& maxWidth) const OVERRIDE; 282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) virtual void computePreferredLogicalWidths() OVERRIDE; 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction) OVERRIDE; 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual int baselinePosition(FontBaseline, bool firstLine, LineDirectionMode, LinePositionMode = PositionOnContainingLine) const OVERRIDE; 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual int firstLineBoxBaseline() const OVERRIDE; 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual int inlineBlockBaseline(LineDirectionMode) const OVERRIDE; 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderTableCol* slowColElement(unsigned col, bool* startEdge, bool* endEdge) const; 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void updateColumnCache() const; 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void invalidateCachedColumns(); 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual RenderBlock* firstLineBlock() const; 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void updateFirstLetter(); 29602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void updateLogicalWidth() OVERRIDE; 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit convertStyleLogicalWidthToComputedWidth(const Length& styleLogicalWidth, LayoutUnit availableWidth); 300926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutUnit convertStyleLogicalHeightToComputedHeight(const Length& styleLogicalHeight); 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual LayoutRect overflowClipRect(const LayoutPoint& location, RenderRegion*, OverlayScrollbarSizeRelevancy = IgnoreOverlayScrollbarSize); 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) virtual void addOverflowFromChildren(); 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void subtractCaptionRect(LayoutRect&) const; 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void recalcCollapsedBorders(); 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void recalcSections() const; 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void layoutCaption(RenderTableCaption*); 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void distributeExtraLogicalHeight(int extraLogicalHeight); 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mutable Vector<int> m_columnPos; 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mutable Vector<ColumnStruct> m_columns; 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mutable Vector<RenderTableCaption*> m_captions; 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mutable Vector<RenderTableCol*> m_columnRenderers; 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mutable RenderTableSection* m_head; 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mutable RenderTableSection* m_foot; 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mutable RenderTableSection* m_firstBody; 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<TableLayout> m_tableLayout; 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CollapsedBorderValues m_collapsedBorders; 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const CollapsedBorderValue* m_currentBorder; 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_collapsedBordersValid : 1; 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mutable bool m_hasColElements : 1; 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mutable bool m_needsSectionRecalc : 1; 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool m_columnLogicalWidthChanged : 1; 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mutable bool m_columnRenderersValid: 1; 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) short m_hSpacing; 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) short m_vSpacing; 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int m_borderStart; 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int m_borderEnd; 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline RenderTableSection* RenderTable::topSection() const 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(!needsSectionRecalc()); 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_head) 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_head; 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_firstBody) 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_firstBody; 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_foot; 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline RenderTable* toRenderTable(RenderObject* object) 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 353926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isTable()); 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return static_cast<RenderTable*>(object); 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline const RenderTable* toRenderTable(const RenderObject* object) 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 359926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isTable()); 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return static_cast<const RenderTable*>(object); 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This will catch anyone doing an unnecessary cast. 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void toRenderTable(const RenderTable*); 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // RenderTable_h 369