fixed several incremental reflow bugs
git-svn-id: svn://10.0.0.236/trunk@13285 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -31,10 +31,8 @@ NS_DEF_PTR(nsIStyleContext);
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
static PRBool gsDebug = PR_FALSE;
|
||||
static PRBool gsDebugCLD = PR_FALSE;
|
||||
#else
|
||||
static const PRBool gsDebug = PR_FALSE;
|
||||
static const PRBool gsDebugCLD = PR_FALSE;
|
||||
#endif
|
||||
|
||||
const nscoord gBigSpace = 100000;
|
||||
|
||||
@@ -1041,6 +1041,7 @@ void nsTableFrame::DumpCellMap ()
|
||||
{
|
||||
PRInt32 rowCount = mCellMap->GetRowCount();
|
||||
PRInt32 colCount = mCellMap->GetColCount();
|
||||
printf("rowCount=%d, colCount=%d\n", rowCount, colCount);
|
||||
for (PRInt32 rowIndex = 0; rowIndex < rowCount; rowIndex++)
|
||||
{
|
||||
if (gsDebug==PR_TRUE)
|
||||
@@ -1591,6 +1592,11 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext& aPresContext,
|
||||
delete mCellMap;
|
||||
mCellMap = new nsCellMap(0,0);
|
||||
ReBuildCellMap();
|
||||
if (PR_TRUE==gsDebugIR)
|
||||
{
|
||||
DumpCellMap();
|
||||
printf("tableFrame thinks colCount is %d\n", mEffectiveColCount);
|
||||
}
|
||||
needsRecalc=PR_TRUE;
|
||||
}
|
||||
if (PR_FALSE==IsFirstPassValid())
|
||||
|
||||
@@ -111,6 +111,7 @@ NS_IMETHODIMP nsTableOuterFrame::Init(nsIPresContext& aPresContext, nsIFrame* aC
|
||||
|
||||
// Set our internal member data
|
||||
mInnerTableFrame = mFirstChild;
|
||||
//XXX this should go through the child list looking for a displaytype==caption
|
||||
if (2 == LengthOf(mFirstChild)) {
|
||||
mFirstChild->GetNextSibling(mCaptionFrame);
|
||||
}
|
||||
@@ -289,7 +290,20 @@ nsresult nsTableOuterFrame::IR_TargetIsChild(nsIPresContext& aPresContext
|
||||
else if (aNextFrame==mCaptionFrame)
|
||||
rv = IR_TargetIsCaptionFrame(aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||
else
|
||||
rv = NS_ERROR_ILLEGAL_VALUE;
|
||||
{
|
||||
const nsStyleDisplay* nextDisplay;
|
||||
aNextFrame->GetStyleData(eStyleStruct_Display, (const nsStyleStruct *&)nextDisplay);
|
||||
if (NS_STYLE_DISPLAY_TABLE_HEADER_GROUP==nextDisplay->mDisplay ||
|
||||
NS_STYLE_DISPLAY_TABLE_FOOTER_GROUP==nextDisplay->mDisplay ||
|
||||
NS_STYLE_DISPLAY_TABLE_ROW_GROUP ==nextDisplay->mDisplay ||
|
||||
NS_STYLE_DISPLAY_TABLE_COLUMN_GROUP==nextDisplay->mDisplay)
|
||||
rv = IR_TargetIsInnerTableFrame(aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||
else
|
||||
{
|
||||
NS_ASSERTION(PR_FALSE, "illegal next frame in incremental reflow.");
|
||||
rv = NS_ERROR_ILLEGAL_VALUE;
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -402,6 +416,7 @@ nsresult nsTableOuterFrame::IR_TargetIsCaptionFrame(nsIPresContext& aPres
|
||||
return rv;
|
||||
}
|
||||
|
||||
// IR_TargetIsMe is free to foward the request to the inner table frame
|
||||
nsresult nsTableOuterFrame::IR_TargetIsMe(nsIPresContext& aPresContext,
|
||||
nsHTMLReflowMetrics& aDesiredSize,
|
||||
OuterTableReflowState& aReflowState,
|
||||
|
||||
@@ -107,6 +107,7 @@ nsTableRowFrame::Init(nsIPresContext& aPresContext, nsIFrame* aChildList)
|
||||
NS_IMETHODIMP
|
||||
nsTableRowFrame::InitChildren(PRInt32 aRowIndex)
|
||||
{
|
||||
if (gsDebug) printf("Row InitChildren: begin\n");
|
||||
nsTableFrame* table = nsnull;
|
||||
nsresult result=NS_OK;
|
||||
|
||||
@@ -114,6 +115,7 @@ nsTableRowFrame::InitChildren(PRInt32 aRowIndex)
|
||||
// for now, we remember globally whether we've added all or none
|
||||
if (PR_FALSE==mInitializedChildren)
|
||||
{
|
||||
if (gsDebug) printf("Row InitChildren: mInitializedChildren=PR_FALSE\n");
|
||||
result = nsTableFrame::GetTableFrame(this, table);
|
||||
if ((NS_OK==result) && (table != nsnull))
|
||||
{
|
||||
@@ -124,6 +126,7 @@ nsTableRowFrame::InitChildren(PRInt32 aRowIndex)
|
||||
else
|
||||
rowIndex = aRowIndex;
|
||||
SetRowIndex(rowIndex);
|
||||
if (gsDebug) printf("Row InitChildren: set row index to %d\n", rowIndex);
|
||||
PRInt32 colIndex = 0;
|
||||
for (nsIFrame* kidFrame = mFirstChild; nsnull != kidFrame; kidFrame->GetNextSibling(kidFrame))
|
||||
{
|
||||
@@ -133,6 +136,7 @@ nsTableRowFrame::InitChildren(PRInt32 aRowIndex)
|
||||
{
|
||||
// what column does this cell belong to?
|
||||
colIndex = table->GetNextAvailColIndex(mRowIndex, colIndex);
|
||||
if (gsDebug) printf("Row InitChildren: cell given colIndex %d\n", colIndex);
|
||||
/* for style context optimization, set the content's column index if possible.
|
||||
* this can only be done if we really have an nsTableCell.
|
||||
* other tags mapped to table cell display won't benefit from this optimization
|
||||
@@ -155,11 +159,13 @@ nsTableRowFrame::InitChildren(PRInt32 aRowIndex)
|
||||
((nsTableCellFrame *)kidFrame)->InitCellFrame(colIndex);
|
||||
if (gsDebug) printf("%p : set cell frame %p to col index = %d\n", this, kidFrame, colIndex);
|
||||
// add the cell frame to the table's cell map
|
||||
if (gsDebug) printf("Row InitChildren: calling AddCellToTable...\n");
|
||||
table->AddCellToTable(this, (nsTableCellFrame *)kidFrame, kidFrame == mFirstChild);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (gsDebug) printf("Row InitChildren: end\n");
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@@ -170,6 +176,7 @@ NS_METHOD
|
||||
nsTableRowFrame::DidReflow(nsIPresContext& aPresContext,
|
||||
nsDidReflowStatus aStatus)
|
||||
{
|
||||
if (gsDebug) printf("Row DidReflow: begin\n");
|
||||
if (NS_FRAME_REFLOW_FINISHED == aStatus) {
|
||||
// Resize and re-align the cell frames based on our row height
|
||||
nscoord cellHeight = mRect.height - mCellMaxTopMargin - mCellMaxBottomMargin;
|
||||
@@ -183,13 +190,14 @@ nsTableRowFrame::DidReflow(nsIPresContext& aPresContext,
|
||||
if (NS_STYLE_DISPLAY_TABLE_CELL == kidDisplay->mDisplay)
|
||||
{
|
||||
PRInt32 rowSpan = tableFrame->GetEffectiveRowSpan(mRowIndex, (nsTableCellFrame *)cellFrame);
|
||||
if (gsDebug) printf("Row DidReflow: cellFrame %p\n", cellFrame);
|
||||
if (1==rowSpan)
|
||||
{
|
||||
// resize the cell's height
|
||||
nsSize cellFrameSize;
|
||||
cellFrame->GetSize(cellFrameSize);
|
||||
cellFrame->SizeTo(cellFrameSize.width, cellHeight);
|
||||
|
||||
if (gsDebug) printf("Row DidReflow: cellFrame %p given height %d\n", cellFrame, cellHeight);
|
||||
// realign cell content based on the new height
|
||||
((nsTableCellFrame *)cellFrame)->VerticallyAlignChild(&aPresContext);
|
||||
}
|
||||
@@ -201,10 +209,12 @@ nsTableRowFrame::DidReflow(nsIPresContext& aPresContext,
|
||||
|
||||
// Let our base class do the usual work
|
||||
return nsContainerFrame::DidReflow(aPresContext, aStatus);
|
||||
if (gsDebug) printf("Row DidReflow: end\n");
|
||||
}
|
||||
|
||||
void nsTableRowFrame::ResetMaxChildHeight()
|
||||
{
|
||||
if (gsDebug) printf("Row ResetMaxChildHeight\n");
|
||||
mTallestCell=0;
|
||||
mCellMaxTopMargin=0;
|
||||
mCellMaxBottomMargin=0;
|
||||
@@ -212,6 +222,7 @@ void nsTableRowFrame::ResetMaxChildHeight()
|
||||
|
||||
void nsTableRowFrame::SetMaxChildHeight(nscoord aChildHeight, nscoord aTopMargin, nscoord aBottomMargin)
|
||||
{
|
||||
if (gsDebug) printf("Row ResetMaxChildHeight to %d\n", aChildHeight);
|
||||
if (mTallestCell<aChildHeight)
|
||||
mTallestCell = aChildHeight;
|
||||
|
||||
@@ -961,7 +972,12 @@ NS_METHOD nsTableRowFrame::IR_CellInserted(nsIPresContext& aPresContext,
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
}
|
||||
|
||||
// set row state
|
||||
GetMinRowSpan(tableFrame);
|
||||
FixMinCellHeight(tableFrame);
|
||||
|
||||
// set table state
|
||||
tableFrame->InvalidateCellMap();
|
||||
tableFrame->InvalidateColumnCache();
|
||||
|
||||
@@ -1001,6 +1017,12 @@ NS_METHOD nsTableRowFrame::IR_CellAppended(nsIPresContext& aPresContext,
|
||||
return rv;
|
||||
}
|
||||
|
||||
// set row state
|
||||
GetMinRowSpan(tableFrame);
|
||||
FixMinCellHeight(tableFrame);
|
||||
|
||||
// set table state
|
||||
|
||||
tableFrame->InvalidateCellMap();
|
||||
tableFrame->InvalidateColumnCache();
|
||||
|
||||
@@ -1055,10 +1077,17 @@ NS_METHOD nsTableRowFrame::IR_CellRemoved(nsIPresContext& aPresContext,
|
||||
nsresult rv = RemoveFrame((nsIFrame*)aDeletedFrame);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
ResetMaxChildHeight();
|
||||
nsTableFrame *tableFrame=nsnull;
|
||||
rv = nsTableFrame::GetTableFrame(this, tableFrame);
|
||||
if (NS_FAILED(rv) || nsnull==tableFrame)
|
||||
return rv;
|
||||
|
||||
// set row state
|
||||
GetMinRowSpan(tableFrame);
|
||||
FixMinCellHeight(tableFrame);
|
||||
|
||||
// set table state
|
||||
tableFrame->InvalidateCellMap();
|
||||
tableFrame->InvalidateColumnCache();
|
||||
|
||||
|
||||
@@ -31,10 +31,8 @@ NS_DEF_PTR(nsIStyleContext);
|
||||
|
||||
#ifdef NS_DEBUG
|
||||
static PRBool gsDebug = PR_FALSE;
|
||||
static PRBool gsDebugCLD = PR_FALSE;
|
||||
#else
|
||||
static const PRBool gsDebug = PR_FALSE;
|
||||
static const PRBool gsDebugCLD = PR_FALSE;
|
||||
#endif
|
||||
|
||||
const nscoord gBigSpace = 100000;
|
||||
|
||||
@@ -1041,6 +1041,7 @@ void nsTableFrame::DumpCellMap ()
|
||||
{
|
||||
PRInt32 rowCount = mCellMap->GetRowCount();
|
||||
PRInt32 colCount = mCellMap->GetColCount();
|
||||
printf("rowCount=%d, colCount=%d\n", rowCount, colCount);
|
||||
for (PRInt32 rowIndex = 0; rowIndex < rowCount; rowIndex++)
|
||||
{
|
||||
if (gsDebug==PR_TRUE)
|
||||
@@ -1591,6 +1592,11 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext& aPresContext,
|
||||
delete mCellMap;
|
||||
mCellMap = new nsCellMap(0,0);
|
||||
ReBuildCellMap();
|
||||
if (PR_TRUE==gsDebugIR)
|
||||
{
|
||||
DumpCellMap();
|
||||
printf("tableFrame thinks colCount is %d\n", mEffectiveColCount);
|
||||
}
|
||||
needsRecalc=PR_TRUE;
|
||||
}
|
||||
if (PR_FALSE==IsFirstPassValid())
|
||||
|
||||
@@ -111,6 +111,7 @@ NS_IMETHODIMP nsTableOuterFrame::Init(nsIPresContext& aPresContext, nsIFrame* aC
|
||||
|
||||
// Set our internal member data
|
||||
mInnerTableFrame = mFirstChild;
|
||||
//XXX this should go through the child list looking for a displaytype==caption
|
||||
if (2 == LengthOf(mFirstChild)) {
|
||||
mFirstChild->GetNextSibling(mCaptionFrame);
|
||||
}
|
||||
@@ -289,7 +290,20 @@ nsresult nsTableOuterFrame::IR_TargetIsChild(nsIPresContext& aPresContext
|
||||
else if (aNextFrame==mCaptionFrame)
|
||||
rv = IR_TargetIsCaptionFrame(aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||
else
|
||||
rv = NS_ERROR_ILLEGAL_VALUE;
|
||||
{
|
||||
const nsStyleDisplay* nextDisplay;
|
||||
aNextFrame->GetStyleData(eStyleStruct_Display, (const nsStyleStruct *&)nextDisplay);
|
||||
if (NS_STYLE_DISPLAY_TABLE_HEADER_GROUP==nextDisplay->mDisplay ||
|
||||
NS_STYLE_DISPLAY_TABLE_FOOTER_GROUP==nextDisplay->mDisplay ||
|
||||
NS_STYLE_DISPLAY_TABLE_ROW_GROUP ==nextDisplay->mDisplay ||
|
||||
NS_STYLE_DISPLAY_TABLE_COLUMN_GROUP==nextDisplay->mDisplay)
|
||||
rv = IR_TargetIsInnerTableFrame(aPresContext, aDesiredSize, aReflowState, aStatus);
|
||||
else
|
||||
{
|
||||
NS_ASSERTION(PR_FALSE, "illegal next frame in incremental reflow.");
|
||||
rv = NS_ERROR_ILLEGAL_VALUE;
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -402,6 +416,7 @@ nsresult nsTableOuterFrame::IR_TargetIsCaptionFrame(nsIPresContext& aPres
|
||||
return rv;
|
||||
}
|
||||
|
||||
// IR_TargetIsMe is free to foward the request to the inner table frame
|
||||
nsresult nsTableOuterFrame::IR_TargetIsMe(nsIPresContext& aPresContext,
|
||||
nsHTMLReflowMetrics& aDesiredSize,
|
||||
OuterTableReflowState& aReflowState,
|
||||
|
||||
@@ -107,6 +107,7 @@ nsTableRowFrame::Init(nsIPresContext& aPresContext, nsIFrame* aChildList)
|
||||
NS_IMETHODIMP
|
||||
nsTableRowFrame::InitChildren(PRInt32 aRowIndex)
|
||||
{
|
||||
if (gsDebug) printf("Row InitChildren: begin\n");
|
||||
nsTableFrame* table = nsnull;
|
||||
nsresult result=NS_OK;
|
||||
|
||||
@@ -114,6 +115,7 @@ nsTableRowFrame::InitChildren(PRInt32 aRowIndex)
|
||||
// for now, we remember globally whether we've added all or none
|
||||
if (PR_FALSE==mInitializedChildren)
|
||||
{
|
||||
if (gsDebug) printf("Row InitChildren: mInitializedChildren=PR_FALSE\n");
|
||||
result = nsTableFrame::GetTableFrame(this, table);
|
||||
if ((NS_OK==result) && (table != nsnull))
|
||||
{
|
||||
@@ -124,6 +126,7 @@ nsTableRowFrame::InitChildren(PRInt32 aRowIndex)
|
||||
else
|
||||
rowIndex = aRowIndex;
|
||||
SetRowIndex(rowIndex);
|
||||
if (gsDebug) printf("Row InitChildren: set row index to %d\n", rowIndex);
|
||||
PRInt32 colIndex = 0;
|
||||
for (nsIFrame* kidFrame = mFirstChild; nsnull != kidFrame; kidFrame->GetNextSibling(kidFrame))
|
||||
{
|
||||
@@ -133,6 +136,7 @@ nsTableRowFrame::InitChildren(PRInt32 aRowIndex)
|
||||
{
|
||||
// what column does this cell belong to?
|
||||
colIndex = table->GetNextAvailColIndex(mRowIndex, colIndex);
|
||||
if (gsDebug) printf("Row InitChildren: cell given colIndex %d\n", colIndex);
|
||||
/* for style context optimization, set the content's column index if possible.
|
||||
* this can only be done if we really have an nsTableCell.
|
||||
* other tags mapped to table cell display won't benefit from this optimization
|
||||
@@ -155,11 +159,13 @@ nsTableRowFrame::InitChildren(PRInt32 aRowIndex)
|
||||
((nsTableCellFrame *)kidFrame)->InitCellFrame(colIndex);
|
||||
if (gsDebug) printf("%p : set cell frame %p to col index = %d\n", this, kidFrame, colIndex);
|
||||
// add the cell frame to the table's cell map
|
||||
if (gsDebug) printf("Row InitChildren: calling AddCellToTable...\n");
|
||||
table->AddCellToTable(this, (nsTableCellFrame *)kidFrame, kidFrame == mFirstChild);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (gsDebug) printf("Row InitChildren: end\n");
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@@ -170,6 +176,7 @@ NS_METHOD
|
||||
nsTableRowFrame::DidReflow(nsIPresContext& aPresContext,
|
||||
nsDidReflowStatus aStatus)
|
||||
{
|
||||
if (gsDebug) printf("Row DidReflow: begin\n");
|
||||
if (NS_FRAME_REFLOW_FINISHED == aStatus) {
|
||||
// Resize and re-align the cell frames based on our row height
|
||||
nscoord cellHeight = mRect.height - mCellMaxTopMargin - mCellMaxBottomMargin;
|
||||
@@ -183,13 +190,14 @@ nsTableRowFrame::DidReflow(nsIPresContext& aPresContext,
|
||||
if (NS_STYLE_DISPLAY_TABLE_CELL == kidDisplay->mDisplay)
|
||||
{
|
||||
PRInt32 rowSpan = tableFrame->GetEffectiveRowSpan(mRowIndex, (nsTableCellFrame *)cellFrame);
|
||||
if (gsDebug) printf("Row DidReflow: cellFrame %p\n", cellFrame);
|
||||
if (1==rowSpan)
|
||||
{
|
||||
// resize the cell's height
|
||||
nsSize cellFrameSize;
|
||||
cellFrame->GetSize(cellFrameSize);
|
||||
cellFrame->SizeTo(cellFrameSize.width, cellHeight);
|
||||
|
||||
if (gsDebug) printf("Row DidReflow: cellFrame %p given height %d\n", cellFrame, cellHeight);
|
||||
// realign cell content based on the new height
|
||||
((nsTableCellFrame *)cellFrame)->VerticallyAlignChild(&aPresContext);
|
||||
}
|
||||
@@ -201,10 +209,12 @@ nsTableRowFrame::DidReflow(nsIPresContext& aPresContext,
|
||||
|
||||
// Let our base class do the usual work
|
||||
return nsContainerFrame::DidReflow(aPresContext, aStatus);
|
||||
if (gsDebug) printf("Row DidReflow: end\n");
|
||||
}
|
||||
|
||||
void nsTableRowFrame::ResetMaxChildHeight()
|
||||
{
|
||||
if (gsDebug) printf("Row ResetMaxChildHeight\n");
|
||||
mTallestCell=0;
|
||||
mCellMaxTopMargin=0;
|
||||
mCellMaxBottomMargin=0;
|
||||
@@ -212,6 +222,7 @@ void nsTableRowFrame::ResetMaxChildHeight()
|
||||
|
||||
void nsTableRowFrame::SetMaxChildHeight(nscoord aChildHeight, nscoord aTopMargin, nscoord aBottomMargin)
|
||||
{
|
||||
if (gsDebug) printf("Row ResetMaxChildHeight to %d\n", aChildHeight);
|
||||
if (mTallestCell<aChildHeight)
|
||||
mTallestCell = aChildHeight;
|
||||
|
||||
@@ -961,7 +972,12 @@ NS_METHOD nsTableRowFrame::IR_CellInserted(nsIPresContext& aPresContext,
|
||||
if (NS_FAILED(rv))
|
||||
return rv;
|
||||
}
|
||||
|
||||
// set row state
|
||||
GetMinRowSpan(tableFrame);
|
||||
FixMinCellHeight(tableFrame);
|
||||
|
||||
// set table state
|
||||
tableFrame->InvalidateCellMap();
|
||||
tableFrame->InvalidateColumnCache();
|
||||
|
||||
@@ -1001,6 +1017,12 @@ NS_METHOD nsTableRowFrame::IR_CellAppended(nsIPresContext& aPresContext,
|
||||
return rv;
|
||||
}
|
||||
|
||||
// set row state
|
||||
GetMinRowSpan(tableFrame);
|
||||
FixMinCellHeight(tableFrame);
|
||||
|
||||
// set table state
|
||||
|
||||
tableFrame->InvalidateCellMap();
|
||||
tableFrame->InvalidateColumnCache();
|
||||
|
||||
@@ -1055,10 +1077,17 @@ NS_METHOD nsTableRowFrame::IR_CellRemoved(nsIPresContext& aPresContext,
|
||||
nsresult rv = RemoveFrame((nsIFrame*)aDeletedFrame);
|
||||
if (NS_SUCCEEDED(rv))
|
||||
{
|
||||
ResetMaxChildHeight();
|
||||
nsTableFrame *tableFrame=nsnull;
|
||||
rv = nsTableFrame::GetTableFrame(this, tableFrame);
|
||||
if (NS_FAILED(rv) || nsnull==tableFrame)
|
||||
return rv;
|
||||
|
||||
// set row state
|
||||
GetMinRowSpan(tableFrame);
|
||||
FixMinCellHeight(tableFrame);
|
||||
|
||||
// set table state
|
||||
tableFrame->InvalidateCellMap();
|
||||
tableFrame->InvalidateColumnCache();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user