nscoord GetSpaceBetween(PRInt32 aPrevColIndex, PRInt32 aColIndex, PRInt32 aColSpan, nsTableFrame& aTableFrame, nscoord aCellSpacingX, bool aIsLeftToRight, bool aCheckVisibility) { nscoord space = 0; PRInt32 colX; if (aIsLeftToRight) { for (colX = aPrevColIndex + 1; aColIndex > colX; colX++) { bool isCollapsed = false; if (!aCheckVisibility) { space += aTableFrame.GetColumnWidth(colX); } else { nsTableColFrame* colFrame = aTableFrame.GetColFrame(colX); const nsStyleVisibility* colVis = colFrame->GetStyleVisibility(); bool collapseCol = (NS_STYLE_VISIBILITY_COLLAPSE == colVis->mVisible); nsIFrame* cgFrame = colFrame->GetParent(); const nsStyleVisibility* groupVis = cgFrame->GetStyleVisibility(); bool collapseGroup = (NS_STYLE_VISIBILITY_COLLAPSE == groupVis->mVisible); isCollapsed = collapseCol || collapseGroup; if (!isCollapsed) space += aTableFrame.GetColumnWidth(colX); } if (!isCollapsed && aTableFrame.ColumnHasCellSpacingBefore(colX)) { space += aCellSpacingX; } } } else { PRInt32 lastCol = aColIndex + aColSpan - 1; for (colX = aPrevColIndex - 1; colX > lastCol; colX--) { bool isCollapsed = false; if (!aCheckVisibility) { space += aTableFrame.GetColumnWidth(colX); } else { nsTableColFrame* colFrame = aTableFrame.GetColFrame(colX); const nsStyleVisibility* colVis = colFrame->GetStyleVisibility(); bool collapseCol = (NS_STYLE_VISIBILITY_COLLAPSE == colVis->mVisible); nsIFrame* cgFrame = colFrame->GetParent(); const nsStyleVisibility* groupVis = cgFrame->GetStyleVisibility(); bool collapseGroup = (NS_STYLE_VISIBILITY_COLLAPSE == groupVis->mVisible); isCollapsed = collapseCol || collapseGroup; if (!isCollapsed) space += aTableFrame.GetColumnWidth(colX); } if (!isCollapsed && aTableFrame.ColumnHasCellSpacingBefore(colX)) { space += aCellSpacingX; } } } return space; }
// Calculates the available width for the table cell based on the known // column widths taking into account column spans and column spacing static nscoord CalcAvailWidth(nsTableFrame& aTableFrame, nsTableCellFrame& aCellFrame, nscoord aCellSpacingX) { nscoord cellAvailWidth = 0; PRInt32 colIndex; aCellFrame.GetColIndex(colIndex); PRInt32 colspan = aTableFrame.GetEffectiveColSpan(aCellFrame); NS_ASSERTION(colspan > 0, "effective colspan should be positive"); for (PRInt32 spanX = 0; spanX < colspan; spanX++) { cellAvailWidth += aTableFrame.GetColumnWidth(colIndex + spanX); if (spanX > 0 && aTableFrame.ColumnHasCellSpacingBefore(colIndex + spanX)) { cellAvailWidth += aCellSpacingX; } } return cellAvailWidth; }