mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-29 15:52:07 +00:00
Updated Table Border code to render HTML3.2 compatible borders (no longer using the cool,
CSS borders). Fixed Table but submitted by Isaac David Guedalia <daniel_sh@gezernet.co.il>.
This commit is contained in:
parent
843b8a3ff9
commit
e1dc943664
@ -380,7 +380,7 @@ nsTableCellFrame::CreateContinuingFrame(nsIPresContext* aPresContext,
|
|||||||
* Update the border style to map to the HTML border style
|
* Update the border style to map to the HTML border style
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void nsTableCellFrame::MapHTMLBorderStyle(nsStyleSpacing& aSpacingStyle, nscoord aBorderWidth)
|
void nsTableCellFrame::MapHTMLBorderStyle(nsIPresContext* aPresContext, nsStyleSpacing& aSpacingStyle, nscoord aBorderWidth)
|
||||||
{
|
{
|
||||||
nsStyleCoord width;
|
nsStyleCoord width;
|
||||||
width.SetCoordValue(aBorderWidth);
|
width.SetCoordValue(aBorderWidth);
|
||||||
@ -391,16 +391,48 @@ void nsTableCellFrame::MapHTMLBorderStyle(nsStyleSpacing& aSpacingStyle, nscoord
|
|||||||
|
|
||||||
aSpacingStyle.mBorderStyle[NS_SIDE_TOP] = NS_STYLE_BORDER_STYLE_INSET;
|
aSpacingStyle.mBorderStyle[NS_SIDE_TOP] = NS_STYLE_BORDER_STYLE_INSET;
|
||||||
aSpacingStyle.mBorderStyle[NS_SIDE_LEFT] = NS_STYLE_BORDER_STYLE_INSET;
|
aSpacingStyle.mBorderStyle[NS_SIDE_LEFT] = NS_STYLE_BORDER_STYLE_INSET;
|
||||||
aSpacingStyle.mBorderStyle[NS_SIDE_BOTTOM] = NS_STYLE_BORDER_STYLE_OUTSET;
|
aSpacingStyle.mBorderStyle[NS_SIDE_BOTTOM] = NS_STYLE_BORDER_STYLE_INSET;
|
||||||
aSpacingStyle.mBorderStyle[NS_SIDE_RIGHT] = NS_STYLE_BORDER_STYLE_OUTSET;
|
aSpacingStyle.mBorderStyle[NS_SIDE_RIGHT] = NS_STYLE_BORDER_STYLE_INSET;
|
||||||
|
|
||||||
NS_ColorNameToRGB("white",&aSpacingStyle.mBorderColor[NS_SIDE_TOP]);
|
nsTableFrame* tableFrame = GetTableFrame();
|
||||||
NS_ColorNameToRGB("white",&aSpacingStyle.mBorderColor[NS_SIDE_LEFT]);
|
nsIStyleContext* styleContext = nsnull;
|
||||||
|
|
||||||
// This should be the background color of the tables
|
tableFrame->GetStyleContext(aPresContext,styleContext);
|
||||||
// container
|
|
||||||
NS_ColorNameToRGB("gray",&aSpacingStyle.mBorderColor[NS_SIDE_BOTTOM]);
|
nsStyleColor* colorData = (nsStyleColor*)styleContext->GetData(eStyleStruct_Color);
|
||||||
NS_ColorNameToRGB("gray",&aSpacingStyle.mBorderColor[NS_SIDE_RIGHT]);
|
|
||||||
|
// Look until we find a style context with a NON-transparent background color
|
||||||
|
while (styleContext)
|
||||||
|
{
|
||||||
|
if ((colorData->mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT)!=0)
|
||||||
|
{
|
||||||
|
nsIStyleContext* temp = styleContext;
|
||||||
|
styleContext = styleContext->GetParent();
|
||||||
|
NS_RELEASE(temp);
|
||||||
|
colorData = (nsStyleColor*)styleContext->GetData(eStyleStruct_Color);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Yaahoo, we found a style context which has a background color
|
||||||
|
|
||||||
|
nscolor borderColor = 0xFFC0C0C0;
|
||||||
|
|
||||||
|
if (styleContext != nsnull)
|
||||||
|
borderColor = colorData->mBackgroundColor;
|
||||||
|
|
||||||
|
// if the border color is white, then shift to grey
|
||||||
|
if (borderColor == 0xFFFFFFFF)
|
||||||
|
borderColor = 0xFFC0C0C0;
|
||||||
|
|
||||||
|
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_TOP] =
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_LEFT] =
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_BOTTOM] =
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_RIGHT] = borderColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -489,7 +521,7 @@ void nsTableCellFrame::MapBorderMarginPadding(nsIPresContext* aPresContext)
|
|||||||
border = nscoord(p2t*(float)intValue);
|
border = nscoord(p2t*(float)intValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MapHTMLBorderStyle(*spacingData,border);
|
MapHTMLBorderStyle(aPresContext, *spacingData,border);
|
||||||
}
|
}
|
||||||
|
|
||||||
void nsTableCellFrame::MapTextAttributes(nsIPresContext* aPresContext)
|
void nsTableCellFrame::MapTextAttributes(nsIPresContext* aPresContext)
|
||||||
|
@ -91,7 +91,7 @@ protected:
|
|||||||
NS_METHOD DidSetStyleContext(nsIPresContext* aPresContext);
|
NS_METHOD DidSetStyleContext(nsIPresContext* aPresContext);
|
||||||
void MapTextAttributes(nsIPresContext* aPresContext);
|
void MapTextAttributes(nsIPresContext* aPresContext);
|
||||||
void MapBorderMarginPadding(nsIPresContext* aPresContext);
|
void MapBorderMarginPadding(nsIPresContext* aPresContext);
|
||||||
void MapHTMLBorderStyle(nsStyleSpacing& aSpacingStyle, nscoord aBorderWidth);
|
void MapHTMLBorderStyle(nsIPresContext* aPresContext,nsStyleSpacing& aSpacingStyle, nscoord aBorderWidth);
|
||||||
PRBool ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault, PRInt32& aResult);
|
PRBool ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault, PRInt32& aResult);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include "prinrval.h"
|
#include "prinrval.h"
|
||||||
#include "nsIPtr.h"
|
#include "nsIPtr.h"
|
||||||
#include "nsIView.h"
|
#include "nsIView.h"
|
||||||
|
#include "nsHTMLAtoms.h"
|
||||||
|
|
||||||
#ifdef NS_DEBUG
|
#ifdef NS_DEBUG
|
||||||
static PRBool gsDebug = PR_FALSE;
|
static PRBool gsDebug = PR_FALSE;
|
||||||
@ -268,8 +269,11 @@ void nsTableFrame::RecalcLayoutData()
|
|||||||
{
|
{
|
||||||
for (col = 0; col < colCount; col++)
|
for (col = 0; col < colCount; col++)
|
||||||
{
|
{
|
||||||
|
nsTableCell* cell = nsnull;
|
||||||
CellData* cellData = cellMap->GetCellAt(row,col);
|
CellData* cellData = cellMap->GetCellAt(row,col);
|
||||||
nsTableCell* cell = cellData->mCell;
|
|
||||||
|
if (cellData)
|
||||||
|
cell = cellData->mCell;
|
||||||
|
|
||||||
if (!cell)
|
if (!cell)
|
||||||
continue;
|
continue;
|
||||||
@ -336,7 +340,7 @@ void nsTableFrame::RecalcLayoutData()
|
|||||||
if (c != col)
|
if (c != col)
|
||||||
{
|
{
|
||||||
cellData = cellMap->GetCellAt(r1,c);
|
cellData = cellMap->GetCellAt(r1,c);
|
||||||
if (cellData->mCell != above)
|
if ((cellData != nsnull) && (cellData->mCell != above))
|
||||||
{
|
{
|
||||||
above = cellData->mCell;
|
above = cellData->mCell;
|
||||||
if (above != nsnull)
|
if (above != nsnull)
|
||||||
@ -353,7 +357,7 @@ void nsTableFrame::RecalcLayoutData()
|
|||||||
{
|
{
|
||||||
// Add bottom edge cells
|
// Add bottom edge cells
|
||||||
cellData = cellMap->GetCellAt(r2,c);
|
cellData = cellMap->GetCellAt(r2,c);
|
||||||
if (cellData->mCell != below)
|
if ((cellData != nsnull) && cellData->mCell != below)
|
||||||
{
|
{
|
||||||
below = cellData->mCell;
|
below = cellData->mCell;
|
||||||
if (below != nsnull)
|
if (below != nsnull)
|
||||||
@ -377,7 +381,7 @@ void nsTableFrame::RecalcLayoutData()
|
|||||||
if (r != row)
|
if (r != row)
|
||||||
{
|
{
|
||||||
cellData = cellMap->GetCellAt(r,c1);
|
cellData = cellMap->GetCellAt(r,c1);
|
||||||
if (cellData->mCell != left)
|
if ((cellData != nsnull) && (cellData->mCell != left))
|
||||||
{
|
{
|
||||||
left = cellData->mCell;
|
left = cellData->mCell;
|
||||||
if (left != nsnull)
|
if (left != nsnull)
|
||||||
@ -394,7 +398,7 @@ void nsTableFrame::RecalcLayoutData()
|
|||||||
{
|
{
|
||||||
// Add right edge cells
|
// Add right edge cells
|
||||||
cellData = cellMap->GetCellAt(r,c2);
|
cellData = cellMap->GetCellAt(r,c2);
|
||||||
if (cellData->mCell != right)
|
if ((cellData != nsnull) && (cellData->mCell != right))
|
||||||
{
|
{
|
||||||
right = cellData->mCell;
|
right = cellData->mCell;
|
||||||
if (right != nsnull)
|
if (right != nsnull)
|
||||||
@ -2173,12 +2177,139 @@ void nsTableFrame::SetColumnWidth(PRInt32 aColIndex, PRInt32 aWidth)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Update the border style to map to the HTML border style
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void nsTableFrame::MapHTMLBorderStyle(nsStyleSpacing& aSpacingStyle, nscoord aBorderWidth)
|
||||||
|
{
|
||||||
|
nsStyleCoord width;
|
||||||
|
width.SetCoordValue(aBorderWidth);
|
||||||
|
aSpacingStyle.mBorder.SetTop(width);
|
||||||
|
aSpacingStyle.mBorder.SetLeft(width);
|
||||||
|
aSpacingStyle.mBorder.SetBottom(width);
|
||||||
|
aSpacingStyle.mBorder.SetRight(width);
|
||||||
|
|
||||||
|
aSpacingStyle.mBorderStyle[NS_SIDE_TOP] = NS_STYLE_BORDER_STYLE_OUTSET;
|
||||||
|
aSpacingStyle.mBorderStyle[NS_SIDE_LEFT] = NS_STYLE_BORDER_STYLE_OUTSET;
|
||||||
|
aSpacingStyle.mBorderStyle[NS_SIDE_BOTTOM] = NS_STYLE_BORDER_STYLE_OUTSET;
|
||||||
|
aSpacingStyle.mBorderStyle[NS_SIDE_RIGHT] = NS_STYLE_BORDER_STYLE_OUTSET;
|
||||||
|
|
||||||
|
|
||||||
|
nsIStyleContext* styleContext = mStyleContext;
|
||||||
|
nsStyleColor* colorData = (nsStyleColor*)styleContext->GetData(eStyleStruct_Color);
|
||||||
|
|
||||||
|
// Look until we find a style context with a NON-transparent background color
|
||||||
|
while (styleContext)
|
||||||
|
{
|
||||||
|
if ((colorData->mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT)!=0)
|
||||||
|
{
|
||||||
|
nsIStyleContext* temp = styleContext;
|
||||||
|
styleContext = styleContext->GetParent();
|
||||||
|
if (temp != mStyleContext)
|
||||||
|
NS_RELEASE(temp);
|
||||||
|
colorData = (nsStyleColor*)styleContext->GetData(eStyleStruct_Color);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Yaahoo, we found a style context which has a background color
|
||||||
|
|
||||||
|
nscolor borderColor = 0xFFC0C0C0;
|
||||||
|
|
||||||
|
if (styleContext != nsnull)
|
||||||
|
{
|
||||||
|
borderColor = colorData->mBackgroundColor;
|
||||||
|
if (styleContext != mStyleContext)
|
||||||
|
NS_RELEASE(styleContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the border color is white, then shift to grey
|
||||||
|
if (borderColor == 0xFFFFFFFF)
|
||||||
|
borderColor = 0xFFC0C0C0;
|
||||||
|
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_TOP] = borderColor;
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_LEFT] = borderColor;
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_BOTTOM] = borderColor;
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_RIGHT] = borderColor;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PRBool nsTableFrame::ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault, PRInt32& aResult)
|
||||||
|
{
|
||||||
|
PRInt32 result = 0;
|
||||||
|
|
||||||
|
if (aValue.GetUnit() == eHTMLUnit_Pixel)
|
||||||
|
aResult = aValue.GetPixelValue();
|
||||||
|
else if (aValue.GetUnit() == eHTMLUnit_Empty)
|
||||||
|
aResult = aDefault;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NS_ERROR("Unit must be pixel or empty");
|
||||||
|
return PR_FALSE;
|
||||||
|
}
|
||||||
|
return PR_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nsTableFrame::MapBorderMarginPadding(nsIPresContext* aPresContext)
|
||||||
|
{
|
||||||
|
// Check to see if the table has either cell padding or
|
||||||
|
// Cell spacing defined for the table. If true, then
|
||||||
|
// this setting overrides any specific border, margin or
|
||||||
|
// padding information in the cell. If these attributes
|
||||||
|
// are not defined, the the cells attributes are used
|
||||||
|
|
||||||
|
nsHTMLValue padding_value;
|
||||||
|
nsHTMLValue spacing_value;
|
||||||
|
nsHTMLValue border_value;
|
||||||
|
|
||||||
|
|
||||||
|
nsContentAttr border_result;
|
||||||
|
|
||||||
|
nscoord padding = 0;
|
||||||
|
nscoord spacing = 0;
|
||||||
|
nscoord border = 1;
|
||||||
|
|
||||||
|
float p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
|
||||||
|
nsTablePart* table = (nsTablePart*)mContent;
|
||||||
|
|
||||||
|
NS_ASSERTION(table,"Table Must not be null");
|
||||||
|
if (!table)
|
||||||
|
return;
|
||||||
|
|
||||||
|
nsStyleSpacing* spacingData = (nsStyleSpacing*)mStyleContext->GetData(eStyleStruct_Spacing);
|
||||||
|
|
||||||
|
border_result = table->GetAttribute(nsHTMLAtoms::border,border_value);
|
||||||
|
if (border_result == eContentAttr_HasValue)
|
||||||
|
{
|
||||||
|
PRInt32 intValue = 0;
|
||||||
|
|
||||||
|
if (ConvertToPixelValue(border_value,1,intValue))
|
||||||
|
border = nscoord(p2t*(float)intValue);
|
||||||
|
}
|
||||||
|
MapHTMLBorderStyle(*spacingData,border);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Subclass hook for style post processing
|
// Subclass hook for style post processing
|
||||||
NS_METHOD nsTableFrame::DidSetStyleContext(nsIPresContext* aPresContext)
|
NS_METHOD nsTableFrame::DidSetStyleContext(nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
#ifdef NOISY_STYLE
|
#ifdef NOISY_STYLE
|
||||||
printf("nsTableFrame::DidSetStyleContext \n");
|
printf("nsTableFrame::DidSetStyleContext \n");
|
||||||
#endif
|
#endif
|
||||||
|
MapBorderMarginPadding(aPresContext);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,8 +27,10 @@ class nsVoidArray;
|
|||||||
class nsTableCellFrame;
|
class nsTableCellFrame;
|
||||||
class CellData;
|
class CellData;
|
||||||
class nsITableLayoutStrategy;
|
class nsITableLayoutStrategy;
|
||||||
|
class nsHTMLValue;
|
||||||
struct InnerTableReflowState;
|
struct InnerTableReflowState;
|
||||||
struct nsStylePosition;
|
struct nsStylePosition;
|
||||||
|
struct nsStyleSpacing;
|
||||||
|
|
||||||
/** nsTableFrame maps the inner portion of a table (everything except captions.)
|
/** nsTableFrame maps the inner portion of a table (everything except captions.)
|
||||||
* Used as a pseudo-frame within nsTableOuterFrame,
|
* Used as a pseudo-frame within nsTableOuterFrame,
|
||||||
@ -293,6 +295,11 @@ protected:
|
|||||||
/** do post processing to setting up style information for the frame */
|
/** do post processing to setting up style information for the frame */
|
||||||
virtual NS_METHOD DidSetStyleContext(nsIPresContext* aPresContext);
|
virtual NS_METHOD DidSetStyleContext(nsIPresContext* aPresContext);
|
||||||
|
|
||||||
|
/** Support methods for DidSetStyleContext */
|
||||||
|
void MapBorderMarginPadding(nsIPresContext* aPresContext);
|
||||||
|
void MapHTMLBorderStyle(nsStyleSpacing& aSpacingStyle, nscoord aBorderWidth);
|
||||||
|
PRBool ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault, PRInt32& aResult);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void DebugPrintCount() const; // Debugging routine
|
void DebugPrintCount() const; // Debugging routine
|
||||||
|
@ -380,7 +380,7 @@ nsTableCellFrame::CreateContinuingFrame(nsIPresContext* aPresContext,
|
|||||||
* Update the border style to map to the HTML border style
|
* Update the border style to map to the HTML border style
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void nsTableCellFrame::MapHTMLBorderStyle(nsStyleSpacing& aSpacingStyle, nscoord aBorderWidth)
|
void nsTableCellFrame::MapHTMLBorderStyle(nsIPresContext* aPresContext, nsStyleSpacing& aSpacingStyle, nscoord aBorderWidth)
|
||||||
{
|
{
|
||||||
nsStyleCoord width;
|
nsStyleCoord width;
|
||||||
width.SetCoordValue(aBorderWidth);
|
width.SetCoordValue(aBorderWidth);
|
||||||
@ -391,16 +391,48 @@ void nsTableCellFrame::MapHTMLBorderStyle(nsStyleSpacing& aSpacingStyle, nscoord
|
|||||||
|
|
||||||
aSpacingStyle.mBorderStyle[NS_SIDE_TOP] = NS_STYLE_BORDER_STYLE_INSET;
|
aSpacingStyle.mBorderStyle[NS_SIDE_TOP] = NS_STYLE_BORDER_STYLE_INSET;
|
||||||
aSpacingStyle.mBorderStyle[NS_SIDE_LEFT] = NS_STYLE_BORDER_STYLE_INSET;
|
aSpacingStyle.mBorderStyle[NS_SIDE_LEFT] = NS_STYLE_BORDER_STYLE_INSET;
|
||||||
aSpacingStyle.mBorderStyle[NS_SIDE_BOTTOM] = NS_STYLE_BORDER_STYLE_OUTSET;
|
aSpacingStyle.mBorderStyle[NS_SIDE_BOTTOM] = NS_STYLE_BORDER_STYLE_INSET;
|
||||||
aSpacingStyle.mBorderStyle[NS_SIDE_RIGHT] = NS_STYLE_BORDER_STYLE_OUTSET;
|
aSpacingStyle.mBorderStyle[NS_SIDE_RIGHT] = NS_STYLE_BORDER_STYLE_INSET;
|
||||||
|
|
||||||
NS_ColorNameToRGB("white",&aSpacingStyle.mBorderColor[NS_SIDE_TOP]);
|
nsTableFrame* tableFrame = GetTableFrame();
|
||||||
NS_ColorNameToRGB("white",&aSpacingStyle.mBorderColor[NS_SIDE_LEFT]);
|
nsIStyleContext* styleContext = nsnull;
|
||||||
|
|
||||||
// This should be the background color of the tables
|
tableFrame->GetStyleContext(aPresContext,styleContext);
|
||||||
// container
|
|
||||||
NS_ColorNameToRGB("gray",&aSpacingStyle.mBorderColor[NS_SIDE_BOTTOM]);
|
nsStyleColor* colorData = (nsStyleColor*)styleContext->GetData(eStyleStruct_Color);
|
||||||
NS_ColorNameToRGB("gray",&aSpacingStyle.mBorderColor[NS_SIDE_RIGHT]);
|
|
||||||
|
// Look until we find a style context with a NON-transparent background color
|
||||||
|
while (styleContext)
|
||||||
|
{
|
||||||
|
if ((colorData->mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT)!=0)
|
||||||
|
{
|
||||||
|
nsIStyleContext* temp = styleContext;
|
||||||
|
styleContext = styleContext->GetParent();
|
||||||
|
NS_RELEASE(temp);
|
||||||
|
colorData = (nsStyleColor*)styleContext->GetData(eStyleStruct_Color);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Yaahoo, we found a style context which has a background color
|
||||||
|
|
||||||
|
nscolor borderColor = 0xFFC0C0C0;
|
||||||
|
|
||||||
|
if (styleContext != nsnull)
|
||||||
|
borderColor = colorData->mBackgroundColor;
|
||||||
|
|
||||||
|
// if the border color is white, then shift to grey
|
||||||
|
if (borderColor == 0xFFFFFFFF)
|
||||||
|
borderColor = 0xFFC0C0C0;
|
||||||
|
|
||||||
|
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_TOP] =
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_LEFT] =
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_BOTTOM] =
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_RIGHT] = borderColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -489,7 +521,7 @@ void nsTableCellFrame::MapBorderMarginPadding(nsIPresContext* aPresContext)
|
|||||||
border = nscoord(p2t*(float)intValue);
|
border = nscoord(p2t*(float)intValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MapHTMLBorderStyle(*spacingData,border);
|
MapHTMLBorderStyle(aPresContext, *spacingData,border);
|
||||||
}
|
}
|
||||||
|
|
||||||
void nsTableCellFrame::MapTextAttributes(nsIPresContext* aPresContext)
|
void nsTableCellFrame::MapTextAttributes(nsIPresContext* aPresContext)
|
||||||
|
@ -91,7 +91,7 @@ protected:
|
|||||||
NS_METHOD DidSetStyleContext(nsIPresContext* aPresContext);
|
NS_METHOD DidSetStyleContext(nsIPresContext* aPresContext);
|
||||||
void MapTextAttributes(nsIPresContext* aPresContext);
|
void MapTextAttributes(nsIPresContext* aPresContext);
|
||||||
void MapBorderMarginPadding(nsIPresContext* aPresContext);
|
void MapBorderMarginPadding(nsIPresContext* aPresContext);
|
||||||
void MapHTMLBorderStyle(nsStyleSpacing& aSpacingStyle, nscoord aBorderWidth);
|
void MapHTMLBorderStyle(nsIPresContext* aPresContext,nsStyleSpacing& aSpacingStyle, nscoord aBorderWidth);
|
||||||
PRBool ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault, PRInt32& aResult);
|
PRBool ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault, PRInt32& aResult);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include "prinrval.h"
|
#include "prinrval.h"
|
||||||
#include "nsIPtr.h"
|
#include "nsIPtr.h"
|
||||||
#include "nsIView.h"
|
#include "nsIView.h"
|
||||||
|
#include "nsHTMLAtoms.h"
|
||||||
|
|
||||||
#ifdef NS_DEBUG
|
#ifdef NS_DEBUG
|
||||||
static PRBool gsDebug = PR_FALSE;
|
static PRBool gsDebug = PR_FALSE;
|
||||||
@ -268,8 +269,11 @@ void nsTableFrame::RecalcLayoutData()
|
|||||||
{
|
{
|
||||||
for (col = 0; col < colCount; col++)
|
for (col = 0; col < colCount; col++)
|
||||||
{
|
{
|
||||||
|
nsTableCell* cell = nsnull;
|
||||||
CellData* cellData = cellMap->GetCellAt(row,col);
|
CellData* cellData = cellMap->GetCellAt(row,col);
|
||||||
nsTableCell* cell = cellData->mCell;
|
|
||||||
|
if (cellData)
|
||||||
|
cell = cellData->mCell;
|
||||||
|
|
||||||
if (!cell)
|
if (!cell)
|
||||||
continue;
|
continue;
|
||||||
@ -336,7 +340,7 @@ void nsTableFrame::RecalcLayoutData()
|
|||||||
if (c != col)
|
if (c != col)
|
||||||
{
|
{
|
||||||
cellData = cellMap->GetCellAt(r1,c);
|
cellData = cellMap->GetCellAt(r1,c);
|
||||||
if (cellData->mCell != above)
|
if ((cellData != nsnull) && (cellData->mCell != above))
|
||||||
{
|
{
|
||||||
above = cellData->mCell;
|
above = cellData->mCell;
|
||||||
if (above != nsnull)
|
if (above != nsnull)
|
||||||
@ -353,7 +357,7 @@ void nsTableFrame::RecalcLayoutData()
|
|||||||
{
|
{
|
||||||
// Add bottom edge cells
|
// Add bottom edge cells
|
||||||
cellData = cellMap->GetCellAt(r2,c);
|
cellData = cellMap->GetCellAt(r2,c);
|
||||||
if (cellData->mCell != below)
|
if ((cellData != nsnull) && cellData->mCell != below)
|
||||||
{
|
{
|
||||||
below = cellData->mCell;
|
below = cellData->mCell;
|
||||||
if (below != nsnull)
|
if (below != nsnull)
|
||||||
@ -377,7 +381,7 @@ void nsTableFrame::RecalcLayoutData()
|
|||||||
if (r != row)
|
if (r != row)
|
||||||
{
|
{
|
||||||
cellData = cellMap->GetCellAt(r,c1);
|
cellData = cellMap->GetCellAt(r,c1);
|
||||||
if (cellData->mCell != left)
|
if ((cellData != nsnull) && (cellData->mCell != left))
|
||||||
{
|
{
|
||||||
left = cellData->mCell;
|
left = cellData->mCell;
|
||||||
if (left != nsnull)
|
if (left != nsnull)
|
||||||
@ -394,7 +398,7 @@ void nsTableFrame::RecalcLayoutData()
|
|||||||
{
|
{
|
||||||
// Add right edge cells
|
// Add right edge cells
|
||||||
cellData = cellMap->GetCellAt(r,c2);
|
cellData = cellMap->GetCellAt(r,c2);
|
||||||
if (cellData->mCell != right)
|
if ((cellData != nsnull) && (cellData->mCell != right))
|
||||||
{
|
{
|
||||||
right = cellData->mCell;
|
right = cellData->mCell;
|
||||||
if (right != nsnull)
|
if (right != nsnull)
|
||||||
@ -2173,12 +2177,139 @@ void nsTableFrame::SetColumnWidth(PRInt32 aColIndex, PRInt32 aWidth)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Update the border style to map to the HTML border style
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void nsTableFrame::MapHTMLBorderStyle(nsStyleSpacing& aSpacingStyle, nscoord aBorderWidth)
|
||||||
|
{
|
||||||
|
nsStyleCoord width;
|
||||||
|
width.SetCoordValue(aBorderWidth);
|
||||||
|
aSpacingStyle.mBorder.SetTop(width);
|
||||||
|
aSpacingStyle.mBorder.SetLeft(width);
|
||||||
|
aSpacingStyle.mBorder.SetBottom(width);
|
||||||
|
aSpacingStyle.mBorder.SetRight(width);
|
||||||
|
|
||||||
|
aSpacingStyle.mBorderStyle[NS_SIDE_TOP] = NS_STYLE_BORDER_STYLE_OUTSET;
|
||||||
|
aSpacingStyle.mBorderStyle[NS_SIDE_LEFT] = NS_STYLE_BORDER_STYLE_OUTSET;
|
||||||
|
aSpacingStyle.mBorderStyle[NS_SIDE_BOTTOM] = NS_STYLE_BORDER_STYLE_OUTSET;
|
||||||
|
aSpacingStyle.mBorderStyle[NS_SIDE_RIGHT] = NS_STYLE_BORDER_STYLE_OUTSET;
|
||||||
|
|
||||||
|
|
||||||
|
nsIStyleContext* styleContext = mStyleContext;
|
||||||
|
nsStyleColor* colorData = (nsStyleColor*)styleContext->GetData(eStyleStruct_Color);
|
||||||
|
|
||||||
|
// Look until we find a style context with a NON-transparent background color
|
||||||
|
while (styleContext)
|
||||||
|
{
|
||||||
|
if ((colorData->mBackgroundFlags & NS_STYLE_BG_COLOR_TRANSPARENT)!=0)
|
||||||
|
{
|
||||||
|
nsIStyleContext* temp = styleContext;
|
||||||
|
styleContext = styleContext->GetParent();
|
||||||
|
if (temp != mStyleContext)
|
||||||
|
NS_RELEASE(temp);
|
||||||
|
colorData = (nsStyleColor*)styleContext->GetData(eStyleStruct_Color);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Yaahoo, we found a style context which has a background color
|
||||||
|
|
||||||
|
nscolor borderColor = 0xFFC0C0C0;
|
||||||
|
|
||||||
|
if (styleContext != nsnull)
|
||||||
|
{
|
||||||
|
borderColor = colorData->mBackgroundColor;
|
||||||
|
if (styleContext != mStyleContext)
|
||||||
|
NS_RELEASE(styleContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the border color is white, then shift to grey
|
||||||
|
if (borderColor == 0xFFFFFFFF)
|
||||||
|
borderColor = 0xFFC0C0C0;
|
||||||
|
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_TOP] = borderColor;
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_LEFT] = borderColor;
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_BOTTOM] = borderColor;
|
||||||
|
aSpacingStyle.mBorderColor[NS_SIDE_RIGHT] = borderColor;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PRBool nsTableFrame::ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault, PRInt32& aResult)
|
||||||
|
{
|
||||||
|
PRInt32 result = 0;
|
||||||
|
|
||||||
|
if (aValue.GetUnit() == eHTMLUnit_Pixel)
|
||||||
|
aResult = aValue.GetPixelValue();
|
||||||
|
else if (aValue.GetUnit() == eHTMLUnit_Empty)
|
||||||
|
aResult = aDefault;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NS_ERROR("Unit must be pixel or empty");
|
||||||
|
return PR_FALSE;
|
||||||
|
}
|
||||||
|
return PR_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nsTableFrame::MapBorderMarginPadding(nsIPresContext* aPresContext)
|
||||||
|
{
|
||||||
|
// Check to see if the table has either cell padding or
|
||||||
|
// Cell spacing defined for the table. If true, then
|
||||||
|
// this setting overrides any specific border, margin or
|
||||||
|
// padding information in the cell. If these attributes
|
||||||
|
// are not defined, the the cells attributes are used
|
||||||
|
|
||||||
|
nsHTMLValue padding_value;
|
||||||
|
nsHTMLValue spacing_value;
|
||||||
|
nsHTMLValue border_value;
|
||||||
|
|
||||||
|
|
||||||
|
nsContentAttr border_result;
|
||||||
|
|
||||||
|
nscoord padding = 0;
|
||||||
|
nscoord spacing = 0;
|
||||||
|
nscoord border = 1;
|
||||||
|
|
||||||
|
float p2t = aPresContext->GetPixelsToTwips();
|
||||||
|
|
||||||
|
nsTablePart* table = (nsTablePart*)mContent;
|
||||||
|
|
||||||
|
NS_ASSERTION(table,"Table Must not be null");
|
||||||
|
if (!table)
|
||||||
|
return;
|
||||||
|
|
||||||
|
nsStyleSpacing* spacingData = (nsStyleSpacing*)mStyleContext->GetData(eStyleStruct_Spacing);
|
||||||
|
|
||||||
|
border_result = table->GetAttribute(nsHTMLAtoms::border,border_value);
|
||||||
|
if (border_result == eContentAttr_HasValue)
|
||||||
|
{
|
||||||
|
PRInt32 intValue = 0;
|
||||||
|
|
||||||
|
if (ConvertToPixelValue(border_value,1,intValue))
|
||||||
|
border = nscoord(p2t*(float)intValue);
|
||||||
|
}
|
||||||
|
MapHTMLBorderStyle(*spacingData,border);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Subclass hook for style post processing
|
// Subclass hook for style post processing
|
||||||
NS_METHOD nsTableFrame::DidSetStyleContext(nsIPresContext* aPresContext)
|
NS_METHOD nsTableFrame::DidSetStyleContext(nsIPresContext* aPresContext)
|
||||||
{
|
{
|
||||||
#ifdef NOISY_STYLE
|
#ifdef NOISY_STYLE
|
||||||
printf("nsTableFrame::DidSetStyleContext \n");
|
printf("nsTableFrame::DidSetStyleContext \n");
|
||||||
#endif
|
#endif
|
||||||
|
MapBorderMarginPadding(aPresContext);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,8 +27,10 @@ class nsVoidArray;
|
|||||||
class nsTableCellFrame;
|
class nsTableCellFrame;
|
||||||
class CellData;
|
class CellData;
|
||||||
class nsITableLayoutStrategy;
|
class nsITableLayoutStrategy;
|
||||||
|
class nsHTMLValue;
|
||||||
struct InnerTableReflowState;
|
struct InnerTableReflowState;
|
||||||
struct nsStylePosition;
|
struct nsStylePosition;
|
||||||
|
struct nsStyleSpacing;
|
||||||
|
|
||||||
/** nsTableFrame maps the inner portion of a table (everything except captions.)
|
/** nsTableFrame maps the inner portion of a table (everything except captions.)
|
||||||
* Used as a pseudo-frame within nsTableOuterFrame,
|
* Used as a pseudo-frame within nsTableOuterFrame,
|
||||||
@ -293,6 +295,11 @@ protected:
|
|||||||
/** do post processing to setting up style information for the frame */
|
/** do post processing to setting up style information for the frame */
|
||||||
virtual NS_METHOD DidSetStyleContext(nsIPresContext* aPresContext);
|
virtual NS_METHOD DidSetStyleContext(nsIPresContext* aPresContext);
|
||||||
|
|
||||||
|
/** Support methods for DidSetStyleContext */
|
||||||
|
void MapBorderMarginPadding(nsIPresContext* aPresContext);
|
||||||
|
void MapHTMLBorderStyle(nsStyleSpacing& aSpacingStyle, nscoord aBorderWidth);
|
||||||
|
PRBool ConvertToPixelValue(nsHTMLValue& aValue, PRInt32 aDefault, PRInt32& aResult);
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void DebugPrintCount() const; // Debugging routine
|
void DebugPrintCount() const; // Debugging routine
|
||||||
|
Loading…
Reference in New Issue
Block a user