better handling of empty cell widths, especially involving colspans. support for bug 7121.

This commit is contained in:
karnaze%netscape.com 1999-09-10 18:55:46 +00:00
Родитель fc22fc06b6
Коммит 4966ef6084
2 изменённых файлов: 96 добавлений и 36 удалений

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

@ -529,8 +529,9 @@ NS_METHOD nsTableCellFrame::Reflow(nsIPresContext& aPresContext,
/* XXX: remove tableFrame when border-collapse inherits */
nsTableFrame* tableFrame=nsnull;
rv = nsTableFrame::GetTableFrame(this, tableFrame);
nsMargin borderPadding;
spacing->GetPadding(borderPadding);
nsMargin padding;
spacing->GetPadding(padding);
nsMargin borderPadding = padding;
nsMargin border;
GetCellBorder(border, tableFrame);
if ((NS_UNCONSTRAINEDSIZE == availSize.width) || !GetContentEmpty()) {
@ -606,12 +607,14 @@ NS_METHOD nsTableCellFrame::Reflow(nsIPresContext& aPresContext,
DebugCheckChildSize(firstKid, kidSize, availSize, (NS_UNCONSTRAINEDSIZE != aReflowState.availableWidth));
#endif
PRBool useInsets = PR_TRUE;
// 0 dimensioned cells need to be treated specially in Standard/NavQuirks mode
// see testcase "cellHeight.html"
// see testcase "emptyCells.html"
if (NS_UNCONSTRAINEDSIZE == kidReflowState.availableWidth) {
if ((0 == kidSize.width) || (0 == kidSize.height)) {
//if ((0 == kidSize.width) && (0 == kidSize.height)) { // XXX why was this &&
SetContentEmpty(PR_TRUE);
useInsets = PR_FALSE;
// need to reduce the insets by border if the cell is empty
leftInset -= border.left;
rightInset -= border.right;
@ -621,19 +624,45 @@ NS_METHOD nsTableCellFrame::Reflow(nsIPresContext& aPresContext,
else
SetContentEmpty(PR_FALSE);
}
const nsStylePosition* pos;
GetStyleData(eStyleStruct_Position, ((const nsStyleStruct *&)pos));
// calculate the min cell width
float p2t;
aPresContext.GetScaledPixelsToTwips(&p2t);
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
nscoord smallestMinWidth = onePixel;
if (eCompatibility_NavQuirks == compatMode) {
if ((pos->mWidth.GetUnit() != eStyleUnit_Coord) &&
(pos->mWidth.GetUnit() != eStyleUnit_Percent)) {
if (border.left > 0)
smallestMinWidth += onePixel;
if (border.right > 0)
smallestMinWidth += onePixel;
}
PRInt32 colspan = GetColSpan();
if (colspan > 1) {
smallestMinWidth = PR_MAX(smallestMinWidth, colspan * onePixel);
nscoord spacingX = tableFrame->GetCellSpacingX();
nscoord spacingExtra = spacingX * (colspan - 1);
smallestMinWidth += spacingExtra;
if (padding.left > 0) {
smallestMinWidth -= onePixel;
}
}
}
if (0 == kidSize.width) {
if (NS_UNCONSTRAINEDSIZE == kidReflowState.availableWidth) {
const nsStylePosition* pos;
GetStyleData(eStyleStruct_Position, ((const nsStyleStruct *&)pos));
if ((pos->mWidth.GetUnit() != eStyleUnit_Coord) &&
(pos->mWidth.GetUnit() != eStyleUnit_Percent)) {
float p2t;
aPresContext.GetScaledPixelsToTwips(&p2t);
PRInt32 pixWidth = (eCompatibility_Standard == compatMode) ? 1 : 3;
kidSize.width = NSIntPixelsToTwips(pixWidth, p2t);
if ((nsnull != aDesiredSize.maxElementSize) && (0 == pMaxElementSize->width))
pMaxElementSize->width = kidSize.width;
}
// const nsStylePosition* pos;
// GetStyleData(eStyleStruct_Position, ((const nsStyleStruct *&)pos));
// if ((pos->mWidth.GetUnit() != eStyleUnit_Coord) &&
// (pos->mWidth.GetUnit() != eStyleUnit_Percent)) {
// kidSize.width = minCellWidth;
// if ((nsnull != aDesiredSize.maxElementSize) && (0 == pMaxElementSize->width))
// pMaxElementSize->width = kidSize.width;
// }
}
else // empty content has to be forced to the assigned width for resize or incremental reflow
kidSize.width = kidReflowState.availableWidth;
@ -643,8 +672,6 @@ NS_METHOD nsTableCellFrame::Reflow(nsIPresContext& aPresContext,
GetStyleData(eStyleStruct_Position, ((const nsStyleStruct *&)pos));
if ((pos->mHeight.GetUnit() != eStyleUnit_Coord) &&
(pos->mHeight.GetUnit() != eStyleUnit_Percent)) {
float p2t;
aPresContext.GetScaledPixelsToTwips(&p2t);
// Standard mode should probably be 0 pixels high instead of 1
PRInt32 pixHeight = (eCompatibility_Standard == compatMode) ? 1 : 2;
kidSize.height = NSIntPixelsToTwips(pixHeight, p2t);
@ -654,6 +681,8 @@ NS_METHOD nsTableCellFrame::Reflow(nsIPresContext& aPresContext,
}
// end 0 dimensioned cells
kidSize.width = PR_MAX(kidSize.width, smallestMinWidth);
// Place the child
//////////////////////////////// HACK //////////////////////////////
kidSize.width = PR_MIN(kidSize.width, availSize.width);
@ -682,8 +711,9 @@ NS_METHOD nsTableCellFrame::Reflow(nsIPresContext& aPresContext,
*aDesiredSize.maxElementSize = *pMaxElementSize;
if (0!=pMaxElementSize->height)
aDesiredSize.maxElementSize->height += topInset + bottomInset;
if (0!=pMaxElementSize->width)
aDesiredSize.maxElementSize->width += leftInset + rightInset;
//if (0!=pMaxElementSize->width)
aDesiredSize.maxElementSize->width = PR_MAX(smallestMinWidth, aDesiredSize.maxElementSize->width);
aDesiredSize.maxElementSize->width += leftInset + rightInset;
}
// remember my desired size for this reflow
SetDesiredSize(aDesiredSize);

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

@ -529,8 +529,9 @@ NS_METHOD nsTableCellFrame::Reflow(nsIPresContext& aPresContext,
/* XXX: remove tableFrame when border-collapse inherits */
nsTableFrame* tableFrame=nsnull;
rv = nsTableFrame::GetTableFrame(this, tableFrame);
nsMargin borderPadding;
spacing->GetPadding(borderPadding);
nsMargin padding;
spacing->GetPadding(padding);
nsMargin borderPadding = padding;
nsMargin border;
GetCellBorder(border, tableFrame);
if ((NS_UNCONSTRAINEDSIZE == availSize.width) || !GetContentEmpty()) {
@ -606,12 +607,14 @@ NS_METHOD nsTableCellFrame::Reflow(nsIPresContext& aPresContext,
DebugCheckChildSize(firstKid, kidSize, availSize, (NS_UNCONSTRAINEDSIZE != aReflowState.availableWidth));
#endif
PRBool useInsets = PR_TRUE;
// 0 dimensioned cells need to be treated specially in Standard/NavQuirks mode
// see testcase "cellHeight.html"
// see testcase "emptyCells.html"
if (NS_UNCONSTRAINEDSIZE == kidReflowState.availableWidth) {
if ((0 == kidSize.width) || (0 == kidSize.height)) {
//if ((0 == kidSize.width) && (0 == kidSize.height)) { // XXX why was this &&
SetContentEmpty(PR_TRUE);
useInsets = PR_FALSE;
// need to reduce the insets by border if the cell is empty
leftInset -= border.left;
rightInset -= border.right;
@ -621,19 +624,45 @@ NS_METHOD nsTableCellFrame::Reflow(nsIPresContext& aPresContext,
else
SetContentEmpty(PR_FALSE);
}
const nsStylePosition* pos;
GetStyleData(eStyleStruct_Position, ((const nsStyleStruct *&)pos));
// calculate the min cell width
float p2t;
aPresContext.GetScaledPixelsToTwips(&p2t);
nscoord onePixel = NSIntPixelsToTwips(1, p2t);
nscoord smallestMinWidth = onePixel;
if (eCompatibility_NavQuirks == compatMode) {
if ((pos->mWidth.GetUnit() != eStyleUnit_Coord) &&
(pos->mWidth.GetUnit() != eStyleUnit_Percent)) {
if (border.left > 0)
smallestMinWidth += onePixel;
if (border.right > 0)
smallestMinWidth += onePixel;
}
PRInt32 colspan = GetColSpan();
if (colspan > 1) {
smallestMinWidth = PR_MAX(smallestMinWidth, colspan * onePixel);
nscoord spacingX = tableFrame->GetCellSpacingX();
nscoord spacingExtra = spacingX * (colspan - 1);
smallestMinWidth += spacingExtra;
if (padding.left > 0) {
smallestMinWidth -= onePixel;
}
}
}
if (0 == kidSize.width) {
if (NS_UNCONSTRAINEDSIZE == kidReflowState.availableWidth) {
const nsStylePosition* pos;
GetStyleData(eStyleStruct_Position, ((const nsStyleStruct *&)pos));
if ((pos->mWidth.GetUnit() != eStyleUnit_Coord) &&
(pos->mWidth.GetUnit() != eStyleUnit_Percent)) {
float p2t;
aPresContext.GetScaledPixelsToTwips(&p2t);
PRInt32 pixWidth = (eCompatibility_Standard == compatMode) ? 1 : 3;
kidSize.width = NSIntPixelsToTwips(pixWidth, p2t);
if ((nsnull != aDesiredSize.maxElementSize) && (0 == pMaxElementSize->width))
pMaxElementSize->width = kidSize.width;
}
// const nsStylePosition* pos;
// GetStyleData(eStyleStruct_Position, ((const nsStyleStruct *&)pos));
// if ((pos->mWidth.GetUnit() != eStyleUnit_Coord) &&
// (pos->mWidth.GetUnit() != eStyleUnit_Percent)) {
// kidSize.width = minCellWidth;
// if ((nsnull != aDesiredSize.maxElementSize) && (0 == pMaxElementSize->width))
// pMaxElementSize->width = kidSize.width;
// }
}
else // empty content has to be forced to the assigned width for resize or incremental reflow
kidSize.width = kidReflowState.availableWidth;
@ -643,8 +672,6 @@ NS_METHOD nsTableCellFrame::Reflow(nsIPresContext& aPresContext,
GetStyleData(eStyleStruct_Position, ((const nsStyleStruct *&)pos));
if ((pos->mHeight.GetUnit() != eStyleUnit_Coord) &&
(pos->mHeight.GetUnit() != eStyleUnit_Percent)) {
float p2t;
aPresContext.GetScaledPixelsToTwips(&p2t);
// Standard mode should probably be 0 pixels high instead of 1
PRInt32 pixHeight = (eCompatibility_Standard == compatMode) ? 1 : 2;
kidSize.height = NSIntPixelsToTwips(pixHeight, p2t);
@ -654,6 +681,8 @@ NS_METHOD nsTableCellFrame::Reflow(nsIPresContext& aPresContext,
}
// end 0 dimensioned cells
kidSize.width = PR_MAX(kidSize.width, smallestMinWidth);
// Place the child
//////////////////////////////// HACK //////////////////////////////
kidSize.width = PR_MIN(kidSize.width, availSize.width);
@ -682,8 +711,9 @@ NS_METHOD nsTableCellFrame::Reflow(nsIPresContext& aPresContext,
*aDesiredSize.maxElementSize = *pMaxElementSize;
if (0!=pMaxElementSize->height)
aDesiredSize.maxElementSize->height += topInset + bottomInset;
if (0!=pMaxElementSize->width)
aDesiredSize.maxElementSize->width += leftInset + rightInset;
//if (0!=pMaxElementSize->width)
aDesiredSize.maxElementSize->width = PR_MAX(smallestMinWidth, aDesiredSize.maxElementSize->width);
aDesiredSize.maxElementSize->width += leftInset + rightInset;
}
// remember my desired size for this reflow
SetDesiredSize(aDesiredSize);