diff --git a/layout/html/table/src/nsTableCellFrame.cpp b/layout/html/table/src/nsTableCellFrame.cpp index 223b7a304fc..81c79d55ae4 100644 --- a/layout/html/table/src/nsTableCellFrame.cpp +++ b/layout/html/table/src/nsTableCellFrame.cpp @@ -434,6 +434,15 @@ nsTableCellFrame::CreateContinuingFrame(nsIPresContext& aPresContext, cf->Init(aPresContext, mContent, aParent, aStyleContext); cf->AppendToFlow(this); aContinuingFrame = cf; + + // Create a continuing body frame + nsIFrame* childList; + nsIStyleContext* kidSC; + + mFirstChild->GetStyleContext(kidSC); + mFirstChild->CreateContinuingFrame(aPresContext, cf, kidSC, childList); + NS_RELEASE(kidSC); + cf->SetInitialChildList(aPresContext, nsnull, childList); return NS_OK; } diff --git a/layout/html/table/src/nsTableRowFrame.cpp b/layout/html/table/src/nsTableRowFrame.cpp index ef1a39501ed..eecbae176a3 100644 --- a/layout/html/table/src/nsTableRowFrame.cpp +++ b/layout/html/table/src/nsTableRowFrame.cpp @@ -483,6 +483,7 @@ NS_METHOD nsTableRowFrame::ResizeReflow(nsIPresContext& aPresContext, RowReflowState& aReflowState, nsReflowStatus& aStatus) { + aStatus = NS_FRAME_COMPLETE; if (nsnull == mFirstChild) return NS_OK; @@ -555,13 +556,21 @@ NS_METHOD nsTableRowFrame::ResizeReflow(nsIPresContext& aPresContext, // If the available width is the same as last time we reflowed the cell, // then just use the previous desired size and max element size. // if we need the max-element-size we don't need to reflow. - // we just grab it from the cell frame which remembers it (see the else clause below) - if (availWidth != ((nsTableCellFrame *)kidFrame)->GetPriorAvailWidth()) + // we just grab it from the cell frame which remembers it (see the else clause below). + // Note: we can't do that optimization if our height is constrained + if ((aReflowState.reflowState.maxSize.height != NS_UNCONSTRAINEDSIZE) || + (availWidth != ((nsTableCellFrame *)kidFrame)->GetPriorAvailWidth())) { + // XXX TROY +#if 0 // Always let the cell be as high as it wants. We ignore the height that's // passed in and always place the entire row. Let the row group decide // whether we fit or wehther the entire row is pushed nsSize kidAvailSize(availWidth, NS_UNCONSTRAINEDSIZE); +#else + // Reflow the cell to fit the available height + nsSize kidAvailSize(availWidth, aReflowState.reflowState.maxSize.height); +#endif // Reflow the child nsHTMLReflowState kidReflowState(aPresContext, kidFrame, @@ -578,7 +587,15 @@ NS_METHOD nsTableRowFrame::ResizeReflow(nsIPresContext& aPresContext, desiredSize.width, availWidth); } #endif + // XXX TROY +#if 0 NS_ASSERTION(NS_FRAME_IS_COMPLETE(status), "unexpected reflow status"); +#else + // If any of the cells are not complete, then we're not complete + if (NS_FRAME_IS_NOT_COMPLETE(status)) { + aStatus = NS_FRAME_NOT_COMPLETE; + } +#endif if (gsDebug) { @@ -646,7 +663,8 @@ NS_METHOD nsTableRowFrame::ResizeReflow(nsIPresContext& aPresContext, nsHTMLReflowMetrics desiredSize(nsnull); if (PR_TRUE==gsDebug) printf("\nRow: Resize Reflow of unknown frame %p of type %d with reason=%d\n", kidFrame, kidDisplay->mDisplay, eReflowReason_Resize); - ReflowChild(kidFrame, aPresContext, desiredSize, kidReflowState, aStatus); + nsReflowStatus status; + ReflowChild(kidFrame, aPresContext, desiredSize, kidReflowState, status); } // Get the next child @@ -1363,6 +1381,7 @@ nsTableRowFrame::Reflow(nsIPresContext& aPresContext, rv = InitialReflow(aPresContext, aDesiredSize, state, aStatus, nsnull, PR_TRUE); GetMinRowSpan(tableFrame); FixMinCellHeight(tableFrame); + aStatus = NS_FRAME_COMPLETE; break; case eReflowReason_Resize: @@ -1374,7 +1393,10 @@ nsTableRowFrame::Reflow(nsIPresContext& aPresContext, break; } + // XXX TROY +#if 0 aStatus = NS_FRAME_COMPLETE; // we're never continued +#endif if (gsDebug==PR_TRUE) { @@ -1398,10 +1420,42 @@ nsTableRowFrame::CreateContinuingFrame(nsIPresContext& aPresContext, nsIStyleContext* aStyleContext, nsIFrame*& aContinuingFrame) { - // Because rows are always complete we should never be asked to create - // a continuing frame - NS_ERROR("Unexpected request"); - return NS_ERROR_NOT_IMPLEMENTED; + nsTableRowFrame* cf = new nsTableRowFrame; + if (nsnull == cf) { + return NS_ERROR_OUT_OF_MEMORY; + } + cf->Init(aPresContext, mContent, aParent, aStyleContext); + cf->AppendToFlow(this); + + // Create a continuing frame for each table cell + nsIFrame* newChildList; + for (nsIFrame* kidFrame = mFirstChild; + nsnull != kidFrame; + kidFrame->GetNextSibling(kidFrame)) { + + const nsStyleDisplay *kidDisplay; + kidFrame->GetStyleData(eStyleStruct_Display, ((const nsStyleStruct *&)kidDisplay)); + if (NS_STYLE_DISPLAY_TABLE_CELL == kidDisplay->mDisplay) { + nsIFrame* contCellFrame; + nsIStyleContext* kidSC; + + // Create a continuing cell frame + kidFrame->GetStyleContext(kidSC); + kidFrame->CreateContinuingFrame(aPresContext, cf, kidSC, contCellFrame); + NS_RELEASE(kidSC); + + // Link it into the list of child frames + if (nsnull == cf->mFirstChild) { + cf->mFirstChild = contCellFrame; + } else { + newChildList->SetNextSibling(contCellFrame); + } + newChildList = contCellFrame; + } + } + + aContinuingFrame = cf; + return NS_OK; } /* we overload this here because rows have children that can span outside of themselves. diff --git a/layout/html/table/src/nsTableRowGroupFrame.cpp b/layout/html/table/src/nsTableRowGroupFrame.cpp index 3cfbe5394cf..861749c2c29 100644 --- a/layout/html/table/src/nsTableRowGroupFrame.cpp +++ b/layout/html/table/src/nsTableRowGroupFrame.cpp @@ -850,6 +850,7 @@ nsTableRowGroupFrame::SplitRowGroup(nsIPresContext& aPresContext, nsReflowStatus& aStatus) { nsIFrame* prevKidFrame = nsnull; + nsresult rv = NS_OK; // Walk each of the row frames looking for the first row frame that // doesn't fit in the available space @@ -857,21 +858,22 @@ nsTableRowGroupFrame::SplitRowGroup(nsIPresContext& aPresContext, nsRect bounds; kidFrame->GetRect(bounds); + // XXX This check isn't correct if there's a footer... if (bounds.YMost() > aReflowState.maxSize.height) { // If this is the first row frame then we need to split it if (nsnull == prevKidFrame) { // Reflow the row in the available space and have it split // XXX Account for horizontal margins... -#if 0 nsSize kidAvailSize(aReflowState.maxSize.width, aReflowState.maxSize.height - bounds.y); - nsHTMLReflowState kidReflowState(aPresContext, kidFrame, aReflowState, - kidAvailSize, eReflowReason_Resize); - nsReflowMetrics desiredSize; + nsHTMLReflowState kidReflowState(aPresContext, kidFrame, aReflowState, + kidAvailSize, eReflowReason_Resize); + nsHTMLReflowMetrics desiredSize(nsnull); rv = ReflowChild(kidFrame, aPresContext, desiredSize, kidReflowState, aStatus); kidFrame->SizeTo(desiredSize.width, desiredSize.height); NS_ASSERTION(NS_FRAME_IS_NOT_COMPLETE(aStatus), "unexpected status"); + ((nsTableRowFrame *)kidFrame)->DidResize(aPresContext, aReflowState); // Create a continuing frame, add it to the child list, and then push it // and the frames that follow @@ -892,8 +894,7 @@ nsTableRowGroupFrame::SplitRowGroup(nsIPresContext& aPresContext, // Push it and the frames that follow PushChildren(continuingFrame, kidFrame); - aDesiredSize.height = bounds.y; -#endif + aDesiredSize.height = desiredSize.height; } else { // See whether the row frame has cells that span into it or across it diff --git a/layout/tables/nsTableCellFrame.cpp b/layout/tables/nsTableCellFrame.cpp index 223b7a304fc..81c79d55ae4 100644 --- a/layout/tables/nsTableCellFrame.cpp +++ b/layout/tables/nsTableCellFrame.cpp @@ -434,6 +434,15 @@ nsTableCellFrame::CreateContinuingFrame(nsIPresContext& aPresContext, cf->Init(aPresContext, mContent, aParent, aStyleContext); cf->AppendToFlow(this); aContinuingFrame = cf; + + // Create a continuing body frame + nsIFrame* childList; + nsIStyleContext* kidSC; + + mFirstChild->GetStyleContext(kidSC); + mFirstChild->CreateContinuingFrame(aPresContext, cf, kidSC, childList); + NS_RELEASE(kidSC); + cf->SetInitialChildList(aPresContext, nsnull, childList); return NS_OK; } diff --git a/layout/tables/nsTableRowFrame.cpp b/layout/tables/nsTableRowFrame.cpp index ef1a39501ed..eecbae176a3 100644 --- a/layout/tables/nsTableRowFrame.cpp +++ b/layout/tables/nsTableRowFrame.cpp @@ -483,6 +483,7 @@ NS_METHOD nsTableRowFrame::ResizeReflow(nsIPresContext& aPresContext, RowReflowState& aReflowState, nsReflowStatus& aStatus) { + aStatus = NS_FRAME_COMPLETE; if (nsnull == mFirstChild) return NS_OK; @@ -555,13 +556,21 @@ NS_METHOD nsTableRowFrame::ResizeReflow(nsIPresContext& aPresContext, // If the available width is the same as last time we reflowed the cell, // then just use the previous desired size and max element size. // if we need the max-element-size we don't need to reflow. - // we just grab it from the cell frame which remembers it (see the else clause below) - if (availWidth != ((nsTableCellFrame *)kidFrame)->GetPriorAvailWidth()) + // we just grab it from the cell frame which remembers it (see the else clause below). + // Note: we can't do that optimization if our height is constrained + if ((aReflowState.reflowState.maxSize.height != NS_UNCONSTRAINEDSIZE) || + (availWidth != ((nsTableCellFrame *)kidFrame)->GetPriorAvailWidth())) { + // XXX TROY +#if 0 // Always let the cell be as high as it wants. We ignore the height that's // passed in and always place the entire row. Let the row group decide // whether we fit or wehther the entire row is pushed nsSize kidAvailSize(availWidth, NS_UNCONSTRAINEDSIZE); +#else + // Reflow the cell to fit the available height + nsSize kidAvailSize(availWidth, aReflowState.reflowState.maxSize.height); +#endif // Reflow the child nsHTMLReflowState kidReflowState(aPresContext, kidFrame, @@ -578,7 +587,15 @@ NS_METHOD nsTableRowFrame::ResizeReflow(nsIPresContext& aPresContext, desiredSize.width, availWidth); } #endif + // XXX TROY +#if 0 NS_ASSERTION(NS_FRAME_IS_COMPLETE(status), "unexpected reflow status"); +#else + // If any of the cells are not complete, then we're not complete + if (NS_FRAME_IS_NOT_COMPLETE(status)) { + aStatus = NS_FRAME_NOT_COMPLETE; + } +#endif if (gsDebug) { @@ -646,7 +663,8 @@ NS_METHOD nsTableRowFrame::ResizeReflow(nsIPresContext& aPresContext, nsHTMLReflowMetrics desiredSize(nsnull); if (PR_TRUE==gsDebug) printf("\nRow: Resize Reflow of unknown frame %p of type %d with reason=%d\n", kidFrame, kidDisplay->mDisplay, eReflowReason_Resize); - ReflowChild(kidFrame, aPresContext, desiredSize, kidReflowState, aStatus); + nsReflowStatus status; + ReflowChild(kidFrame, aPresContext, desiredSize, kidReflowState, status); } // Get the next child @@ -1363,6 +1381,7 @@ nsTableRowFrame::Reflow(nsIPresContext& aPresContext, rv = InitialReflow(aPresContext, aDesiredSize, state, aStatus, nsnull, PR_TRUE); GetMinRowSpan(tableFrame); FixMinCellHeight(tableFrame); + aStatus = NS_FRAME_COMPLETE; break; case eReflowReason_Resize: @@ -1374,7 +1393,10 @@ nsTableRowFrame::Reflow(nsIPresContext& aPresContext, break; } + // XXX TROY +#if 0 aStatus = NS_FRAME_COMPLETE; // we're never continued +#endif if (gsDebug==PR_TRUE) { @@ -1398,10 +1420,42 @@ nsTableRowFrame::CreateContinuingFrame(nsIPresContext& aPresContext, nsIStyleContext* aStyleContext, nsIFrame*& aContinuingFrame) { - // Because rows are always complete we should never be asked to create - // a continuing frame - NS_ERROR("Unexpected request"); - return NS_ERROR_NOT_IMPLEMENTED; + nsTableRowFrame* cf = new nsTableRowFrame; + if (nsnull == cf) { + return NS_ERROR_OUT_OF_MEMORY; + } + cf->Init(aPresContext, mContent, aParent, aStyleContext); + cf->AppendToFlow(this); + + // Create a continuing frame for each table cell + nsIFrame* newChildList; + for (nsIFrame* kidFrame = mFirstChild; + nsnull != kidFrame; + kidFrame->GetNextSibling(kidFrame)) { + + const nsStyleDisplay *kidDisplay; + kidFrame->GetStyleData(eStyleStruct_Display, ((const nsStyleStruct *&)kidDisplay)); + if (NS_STYLE_DISPLAY_TABLE_CELL == kidDisplay->mDisplay) { + nsIFrame* contCellFrame; + nsIStyleContext* kidSC; + + // Create a continuing cell frame + kidFrame->GetStyleContext(kidSC); + kidFrame->CreateContinuingFrame(aPresContext, cf, kidSC, contCellFrame); + NS_RELEASE(kidSC); + + // Link it into the list of child frames + if (nsnull == cf->mFirstChild) { + cf->mFirstChild = contCellFrame; + } else { + newChildList->SetNextSibling(contCellFrame); + } + newChildList = contCellFrame; + } + } + + aContinuingFrame = cf; + return NS_OK; } /* we overload this here because rows have children that can span outside of themselves. diff --git a/layout/tables/nsTableRowGroupFrame.cpp b/layout/tables/nsTableRowGroupFrame.cpp index 3cfbe5394cf..861749c2c29 100644 --- a/layout/tables/nsTableRowGroupFrame.cpp +++ b/layout/tables/nsTableRowGroupFrame.cpp @@ -850,6 +850,7 @@ nsTableRowGroupFrame::SplitRowGroup(nsIPresContext& aPresContext, nsReflowStatus& aStatus) { nsIFrame* prevKidFrame = nsnull; + nsresult rv = NS_OK; // Walk each of the row frames looking for the first row frame that // doesn't fit in the available space @@ -857,21 +858,22 @@ nsTableRowGroupFrame::SplitRowGroup(nsIPresContext& aPresContext, nsRect bounds; kidFrame->GetRect(bounds); + // XXX This check isn't correct if there's a footer... if (bounds.YMost() > aReflowState.maxSize.height) { // If this is the first row frame then we need to split it if (nsnull == prevKidFrame) { // Reflow the row in the available space and have it split // XXX Account for horizontal margins... -#if 0 nsSize kidAvailSize(aReflowState.maxSize.width, aReflowState.maxSize.height - bounds.y); - nsHTMLReflowState kidReflowState(aPresContext, kidFrame, aReflowState, - kidAvailSize, eReflowReason_Resize); - nsReflowMetrics desiredSize; + nsHTMLReflowState kidReflowState(aPresContext, kidFrame, aReflowState, + kidAvailSize, eReflowReason_Resize); + nsHTMLReflowMetrics desiredSize(nsnull); rv = ReflowChild(kidFrame, aPresContext, desiredSize, kidReflowState, aStatus); kidFrame->SizeTo(desiredSize.width, desiredSize.height); NS_ASSERTION(NS_FRAME_IS_NOT_COMPLETE(aStatus), "unexpected status"); + ((nsTableRowFrame *)kidFrame)->DidResize(aPresContext, aReflowState); // Create a continuing frame, add it to the child list, and then push it // and the frames that follow @@ -892,8 +894,7 @@ nsTableRowGroupFrame::SplitRowGroup(nsIPresContext& aPresContext, // Push it and the frames that follow PushChildren(continuingFrame, kidFrame); - aDesiredSize.height = bounds.y; -#endif + aDesiredSize.height = desiredSize.height; } else { // See whether the row frame has cells that span into it or across it