📄 renderframeset.cpp
字号:
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 + -