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