From f857105001d7d99ad6f9063c7b30639a215548b7 Mon Sep 17 00:00:00 2001 From: "bmlk%gmx.de" Date: Wed, 28 Apr 2004 16:42:59 +0000 Subject: [PATCH] make visibility collapse work during incr reflows bug 77019 r= bzbarsky sr=dbaron --- layout/html/table/src/nsTableColFrame.cpp | 10 ++++++ .../html/table/src/nsTableColGroupFrame.cpp | 13 ++++++- layout/html/table/src/nsTableFrame.cpp | 36 +++++++++++++------ layout/html/table/src/nsTableFrame.h | 31 ++++++++++++++-- layout/html/table/src/nsTableRowFrame.cpp | 6 ++++ .../html/table/src/nsTableRowGroupFrame.cpp | 5 +++ layout/tables/nsTableColFrame.cpp | 10 ++++++ layout/tables/nsTableColGroupFrame.cpp | 13 ++++++- layout/tables/nsTableFrame.cpp | 36 +++++++++++++------ layout/tables/nsTableFrame.h | 31 ++++++++++++++-- layout/tables/nsTableRowFrame.cpp | 6 ++++ layout/tables/nsTableRowGroupFrame.cpp | 5 +++ 12 files changed, 174 insertions(+), 28 deletions(-) diff --git a/layout/html/table/src/nsTableColFrame.cpp b/layout/html/table/src/nsTableColFrame.cpp index 8d348841717a..68594c019ece 100644 --- a/layout/html/table/src/nsTableColFrame.cpp +++ b/layout/html/table/src/nsTableColFrame.cpp @@ -36,6 +36,7 @@ * ***** END LICENSE BLOCK ***** */ #include "nsCOMPtr.h" #include "nsTableColFrame.h" +#include "nsTableFrame.h" #include "nsContainerFrame.h" #include "nsStyleContext.h" #include "nsStyleConsts.h" @@ -176,6 +177,15 @@ NS_METHOD nsTableColFrame::Reflow(nsIPresContext* aPresContext, DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus); aDesiredSize.width=0; aDesiredSize.height=0; + const nsStyleVisibility* colVis = GetStyleVisibility(); + PRBool collapseCol = (NS_STYLE_VISIBILITY_COLLAPSE == colVis->mVisible); + if (collapseCol) { + nsTableFrame* tableFrame = nsnull; + nsTableFrame::GetTableFrame(this, tableFrame); + if (tableFrame) { + tableFrame->SetNeedToCollapseColumns(PR_TRUE); + } + } if (aDesiredSize.mComputeMEW) { aDesiredSize.mMaxElementWidth=0; diff --git a/layout/html/table/src/nsTableColGroupFrame.cpp b/layout/html/table/src/nsTableColGroupFrame.cpp index 82530f7602b3..2de103a659d8 100644 --- a/layout/html/table/src/nsTableColGroupFrame.cpp +++ b/layout/html/table/src/nsTableColGroupFrame.cpp @@ -426,10 +426,21 @@ NS_METHOD nsTableColGroupFrame::Reflow(nsIPresContext* aPresContext, DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus); NS_ASSERTION(nsnull!=mContent, "bad state -- null content for frame"); nsresult rv=NS_OK; + + const nsStyleVisibility* groupVis = GetStyleVisibility(); + PRBool collapseGroup = (NS_STYLE_VISIBILITY_COLLAPSE == groupVis->mVisible); + if (collapseGroup) { + nsTableFrame* tableFrame = nsnull; + nsTableFrame::GetTableFrame(this, tableFrame); + if (tableFrame) { + tableFrame->SetNeedToCollapseColumns(PR_TRUE); + } + } // for every content child that (is a column thingy and does not already have a frame) // create a frame and adjust it's style nsIFrame* kidFrame = nsnull; - + + if (eReflowReason_Incremental == aReflowState.reason) { rv = IncrementalReflow(aPresContext, aDesiredSize, aReflowState, aStatus); } diff --git a/layout/html/table/src/nsTableFrame.cpp b/layout/html/table/src/nsTableFrame.cpp index 1f1a57ed62f0..24a6d8ffac9c 100644 --- a/layout/html/table/src/nsTableFrame.cpp +++ b/layout/html/table/src/nsTableFrame.cpp @@ -1905,7 +1905,6 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext* aPresContext, GET_TWIPS_TO_PIXELS(aPresContext, p2t); CalcBCBorders(*aPresContext); } - PRBool doCollapse = PR_FALSE; // collapsing rows, cols, etc. aDesiredSize.width = aReflowState.availableWidth; @@ -2004,7 +2003,7 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext* aPresContext, ? NS_UNCONSTRAINEDSIZE : aReflowState.availableHeight; ReflowTable(aPresContext, aDesiredSize, aReflowState, availHeight, nextReason, - lastChildReflowed, doCollapse, balanced, aStatus); + lastChildReflowed, balanced, aStatus); reflowedChildren = PR_TRUE; } if (willInitiateSpecialReflow && NS_FRAME_IS_COMPLETE(aStatus)) { @@ -2017,7 +2016,7 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext* aPresContext, ((nsHTMLReflowState::ReflowStateFlags&)aReflowState.mFlags).mSpecialHeightReflow = PR_TRUE; ReflowTable(aPresContext, aDesiredSize, aReflowState, aReflowState.availableHeight, - nextReason, lastChildReflowed, doCollapse, balanced, aStatus); + nextReason, lastChildReflowed, balanced, aStatus); // restore the previous special height reflow initiator ((nsHTMLReflowState&)aReflowState).mPercentHeightReflowInitiator = specialReflowInitiator; // XXX We should call SetInitiatedSpecialReflow(PR_FALSE) at some point, but it is difficult to tell when @@ -2054,8 +2053,10 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext* aPresContext, nsMargin borderPadding = GetChildAreaOffset(&aReflowState); SetColumnDimensions(aDesiredSize.height, borderPadding); - if (doCollapse) { + if (NeedToCollapseRows()) { AdjustForCollapsingRows(aPresContext, aDesiredSize.height); + } + if (NeedToCollapseColumns()) { AdjustForCollapsingCols(aPresContext, aDesiredSize.width); } @@ -2133,12 +2134,10 @@ nsTableFrame::ReflowTable(nsIPresContext* aPresContext, nscoord aAvailHeight, nsReflowReason aReason, nsIFrame*& aLastChildReflowed, - PRBool& aDoCollapse, PRBool& aDidBalance, nsReflowStatus& aStatus) { nsresult rv = NS_OK; - aDoCollapse = PR_FALSE; aDidBalance = PR_FALSE; aLastChildReflowed = nsnull; @@ -2165,8 +2164,6 @@ nsTableFrame::ReflowTable(nsIPresContext* aPresContext, if (eReflowReason_Resize == aReflowState.reason) { if (!DidResizeReflow()) { - // XXX we need to do this in other cases as well, but it needs to be made more incremental - aDoCollapse = PR_TRUE; SetResizeReflow(PR_TRUE); } } @@ -2292,14 +2289,21 @@ nsTableFrame::CollapseRowGroupIfNecessary(nsIPresContext* aPresContext, const nsStyleVisibility* groupVis = aRowGroupFrame->GetStyleVisibility(); PRBool collapseGroup = (NS_STYLE_VISIBILITY_COLLAPSE == groupVis->mVisible); + if (collapseGroup) { + SetNeedToCollapseRows(PR_TRUE); + } nsIFrame* rowFrame = aRowGroupFrame->GetFirstChild(nsnull); while (nsnull != rowFrame) { const nsStyleDisplay* rowDisplay = rowFrame->GetStyleDisplay(); if (NS_STYLE_DISPLAY_TABLE_ROW == rowDisplay->mDisplay) { const nsStyleVisibility* rowVis = rowFrame->GetStyleVisibility(); + PRBool collapseRow = (NS_STYLE_VISIBILITY_COLLAPSE == rowVis->mVisible); + if (collapseRow) { + SetNeedToCollapseRows(PR_TRUE); + } nsRect rowRect = rowFrame->GetRect(); - if (collapseGroup || (NS_STYLE_VISIBILITY_COLLAPSE == rowVis->mVisible)) { + if (collapseGroup || collapseRow) { aYGroupOffset += rowRect.height; rowRect.height = 0; rowFrame->SetRect(rowRect); @@ -2362,7 +2366,9 @@ NS_METHOD nsTableFrame::AdjustForCollapsingRows(nsIPresContext* aPresContext, nscoord yGroupOffset = 0; // total offset among rows within a single row group nscoord yTotalOffset = 0; // total offset among all rows in all row groups PRInt32 rowIndex = 0; - + // reset the bit, it will be set again if row/rowgroup is collapsed + SetNeedToCollapseRows(PR_FALSE); + // collapse the rows and/or row groups as necessary while (nsnull != groupFrame) { if (IsRowGroup(groupFrame->GetStyleDisplay()->mDisplay)) { @@ -2383,7 +2389,9 @@ NS_METHOD nsTableFrame::AdjustForCollapsingCols(nsIPresContext* aPresContext, { nsTableCellMap* cellMap = GetCellMap(); if (!cellMap) return NS_OK; - + // reset the bit, it will be set again if col/colgroup is collapsed + SetNeedToCollapseColumns(PR_FALSE); + PRInt32 numRows = cellMap->GetRowCount(); nsTableIterator groupIter(mColGroups, eTableDIR); nsIFrame* groupFrame = groupIter.First(); @@ -2396,6 +2404,9 @@ NS_METHOD nsTableFrame::AdjustForCollapsingCols(nsIPresContext* aPresContext, const nsStyleVisibility* groupVis = groupFrame->GetStyleVisibility(); PRBool collapseGroup = (NS_STYLE_VISIBILITY_COLLAPSE == groupVis->mVisible); + if (collapseGroup) { + SetNeedToCollapseColumns(PR_TRUE); + } nsTableIterator colIter(*groupFrame, eTableDIR); nsIFrame* colFrame = colIter.First(); // iterate over the cols in the col group @@ -2404,6 +2415,9 @@ NS_METHOD nsTableFrame::AdjustForCollapsingCols(nsIPresContext* aPresContext, if (NS_STYLE_DISPLAY_TABLE_COLUMN == colDisplay->mDisplay) { const nsStyleVisibility* colVis = colFrame->GetStyleVisibility(); PRBool collapseCol = (NS_STYLE_VISIBILITY_COLLAPSE == colVis->mVisible); + if (collapseCol) { + SetNeedToCollapseColumns(PR_TRUE); + } PRInt32 colWidth = GetColumnWidth(colX); if (collapseGroup || collapseCol) { xOffset += colWidth + cellSpacingX; diff --git a/layout/html/table/src/nsTableFrame.h b/layout/html/table/src/nsTableFrame.h index d0dee7e2d204..13b16a191dd9 100644 --- a/layout/html/table/src/nsTableFrame.h +++ b/layout/html/table/src/nsTableFrame.h @@ -382,7 +382,6 @@ public: nscoord aAvailHeight, nsReflowReason aReason, nsIFrame*& aLastChildReflowed, - PRBool& aDoCollapse, PRBool& aDidBalance, nsReflowStatus& aStatus); @@ -788,6 +787,12 @@ public: PRBool NeedToCalcBCBorders() const; void SetNeedToCalcBCBorders(PRBool aValue); + + PRBool NeedToCollapseRows() const; + void SetNeedToCollapseRows(PRBool aValue); + + PRBool NeedToCollapseColumns() const; + void SetNeedToCollapseColumns(PRBool aValue); /** Get the cell map for this table frame. It is not always mCellMap. * Only the firstInFlow has a legit cell map @@ -930,7 +935,9 @@ protected: PRUint32 mInitiatedSpecialReflow:1; PRUint32 mNeedToCalcBCBorders:1; PRUint32 mLeftContBCBorder:8; - PRUint32 : 11; // unused + PRUint32 mNeedToCollapseRows:1; // rows that have visibility need to be collapse + PRUint32 mNeedToCollapseColumns:1; // colums that have visibility need to be collapsed + PRUint32 :9; // unused } mBits; nsTableCellMap* mCellMap; // maintains the relationships between rows, cols, and cells @@ -1048,6 +1055,26 @@ inline void nsTableFrame::SetRowInserted(PRBool aValue) mBits.mRowInserted = (unsigned)aValue; } +inline void nsTableFrame::SetNeedToCollapseRows(PRBool aValue) +{ + mBits.mNeedToCollapseRows = (unsigned)aValue; +} + +inline PRBool nsTableFrame::NeedToCollapseRows() const +{ + return (PRBool)mBits.mNeedToCollapseRows; +} + +inline void nsTableFrame::SetNeedToCollapseColumns(PRBool aValue) +{ + mBits.mNeedToCollapseColumns = (unsigned)aValue; +} + +inline PRBool nsTableFrame::NeedToCollapseColumns() const +{ + return (PRBool)mBits.mNeedToCollapseColumns; +} + inline nsFrameList& nsTableFrame::GetColGroups() { return NS_STATIC_CAST(nsTableFrame*, GetFirstInFlow())->mColGroups; diff --git a/layout/html/table/src/nsTableRowFrame.cpp b/layout/html/table/src/nsTableRowFrame.cpp index 433828295da2..5ebc447e2d03 100644 --- a/layout/html/table/src/nsTableRowFrame.cpp +++ b/layout/html/table/src/nsTableRowFrame.cpp @@ -1373,6 +1373,12 @@ nsTableRowFrame::Reflow(nsIPresContext* aPresContext, rv = nsTableFrame::GetTableFrame(this, tableFrame); if (!tableFrame) return NS_ERROR_NULL_POINTER; + const nsStyleVisibility* rowVis = GetStyleVisibility(); + PRBool collapseRow = (NS_STYLE_VISIBILITY_COLLAPSE == rowVis->mVisible); + if (collapseRow) { + tableFrame->SetNeedToCollapseRows(PR_TRUE); + } + // see if a special height reflow needs to occur due to having a pct height if (!NeedSpecialReflow()) nsTableFrame::CheckRequestSpecialHeightReflow(aReflowState); diff --git a/layout/html/table/src/nsTableRowGroupFrame.cpp b/layout/html/table/src/nsTableRowGroupFrame.cpp index f1f721251782..2268421067d2 100644 --- a/layout/html/table/src/nsTableRowGroupFrame.cpp +++ b/layout/html/table/src/nsTableRowGroupFrame.cpp @@ -1201,6 +1201,11 @@ nsTableRowGroupFrame::Reflow(nsIPresContext* aPresContext, nsRowGroupReflowState state(aReflowState, tableFrame); PRBool haveDesiredHeight = PR_FALSE; + const nsStyleVisibility* groupVis = GetStyleVisibility(); + PRBool collapseGroup = (NS_STYLE_VISIBILITY_COLLAPSE == groupVis->mVisible); + if (collapseGroup) { + tableFrame->SetNeedToCollapseRows(PR_TRUE); + } if (eReflowReason_Incremental == aReflowState.reason) { rv = IncrementalReflow(aPresContext, aDesiredSize, state, aStatus); diff --git a/layout/tables/nsTableColFrame.cpp b/layout/tables/nsTableColFrame.cpp index 8d348841717a..68594c019ece 100644 --- a/layout/tables/nsTableColFrame.cpp +++ b/layout/tables/nsTableColFrame.cpp @@ -36,6 +36,7 @@ * ***** END LICENSE BLOCK ***** */ #include "nsCOMPtr.h" #include "nsTableColFrame.h" +#include "nsTableFrame.h" #include "nsContainerFrame.h" #include "nsStyleContext.h" #include "nsStyleConsts.h" @@ -176,6 +177,15 @@ NS_METHOD nsTableColFrame::Reflow(nsIPresContext* aPresContext, DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus); aDesiredSize.width=0; aDesiredSize.height=0; + const nsStyleVisibility* colVis = GetStyleVisibility(); + PRBool collapseCol = (NS_STYLE_VISIBILITY_COLLAPSE == colVis->mVisible); + if (collapseCol) { + nsTableFrame* tableFrame = nsnull; + nsTableFrame::GetTableFrame(this, tableFrame); + if (tableFrame) { + tableFrame->SetNeedToCollapseColumns(PR_TRUE); + } + } if (aDesiredSize.mComputeMEW) { aDesiredSize.mMaxElementWidth=0; diff --git a/layout/tables/nsTableColGroupFrame.cpp b/layout/tables/nsTableColGroupFrame.cpp index 82530f7602b3..2de103a659d8 100644 --- a/layout/tables/nsTableColGroupFrame.cpp +++ b/layout/tables/nsTableColGroupFrame.cpp @@ -426,10 +426,21 @@ NS_METHOD nsTableColGroupFrame::Reflow(nsIPresContext* aPresContext, DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus); NS_ASSERTION(nsnull!=mContent, "bad state -- null content for frame"); nsresult rv=NS_OK; + + const nsStyleVisibility* groupVis = GetStyleVisibility(); + PRBool collapseGroup = (NS_STYLE_VISIBILITY_COLLAPSE == groupVis->mVisible); + if (collapseGroup) { + nsTableFrame* tableFrame = nsnull; + nsTableFrame::GetTableFrame(this, tableFrame); + if (tableFrame) { + tableFrame->SetNeedToCollapseColumns(PR_TRUE); + } + } // for every content child that (is a column thingy and does not already have a frame) // create a frame and adjust it's style nsIFrame* kidFrame = nsnull; - + + if (eReflowReason_Incremental == aReflowState.reason) { rv = IncrementalReflow(aPresContext, aDesiredSize, aReflowState, aStatus); } diff --git a/layout/tables/nsTableFrame.cpp b/layout/tables/nsTableFrame.cpp index 1f1a57ed62f0..24a6d8ffac9c 100644 --- a/layout/tables/nsTableFrame.cpp +++ b/layout/tables/nsTableFrame.cpp @@ -1905,7 +1905,6 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext* aPresContext, GET_TWIPS_TO_PIXELS(aPresContext, p2t); CalcBCBorders(*aPresContext); } - PRBool doCollapse = PR_FALSE; // collapsing rows, cols, etc. aDesiredSize.width = aReflowState.availableWidth; @@ -2004,7 +2003,7 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext* aPresContext, ? NS_UNCONSTRAINEDSIZE : aReflowState.availableHeight; ReflowTable(aPresContext, aDesiredSize, aReflowState, availHeight, nextReason, - lastChildReflowed, doCollapse, balanced, aStatus); + lastChildReflowed, balanced, aStatus); reflowedChildren = PR_TRUE; } if (willInitiateSpecialReflow && NS_FRAME_IS_COMPLETE(aStatus)) { @@ -2017,7 +2016,7 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext* aPresContext, ((nsHTMLReflowState::ReflowStateFlags&)aReflowState.mFlags).mSpecialHeightReflow = PR_TRUE; ReflowTable(aPresContext, aDesiredSize, aReflowState, aReflowState.availableHeight, - nextReason, lastChildReflowed, doCollapse, balanced, aStatus); + nextReason, lastChildReflowed, balanced, aStatus); // restore the previous special height reflow initiator ((nsHTMLReflowState&)aReflowState).mPercentHeightReflowInitiator = specialReflowInitiator; // XXX We should call SetInitiatedSpecialReflow(PR_FALSE) at some point, but it is difficult to tell when @@ -2054,8 +2053,10 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext* aPresContext, nsMargin borderPadding = GetChildAreaOffset(&aReflowState); SetColumnDimensions(aDesiredSize.height, borderPadding); - if (doCollapse) { + if (NeedToCollapseRows()) { AdjustForCollapsingRows(aPresContext, aDesiredSize.height); + } + if (NeedToCollapseColumns()) { AdjustForCollapsingCols(aPresContext, aDesiredSize.width); } @@ -2133,12 +2134,10 @@ nsTableFrame::ReflowTable(nsIPresContext* aPresContext, nscoord aAvailHeight, nsReflowReason aReason, nsIFrame*& aLastChildReflowed, - PRBool& aDoCollapse, PRBool& aDidBalance, nsReflowStatus& aStatus) { nsresult rv = NS_OK; - aDoCollapse = PR_FALSE; aDidBalance = PR_FALSE; aLastChildReflowed = nsnull; @@ -2165,8 +2164,6 @@ nsTableFrame::ReflowTable(nsIPresContext* aPresContext, if (eReflowReason_Resize == aReflowState.reason) { if (!DidResizeReflow()) { - // XXX we need to do this in other cases as well, but it needs to be made more incremental - aDoCollapse = PR_TRUE; SetResizeReflow(PR_TRUE); } } @@ -2292,14 +2289,21 @@ nsTableFrame::CollapseRowGroupIfNecessary(nsIPresContext* aPresContext, const nsStyleVisibility* groupVis = aRowGroupFrame->GetStyleVisibility(); PRBool collapseGroup = (NS_STYLE_VISIBILITY_COLLAPSE == groupVis->mVisible); + if (collapseGroup) { + SetNeedToCollapseRows(PR_TRUE); + } nsIFrame* rowFrame = aRowGroupFrame->GetFirstChild(nsnull); while (nsnull != rowFrame) { const nsStyleDisplay* rowDisplay = rowFrame->GetStyleDisplay(); if (NS_STYLE_DISPLAY_TABLE_ROW == rowDisplay->mDisplay) { const nsStyleVisibility* rowVis = rowFrame->GetStyleVisibility(); + PRBool collapseRow = (NS_STYLE_VISIBILITY_COLLAPSE == rowVis->mVisible); + if (collapseRow) { + SetNeedToCollapseRows(PR_TRUE); + } nsRect rowRect = rowFrame->GetRect(); - if (collapseGroup || (NS_STYLE_VISIBILITY_COLLAPSE == rowVis->mVisible)) { + if (collapseGroup || collapseRow) { aYGroupOffset += rowRect.height; rowRect.height = 0; rowFrame->SetRect(rowRect); @@ -2362,7 +2366,9 @@ NS_METHOD nsTableFrame::AdjustForCollapsingRows(nsIPresContext* aPresContext, nscoord yGroupOffset = 0; // total offset among rows within a single row group nscoord yTotalOffset = 0; // total offset among all rows in all row groups PRInt32 rowIndex = 0; - + // reset the bit, it will be set again if row/rowgroup is collapsed + SetNeedToCollapseRows(PR_FALSE); + // collapse the rows and/or row groups as necessary while (nsnull != groupFrame) { if (IsRowGroup(groupFrame->GetStyleDisplay()->mDisplay)) { @@ -2383,7 +2389,9 @@ NS_METHOD nsTableFrame::AdjustForCollapsingCols(nsIPresContext* aPresContext, { nsTableCellMap* cellMap = GetCellMap(); if (!cellMap) return NS_OK; - + // reset the bit, it will be set again if col/colgroup is collapsed + SetNeedToCollapseColumns(PR_FALSE); + PRInt32 numRows = cellMap->GetRowCount(); nsTableIterator groupIter(mColGroups, eTableDIR); nsIFrame* groupFrame = groupIter.First(); @@ -2396,6 +2404,9 @@ NS_METHOD nsTableFrame::AdjustForCollapsingCols(nsIPresContext* aPresContext, const nsStyleVisibility* groupVis = groupFrame->GetStyleVisibility(); PRBool collapseGroup = (NS_STYLE_VISIBILITY_COLLAPSE == groupVis->mVisible); + if (collapseGroup) { + SetNeedToCollapseColumns(PR_TRUE); + } nsTableIterator colIter(*groupFrame, eTableDIR); nsIFrame* colFrame = colIter.First(); // iterate over the cols in the col group @@ -2404,6 +2415,9 @@ NS_METHOD nsTableFrame::AdjustForCollapsingCols(nsIPresContext* aPresContext, if (NS_STYLE_DISPLAY_TABLE_COLUMN == colDisplay->mDisplay) { const nsStyleVisibility* colVis = colFrame->GetStyleVisibility(); PRBool collapseCol = (NS_STYLE_VISIBILITY_COLLAPSE == colVis->mVisible); + if (collapseCol) { + SetNeedToCollapseColumns(PR_TRUE); + } PRInt32 colWidth = GetColumnWidth(colX); if (collapseGroup || collapseCol) { xOffset += colWidth + cellSpacingX; diff --git a/layout/tables/nsTableFrame.h b/layout/tables/nsTableFrame.h index d0dee7e2d204..13b16a191dd9 100644 --- a/layout/tables/nsTableFrame.h +++ b/layout/tables/nsTableFrame.h @@ -382,7 +382,6 @@ public: nscoord aAvailHeight, nsReflowReason aReason, nsIFrame*& aLastChildReflowed, - PRBool& aDoCollapse, PRBool& aDidBalance, nsReflowStatus& aStatus); @@ -788,6 +787,12 @@ public: PRBool NeedToCalcBCBorders() const; void SetNeedToCalcBCBorders(PRBool aValue); + + PRBool NeedToCollapseRows() const; + void SetNeedToCollapseRows(PRBool aValue); + + PRBool NeedToCollapseColumns() const; + void SetNeedToCollapseColumns(PRBool aValue); /** Get the cell map for this table frame. It is not always mCellMap. * Only the firstInFlow has a legit cell map @@ -930,7 +935,9 @@ protected: PRUint32 mInitiatedSpecialReflow:1; PRUint32 mNeedToCalcBCBorders:1; PRUint32 mLeftContBCBorder:8; - PRUint32 : 11; // unused + PRUint32 mNeedToCollapseRows:1; // rows that have visibility need to be collapse + PRUint32 mNeedToCollapseColumns:1; // colums that have visibility need to be collapsed + PRUint32 :9; // unused } mBits; nsTableCellMap* mCellMap; // maintains the relationships between rows, cols, and cells @@ -1048,6 +1055,26 @@ inline void nsTableFrame::SetRowInserted(PRBool aValue) mBits.mRowInserted = (unsigned)aValue; } +inline void nsTableFrame::SetNeedToCollapseRows(PRBool aValue) +{ + mBits.mNeedToCollapseRows = (unsigned)aValue; +} + +inline PRBool nsTableFrame::NeedToCollapseRows() const +{ + return (PRBool)mBits.mNeedToCollapseRows; +} + +inline void nsTableFrame::SetNeedToCollapseColumns(PRBool aValue) +{ + mBits.mNeedToCollapseColumns = (unsigned)aValue; +} + +inline PRBool nsTableFrame::NeedToCollapseColumns() const +{ + return (PRBool)mBits.mNeedToCollapseColumns; +} + inline nsFrameList& nsTableFrame::GetColGroups() { return NS_STATIC_CAST(nsTableFrame*, GetFirstInFlow())->mColGroups; diff --git a/layout/tables/nsTableRowFrame.cpp b/layout/tables/nsTableRowFrame.cpp index 433828295da2..5ebc447e2d03 100644 --- a/layout/tables/nsTableRowFrame.cpp +++ b/layout/tables/nsTableRowFrame.cpp @@ -1373,6 +1373,12 @@ nsTableRowFrame::Reflow(nsIPresContext* aPresContext, rv = nsTableFrame::GetTableFrame(this, tableFrame); if (!tableFrame) return NS_ERROR_NULL_POINTER; + const nsStyleVisibility* rowVis = GetStyleVisibility(); + PRBool collapseRow = (NS_STYLE_VISIBILITY_COLLAPSE == rowVis->mVisible); + if (collapseRow) { + tableFrame->SetNeedToCollapseRows(PR_TRUE); + } + // see if a special height reflow needs to occur due to having a pct height if (!NeedSpecialReflow()) nsTableFrame::CheckRequestSpecialHeightReflow(aReflowState); diff --git a/layout/tables/nsTableRowGroupFrame.cpp b/layout/tables/nsTableRowGroupFrame.cpp index f1f721251782..2268421067d2 100644 --- a/layout/tables/nsTableRowGroupFrame.cpp +++ b/layout/tables/nsTableRowGroupFrame.cpp @@ -1201,6 +1201,11 @@ nsTableRowGroupFrame::Reflow(nsIPresContext* aPresContext, nsRowGroupReflowState state(aReflowState, tableFrame); PRBool haveDesiredHeight = PR_FALSE; + const nsStyleVisibility* groupVis = GetStyleVisibility(); + PRBool collapseGroup = (NS_STYLE_VISIBILITY_COLLAPSE == groupVis->mVisible); + if (collapseGroup) { + tableFrame->SetNeedToCollapseRows(PR_TRUE); + } if (eReflowReason_Incremental == aReflowState.reason) { rv = IncrementalReflow(aPresContext, aDesiredSize, state, aStatus);