fixed nested tables for the case where both parent and child table are %-width,

and the columns are any variety of width types
This commit is contained in:
buster%netscape.com 1998-08-17 23:37:04 +00:00
Родитель b97de2d626
Коммит a42be9cf57
4 изменённых файлов: 138 добавлений и 78 удалений

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

@ -37,6 +37,8 @@ static const PRBool gsDebug = PR_FALSE;
static const PRBool gsDebugCLD = PR_FALSE;
#endif
const nscoord gBigSpace = 100000;
/* ---------- ProportionalColumnLayoutStruct ---------- */
// TODO: make public so other subclasses can use it
@ -776,7 +778,7 @@ PRBool BasicTableLayoutStrategy::BalanceProportionalColumns(const nsReflowState&
if (NS_UNCONSTRAINEDSIZE==aMaxWidth || NS_UNCONSTRAINEDSIZE==mMinTableWidth)
{ // the max width of the table fits comfortably in the available space
if (gsDebug) printf (" * auto table laying out in NS_UNCONSTRAINEDSIZE, calling BalanceColumnsTableFits\n");
nscoord bigSpace = 100000;
nscoord bigSpace = gBigSpace;
bigSpace = PR_MAX(bigSpace, mMaxTableWidth);
result = BalanceColumnsTableFits(aReflowState, bigSpace,
bigSpace, aTableSpecifiedWidth, aTableIsAutoWidth);
@ -1285,8 +1287,9 @@ PRBool BasicTableLayoutStrategy::BalanceColumnsTableFits(const nsReflowState& aR
nscoord otherWidth = (nscoord)((1.0f/remainingPercent)*((float)(widthOfOtherCells)));
if (PR_TRUE==gsDebug)
printf(" percentWidth=%d otherWidth=%d\n", percentWidth, otherWidth);
newTableWidth = PR_MAX(percentWidth, otherWidth);
newTableWidth = PR_MIN(newTableWidth, aMaxWidth); // since this is an auto-width table, it can't normally be wider than it's parent
newTableWidth = PR_MAX(percentWidth, otherWidth); // the table width is the larger of the two computations
newTableWidth = PR_MIN(newTableWidth, aMaxWidth); // an auto-width table can't normally be wider than it's parent
newTableWidth = PR_MIN(newTableWidth, mMaxTableWidth);// an auto-width table can't normally be wider than it's own computed max width
}
nscoord excess = newTableWidth-mFixedTableWidth; // the amount of new space that needs to be
// accounted for in the non-fixed columns
@ -1450,7 +1453,8 @@ PRBool BasicTableLayoutStrategy::BalanceColumnsTableFits(const nsReflowState& aR
// next, if the specified width of the table is greater than the table's computed width, expand the
// table's computed width to match the specified width, giving the extra space to proportionately-sized
// columns if possible.
if ((PR_FALSE==aTableIsAutoWidth) && (aAvailWidth > (tableWidth-widthOfFixedTableColumns)))
if ((PR_FALSE==aTableIsAutoWidth) && (aAvailWidth > (tableWidth-widthOfFixedTableColumns)) &&
(gBigSpace!=aAvailWidth))
{
DistributeExcessSpace(aAvailWidth, tableWidth, widthOfFixedTableColumns);
}

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

@ -466,7 +466,7 @@ PRInt32 nsTableFrame::GetEffectiveColSpan (PRInt32 aColIndex, nsTableCellFrame *
{
NS_PRECONDITION (nsnull!=aCell, "bad cell arg");
nsCellMap *cellMap = GetCellMap();
NS_PRECONDITION (nsnull!=cellMap, "bad call, mCellMap not yet allocated.");
NS_PRECONDITION (nsnull!=cellMap, "bad call, cellMap not yet allocated.");
NS_PRECONDITION (0<=aColIndex && aColIndex<GetColCount(), "bad col index arg");
if (cellMap->GetRowCount()==1)
@ -481,7 +481,7 @@ PRInt32 nsTableFrame::GetEffectiveColSpan (PRInt32 aColIndex, nsTableCellFrame *
PRInt32 nsTableFrame::GetEffectiveCOLSAttribute()
{
nsCellMap *cellMap = GetCellMap();
NS_PRECONDITION (nsnull!=cellMap, "bad call, mCellMap not yet allocated.");
NS_PRECONDITION (nsnull!=cellMap, "bad call, cellMap not yet allocated.");
PRInt32 result;
nsIFrame *tableFrame = this;
// begin REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED! XXX
@ -629,13 +629,14 @@ nsCellMap * nsTableFrame::GetCellMap()
}
void nsTableFrame::EnsureCellMap()
{
{ // XXX: must be called ONLY on first-in-flow
if (mCellMap == nsnull)
BuildCellMap();
}
void nsTableFrame::BuildCellMap ()
{
// XXX: must be called only on first-in-flow!
if (gsDebug==PR_TRUE) printf("Build Cell Map...\n");
int rowCount = GetRowCount();
@ -897,12 +898,13 @@ void nsTableFrame::ListColumnLayoutData(FILE* out, PRInt32 aIndent)
return;
}
if (nsnull!=mCellMap)
nsCellMap *cellMap = GetCellMap();
if (nsnull!=cellMap)
{
fprintf(out,"Column Layout Data \n");
PRInt32 numCols = GetColCount();
PRInt32 numRows = mCellMap->GetRowCount();
PRInt32 numRows = cellMap->GetRowCount();
for (PRInt32 colIndex = 0; colIndex<numCols; colIndex++)
{
for (PRInt32 indent = aIndent; --indent >= 0; )
@ -910,7 +912,7 @@ void nsTableFrame::ListColumnLayoutData(FILE* out, PRInt32 aIndent)
fprintf(out,"Column Data [%d] \n",colIndex);
for (PRInt32 rowIndex = 0; rowIndex < numRows; rowIndex++)
{
nsTableCellFrame *cellFrame = mCellMap->GetCellFrameAt(rowIndex, colIndex);
nsTableCellFrame *cellFrame = cellMap->GetCellFrameAt(rowIndex, colIndex);
PRInt32 rowIndent;
for (rowIndent = aIndent+2; --rowIndent >= 0; ) fputs(" ", out);
fprintf(out,"Cell Data [%d] \n",rowIndex);
@ -956,11 +958,12 @@ void nsTableFrame::AppendLayoutData(nsVoidArray* aList, nsTableCellFrame* aTable
void nsTableFrame::RecalcLayoutData()
{
if (nsnull==mCellMap)
nsCellMap *cellMap = GetCellMap();
if (nsnull==cellMap)
return; // no info yet, so nothing useful to do
PRInt32 colCount = GetColCount();
PRInt32 rowCount = mCellMap->GetRowCount();
PRInt32 rowCount = cellMap->GetRowCount();
PRInt32 row = 0;
PRInt32 col = 0;
@ -984,7 +987,7 @@ void nsTableFrame::RecalcLayoutData()
for (col = 0; col < colCount; col++)
{
nsTableCellFrame* cell = nsnull;
CellData* cellData = mCellMap->GetCellAt(row,col);
CellData* cellData = cellMap->GetCellAt(row,col);
if (cellData)
cell = cellData->mCell;
@ -1007,7 +1010,7 @@ void nsTableFrame::RecalcLayoutData()
above = nsnull;
else
{
cellData = mCellMap->GetCellAt(row-1,col);
cellData = cellMap->GetCellAt(row-1,col);
if (nsnull != cellData)
above = cellData->mRealCell->mCell;
@ -1022,7 +1025,7 @@ void nsTableFrame::RecalcLayoutData()
left = nsnull;
else
{
cellData = mCellMap->GetCellAt(row,col-1);
cellData = cellMap->GetCellAt(row,col-1);
if (cellData != nsnull)
left = cellData->mRealCell->mCell;
@ -1053,7 +1056,7 @@ void nsTableFrame::RecalcLayoutData()
// Add top edge cells
if (c != col)
{
cellData = mCellMap->GetCellAt(r1,c);
cellData = cellMap->GetCellAt(r1,c);
if ((cellData != nsnull) && (cellData->mCell != above))
{
above = cellData->mCell;
@ -1070,7 +1073,7 @@ void nsTableFrame::RecalcLayoutData()
if (r2 < rowCount)
{
// Add bottom edge cells
cellData = mCellMap->GetCellAt(r2,c);
cellData = cellMap->GetCellAt(r2,c);
if ((cellData != nsnull) && cellData->mCell != below)
{
below = cellData->mCell;
@ -1095,7 +1098,7 @@ void nsTableFrame::RecalcLayoutData()
{
if (r != row)
{
cellData = mCellMap->GetCellAt(r,c1);
cellData = cellMap->GetCellAt(r,c1);
if ((cellData != nsnull) && (cellData->mCell != left))
{
left = cellData->mCell;
@ -1112,7 +1115,7 @@ void nsTableFrame::RecalcLayoutData()
if (c2 < colCount)
{
// Add right edge cells
cellData = mCellMap->GetCellAt(r,c2);
cellData = cellMap->GetCellAt(r,c2);
if ((cellData != nsnull) && (cellData->mCell != right))
{
right = cellData->mCell;
@ -2470,7 +2473,8 @@ void nsTableFrame::VerticallyAlignChildren(nsIPresContext* aPresContext,
void nsTableFrame::AdjustColumnsForCOLSAttribute()
{
NS_ASSERTION(nsnull!=mCellMap, "bad cell map");
nsCellMap *cellMap = GetCellMap();
NS_ASSERTION(nsnull!=cellMap, "bad cell map");
// any specified-width column turns off COLS attribute
nsStyleTable* tableStyle = (nsStyleTable *)mStyleContext->GetMutableStyleData(eStyleStruct_Table);
@ -2482,7 +2486,7 @@ void nsTableFrame::AdjustColumnsForCOLSAttribute()
{
for (PRInt32 colIndex=0; colIndex<numCols; colIndex++)
{
nsTableCellFrame *cellFrame = mCellMap->GetCellFrameAt(rowIndex, colIndex);
nsTableCellFrame *cellFrame = cellMap->GetCellFrameAt(rowIndex, colIndex);
// get the cell style info
const nsStylePosition* cellPosition;
if (nsnull!=cellFrame)
@ -2560,10 +2564,10 @@ nsTableFrame::SetColumnStyleFromCell(nsIPresContext * aPresContext,
NS_METHOD nsTableFrame::GetColumnFrame(PRInt32 aColIndex, nsTableColFrame *&aColFrame)
{
aColFrame = nsnull; // initialize out parameter
nsTableFrame * firstInFlow = (nsTableFrame *)GetFirstInFlow();
if (nsnull!=firstInFlow->mCellMap)
nsCellMap *cellMap = GetCellMap();
if (nsnull!=cellMap)
{ // hooray, we get to do this the easy way because the info is cached
aColFrame = firstInFlow->mCellMap->GetColumnFrame(aColIndex);
aColFrame = cellMap->GetColumnFrame(aColIndex);
NS_ASSERTION(nsnull!=aColFrame, "bad col frame");
}
else
@ -3145,6 +3149,7 @@ nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
parentWidth = NS_UNCONSTRAINEDSIZE;
if (nsnull != ((nsTableFrame*)table)->mColumnWidths)
{
parentWidth=0;
PRInt32 colIndex = ((nsTableCellFrame *)greatgrandchildFrame)->GetColIndex();
PRInt32 colSpan = ((nsTableFrame*)table)->GetEffectiveColSpan(colIndex, ((nsTableCellFrame *)greatgrandchildFrame));
for (PRInt32 i = 0; i<colSpan; i++)
@ -3168,28 +3173,49 @@ nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
{
if (nsnull!=((nsTableFrame*)table)->mColumnWidths)
{
parentWidth=0;
PRInt32 colIndex = ((nsTableCellFrame*)greatgrandchildFrame)->GetColIndex();
parentWidth = ((nsTableFrame*)table)->GetColumnWidth(colIndex);
PRInt32 colSpan = ((nsTableFrame*)table)->GetEffectiveColSpan(colIndex, ((nsTableCellFrame *)greatgrandchildFrame));
for (PRInt32 i = 0; i<colSpan; i++)
parentWidth += ((nsTableFrame*)table)->GetColumnWidth(i+colIndex);
if (eStyleUnit_Percent == tablePosition->mWidth.GetUnit())
{
float percent = tablePosition->mWidth.GetPercentValue();
parentWidth = (nscoord)(percent*((float)parentWidth));
}
}
else
{
nsSize tableSize;
table->GetSize(tableSize);
parentWidth = tableSize.width;
spacing->CalcBorderPaddingFor(rs->frame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
// same for the row group
childFrame->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
spacing->CalcBorderPaddingFor(childFrame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
// same for the row
grandchildFrame->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
spacing->CalcBorderPaddingFor(grandchildFrame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
// same for the cell
greatgrandchildFrame->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
spacing->CalcBorderPaddingFor(greatgrandchildFrame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
if (0!=tableSize.width)
{ // the table has been sized, so we can compute the available space for the child
spacing->CalcBorderPaddingFor(rs->frame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
// same for the row group
childFrame->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
spacing->CalcBorderPaddingFor(childFrame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
// same for the row
grandchildFrame->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
spacing->CalcBorderPaddingFor(grandchildFrame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
// same for the cell
greatgrandchildFrame->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
spacing->CalcBorderPaddingFor(greatgrandchildFrame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
}
else
{
// the table has not yet been sized, so we need to infer the available space
parentWidth = rs->maxSize.width;
if (eStyleUnit_Percent == tablePosition->mWidth.GetUnit())
{
float percent = tablePosition->mWidth.GetPercentValue();
parentWidth = (nscoord)(percent*((float)parentWidth));
}
}
}
if (PR_TRUE==gsDebugNT)
printf("%p: found a table frame %p, returning parentWidth %d \n",

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

@ -37,6 +37,8 @@ static const PRBool gsDebug = PR_FALSE;
static const PRBool gsDebugCLD = PR_FALSE;
#endif
const nscoord gBigSpace = 100000;
/* ---------- ProportionalColumnLayoutStruct ---------- */
// TODO: make public so other subclasses can use it
@ -776,7 +778,7 @@ PRBool BasicTableLayoutStrategy::BalanceProportionalColumns(const nsReflowState&
if (NS_UNCONSTRAINEDSIZE==aMaxWidth || NS_UNCONSTRAINEDSIZE==mMinTableWidth)
{ // the max width of the table fits comfortably in the available space
if (gsDebug) printf (" * auto table laying out in NS_UNCONSTRAINEDSIZE, calling BalanceColumnsTableFits\n");
nscoord bigSpace = 100000;
nscoord bigSpace = gBigSpace;
bigSpace = PR_MAX(bigSpace, mMaxTableWidth);
result = BalanceColumnsTableFits(aReflowState, bigSpace,
bigSpace, aTableSpecifiedWidth, aTableIsAutoWidth);
@ -1285,8 +1287,9 @@ PRBool BasicTableLayoutStrategy::BalanceColumnsTableFits(const nsReflowState& aR
nscoord otherWidth = (nscoord)((1.0f/remainingPercent)*((float)(widthOfOtherCells)));
if (PR_TRUE==gsDebug)
printf(" percentWidth=%d otherWidth=%d\n", percentWidth, otherWidth);
newTableWidth = PR_MAX(percentWidth, otherWidth);
newTableWidth = PR_MIN(newTableWidth, aMaxWidth); // since this is an auto-width table, it can't normally be wider than it's parent
newTableWidth = PR_MAX(percentWidth, otherWidth); // the table width is the larger of the two computations
newTableWidth = PR_MIN(newTableWidth, aMaxWidth); // an auto-width table can't normally be wider than it's parent
newTableWidth = PR_MIN(newTableWidth, mMaxTableWidth);// an auto-width table can't normally be wider than it's own computed max width
}
nscoord excess = newTableWidth-mFixedTableWidth; // the amount of new space that needs to be
// accounted for in the non-fixed columns
@ -1450,7 +1453,8 @@ PRBool BasicTableLayoutStrategy::BalanceColumnsTableFits(const nsReflowState& aR
// next, if the specified width of the table is greater than the table's computed width, expand the
// table's computed width to match the specified width, giving the extra space to proportionately-sized
// columns if possible.
if ((PR_FALSE==aTableIsAutoWidth) && (aAvailWidth > (tableWidth-widthOfFixedTableColumns)))
if ((PR_FALSE==aTableIsAutoWidth) && (aAvailWidth > (tableWidth-widthOfFixedTableColumns)) &&
(gBigSpace!=aAvailWidth))
{
DistributeExcessSpace(aAvailWidth, tableWidth, widthOfFixedTableColumns);
}

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

@ -466,7 +466,7 @@ PRInt32 nsTableFrame::GetEffectiveColSpan (PRInt32 aColIndex, nsTableCellFrame *
{
NS_PRECONDITION (nsnull!=aCell, "bad cell arg");
nsCellMap *cellMap = GetCellMap();
NS_PRECONDITION (nsnull!=cellMap, "bad call, mCellMap not yet allocated.");
NS_PRECONDITION (nsnull!=cellMap, "bad call, cellMap not yet allocated.");
NS_PRECONDITION (0<=aColIndex && aColIndex<GetColCount(), "bad col index arg");
if (cellMap->GetRowCount()==1)
@ -481,7 +481,7 @@ PRInt32 nsTableFrame::GetEffectiveColSpan (PRInt32 aColIndex, nsTableCellFrame *
PRInt32 nsTableFrame::GetEffectiveCOLSAttribute()
{
nsCellMap *cellMap = GetCellMap();
NS_PRECONDITION (nsnull!=cellMap, "bad call, mCellMap not yet allocated.");
NS_PRECONDITION (nsnull!=cellMap, "bad call, cellMap not yet allocated.");
PRInt32 result;
nsIFrame *tableFrame = this;
// begin REMOVE_ME_WHEN_TABLE_STYLE_IS_RESOLVED! XXX
@ -629,13 +629,14 @@ nsCellMap * nsTableFrame::GetCellMap()
}
void nsTableFrame::EnsureCellMap()
{
{ // XXX: must be called ONLY on first-in-flow
if (mCellMap == nsnull)
BuildCellMap();
}
void nsTableFrame::BuildCellMap ()
{
// XXX: must be called only on first-in-flow!
if (gsDebug==PR_TRUE) printf("Build Cell Map...\n");
int rowCount = GetRowCount();
@ -897,12 +898,13 @@ void nsTableFrame::ListColumnLayoutData(FILE* out, PRInt32 aIndent)
return;
}
if (nsnull!=mCellMap)
nsCellMap *cellMap = GetCellMap();
if (nsnull!=cellMap)
{
fprintf(out,"Column Layout Data \n");
PRInt32 numCols = GetColCount();
PRInt32 numRows = mCellMap->GetRowCount();
PRInt32 numRows = cellMap->GetRowCount();
for (PRInt32 colIndex = 0; colIndex<numCols; colIndex++)
{
for (PRInt32 indent = aIndent; --indent >= 0; )
@ -910,7 +912,7 @@ void nsTableFrame::ListColumnLayoutData(FILE* out, PRInt32 aIndent)
fprintf(out,"Column Data [%d] \n",colIndex);
for (PRInt32 rowIndex = 0; rowIndex < numRows; rowIndex++)
{
nsTableCellFrame *cellFrame = mCellMap->GetCellFrameAt(rowIndex, colIndex);
nsTableCellFrame *cellFrame = cellMap->GetCellFrameAt(rowIndex, colIndex);
PRInt32 rowIndent;
for (rowIndent = aIndent+2; --rowIndent >= 0; ) fputs(" ", out);
fprintf(out,"Cell Data [%d] \n",rowIndex);
@ -956,11 +958,12 @@ void nsTableFrame::AppendLayoutData(nsVoidArray* aList, nsTableCellFrame* aTable
void nsTableFrame::RecalcLayoutData()
{
if (nsnull==mCellMap)
nsCellMap *cellMap = GetCellMap();
if (nsnull==cellMap)
return; // no info yet, so nothing useful to do
PRInt32 colCount = GetColCount();
PRInt32 rowCount = mCellMap->GetRowCount();
PRInt32 rowCount = cellMap->GetRowCount();
PRInt32 row = 0;
PRInt32 col = 0;
@ -984,7 +987,7 @@ void nsTableFrame::RecalcLayoutData()
for (col = 0; col < colCount; col++)
{
nsTableCellFrame* cell = nsnull;
CellData* cellData = mCellMap->GetCellAt(row,col);
CellData* cellData = cellMap->GetCellAt(row,col);
if (cellData)
cell = cellData->mCell;
@ -1007,7 +1010,7 @@ void nsTableFrame::RecalcLayoutData()
above = nsnull;
else
{
cellData = mCellMap->GetCellAt(row-1,col);
cellData = cellMap->GetCellAt(row-1,col);
if (nsnull != cellData)
above = cellData->mRealCell->mCell;
@ -1022,7 +1025,7 @@ void nsTableFrame::RecalcLayoutData()
left = nsnull;
else
{
cellData = mCellMap->GetCellAt(row,col-1);
cellData = cellMap->GetCellAt(row,col-1);
if (cellData != nsnull)
left = cellData->mRealCell->mCell;
@ -1053,7 +1056,7 @@ void nsTableFrame::RecalcLayoutData()
// Add top edge cells
if (c != col)
{
cellData = mCellMap->GetCellAt(r1,c);
cellData = cellMap->GetCellAt(r1,c);
if ((cellData != nsnull) && (cellData->mCell != above))
{
above = cellData->mCell;
@ -1070,7 +1073,7 @@ void nsTableFrame::RecalcLayoutData()
if (r2 < rowCount)
{
// Add bottom edge cells
cellData = mCellMap->GetCellAt(r2,c);
cellData = cellMap->GetCellAt(r2,c);
if ((cellData != nsnull) && cellData->mCell != below)
{
below = cellData->mCell;
@ -1095,7 +1098,7 @@ void nsTableFrame::RecalcLayoutData()
{
if (r != row)
{
cellData = mCellMap->GetCellAt(r,c1);
cellData = cellMap->GetCellAt(r,c1);
if ((cellData != nsnull) && (cellData->mCell != left))
{
left = cellData->mCell;
@ -1112,7 +1115,7 @@ void nsTableFrame::RecalcLayoutData()
if (c2 < colCount)
{
// Add right edge cells
cellData = mCellMap->GetCellAt(r,c2);
cellData = cellMap->GetCellAt(r,c2);
if ((cellData != nsnull) && (cellData->mCell != right))
{
right = cellData->mCell;
@ -2470,7 +2473,8 @@ void nsTableFrame::VerticallyAlignChildren(nsIPresContext* aPresContext,
void nsTableFrame::AdjustColumnsForCOLSAttribute()
{
NS_ASSERTION(nsnull!=mCellMap, "bad cell map");
nsCellMap *cellMap = GetCellMap();
NS_ASSERTION(nsnull!=cellMap, "bad cell map");
// any specified-width column turns off COLS attribute
nsStyleTable* tableStyle = (nsStyleTable *)mStyleContext->GetMutableStyleData(eStyleStruct_Table);
@ -2482,7 +2486,7 @@ void nsTableFrame::AdjustColumnsForCOLSAttribute()
{
for (PRInt32 colIndex=0; colIndex<numCols; colIndex++)
{
nsTableCellFrame *cellFrame = mCellMap->GetCellFrameAt(rowIndex, colIndex);
nsTableCellFrame *cellFrame = cellMap->GetCellFrameAt(rowIndex, colIndex);
// get the cell style info
const nsStylePosition* cellPosition;
if (nsnull!=cellFrame)
@ -2560,10 +2564,10 @@ nsTableFrame::SetColumnStyleFromCell(nsIPresContext * aPresContext,
NS_METHOD nsTableFrame::GetColumnFrame(PRInt32 aColIndex, nsTableColFrame *&aColFrame)
{
aColFrame = nsnull; // initialize out parameter
nsTableFrame * firstInFlow = (nsTableFrame *)GetFirstInFlow();
if (nsnull!=firstInFlow->mCellMap)
nsCellMap *cellMap = GetCellMap();
if (nsnull!=cellMap)
{ // hooray, we get to do this the easy way because the info is cached
aColFrame = firstInFlow->mCellMap->GetColumnFrame(aColIndex);
aColFrame = cellMap->GetColumnFrame(aColIndex);
NS_ASSERTION(nsnull!=aColFrame, "bad col frame");
}
else
@ -3145,6 +3149,7 @@ nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
parentWidth = NS_UNCONSTRAINEDSIZE;
if (nsnull != ((nsTableFrame*)table)->mColumnWidths)
{
parentWidth=0;
PRInt32 colIndex = ((nsTableCellFrame *)greatgrandchildFrame)->GetColIndex();
PRInt32 colSpan = ((nsTableFrame*)table)->GetEffectiveColSpan(colIndex, ((nsTableCellFrame *)greatgrandchildFrame));
for (PRInt32 i = 0; i<colSpan; i++)
@ -3168,28 +3173,49 @@ nscoord nsTableFrame::GetTableContainerWidth(const nsReflowState& aReflowState)
{
if (nsnull!=((nsTableFrame*)table)->mColumnWidths)
{
parentWidth=0;
PRInt32 colIndex = ((nsTableCellFrame*)greatgrandchildFrame)->GetColIndex();
parentWidth = ((nsTableFrame*)table)->GetColumnWidth(colIndex);
PRInt32 colSpan = ((nsTableFrame*)table)->GetEffectiveColSpan(colIndex, ((nsTableCellFrame *)greatgrandchildFrame));
for (PRInt32 i = 0; i<colSpan; i++)
parentWidth += ((nsTableFrame*)table)->GetColumnWidth(i+colIndex);
if (eStyleUnit_Percent == tablePosition->mWidth.GetUnit())
{
float percent = tablePosition->mWidth.GetPercentValue();
parentWidth = (nscoord)(percent*((float)parentWidth));
}
}
else
{
nsSize tableSize;
table->GetSize(tableSize);
parentWidth = tableSize.width;
spacing->CalcBorderPaddingFor(rs->frame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
// same for the row group
childFrame->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
spacing->CalcBorderPaddingFor(childFrame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
// same for the row
grandchildFrame->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
spacing->CalcBorderPaddingFor(grandchildFrame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
// same for the cell
greatgrandchildFrame->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
spacing->CalcBorderPaddingFor(greatgrandchildFrame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
if (0!=tableSize.width)
{ // the table has been sized, so we can compute the available space for the child
spacing->CalcBorderPaddingFor(rs->frame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
// same for the row group
childFrame->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
spacing->CalcBorderPaddingFor(childFrame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
// same for the row
grandchildFrame->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
spacing->CalcBorderPaddingFor(grandchildFrame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
// same for the cell
greatgrandchildFrame->GetStyleData(eStyleStruct_Spacing, (const nsStyleStruct *&)spacing);
spacing->CalcBorderPaddingFor(greatgrandchildFrame, borderPadding);
parentWidth -= (borderPadding.right + borderPadding.left);
}
else
{
// the table has not yet been sized, so we need to infer the available space
parentWidth = rs->maxSize.width;
if (eStyleUnit_Percent == tablePosition->mWidth.GetUnit())
{
float percent = tablePosition->mWidth.GetPercentValue();
parentWidth = (nscoord)(percent*((float)parentWidth));
}
}
}
if (PR_TRUE==gsDebugNT)
printf("%p: found a table frame %p, returning parentWidth %d \n",