Handle floaters better by triggering a resize-reflow on the body's content frame after reflowing the floater

This commit is contained in:
kipp%netscape.com 1998-07-23 19:55:27 +00:00
Родитель f9ce8ce6a7
Коммит c233b72b56
1 изменённых файлов: 33 добавлений и 7 удалений

Просмотреть файл

@ -92,6 +92,9 @@ NS_METHOD nsBodyFrame::Reflow(nsIPresContext& aPresContext,
const nsReflowState& aReflowState,
nsReflowStatus& aStatus)
{
const nsReflowState* rsp = &aReflowState;
nsReflowState resizeReflowState(aReflowState);
NS_FRAME_TRACE_REFLOW_IN("nsBodyFrame::Reflow");
aStatus = NS_FRAME_COMPLETE; // initialize out parameter
@ -138,7 +141,30 @@ NS_METHOD nsBodyFrame::Reflow(nsIPresContext& aPresContext,
// XXX FIX ME. For an absolutely positioned item we need to properly
// compute the available space and then resize the frame if necessary...
nsReflowState reflowState(nextFrame, aReflowState, aReflowState.maxSize);
return nextFrame->Reflow(aPresContext, aDesiredSize, reflowState, aStatus);
nsresult rv = nextFrame->Reflow(aPresContext, aDesiredSize,
reflowState, aStatus);
if (NS_OK != rv) {
return rv;
}
// XXX Temporary code: if the frame we just reflowed is a
// floating frame then fall through into the main reflow pathway
// after clearing out our incremental reflow status. This forces
// our child to adjust to the new size of the floater.
const nsStyleDisplay* display;
nextFrame->GetStyleData(eStyleStruct_Display,
(const nsStyleStruct*&) display);
if (NS_STYLE_FLOAT_NONE == display->mFloats) {
return rv;
}
// Switch over to a reflow-state that is called resize instead
// of an incremental reflow state like we were passed in.
resizeReflowState.reason = eReflowReason_Resize;
resizeReflowState.reflowCommand = nsnull;
rsp = &resizeReflowState;
// XXX End temporary code
}
}
@ -155,10 +181,10 @@ NS_METHOD nsBodyFrame::Reflow(nsIPresContext& aPresContext,
// Compute the child frame's max size
nsSize kidMaxSize = GetColumnAvailSpace(&aPresContext, borderPadding,
aReflowState.maxSize);
rsp->maxSize);
mSpaceManager->Translate(borderPadding.left, borderPadding.top);
if (eReflowReason_Resize == aReflowState.reason) {
if (eReflowReason_Resize == rsp->reason) {
// Clear any regions that are marked as unavailable
// XXX Temporary hack until everything is incremental...
mSpaceManager->ClearRegions();
@ -170,7 +196,7 @@ NS_METHOD nsBodyFrame::Reflow(nsIPresContext& aPresContext,
// Get the column's desired rect
nsIRunaround* reflowRunaround;
nsReflowState reflowState(mFirstChild, aReflowState, kidMaxSize);
nsReflowState reflowState(mFirstChild, *rsp, kidMaxSize);
nsRect desiredRect;
mFirstChild->WillReflow(aPresContext);
@ -210,15 +236,15 @@ NS_METHOD nsBodyFrame::Reflow(nsIPresContext& aPresContext,
#endif
// Reflow any absolutely positioned frames that need reflowing
ReflowAbsoluteItems(&aPresContext, aReflowState);
ReflowAbsoluteItems(&aPresContext, *rsp);
// Return our desired size
ComputeDesiredSize(desiredRect, aReflowState.maxSize, borderPadding, aDesiredSize);
ComputeDesiredSize(desiredRect, rsp->maxSize, borderPadding, aDesiredSize);
// Decide how much to repaint based on the reflow type.
// Note: we don't have to handle the initial reflow case, because that's
// handled by the root content frame
switch (aReflowState.reason) {
switch (rsp->reason) {
case eReflowReason_Resize:
// For a resize just repaint the entire frame
damageArea.width = aDesiredSize.width;