diff --git a/layout/html/table/src/nsTableColFrame.cpp b/layout/html/table/src/nsTableColFrame.cpp index cde85c83968..325278e9978 100644 --- a/layout/html/table/src/nsTableColFrame.cpp +++ b/layout/html/table/src/nsTableColFrame.cpp @@ -23,6 +23,7 @@ #include "nsIPresContext.h" #include "nsHTMLIIDs.h" #include "nsHTMLAtoms.h" +#include "nsCSSRendering.h" #ifdef NS_DEBUG static PRBool gsDebug = PR_FALSE; @@ -44,8 +45,25 @@ NS_METHOD nsTableColFrame::Paint(nsIPresContext& aPresContext, const nsRect& aDirtyRect, nsFramePaintLayer aWhichLayer) { - if (gsDebug==PR_TRUE) - printf("nsTableColFrame::Paint\n"); + if (gsDebug==PR_TRUE) printf("nsTableColFrame::Paint\n"); + + if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) { + nsCompatibility mode; + aPresContext.GetCompatibilityMode(&mode); + if (eCompatibility_Standard == mode) { + const nsStyleDisplay* disp = + (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); + if (disp->mVisible) { + const nsStyleSpacing* spacing = + (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); + const nsStyleColor* color = + (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); + nsRect rect(0, 0, mRect.width, mRect.height); + nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, + aDirtyRect, rect, *color, *spacing, 0, 0); + } + } + } return NS_OK; } diff --git a/layout/html/table/src/nsTableColGroupFrame.cpp b/layout/html/table/src/nsTableColGroupFrame.cpp index e14a5f546fa..c52d75adbba 100644 --- a/layout/html/table/src/nsTableColGroupFrame.cpp +++ b/layout/html/table/src/nsTableColGroupFrame.cpp @@ -29,6 +29,7 @@ #include "nsHTMLAtoms.h" #include "nsHTMLIIDs.h" #include "nsCOMPtr.h" +#include "nsCSSRendering.h" NS_DEF_PTR(nsIContent); @@ -136,12 +137,30 @@ nsTableColGroupFrame::SetInitialChildList(nsIPresContext& aPresContext, return result; } -NS_METHOD nsTableColGroupFrame::Paint(nsIPresContext& aPresContext, +NS_METHOD nsTableColGroupFrame::Paint(nsIPresContext& aPresContext, nsIRenderingContext& aRenderingContext, const nsRect& aDirtyRect, - nsFramePaintLayer aWhichLayer) + nsFramePaintLayer aWhichLayer) { if (gsDebug==PR_TRUE) printf("nsTableColGroupFrame::Paint\n"); + + if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) { + nsCompatibility mode; + aPresContext.GetCompatibilityMode(&mode); + if (eCompatibility_Standard == mode) { + const nsStyleDisplay* disp = + (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); + if (disp->mVisible) { + const nsStyleSpacing* spacing = + (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); + const nsStyleColor* color = + (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); + nsRect rect(0, 0, mRect.width, mRect.height); + nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, + aDirtyRect, rect, *color, *spacing, 0, 0); + } + } + } PaintChildren(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer); return NS_OK; } diff --git a/layout/html/table/src/nsTableFrame.cpp b/layout/html/table/src/nsTableFrame.cpp index 7c43d94931f..7f4d881dad7 100644 --- a/layout/html/table/src/nsTableFrame.cpp +++ b/layout/html/table/src/nsTableFrame.cpp @@ -2285,8 +2285,19 @@ NS_METHOD nsTableFrame::Paint(nsIPresContext& aPresContext, (const nsStyleTable*)mStyleContext->GetStyleData(eStyleStruct_Table); nsRect rect(0, 0, mRect.width, mRect.height); - nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, - aDirtyRect, rect, *color, *spacing, 0, 0); + + nsCompatibility mode; + aPresContext.GetCompatibilityMode(&mode); + if (eCompatibility_Standard == mode) { + nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, + aDirtyRect, rect, *color, *spacing, 0, 0); + // paint the column groups and columns + nsIFrame* colGroupFrame = mColGroups.FirstChild(); + while (nsnull != colGroupFrame) { + PaintChild(aPresContext, aRenderingContext, aDirtyRect, colGroupFrame, aWhichLayer); + colGroupFrame->GetNextSibling(&colGroupFrame); + } + } PRIntn skipSides = GetSkipSides(); if (NS_STYLE_BORDER_SEPARATE==tableStyle->mBorderCollapse) { @@ -2413,6 +2424,47 @@ nsresult nsTableFrame::AdjustSiblingsAfterReflow(nsIPresContext& aPresCon return NS_OK; } +void nsTableFrame::SetColumnDimensions(nscoord aHeight) +{ + const nsStyleSpacing* spacing = + (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); + nsMargin borderPadding; + spacing->CalcBorderPaddingFor(this, borderPadding); + nscoord colHeight = aHeight -= borderPadding.top + borderPadding.bottom; + nscoord cellSpacingX = GetCellSpacingX(); + nscoord halfCellSpacingX = NSToCoordRound(((float)cellSpacingX) / (float)2); + + nsIFrame* colGroupFrame = mColGroups.FirstChild(); + PRInt32 colX = 0; + nsPoint colGroupOrigin(borderPadding.left, borderPadding.top); + while (nsnull != colGroupFrame) { + nscoord colGroupWidth = 0; + nsIFrame* colFrame = nsnull; + colGroupFrame->FirstChild(nsnull, &colFrame); + nsPoint colOrigin(0, 0); + while (nsnull != colFrame) { + NS_ASSERTION(colX < mColCount, "invalid number of columns"); + nscoord colWidth = mColumnWidths[colX] + cellSpacingX; + if (mColCount == 1) { + colWidth += cellSpacingX; + } + else if ((0 == colX) || (mColCount - 1 == colX)) { + colWidth += halfCellSpacingX; + } + colGroupWidth += colWidth; + nsRect colRect(colOrigin.x, colOrigin.y, colWidth, colHeight); + colFrame->SetRect(colRect); + colFrame->GetNextSibling(&colFrame); + colOrigin.x += colWidth; + colX++; + } + nsRect colGroupRect(colGroupOrigin.x, colGroupOrigin.y, colGroupWidth, colHeight); + colGroupFrame->SetRect(colGroupRect); + colGroupFrame->GetNextSibling(&colGroupFrame); + colGroupOrigin.x += colGroupWidth; + } +} + // SEC: TODO need to worry about continuing frames prev/next in flow for splitting across pages. /* overview: @@ -2556,6 +2608,8 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext& aPresContext, this, aDesiredSize.width, aDesiredSize.height); } + SetColumnDimensions(aDesiredSize.height); + if (PR_TRUE==gsDebug) printf("end reflow for table %p\n", this); return rv; } diff --git a/layout/html/table/src/nsTableFrame.h b/layout/html/table/src/nsTableFrame.h index 00a43f957b8..839b1e472c1 100644 --- a/layout/html/table/src/nsTableFrame.h +++ b/layout/html/table/src/nsTableFrame.h @@ -697,6 +697,8 @@ protected: */ virtual nsCellMap *GetCellMap() const; + void SetColumnDimensions(nscoord aHeight); + #ifdef NS_DEBUG /** for debugging only * prints out information about the cell map diff --git a/layout/html/table/src/nsTableRowFrame.cpp b/layout/html/table/src/nsTableRowFrame.cpp index 396f12f3823..3ae910327aa 100644 --- a/layout/html/table/src/nsTableRowFrame.cpp +++ b/layout/html/table/src/nsTableRowFrame.cpp @@ -282,11 +282,6 @@ void nsTableRowFrame::SetMaxChildHeight(nscoord aChildHeight, nscoord aTopMargin mCellMaxBottomMargin = aBottomMargin; } -NS_METHOD nsTableRowFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect, - nsFramePaintLayer aWhichLayer) -{ /* const nsStyleColor* myColor = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); @@ -297,8 +292,74 @@ NS_METHOD nsTableRowFrame::Paint(nsIPresContext& aPresContext, } */ +PRBool IsFirstRow(nsTableFrame& aTable, + nsTableRowFrame& aRow) +{ + nsIFrame* firstRowGroup = nsnull; + aTable.FirstChild(nsnull, &firstRowGroup); + nsIFrame* rowGroupFrame = nsnull; + nsresult rv = aRow.GetParent(&rowGroupFrame); + if (NS_SUCCEEDED(rv) && (rowGroupFrame == firstRowGroup)) { + nsIFrame* firstRow; + rowGroupFrame->FirstChild(nsnull, &firstRow); + return (&aRow == firstRow); + } + return PR_FALSE; +} + + +NS_METHOD nsTableRowFrame::Paint(nsIPresContext& aPresContext, + nsIRenderingContext& aRenderingContext, + const nsRect& aDirtyRect, + nsFramePaintLayer aWhichLayer) +{ + nsresult rv; + if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) { + nsCompatibility mode; + aPresContext.GetCompatibilityMode(&mode); + if (eCompatibility_Standard == mode) { + const nsStyleDisplay* disp = + (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); + if (disp->mVisible) { + const nsStyleSpacing* spacing = + (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); + const nsStyleColor* color = + (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); + nsTableFrame* tableFrame = nsnull; + rv = nsTableFrame::GetTableFrame(this, tableFrame); + if (NS_FAILED(rv) || (nsnull == tableFrame)) { + return rv; + } + nscoord cellSpacingX = tableFrame->GetCellSpacingX(); + nscoord halfCellSpacingY = + NSToCoordRound(((float)tableFrame->GetCellSpacingY()) / (float)2); + // every row is short by the ending cell spacing X + nsRect rect(0, 0, mRect.width + cellSpacingX, mRect.height); + // first row may have gotten too much cell spacing Y + if (tableFrame->GetRowCount() != 1) { + if (IsFirstRow(*tableFrame, *this)) { + rect.height -= halfCellSpacingY; + } + else { + rect.height += halfCellSpacingY; + rect.y -= halfCellSpacingY; + } + } + + nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, + aDirtyRect, rect, *color, *spacing, 0, 0); + } + } + } + // for debug... + if ((NS_FRAME_PAINT_LAYER_DEBUG == aWhichLayer) && GetShowFrameBorders()) { + aRenderingContext.SetColor(NS_RGB(0,255,0)); + aRenderingContext.DrawRect(0, 0, mRect.width, mRect.height); + } + PaintChildren(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer); - return NS_OK; + return nsFrame::Paint(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer); + } PRIntn diff --git a/layout/html/table/src/nsTableRowGroupFrame.cpp b/layout/html/table/src/nsTableRowGroupFrame.cpp index 86234b517e6..082575f9ff9 100644 --- a/layout/html/table/src/nsTableRowGroupFrame.cpp +++ b/layout/html/table/src/nsTableRowGroupFrame.cpp @@ -34,6 +34,7 @@ #include "nsIStyleSet.h" #include "nsIPresShell.h" #include "nsLayoutAtoms.h" +#include "nsCSSRendering.h" #ifdef NS_DEBUG static PRBool gsDebug = PR_FALSE; @@ -220,22 +221,59 @@ nsTableRowGroupFrame::InitRepeatedFrame(nsTableRowGroupFrame* aHeaderFooterFrame return NS_OK; } -NS_METHOD nsTableRowGroupFrame::Paint(nsIPresContext& aPresContext, +NS_METHOD nsTableRowGroupFrame::Paint(nsIPresContext& aPresContext, nsIRenderingContext& aRenderingContext, const nsRect& aDirtyRect, - nsFramePaintLayer aWhichLayer) + nsFramePaintLayer aWhichLayer) { + nsresult rv; + if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) { + nsCompatibility mode; + aPresContext.GetCompatibilityMode(&mode); + if (eCompatibility_Standard == mode) { + const nsStyleDisplay* disp = + (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); + if (disp->mVisible) { + const nsStyleSpacing* spacing = + (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); + const nsStyleColor* color = + (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); + nsTableFrame* tableFrame = nsnull; + rv = nsTableFrame::GetTableFrame(this, tableFrame); + if (NS_FAILED(rv) || (nsnull == tableFrame)) { + return rv; + } + nscoord halfCellSpacingY = + NSToCoordRound(((float)tableFrame->GetCellSpacingY()) / (float)2); + // every row group is short by the ending cell spacing X + nsRect rect(0, 0, mRect.width, mRect.height); + nsIFrame* firstRowGroup = nsnull; + tableFrame->FirstChild(nsnull, &firstRowGroup); + // first row group may have gotten too much cell spacing Y + if (tableFrame->GetRowCount() != 1) { + if (this == firstRowGroup) { + rect.height -= halfCellSpacingY; + } + else { + rect.height += halfCellSpacingY; + rect.y -= halfCellSpacingY; + } + } + nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, + aDirtyRect, rect, *color, *spacing, 0, 0); + } + } + } // for debug... - /* - if (nsIFrame::GetShowFrameBorders()) { - aRenderingContext.SetColor(NS_RGB(128,0,0)); + if ((NS_FRAME_PAINT_LAYER_DEBUG == aWhichLayer) && GetShowFrameBorders()) { + aRenderingContext.SetColor(NS_RGB(0,255,0)); aRenderingContext.DrawRect(0, 0, mRect.width, mRect.height); } - */ PaintChildren(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer); - return NS_OK; + return nsFrame::Paint(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer); + } PRIntn diff --git a/layout/tables/nsTableColFrame.cpp b/layout/tables/nsTableColFrame.cpp index cde85c83968..325278e9978 100644 --- a/layout/tables/nsTableColFrame.cpp +++ b/layout/tables/nsTableColFrame.cpp @@ -23,6 +23,7 @@ #include "nsIPresContext.h" #include "nsHTMLIIDs.h" #include "nsHTMLAtoms.h" +#include "nsCSSRendering.h" #ifdef NS_DEBUG static PRBool gsDebug = PR_FALSE; @@ -44,8 +45,25 @@ NS_METHOD nsTableColFrame::Paint(nsIPresContext& aPresContext, const nsRect& aDirtyRect, nsFramePaintLayer aWhichLayer) { - if (gsDebug==PR_TRUE) - printf("nsTableColFrame::Paint\n"); + if (gsDebug==PR_TRUE) printf("nsTableColFrame::Paint\n"); + + if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) { + nsCompatibility mode; + aPresContext.GetCompatibilityMode(&mode); + if (eCompatibility_Standard == mode) { + const nsStyleDisplay* disp = + (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); + if (disp->mVisible) { + const nsStyleSpacing* spacing = + (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); + const nsStyleColor* color = + (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); + nsRect rect(0, 0, mRect.width, mRect.height); + nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, + aDirtyRect, rect, *color, *spacing, 0, 0); + } + } + } return NS_OK; } diff --git a/layout/tables/nsTableColGroupFrame.cpp b/layout/tables/nsTableColGroupFrame.cpp index e14a5f546fa..c52d75adbba 100644 --- a/layout/tables/nsTableColGroupFrame.cpp +++ b/layout/tables/nsTableColGroupFrame.cpp @@ -29,6 +29,7 @@ #include "nsHTMLAtoms.h" #include "nsHTMLIIDs.h" #include "nsCOMPtr.h" +#include "nsCSSRendering.h" NS_DEF_PTR(nsIContent); @@ -136,12 +137,30 @@ nsTableColGroupFrame::SetInitialChildList(nsIPresContext& aPresContext, return result; } -NS_METHOD nsTableColGroupFrame::Paint(nsIPresContext& aPresContext, +NS_METHOD nsTableColGroupFrame::Paint(nsIPresContext& aPresContext, nsIRenderingContext& aRenderingContext, const nsRect& aDirtyRect, - nsFramePaintLayer aWhichLayer) + nsFramePaintLayer aWhichLayer) { if (gsDebug==PR_TRUE) printf("nsTableColGroupFrame::Paint\n"); + + if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) { + nsCompatibility mode; + aPresContext.GetCompatibilityMode(&mode); + if (eCompatibility_Standard == mode) { + const nsStyleDisplay* disp = + (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); + if (disp->mVisible) { + const nsStyleSpacing* spacing = + (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); + const nsStyleColor* color = + (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); + nsRect rect(0, 0, mRect.width, mRect.height); + nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, + aDirtyRect, rect, *color, *spacing, 0, 0); + } + } + } PaintChildren(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer); return NS_OK; } diff --git a/layout/tables/nsTableFrame.cpp b/layout/tables/nsTableFrame.cpp index 7c43d94931f..7f4d881dad7 100644 --- a/layout/tables/nsTableFrame.cpp +++ b/layout/tables/nsTableFrame.cpp @@ -2285,8 +2285,19 @@ NS_METHOD nsTableFrame::Paint(nsIPresContext& aPresContext, (const nsStyleTable*)mStyleContext->GetStyleData(eStyleStruct_Table); nsRect rect(0, 0, mRect.width, mRect.height); - nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, - aDirtyRect, rect, *color, *spacing, 0, 0); + + nsCompatibility mode; + aPresContext.GetCompatibilityMode(&mode); + if (eCompatibility_Standard == mode) { + nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, + aDirtyRect, rect, *color, *spacing, 0, 0); + // paint the column groups and columns + nsIFrame* colGroupFrame = mColGroups.FirstChild(); + while (nsnull != colGroupFrame) { + PaintChild(aPresContext, aRenderingContext, aDirtyRect, colGroupFrame, aWhichLayer); + colGroupFrame->GetNextSibling(&colGroupFrame); + } + } PRIntn skipSides = GetSkipSides(); if (NS_STYLE_BORDER_SEPARATE==tableStyle->mBorderCollapse) { @@ -2413,6 +2424,47 @@ nsresult nsTableFrame::AdjustSiblingsAfterReflow(nsIPresContext& aPresCon return NS_OK; } +void nsTableFrame::SetColumnDimensions(nscoord aHeight) +{ + const nsStyleSpacing* spacing = + (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); + nsMargin borderPadding; + spacing->CalcBorderPaddingFor(this, borderPadding); + nscoord colHeight = aHeight -= borderPadding.top + borderPadding.bottom; + nscoord cellSpacingX = GetCellSpacingX(); + nscoord halfCellSpacingX = NSToCoordRound(((float)cellSpacingX) / (float)2); + + nsIFrame* colGroupFrame = mColGroups.FirstChild(); + PRInt32 colX = 0; + nsPoint colGroupOrigin(borderPadding.left, borderPadding.top); + while (nsnull != colGroupFrame) { + nscoord colGroupWidth = 0; + nsIFrame* colFrame = nsnull; + colGroupFrame->FirstChild(nsnull, &colFrame); + nsPoint colOrigin(0, 0); + while (nsnull != colFrame) { + NS_ASSERTION(colX < mColCount, "invalid number of columns"); + nscoord colWidth = mColumnWidths[colX] + cellSpacingX; + if (mColCount == 1) { + colWidth += cellSpacingX; + } + else if ((0 == colX) || (mColCount - 1 == colX)) { + colWidth += halfCellSpacingX; + } + colGroupWidth += colWidth; + nsRect colRect(colOrigin.x, colOrigin.y, colWidth, colHeight); + colFrame->SetRect(colRect); + colFrame->GetNextSibling(&colFrame); + colOrigin.x += colWidth; + colX++; + } + nsRect colGroupRect(colGroupOrigin.x, colGroupOrigin.y, colGroupWidth, colHeight); + colGroupFrame->SetRect(colGroupRect); + colGroupFrame->GetNextSibling(&colGroupFrame); + colGroupOrigin.x += colGroupWidth; + } +} + // SEC: TODO need to worry about continuing frames prev/next in flow for splitting across pages. /* overview: @@ -2556,6 +2608,8 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext& aPresContext, this, aDesiredSize.width, aDesiredSize.height); } + SetColumnDimensions(aDesiredSize.height); + if (PR_TRUE==gsDebug) printf("end reflow for table %p\n", this); return rv; } diff --git a/layout/tables/nsTableFrame.h b/layout/tables/nsTableFrame.h index 00a43f957b8..839b1e472c1 100644 --- a/layout/tables/nsTableFrame.h +++ b/layout/tables/nsTableFrame.h @@ -697,6 +697,8 @@ protected: */ virtual nsCellMap *GetCellMap() const; + void SetColumnDimensions(nscoord aHeight); + #ifdef NS_DEBUG /** for debugging only * prints out information about the cell map diff --git a/layout/tables/nsTableRowFrame.cpp b/layout/tables/nsTableRowFrame.cpp index 396f12f3823..3ae910327aa 100644 --- a/layout/tables/nsTableRowFrame.cpp +++ b/layout/tables/nsTableRowFrame.cpp @@ -282,11 +282,6 @@ void nsTableRowFrame::SetMaxChildHeight(nscoord aChildHeight, nscoord aTopMargin mCellMaxBottomMargin = aBottomMargin; } -NS_METHOD nsTableRowFrame::Paint(nsIPresContext& aPresContext, - nsIRenderingContext& aRenderingContext, - const nsRect& aDirtyRect, - nsFramePaintLayer aWhichLayer) -{ /* const nsStyleColor* myColor = (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); @@ -297,8 +292,74 @@ NS_METHOD nsTableRowFrame::Paint(nsIPresContext& aPresContext, } */ +PRBool IsFirstRow(nsTableFrame& aTable, + nsTableRowFrame& aRow) +{ + nsIFrame* firstRowGroup = nsnull; + aTable.FirstChild(nsnull, &firstRowGroup); + nsIFrame* rowGroupFrame = nsnull; + nsresult rv = aRow.GetParent(&rowGroupFrame); + if (NS_SUCCEEDED(rv) && (rowGroupFrame == firstRowGroup)) { + nsIFrame* firstRow; + rowGroupFrame->FirstChild(nsnull, &firstRow); + return (&aRow == firstRow); + } + return PR_FALSE; +} + + +NS_METHOD nsTableRowFrame::Paint(nsIPresContext& aPresContext, + nsIRenderingContext& aRenderingContext, + const nsRect& aDirtyRect, + nsFramePaintLayer aWhichLayer) +{ + nsresult rv; + if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) { + nsCompatibility mode; + aPresContext.GetCompatibilityMode(&mode); + if (eCompatibility_Standard == mode) { + const nsStyleDisplay* disp = + (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); + if (disp->mVisible) { + const nsStyleSpacing* spacing = + (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); + const nsStyleColor* color = + (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); + nsTableFrame* tableFrame = nsnull; + rv = nsTableFrame::GetTableFrame(this, tableFrame); + if (NS_FAILED(rv) || (nsnull == tableFrame)) { + return rv; + } + nscoord cellSpacingX = tableFrame->GetCellSpacingX(); + nscoord halfCellSpacingY = + NSToCoordRound(((float)tableFrame->GetCellSpacingY()) / (float)2); + // every row is short by the ending cell spacing X + nsRect rect(0, 0, mRect.width + cellSpacingX, mRect.height); + // first row may have gotten too much cell spacing Y + if (tableFrame->GetRowCount() != 1) { + if (IsFirstRow(*tableFrame, *this)) { + rect.height -= halfCellSpacingY; + } + else { + rect.height += halfCellSpacingY; + rect.y -= halfCellSpacingY; + } + } + + nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, + aDirtyRect, rect, *color, *spacing, 0, 0); + } + } + } + // for debug... + if ((NS_FRAME_PAINT_LAYER_DEBUG == aWhichLayer) && GetShowFrameBorders()) { + aRenderingContext.SetColor(NS_RGB(0,255,0)); + aRenderingContext.DrawRect(0, 0, mRect.width, mRect.height); + } + PaintChildren(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer); - return NS_OK; + return nsFrame::Paint(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer); + } PRIntn diff --git a/layout/tables/nsTableRowGroupFrame.cpp b/layout/tables/nsTableRowGroupFrame.cpp index 86234b517e6..082575f9ff9 100644 --- a/layout/tables/nsTableRowGroupFrame.cpp +++ b/layout/tables/nsTableRowGroupFrame.cpp @@ -34,6 +34,7 @@ #include "nsIStyleSet.h" #include "nsIPresShell.h" #include "nsLayoutAtoms.h" +#include "nsCSSRendering.h" #ifdef NS_DEBUG static PRBool gsDebug = PR_FALSE; @@ -220,22 +221,59 @@ nsTableRowGroupFrame::InitRepeatedFrame(nsTableRowGroupFrame* aHeaderFooterFrame return NS_OK; } -NS_METHOD nsTableRowGroupFrame::Paint(nsIPresContext& aPresContext, +NS_METHOD nsTableRowGroupFrame::Paint(nsIPresContext& aPresContext, nsIRenderingContext& aRenderingContext, const nsRect& aDirtyRect, - nsFramePaintLayer aWhichLayer) + nsFramePaintLayer aWhichLayer) { + nsresult rv; + if (NS_FRAME_PAINT_LAYER_BACKGROUND == aWhichLayer) { + nsCompatibility mode; + aPresContext.GetCompatibilityMode(&mode); + if (eCompatibility_Standard == mode) { + const nsStyleDisplay* disp = + (const nsStyleDisplay*)mStyleContext->GetStyleData(eStyleStruct_Display); + if (disp->mVisible) { + const nsStyleSpacing* spacing = + (const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing); + const nsStyleColor* color = + (const nsStyleColor*)mStyleContext->GetStyleData(eStyleStruct_Color); + nsTableFrame* tableFrame = nsnull; + rv = nsTableFrame::GetTableFrame(this, tableFrame); + if (NS_FAILED(rv) || (nsnull == tableFrame)) { + return rv; + } + nscoord halfCellSpacingY = + NSToCoordRound(((float)tableFrame->GetCellSpacingY()) / (float)2); + // every row group is short by the ending cell spacing X + nsRect rect(0, 0, mRect.width, mRect.height); + nsIFrame* firstRowGroup = nsnull; + tableFrame->FirstChild(nsnull, &firstRowGroup); + // first row group may have gotten too much cell spacing Y + if (tableFrame->GetRowCount() != 1) { + if (this == firstRowGroup) { + rect.height -= halfCellSpacingY; + } + else { + rect.height += halfCellSpacingY; + rect.y -= halfCellSpacingY; + } + } + nsCSSRendering::PaintBackground(aPresContext, aRenderingContext, this, + aDirtyRect, rect, *color, *spacing, 0, 0); + } + } + } // for debug... - /* - if (nsIFrame::GetShowFrameBorders()) { - aRenderingContext.SetColor(NS_RGB(128,0,0)); + if ((NS_FRAME_PAINT_LAYER_DEBUG == aWhichLayer) && GetShowFrameBorders()) { + aRenderingContext.SetColor(NS_RGB(0,255,0)); aRenderingContext.DrawRect(0, 0, mRect.width, mRect.height); } - */ PaintChildren(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer); - return NS_OK; + return nsFrame::Paint(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer); + } PRIntn