From d73ce78fae76cdbb39d036454cdbda222db9dfda Mon Sep 17 00:00:00 2001 From: "troy%netscape.com" Date: Sat, 20 Feb 1999 03:15:03 +0000 Subject: [PATCH] Pagination work-in-progress git-svn-id: svn://10.0.0.236/trunk@21390 18797224-902f-48f8-a5cc-f745e15eee43 --- .../html/table/src/nsTableRowGroupFrame.cpp | 170 +++++------------- .../html/table/src/nsTableRowGroupFrame.h | 12 +- .../layout/tables/nsTableRowGroupFrame.cpp | 170 +++++------------- mozilla/layout/tables/nsTableRowGroupFrame.h | 12 +- 4 files changed, 88 insertions(+), 276 deletions(-) diff --git a/mozilla/layout/html/table/src/nsTableRowGroupFrame.cpp b/mozilla/layout/html/table/src/nsTableRowGroupFrame.cpp index 132c38845d1..2f120f16df3 100644 --- a/mozilla/layout/html/table/src/nsTableRowGroupFrame.cpp +++ b/mozilla/layout/html/table/src/nsTableRowGroupFrame.cpp @@ -425,131 +425,50 @@ NS_METHOD nsTableRowGroupFrame::ReflowMappedChildren(nsIPresContext& aPresC } /** - * Try and pull-up frames from our next-in-flow - * - * @param aPresContext presentation context to use - * @param aReflowState current inline state - * @return NS_FRAME_COMPLETE if there are no frames to pull-up or if we pulled - * up all the next-in-flow frames, and NS_FRAME_NOT_COMPLETE otherwise + * Pull-up all the row frames from our next-in-flow */ -NS_METHOD nsTableRowGroupFrame::PullUpChildren(nsIPresContext& aPresContext, - nsHTMLReflowMetrics& aDesiredSize, - RowGroupReflowState& aReflowState, - nsReflowStatus& aStatus) +NS_METHOD nsTableRowGroupFrame::PullUpAllRowFrames(nsIPresContext& aPresContext) { -// XXX if this code is activated then fix the nsRowGroupFrame cast, it might be an nsScrollFrame - nsTableRowGroupFrame* nextInFlow = (nsTableRowGroupFrame*)mNextInFlow; - nsSize kidMaxElementSize; - nsSize* pKidMaxElementSize = (nsnull != aDesiredSize.maxElementSize) ? &kidMaxElementSize : nsnull; - nsIFrame* prevKidFrame = mFrames.LastChild(); - nsresult rv = NS_OK; - - aStatus = NS_FRAME_COMPLETE; - while (nsnull != nextInFlow) { - nsHTMLReflowMetrics kidSize(pKidMaxElementSize); - kidSize.width=kidSize.height=kidSize.ascent=kidSize.descent=0; - - // Get the next child - nsIFrame* kidFrame = nextInFlow->mFrames.FirstChild(); - - // Any more row frames? - if (nsnull == kidFrame) { - // No. Any frames on its overflow list? - if (nextInFlow->mOverflowFrames.NotEmpty()) { - // Move the overflow list to become the child list - nextInFlow->AppendChildren(nextInFlow->mOverflowFrames.FirstChild(), PR_TRUE); - nextInFlow->mOverflowFrames.SetFrames(nsnull); - kidFrame = nextInFlow->mFrames.FirstChild(); + if (mNextInFlow) { + nsTableRowGroupFrame* nextInFlow = (nsTableRowGroupFrame*)mNextInFlow; + nsIFrame* prevKidFrame = mFrames.LastChild(); + + while (nsnull != nextInFlow) { + // Get the next child + nsIFrame* kidFrame = nextInFlow->mFrames.FirstChild(); + + // Any more row frames? + if (nsnull == kidFrame) { + // No. Any frames on its overflow list? + if (nextInFlow->mOverflowFrames.NotEmpty()) { + // Move the overflow list to become the child list + nextInFlow->AppendChildren(nextInFlow->mOverflowFrames.FirstChild(), PR_TRUE); + nextInFlow->mOverflowFrames.SetFrames(nsnull); + kidFrame = nextInFlow->mFrames.FirstChild(); + } else { + // We've pulled up all the children, so move to the next-in-flow. + nextInFlow->GetNextInFlow((nsIFrame*&)nextInFlow); + continue; + } + } + + // Remove the frame from its current parent + nextInFlow->mFrames.RemoveFirstChild(); + + // Link the frame into our list of children + kidFrame->SetParent(this); + if (nsnull == prevKidFrame) { + mFrames.SetFrames(kidFrame); } else { - // We've pulled up all the children, so move to the next-in-flow. - nextInFlow->GetNextInFlow((nsIFrame*&)nextInFlow); - continue; + prevKidFrame->SetNextSibling(kidFrame); } - } + kidFrame->SetNextSibling(nsnull); - // See if the child fits in the available space. If it fits or - // it's splittable then reflow it - nsSize kidFrameSize; - nsSplittableType kidIsSplittable; - - kidFrame->GetSize(kidFrameSize); - kidFrame->IsSplittable(kidIsSplittable); - if ((kidFrameSize.height > aReflowState.availSize.height) && - NS_FRAME_IS_NOT_SPLITTABLE(kidIsSplittable)) { - aStatus = NS_FRAME_NOT_COMPLETE; - break; - } - nsHTMLReflowState kidReflowState(aPresContext, kidFrame, - aReflowState.reflowState, aReflowState.availSize, - eReflowReason_Resize); - - rv = ReflowChild(kidFrame, aPresContext, kidSize, kidReflowState, aStatus); - - // Did the child fit? - if (kidSize.height > aReflowState.availSize.height) { - aStatus = NS_FRAME_NOT_COMPLETE; // the child doesn't fit - break; - } - - // Place the child - nsRect kidRect (0, 0, kidSize.width, kidSize.height); - kidRect.y += aReflowState.y; - PlaceChild(aPresContext, aReflowState, kidFrame, kidRect, aDesiredSize.maxElementSize, *pKidMaxElementSize); - - // Remove the frame from its current parent - // XXX We need to do this BEFORE we reflow the child; otherwise we're reflowing - // it without its geometric parent set properly... - nextInFlow->mFrames.RemoveFirstChild(); - - // Link the frame into our list of children - kidFrame->SetParent(this); - - if (nsnull == prevKidFrame) { - mFrames.SetFrames(kidFrame); - } else { - prevKidFrame->SetNextSibling(kidFrame); - } - kidFrame->SetNextSibling(nsnull); - - // Remember where we just were in case we end up pushing children - prevKidFrame = kidFrame; - - // Is the child we just pulled up complete? - if (NS_FRAME_IS_NOT_COMPLETE(aStatus)) { - // No the child isn't complete - nsIFrame* kidNextInFlow; - - kidFrame->GetNextInFlow(kidNextInFlow); - if (nsnull == kidNextInFlow) { - // The child doesn't have a next-in-flow so create a - // continuing frame. The creation appends it to the flow and - // prepares it for reflow. - nsIFrame* continuingFrame; - nsIStyleContext* kidSC; - kidFrame->GetStyleContext(&kidSC); - kidFrame->CreateContinuingFrame(aPresContext, this, kidSC, - continuingFrame); - NS_RELEASE(kidSC); - NS_ASSERTION(nsnull != continuingFrame, "frame creation failed"); - - // Add the continuing frame to our sibling list and then push - // it to the next-in-flow. This ensures the next-in-flow's - // content offsets and child count are set properly. Note that - // we can safely assume that the continuation is complete so - // we pass PR_TRUE into PushChidren - kidFrame->SetNextSibling(continuingFrame); - - PushChildren(continuingFrame, kidFrame); - } - - // If the child isn't complete then it means that we've used up - // all of our available space. - aStatus = NS_FRAME_NOT_COMPLETE; - break; + prevKidFrame = kidFrame; } } - return rv; + return NS_OK; } /* CalculateRowHeights provides default heights for all rows in the rowgroup. @@ -905,22 +824,17 @@ nsTableRowGroupFrame::Reflow(nsIPresContext& aPresContext, // Check for an overflow list MoveOverflowToChildList(); - // Reflow the existing frames + // Reflow the existing frames. Before we do, pull-up any row frames from + // our next-in-flow. + // XXX It would be more efficient to do this if we have room left after + // reflowing the frames we have, the problem is we don't know if we have + // room left until after we call CalculateRowHeights()... + PullUpAllRowFrames(aPresContext); if (nsnull != mFrames.FirstChild()) { rv = ReflowMappedChildren(aPresContext, aDesiredSize, state, aStatus, nsnull, aReflowState.reason, PR_TRUE); } - // XXX We need to figure out what to do about this... -#if 0 - // XXX if this code is activated then fix PullUpChildren to not case nsRowGroupFrame, it might be an nsScrollFrame - // Did we successfully reflow our mapped children? - if (NS_FRAME_COMPLETE==aStatus) { - // Try and pull-up some children from a next-in-flow - rv = PullUpChildren(aPresContext, aDesiredSize, state, aStatus); - } -#endif - // Return our desired rect aDesiredSize.width = aReflowState.availableWidth; aDesiredSize.height = state.y; diff --git a/mozilla/layout/html/table/src/nsTableRowGroupFrame.h b/mozilla/layout/html/table/src/nsTableRowGroupFrame.h index 3e36954db2c..a4d9f84cea6 100644 --- a/mozilla/layout/html/table/src/nsTableRowGroupFrame.h +++ b/mozilla/layout/html/table/src/nsTableRowGroupFrame.h @@ -204,17 +204,9 @@ protected: PRBool aDoSiblings); /** - * Try and pull-up frames from our next-in-flow - * - * @param aPresContext presentation context to use - * @param aReflowState current inline state - * @return true if we successfully pulled-up all the children and false - * otherwise, e.g. child didn't fit + * Pull-up all the row frames from our next-in-flow */ - NS_METHOD PullUpChildren(nsIPresContext& aPresContext, - nsHTMLReflowMetrics& aDesiredSize, - RowGroupReflowState& aReflowState, - nsReflowStatus& aStatus); + NS_METHOD PullUpAllRowFrames(nsIPresContext& aPresContext); nsresult SplitRowGroup(nsIPresContext& aPresContext, nsHTMLReflowMetrics& aDesiredSize, diff --git a/mozilla/layout/tables/nsTableRowGroupFrame.cpp b/mozilla/layout/tables/nsTableRowGroupFrame.cpp index 132c38845d1..2f120f16df3 100644 --- a/mozilla/layout/tables/nsTableRowGroupFrame.cpp +++ b/mozilla/layout/tables/nsTableRowGroupFrame.cpp @@ -425,131 +425,50 @@ NS_METHOD nsTableRowGroupFrame::ReflowMappedChildren(nsIPresContext& aPresC } /** - * Try and pull-up frames from our next-in-flow - * - * @param aPresContext presentation context to use - * @param aReflowState current inline state - * @return NS_FRAME_COMPLETE if there are no frames to pull-up or if we pulled - * up all the next-in-flow frames, and NS_FRAME_NOT_COMPLETE otherwise + * Pull-up all the row frames from our next-in-flow */ -NS_METHOD nsTableRowGroupFrame::PullUpChildren(nsIPresContext& aPresContext, - nsHTMLReflowMetrics& aDesiredSize, - RowGroupReflowState& aReflowState, - nsReflowStatus& aStatus) +NS_METHOD nsTableRowGroupFrame::PullUpAllRowFrames(nsIPresContext& aPresContext) { -// XXX if this code is activated then fix the nsRowGroupFrame cast, it might be an nsScrollFrame - nsTableRowGroupFrame* nextInFlow = (nsTableRowGroupFrame*)mNextInFlow; - nsSize kidMaxElementSize; - nsSize* pKidMaxElementSize = (nsnull != aDesiredSize.maxElementSize) ? &kidMaxElementSize : nsnull; - nsIFrame* prevKidFrame = mFrames.LastChild(); - nsresult rv = NS_OK; - - aStatus = NS_FRAME_COMPLETE; - while (nsnull != nextInFlow) { - nsHTMLReflowMetrics kidSize(pKidMaxElementSize); - kidSize.width=kidSize.height=kidSize.ascent=kidSize.descent=0; - - // Get the next child - nsIFrame* kidFrame = nextInFlow->mFrames.FirstChild(); - - // Any more row frames? - if (nsnull == kidFrame) { - // No. Any frames on its overflow list? - if (nextInFlow->mOverflowFrames.NotEmpty()) { - // Move the overflow list to become the child list - nextInFlow->AppendChildren(nextInFlow->mOverflowFrames.FirstChild(), PR_TRUE); - nextInFlow->mOverflowFrames.SetFrames(nsnull); - kidFrame = nextInFlow->mFrames.FirstChild(); + if (mNextInFlow) { + nsTableRowGroupFrame* nextInFlow = (nsTableRowGroupFrame*)mNextInFlow; + nsIFrame* prevKidFrame = mFrames.LastChild(); + + while (nsnull != nextInFlow) { + // Get the next child + nsIFrame* kidFrame = nextInFlow->mFrames.FirstChild(); + + // Any more row frames? + if (nsnull == kidFrame) { + // No. Any frames on its overflow list? + if (nextInFlow->mOverflowFrames.NotEmpty()) { + // Move the overflow list to become the child list + nextInFlow->AppendChildren(nextInFlow->mOverflowFrames.FirstChild(), PR_TRUE); + nextInFlow->mOverflowFrames.SetFrames(nsnull); + kidFrame = nextInFlow->mFrames.FirstChild(); + } else { + // We've pulled up all the children, so move to the next-in-flow. + nextInFlow->GetNextInFlow((nsIFrame*&)nextInFlow); + continue; + } + } + + // Remove the frame from its current parent + nextInFlow->mFrames.RemoveFirstChild(); + + // Link the frame into our list of children + kidFrame->SetParent(this); + if (nsnull == prevKidFrame) { + mFrames.SetFrames(kidFrame); } else { - // We've pulled up all the children, so move to the next-in-flow. - nextInFlow->GetNextInFlow((nsIFrame*&)nextInFlow); - continue; + prevKidFrame->SetNextSibling(kidFrame); } - } + kidFrame->SetNextSibling(nsnull); - // See if the child fits in the available space. If it fits or - // it's splittable then reflow it - nsSize kidFrameSize; - nsSplittableType kidIsSplittable; - - kidFrame->GetSize(kidFrameSize); - kidFrame->IsSplittable(kidIsSplittable); - if ((kidFrameSize.height > aReflowState.availSize.height) && - NS_FRAME_IS_NOT_SPLITTABLE(kidIsSplittable)) { - aStatus = NS_FRAME_NOT_COMPLETE; - break; - } - nsHTMLReflowState kidReflowState(aPresContext, kidFrame, - aReflowState.reflowState, aReflowState.availSize, - eReflowReason_Resize); - - rv = ReflowChild(kidFrame, aPresContext, kidSize, kidReflowState, aStatus); - - // Did the child fit? - if (kidSize.height > aReflowState.availSize.height) { - aStatus = NS_FRAME_NOT_COMPLETE; // the child doesn't fit - break; - } - - // Place the child - nsRect kidRect (0, 0, kidSize.width, kidSize.height); - kidRect.y += aReflowState.y; - PlaceChild(aPresContext, aReflowState, kidFrame, kidRect, aDesiredSize.maxElementSize, *pKidMaxElementSize); - - // Remove the frame from its current parent - // XXX We need to do this BEFORE we reflow the child; otherwise we're reflowing - // it without its geometric parent set properly... - nextInFlow->mFrames.RemoveFirstChild(); - - // Link the frame into our list of children - kidFrame->SetParent(this); - - if (nsnull == prevKidFrame) { - mFrames.SetFrames(kidFrame); - } else { - prevKidFrame->SetNextSibling(kidFrame); - } - kidFrame->SetNextSibling(nsnull); - - // Remember where we just were in case we end up pushing children - prevKidFrame = kidFrame; - - // Is the child we just pulled up complete? - if (NS_FRAME_IS_NOT_COMPLETE(aStatus)) { - // No the child isn't complete - nsIFrame* kidNextInFlow; - - kidFrame->GetNextInFlow(kidNextInFlow); - if (nsnull == kidNextInFlow) { - // The child doesn't have a next-in-flow so create a - // continuing frame. The creation appends it to the flow and - // prepares it for reflow. - nsIFrame* continuingFrame; - nsIStyleContext* kidSC; - kidFrame->GetStyleContext(&kidSC); - kidFrame->CreateContinuingFrame(aPresContext, this, kidSC, - continuingFrame); - NS_RELEASE(kidSC); - NS_ASSERTION(nsnull != continuingFrame, "frame creation failed"); - - // Add the continuing frame to our sibling list and then push - // it to the next-in-flow. This ensures the next-in-flow's - // content offsets and child count are set properly. Note that - // we can safely assume that the continuation is complete so - // we pass PR_TRUE into PushChidren - kidFrame->SetNextSibling(continuingFrame); - - PushChildren(continuingFrame, kidFrame); - } - - // If the child isn't complete then it means that we've used up - // all of our available space. - aStatus = NS_FRAME_NOT_COMPLETE; - break; + prevKidFrame = kidFrame; } } - return rv; + return NS_OK; } /* CalculateRowHeights provides default heights for all rows in the rowgroup. @@ -905,22 +824,17 @@ nsTableRowGroupFrame::Reflow(nsIPresContext& aPresContext, // Check for an overflow list MoveOverflowToChildList(); - // Reflow the existing frames + // Reflow the existing frames. Before we do, pull-up any row frames from + // our next-in-flow. + // XXX It would be more efficient to do this if we have room left after + // reflowing the frames we have, the problem is we don't know if we have + // room left until after we call CalculateRowHeights()... + PullUpAllRowFrames(aPresContext); if (nsnull != mFrames.FirstChild()) { rv = ReflowMappedChildren(aPresContext, aDesiredSize, state, aStatus, nsnull, aReflowState.reason, PR_TRUE); } - // XXX We need to figure out what to do about this... -#if 0 - // XXX if this code is activated then fix PullUpChildren to not case nsRowGroupFrame, it might be an nsScrollFrame - // Did we successfully reflow our mapped children? - if (NS_FRAME_COMPLETE==aStatus) { - // Try and pull-up some children from a next-in-flow - rv = PullUpChildren(aPresContext, aDesiredSize, state, aStatus); - } -#endif - // Return our desired rect aDesiredSize.width = aReflowState.availableWidth; aDesiredSize.height = state.y; diff --git a/mozilla/layout/tables/nsTableRowGroupFrame.h b/mozilla/layout/tables/nsTableRowGroupFrame.h index 3e36954db2c..a4d9f84cea6 100644 --- a/mozilla/layout/tables/nsTableRowGroupFrame.h +++ b/mozilla/layout/tables/nsTableRowGroupFrame.h @@ -204,17 +204,9 @@ protected: PRBool aDoSiblings); /** - * Try and pull-up frames from our next-in-flow - * - * @param aPresContext presentation context to use - * @param aReflowState current inline state - * @return true if we successfully pulled-up all the children and false - * otherwise, e.g. child didn't fit + * Pull-up all the row frames from our next-in-flow */ - NS_METHOD PullUpChildren(nsIPresContext& aPresContext, - nsHTMLReflowMetrics& aDesiredSize, - RowGroupReflowState& aReflowState, - nsReflowStatus& aStatus); + NS_METHOD PullUpAllRowFrames(nsIPresContext& aPresContext); nsresult SplitRowGroup(nsIPresContext& aPresContext, nsHTMLReflowMetrics& aDesiredSize,