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

📄 renderframeset.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        for (int i = 0; i < gridLen; ++i) {            if (grid[i].isPercent()) {                changePercent = remainingPercent / countPercent;                gridLayout[i] += changePercent;                remainingLen -= changePercent;            }        }    }         // If we don't have any percentage columns/rows we only have fixed columns. Spread    // the remainder equally over all fixed columns/rows.    else if (remainingLen && countFixed) {        int remainingFixed = remainingLen;        int changeFixed = 0;                for (int i = 0; i < gridLen; ++i) {            if (grid[i].isFixed()) {                changeFixed = remainingFixed / countFixed;                gridLayout[i] += changeFixed;                remainingLen -= changeFixed;            }        }    }    // Still some left over. Add it to the last column, because it is impossible    // spread it evenly or equally.    if (remainingLen)        gridLayout[gridLen - 1] += remainingLen;    // now we have the final layout, distribute the delta over it    bool worked = true;    int* gridDelta = axis.m_deltas.data();    for (int i = 0; i < gridLen; ++i) {        if (gridLayout[i] && gridLayout[i] + gridDelta[i] <= 0)            worked = false;        gridLayout[i] += gridDelta[i];    }    // if the deltas broke something, undo them    if (!worked) {        for (int i = 0; i < gridLen; ++i)            gridLayout[i] -= gridDelta[i];        axis.m_deltas.fill(0);    }}void RenderFrameSet::fillFromEdgeInfo(const FrameEdgeInfo& edgeInfo, int r, int c){    if (edgeInfo.allowBorder(LeftFrameEdge))        m_cols.m_allowBorder[c] = true;    if (edgeInfo.allowBorder(RightFrameEdge))        m_cols.m_allowBorder[c + 1] = true;    if (edgeInfo.preventResize(LeftFrameEdge))        m_cols.m_preventResize[c] = true;    if (edgeInfo.preventResize(RightFrameEdge))        m_cols.m_preventResize[c + 1] = true;        if (edgeInfo.allowBorder(TopFrameEdge))        m_rows.m_allowBorder[r] = true;    if (edgeInfo.allowBorder(BottomFrameEdge))        m_rows.m_allowBorder[r + 1] = true;    if (edgeInfo.preventResize(TopFrameEdge))        m_rows.m_preventResize[r] = true;    if (edgeInfo.preventResize(BottomFrameEdge))        m_rows.m_preventResize[r + 1] = true;}void RenderFrameSet::computeEdgeInfo(){    m_rows.m_preventResize.fill(frameSet()->noResize());        m_rows.m_allowBorder.fill(false);    m_cols.m_preventResize.fill(frameSet()->noResize());        m_cols.m_allowBorder.fill(false);        RenderObject* child = firstChild();    if (!child)        return;    int rows = frameSet()->totalRows();    int cols = frameSet()->totalCols();    for (int r = 0; r < rows; ++r) {        for (int c = 0; c < cols; ++c) {            FrameEdgeInfo edgeInfo;            if (child->isFrameSet())                edgeInfo = static_cast<RenderFrameSet*>(child)->edgeInfo();            else                edgeInfo = static_cast<RenderFrame*>(child)->edgeInfo();            fillFromEdgeInfo(edgeInfo, r, c);            child = child->nextSibling();            if (!child)                return;        }    }}FrameEdgeInfo RenderFrameSet::edgeInfo() const{    FrameEdgeInfo result(frameSet()->noResize(), true);        int rows = frameSet()->totalRows();    int cols = frameSet()->totalCols();    if (rows && cols) {        result.setPreventResize(LeftFrameEdge, m_cols.m_preventResize[0]);        result.setAllowBorder(LeftFrameEdge, m_cols.m_allowBorder[0]);        result.setPreventResize(RightFrameEdge, m_cols.m_preventResize[cols]);        result.setAllowBorder(RightFrameEdge, m_cols.m_allowBorder[cols]);        result.setPreventResize(TopFrameEdge, m_rows.m_preventResize[0]);        result.setAllowBorder(TopFrameEdge, m_rows.m_allowBorder[0]);        result.setPreventResize(BottomFrameEdge, m_rows.m_preventResize[rows]);        result.setAllowBorder(BottomFrameEdge, m_rows.m_allowBorder[rows]);    }        return result;}void RenderFrameSet::layout(){    ASSERT(needsLayout());    bool doFullRepaint = selfNeedsLayout() && checkForRepaintDuringLayout();    IntRect oldBounds;    if (doFullRepaint)        oldBounds = absoluteClippedOverflowRect();    if (!parent()->isFrameSet() && !document()->printing()) {        setWidth(view()->viewWidth());        setHeight(view()->viewHeight());    }    size_t cols = frameSet()->totalCols();    size_t rows = frameSet()->totalRows();    if (m_rows.m_sizes.size() != rows || m_cols.m_sizes.size() != cols) {        m_rows.resize(rows);        m_cols.resize(cols);    }    int borderThickness = frameSet()->border();    layOutAxis(m_rows, frameSet()->rowLengths(), height() - (rows - 1) * borderThickness);    layOutAxis(m_cols, frameSet()->colLengths(), width() - (cols - 1) * borderThickness);    positionFrames();    RenderBox::layout();    computeEdgeInfo();    if (doFullRepaint) {        view()->repaintViewRectangle(oldBounds);        IntRect newBounds = absoluteClippedOverflowRect();        if (newBounds != oldBounds)            view()->repaintViewRectangle(newBounds);    }    setNeedsLayout(false);}void RenderFrameSet::positionFrames(){    RenderBox* child = firstChildBox();    if (!child)        return;    int rows = frameSet()->totalRows();    int cols = frameSet()->totalCols();    int yPos = 0;    int borderThickness = frameSet()->border();    for (int r = 0; r < rows; r++) {        int xPos = 0;        int height = m_rows.m_sizes[r];        for (int c = 0; c < cols; c++) {            child->setLocation(xPos, yPos);            int width = m_cols.m_sizes[c];            // has to be resized and itself resize its contents            if (width != child->width() || height != child->height()) {                child->setWidth(width);                child->setHeight(height);                child->setNeedsLayout(true);                child->layout();            }            xPos += width + borderThickness;            child = child->nextSiblingBox();            if (!child)                return;        }        yPos += height + borderThickness;    }    // all the remaining frames are hidden to avoid ugly spurious unflowed frames    for (; child; child = child->nextSiblingBox()) {        child->setWidth(0);        child->setHeight(0);        child->setNeedsLayout(false);    }}void RenderFrameSet::startResizing(GridAxis& axis, int position){    int split = hitTestSplit(axis, position);    if (split == noSplit || !axis.m_allowBorder[split] || axis.m_preventResize[split]) {        axis.m_splitBeingResized = noSplit;        return;    }    axis.m_splitBeingResized = split;    axis.m_splitResizeOffset = position - splitPosition(axis, split);}void RenderFrameSet::continueResizing(GridAxis& axis, int position){    if (needsLayout())        return;    if (axis.m_splitBeingResized == noSplit)        return;    int currentSplitPosition = splitPosition(axis, axis.m_splitBeingResized);    int delta = (position - currentSplitPosition) - axis.m_splitResizeOffset;    if (delta == 0)        return;    axis.m_deltas[axis.m_splitBeingResized - 1] += delta;    axis.m_deltas[axis.m_splitBeingResized] -= delta;    setNeedsLayout(true);}bool RenderFrameSet::userResize(MouseEvent* evt){    if (!m_isResizing) {        if (needsLayout())            return false;        if (evt->type() == eventNames().mousedownEvent && evt->button() == LeftButton) {            FloatPoint pos = localToAbsolute();            startResizing(m_cols, evt->pageX() - pos.x());            startResizing(m_rows, evt->pageY() - pos.y());            if (m_cols.m_splitBeingResized != noSplit || m_rows.m_splitBeingResized != noSplit) {                setIsResizing(true);                return true;            }        }    } else {        if (evt->type() == eventNames().mousemoveEvent || (evt->type() == eventNames().mouseupEvent && evt->button() == LeftButton)) {            FloatPoint pos = localToAbsolute();            continueResizing(m_cols, evt->pageX() - pos.x());            continueResizing(m_rows, evt->pageY() - pos.y());            if (evt->type() == eventNames().mouseupEvent && evt->button() == LeftButton) {                setIsResizing(false);                return true;            }        }    }    return false;}void RenderFrameSet::setIsResizing(bool isResizing){    m_isResizing = isResizing;    for (RenderObject* p = parent(); p; p = p->parent())        if (p->isFrameSet())            static_cast<RenderFrameSet*>(p)->m_isChildResizing = isResizing;    if (Frame* frame = document()->frame())        frame->eventHandler()->setResizingFrameSet(isResizing ? frameSet() : 0);}bool RenderFrameSet::isResizingRow() const{    return m_isResizing && m_rows.m_splitBeingResized != noSplit;}bool RenderFrameSet::isResizingColumn() const{    return m_isResizing && m_cols.m_splitBeingResized != noSplit;}bool RenderFrameSet::canResizeRow(const IntPoint& p) const{    int r = hitTestSplit(m_rows, p.y());    return r != noSplit && m_rows.m_allowBorder[r] && !m_rows.m_preventResize[r];}bool RenderFrameSet::canResizeColumn(const IntPoint& p) const{    int c = hitTestSplit(m_cols, p.x());    return c != noSplit && m_cols.m_allowBorder[c] && !m_cols.m_preventResize[c];}int RenderFrameSet::splitPosition(const GridAxis& axis, int split) const{    if (needsLayout())        return 0;    int borderThickness = frameSet()->border();    int size = axis.m_sizes.size();    if (!size)        return 0;    int position = 0;    for (int i = 0; i < split && i < size; ++i)        position += axis.m_sizes[i] + borderThickness;    return position - borderThickness;}int RenderFrameSet::hitTestSplit(const GridAxis& axis, int position) const{    if (needsLayout())        return noSplit;    int borderThickness = frameSet()->border();    if (borderThickness <= 0)        return noSplit;    size_t size = axis.m_sizes.size();    if (!size)        return noSplit;    int splitPosition = axis.m_sizes[0];    for (size_t i = 1; i < size; ++i) {        if (position >= splitPosition && position < splitPosition + borderThickness)            return i;        splitPosition += borderThickness + axis.m_sizes[i];    }    return noSplit;}bool RenderFrameSet::isChildAllowed(RenderObject* child, RenderStyle*) const{    return child->isFrame() || child->isFrameSet();}} // namespace WebCore

⌨️ 快捷键说明

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