15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/** 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2000 Simon Hausmann <hausmann@kde.org> 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2000 Stefan Schimanski (1Stein@gmx.de) 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc. 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful, 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details. 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB. If not, write to 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA. 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderFrameSet.h" 2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 2753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/EventNames.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/MouseEvent.h" 307757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "core/html/HTMLDimension.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFrameSetElement.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/EventHandler.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/Frame.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/Cursor.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/GraphicsContext.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/PaintInfo.h" 3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderFrame.h" 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h" 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderFrameSet::RenderFrameSet(HTMLFrameSetElement* frameSet) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : RenderBox(frameSet) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_isResizing(false) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_isChildResizing(false) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setInline(false); 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderFrameSet::~RenderFrameSet() 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderFrameSet::GridAxis::GridAxis() 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_splitBeingResized(noSplit) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline HTMLFrameSetElement* RenderFrameSet::frameSet() const 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return static_cast<HTMLFrameSetElement*>(node()); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static Color borderStartEdgeColor() 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Color(170, 170, 170); 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static Color borderEndEdgeColor() 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Color::black; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static Color borderFillColor() 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Color(208, 208, 208); 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderFrameSet::paintColumnBorder(const PaintInfo& paintInfo, const IntRect& borderRect) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!paintInfo.rect.intersects(borderRect)) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 835267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: We should do something clever when borders from distinct framesets meet at a join. 855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Fill first. 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) GraphicsContext* context = paintInfo.context; 887757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch context->fillRect(borderRect, frameSet()->hasBorderColor() ? resolveColor(CSSPropertyBorderLeftColor) : borderFillColor()); 895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Now stroke the edges but only if we have enough room to paint both edges with a little 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // bit of the fill color showing through. 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (borderRect.width() >= 3) { 935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) context->fillRect(IntRect(borderRect.location(), IntSize(1, height())), borderStartEdgeColor()); 945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) context->fillRect(IntRect(IntPoint(borderRect.maxX() - 1, borderRect.y()), IntSize(1, height())), borderEndEdgeColor()); 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderFrameSet::paintRowBorder(const PaintInfo& paintInfo, const IntRect& borderRect) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!paintInfo.rect.intersects(borderRect)) 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: We should do something clever when borders from distinct framesets meet at a join. 1045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Fill first. 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) GraphicsContext* context = paintInfo.context; 1077757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch context->fillRect(borderRect, frameSet()->hasBorderColor() ? resolveColor(CSSPropertyBorderLeftColor) : borderFillColor()); 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Now stroke the edges but only if we have enough room to paint both edges with a little 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // bit of the fill color showing through. 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (borderRect.height() >= 3) { 1125267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) context->fillRect(IntRect(borderRect.location(), IntSize(width(), 1)), borderStartEdgeColor()); 1135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) context->fillRect(IntRect(IntPoint(borderRect.x(), borderRect.maxY() - 1), IntSize(width(), 1)), borderEndEdgeColor()); 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderFrameSet::paint(PaintInfo& paintInfo, const LayoutPoint& paintOffset) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1195267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) ANNOTATE_GRAPHICS_CONTEXT(paintInfo, this); 1205267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (paintInfo.phase != PaintPhaseForeground) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 12302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject* child = firstChild(); 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!child) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutPoint adjustedPaintOffset = paintOffset + location(); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) size_t rows = m_rows.m_sizes.size(); 131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) size_t cols = m_cols.m_sizes.size(); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit borderThickness = frameSet()->border(); 13302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit yPos = 0; 135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (size_t r = 0; r < rows; r++) { 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit xPos = 0; 137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) for (size_t c = 0; c < cols; c++) { 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) child->paint(paintInfo, adjustedPaintOffset); 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xPos += m_cols.m_sizes[c]; 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (borderThickness && m_cols.m_allowBorder[c + 1]) { 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) paintColumnBorder(paintInfo, pixelSnappedIntRect(LayoutRect(adjustedPaintOffset.x() + xPos, adjustedPaintOffset.y() + yPos, borderThickness, height()))); 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xPos += borderThickness; 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) child = child->nextSibling(); 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!child) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) yPos += m_rows.m_sizes[r]; 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (borderThickness && m_rows.m_allowBorder[r + 1]) { 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) paintRowBorder(paintInfo, pixelSnappedIntRect(LayoutRect(adjustedPaintOffset.x(), adjustedPaintOffset.y() + yPos, width(), borderThickness))); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) yPos += borderThickness; 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderFrameSet::GridAxis::resize(int size) 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_sizes.resize(size); 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_deltas.resize(size); 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_deltas.fill(0); 16102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // To track edges for resizability and borders, we need to be (size + 1). This is because a parent frameset 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // may ask us for information about our left/top/right/bottom edges in order to make its own decisions about 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // what to do. We are capable of tainting that parent frameset's borders, so we have to cache this info. 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_preventResize.resize(size + 1); 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_allowBorder.resize(size + 1); 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1697757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdochvoid RenderFrameSet::layOutAxis(GridAxis& axis, const Vector<HTMLDimension>& grid, int availableLen) 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) availableLen = max(availableLen, 0); 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int* gridLayout = axis.m_sizes.data(); 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 175591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (grid.isEmpty()) { 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gridLayout[0] = availableLen; 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int gridLen = axis.m_sizes.size(); 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(gridLen); 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int totalRelative = 0; 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int totalFixed = 0; 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int totalPercent = 0; 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int countRelative = 0; 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int countFixed = 0; 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int countPercent = 0; 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // First we need to investigate how many columns of each type we have and 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // how much space these columns are going to require. 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = 0; i < gridLen; ++i) { 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Count the total length of all of the fixed columns/rows -> totalFixed 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Count the number of columns/rows which are fixed -> countFixed 1957757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (grid[i].isAbsolute()) { 1967757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch gridLayout[i] = max<int>(grid[i].value(), 0); 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) totalFixed += gridLayout[i]; 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) countFixed++; 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 20002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Count the total percentage of all of the percentage columns/rows -> totalPercent 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Count the number of columns/rows which are percentages -> countPercent 2037757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (grid[i].isPercentage()) { 2047757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch gridLayout[i] = max<int>(grid[i].value() * availableLen / 100., 0); 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) totalPercent += gridLayout[i]; 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) countPercent++; 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Count the total relative of all the relative columns/rows -> totalRelative 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Count the number of columns/rows which are relative -> countRelative 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (grid[i].isRelative()) { 2127757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch totalRelative += max<int>(grid[i].value(), 1); 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) countRelative++; 21402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch } 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int remainingLen = availableLen; 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Fixed columns/rows are our first priority. If there is not enough space to fit all fixed 22002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // columns/rows we need to proportionally adjust their size. 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (totalFixed > remainingLen) { 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int remainingFixed = remainingLen; 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = 0; i < gridLen; ++i) { 2257757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (grid[i].isAbsolute()) { 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gridLayout[i] = (gridLayout[i] * remainingFixed) / totalFixed; 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) remainingLen -= gridLayout[i]; 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) remainingLen -= totalFixed; 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 23302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // Percentage columns/rows are our second priority. Divide the remaining space proportionally 23402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // over all percentage columns/rows. IMPORTANT: the size of each column/row is not relative 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to 100%, but to the total percentage. For example, if there are three columns, each of 75%, 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and the available space is 300px, each column will become 100px in width. 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (totalPercent > remainingLen) { 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int remainingPercent = remainingLen; 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = 0; i < gridLen; ++i) { 2417757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (grid[i].isPercentage()) { 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gridLayout[i] = (gridLayout[i] * remainingPercent) / totalPercent; 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) remainingLen -= gridLayout[i]; 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) remainingLen -= totalPercent; 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Relative columns/rows are our last priority. Divide the remaining space proportionally 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // over all relative columns/rows. IMPORTANT: the relative value of 0* is treated as 1*. 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (countRelative) { 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int lastRelative = 0; 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int remainingRelative = remainingLen; 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = 0; i < gridLen; ++i) { 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (grid[i].isRelative()) { 2577757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch gridLayout[i] = (max(grid[i].value(), 1.) * remainingRelative) / totalRelative; 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) remainingLen -= gridLayout[i]; 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lastRelative = i; 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 26202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 26302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // If we could not evenly distribute the available space of all of the relative 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // columns/rows, the remainder will be added to the last column/row. 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For example: if we have a space of 100px and three columns (*,*,*), the remainder will 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // be 1px and will be added to the last column: 33px, 33px, 34px. 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (remainingLen) { 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gridLayout[lastRelative] += remainingLen; 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) remainingLen = 0; 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we still have some left over space we need to divide it over the already existing 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // columns/rows 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (remainingLen) { 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Our first priority is to spread if over the percentage columns. The remaining 27702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // space is spread evenly, for example: if we have a space of 100px, the columns 27802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // definition of 25%,25% used to result in two columns of 25px. After this the 27902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // columns will each be 50px in width. 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (countPercent && totalPercent) { 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int remainingPercent = remainingLen; 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int changePercent = 0; 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = 0; i < gridLen; ++i) { 2857757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (grid[i].isPercentage()) { 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) changePercent = (remainingPercent * gridLayout[i]) / totalPercent; 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gridLayout[i] += changePercent; 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) remainingLen -= changePercent; 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else if (totalFixed) { 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Our last priority is to spread the remaining space over the fixed columns. 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For example if we have 100px of space and two column of each 40px, both 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // columns will become exactly 50px. 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int remainingFixed = remainingLen; 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int changeFixed = 0; 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = 0; i < gridLen; ++i) { 2997757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (grid[i].isAbsolute()) { 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) changeFixed = (remainingFixed * gridLayout[i]) / totalFixed; 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gridLayout[i] += changeFixed; 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) remainingLen -= changeFixed; 30302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch } 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 30702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we still have some left over space we probably ended up with a remainder of 30902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // a division. We cannot spread it evenly anymore. If we have any percentage 31002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // columns/rows simply spread the remainder equally over all available percentage columns, 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // regardless of their size. 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (remainingLen && countPercent) { 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int remainingPercent = remainingLen; 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int changePercent = 0; 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = 0; i < gridLen; ++i) { 3177757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (grid[i].isPercentage()) { 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) changePercent = remainingPercent / countPercent; 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gridLayout[i] += changePercent; 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) remainingLen -= changePercent; 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else if (remainingLen && countFixed) { 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we don't have any percentage columns/rows we only have 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // fixed columns. Spread the remainder equally over all fixed 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // columns/rows. 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int remainingFixed = remainingLen; 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int changeFixed = 0; 32902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = 0; i < gridLen; ++i) { 3317757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (grid[i].isAbsolute()) { 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) changeFixed = remainingFixed / countFixed; 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gridLayout[i] += changeFixed; 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) remainingLen -= changeFixed; 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Still some left over. Add it to the last column, because it is impossible 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // spread it evenly or equally. 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (remainingLen) 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gridLayout[gridLen - 1] += remainingLen; 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // now we have the final layout, distribute the delta over it 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool worked = true; 3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int* gridDelta = axis.m_deltas.data(); 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = 0; i < gridLen; ++i) { 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (gridLayout[i] && gridLayout[i] + gridDelta[i] <= 0) 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) worked = false; 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gridLayout[i] += gridDelta[i]; 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if the deltas broke something, undo them 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!worked) { 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = 0; i < gridLen; ++i) 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) gridLayout[i] -= gridDelta[i]; 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) axis.m_deltas.fill(0); 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderFrameSet::notifyFrameEdgeInfoChanged() 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (needsLayout()) 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: We should only recompute the edge info with respect to the frame that changed 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // and its adjacent frame(s) instead of recomputing the edge info for the entire frameset. 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) computeEdgeInfo(); 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderFrameSet::fillFromEdgeInfo(const FrameEdgeInfo& edgeInfo, int r, int c) 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (edgeInfo.allowBorder(LeftFrameEdge)) 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_cols.m_allowBorder[c] = true; 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (edgeInfo.allowBorder(RightFrameEdge)) 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_cols.m_allowBorder[c + 1] = true; 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (edgeInfo.preventResize(LeftFrameEdge)) 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_cols.m_preventResize[c] = true; 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (edgeInfo.preventResize(RightFrameEdge)) 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_cols.m_preventResize[c + 1] = true; 37902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (edgeInfo.allowBorder(TopFrameEdge)) 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_rows.m_allowBorder[r] = true; 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (edgeInfo.allowBorder(BottomFrameEdge)) 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_rows.m_allowBorder[r + 1] = true; 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (edgeInfo.preventResize(TopFrameEdge)) 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_rows.m_preventResize[r] = true; 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (edgeInfo.preventResize(BottomFrameEdge)) 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_rows.m_preventResize[r + 1] = true; 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderFrameSet::computeEdgeInfo() 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 39202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch m_rows.m_preventResize.fill(frameSet()->noResize()); 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_rows.m_allowBorder.fill(false); 39402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch m_cols.m_preventResize.fill(frameSet()->noResize()); 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_cols.m_allowBorder.fill(false); 39602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderObject* child = firstChild(); 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!child) 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 40153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) size_t rows = m_rows.m_sizes.size(); 40253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) size_t cols = m_cols.m_sizes.size(); 40353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t r = 0; r < rows; ++r) { 40453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) for (size_t c = 0; c < cols; ++c) { 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FrameEdgeInfo edgeInfo; 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (child->isFrameSet()) 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) edgeInfo = toRenderFrameSet(child)->edgeInfo(); 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) edgeInfo = toRenderFrame(child)->edgeInfo(); 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) fillFromEdgeInfo(edgeInfo, r, c); 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) child = child->nextSibling(); 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!child) 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)FrameEdgeInfo RenderFrameSet::edgeInfo() const 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FrameEdgeInfo result(frameSet()->noResize(), true); 42102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int rows = frameSet()->totalRows(); 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int cols = frameSet()->totalCols(); 4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (rows && cols) { 4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.setPreventResize(LeftFrameEdge, m_cols.m_preventResize[0]); 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.setAllowBorder(LeftFrameEdge, m_cols.m_allowBorder[0]); 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.setPreventResize(RightFrameEdge, m_cols.m_preventResize[cols]); 4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.setAllowBorder(RightFrameEdge, m_cols.m_allowBorder[cols]); 4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.setPreventResize(TopFrameEdge, m_rows.m_preventResize[0]); 4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.setAllowBorder(TopFrameEdge, m_rows.m_allowBorder[0]); 4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.setPreventResize(BottomFrameEdge, m_rows.m_preventResize[rows]); 4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.setAllowBorder(BottomFrameEdge, m_rows.m_allowBorder[rows]); 4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 43402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderFrameSet::layout() 4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StackStats::LayoutCheckPoint layoutCheckPoint; 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(needsLayout()); 4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool doFullRepaint = selfNeedsLayout() && checkForRepaintDuringLayout(); 4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutRect oldBounds; 445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) RenderLayerModelObject* repaintContainer = 0; 446926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (doFullRepaint) { 447926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) repaintContainer = containerForRepaint(); 448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) oldBounds = clippedOverflowRectForRepaint(repaintContainer); 449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!parent()->isFrameSet() && !document()->printing()) { 4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setWidth(view()->viewWidth()); 4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setHeight(view()->viewHeight()); 4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned cols = frameSet()->totalCols(); 4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned rows = frameSet()->totalRows(); 4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_rows.m_sizes.size() != rows || m_cols.m_sizes.size() != cols) { 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_rows.resize(rows); 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_cols.resize(cols); 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LayoutUnit borderThickness = frameSet()->border(); 4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) layOutAxis(m_rows, frameSet()->rowLengths(), height() - (rows - 1) * borderThickness); 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) layOutAxis(m_cols, frameSet()->colLengths(), width() - (cols - 1) * borderThickness); 4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles) positionFrames(); 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBox::layout(); 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) computeEdgeInfo(); 4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 474926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) updateLayerTransform(); 475926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (doFullRepaint) { 477926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) repaintUsingContainer(repaintContainer, pixelSnappedIntRect(oldBounds)); 478926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) LayoutRect newBounds = clippedOverflowRectForRepaint(repaintContainer); 4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (newBounds != oldBounds) 480926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) repaintUsingContainer(repaintContainer, pixelSnappedIntRect(newBounds)); 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 483e6d4491e48613634a83c1957c72759da80987961Ben Murdoch clearNeedsLayout(); 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderFrameSet::positionFrames() 4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RenderBox* child = firstChildBox(); 4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!child) 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int rows = frameSet()->totalRows(); 4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int cols = frameSet()->totalCols(); 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int yPos = 0; 4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int borderThickness = frameSet()->border(); 4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int r = 0; r < rows; r++) { 4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int xPos = 0; 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int height = m_rows.m_sizes[r]; 5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int c = 0; c < cols; c++) { 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) child->setLocation(IntPoint(xPos, yPos)); 5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int width = m_cols.m_sizes[c]; 5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // has to be resized and itself resize its contents 5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (width != child->width() || height != child->height()) { 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) child->setWidth(width); 5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) child->setHeight(height); 508d24c94b5090b6aa121f0f82325c9379004dc3196Ben Murdoch child->setNeedsLayout(); 5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) child->layout(); 5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) xPos += width + borderThickness; 5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) child = child->nextSiblingBox(); 5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!child) 5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) yPos += height + borderThickness; 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // all the remaining frames are hidden to avoid ugly spurious unflowed frames 5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (; child; child = child->nextSiblingBox()) { 5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) child->setWidth(0); 5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) child->setHeight(0); 525e6d4491e48613634a83c1957c72759da80987961Ben Murdoch child->clearNeedsLayout(); 5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderFrameSet::startResizing(GridAxis& axis, int position) 5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int split = hitTestSplit(axis, position); 5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (split == noSplit || axis.m_preventResize[split]) { 5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) axis.m_splitBeingResized = noSplit; 5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) axis.m_splitBeingResized = split; 5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) axis.m_splitResizeOffset = position - splitPosition(axis, split); 5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderFrameSet::continueResizing(GridAxis& axis, int position) 5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (needsLayout()) 5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (axis.m_splitBeingResized == noSplit) 5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int currentSplitPosition = splitPosition(axis, axis.m_splitBeingResized); 5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int delta = (position - currentSplitPosition) - axis.m_splitResizeOffset; 5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!delta) 5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) axis.m_deltas[axis.m_splitBeingResized - 1] += delta; 5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) axis.m_deltas[axis.m_splitBeingResized] -= delta; 552d24c94b5090b6aa121f0f82325c9379004dc3196Ben Murdoch setNeedsLayout(); 5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderFrameSet::userResize(MouseEvent* evt) 5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_isResizing) { 5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (needsLayout()) 5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (evt->type() == eventNames().mousedownEvent && evt->button() == LeftButton) { 561926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatPoint localPos = absoluteToLocal(evt->absoluteLocation(), UseTransforms); 5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) startResizing(m_cols, localPos.x()); 5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) startResizing(m_rows, localPos.y()); 5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_cols.m_splitBeingResized != noSplit || m_rows.m_splitBeingResized != noSplit) { 5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setIsResizing(true); 5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (evt->type() == eventNames().mousemoveEvent || (evt->type() == eventNames().mouseupEvent && evt->button() == LeftButton)) { 571926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) FloatPoint localPos = absoluteToLocal(evt->absoluteLocation(), UseTransforms); 5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continueResizing(m_cols, localPos.x()); 5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continueResizing(m_rows, localPos.y()); 5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (evt->type() == eventNames().mouseupEvent && evt->button() == LeftButton) { 5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) setIsResizing(false); 5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderFrameSet::setIsResizing(bool isResizing) 5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_isResizing = isResizing; 5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (RenderObject* ancestor = parent(); ancestor; ancestor = ancestor->parent()) { 5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (ancestor->isFrameSet()) 5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) toRenderFrameSet(ancestor)->m_isChildResizing = isResizing; 5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (Frame* frame = this->frame()) 5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) frame->eventHandler()->setResizingFrameSet(isResizing ? frameSet() : 0); 5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderFrameSet::isResizingRow() const 5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_isResizing && m_rows.m_splitBeingResized != noSplit; 5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderFrameSet::isResizingColumn() const 6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_isResizing && m_cols.m_splitBeingResized != noSplit; 6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderFrameSet::canResizeRow(const IntPoint& p) const 6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int r = hitTestSplit(m_rows, p.y()); 6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return r != noSplit && !m_rows.m_preventResize[r]; 6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderFrameSet::canResizeColumn(const IntPoint& p) const 6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int c = hitTestSplit(m_cols, p.x()); 6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return c != noSplit && !m_cols.m_preventResize[c]; 6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int RenderFrameSet::splitPosition(const GridAxis& axis, int split) const 6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (needsLayout()) 6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int borderThickness = frameSet()->border(); 6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int size = axis.m_sizes.size(); 6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!size) 6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int position = 0; 6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int i = 0; i < split && i < size; ++i) 6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) position += axis.m_sizes[i] + borderThickness; 6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return position - borderThickness; 6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int RenderFrameSet::hitTestSplit(const GridAxis& axis, int position) const 6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (needsLayout()) 6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return noSplit; 6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int borderThickness = frameSet()->border(); 6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (borderThickness <= 0) 6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return noSplit; 6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t size = axis.m_sizes.size(); 6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!size) 6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return noSplit; 6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int splitPosition = axis.m_sizes[0]; 6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 1; i < size; ++i) { 6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (position >= splitPosition && position < splitPosition + borderThickness) 6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return i; 6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) splitPosition += borderThickness + axis.m_sizes[i]; 6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return noSplit; 6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderFrameSet::isChildAllowed(RenderObject* child, RenderStyle*) const 6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return child->isFrame() || child->isFrameSet(); 6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CursorDirective RenderFrameSet::getCursor(const LayoutPoint& point, Cursor& cursor) const 6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntPoint roundedPoint = roundedIntPoint(point); 6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (canResizeRow(roundedPoint)) { 6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cursor = rowResizeCursor(); 6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SetCursor; 6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (canResizeColumn(roundedPoint)) { 6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cursor = columnResizeCursor(); 6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return SetCursor; 6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return RenderBox::getCursor(point, cursor); 6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 676