This commit is contained in:
buster%netscape.com 1998-12-16 22:19:23 +00:00
Родитель 0dd9eae393
Коммит a7f7678ce9
4 изменённых файлов: 172 добавлений и 36 удалений

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

@ -34,6 +34,7 @@
#include "nsIPresContext.h" #include "nsIPresContext.h"
#include "nsCSSRendering.h" #include "nsCSSRendering.h"
#include "nsBorder.h"
#include "nsStyleConsts.h" #include "nsStyleConsts.h"
#include "nsVoidArray.h" #include "nsVoidArray.h"
#include "nsIPtr.h" #include "nsIPtr.h"
@ -1182,12 +1183,9 @@ void nsTableFrame::AppendLayoutData(nsVoidArray* aList, nsTableCellFrame* aTable
void nsTableFrame::ComputeCollapsingBorders(PRInt32 aStartRowIndex, void nsTableFrame::ComputeCollapsingBorders(PRInt32 aStartRowIndex,
PRInt32 aEndRowIndex) PRInt32 aEndRowIndex)
{ {
nsCellMap *cellMap = GetCellMap(); // this method just uses mCellMap, because it can't get called unless nCellMap!=nsnull
if (nsnull==cellMap) PRInt32 colCount = mCellMap->GetColCount();
return; // no info yet, so nothing useful to do PRInt32 rowCount = mCellMap->GetRowCount();
PRInt32 colCount = cellMap->GetColCount();
PRInt32 rowCount = cellMap->GetRowCount();
if (aStartRowIndex>=rowCount) if (aStartRowIndex>=rowCount)
{ {
NS_ASSERTION(PR_FALSE, "aStartRowIndex>=rowCount in ComputeCollapsingBorders"); NS_ASSERTION(PR_FALSE, "aStartRowIndex>=rowCount in ComputeCollapsingBorders");
@ -1196,6 +1194,8 @@ void nsTableFrame::ComputeCollapsingBorders(PRInt32 aStartRowIndex,
// For every row between aStartRowIndex and aEndRowIndex (or the end of the table), // For every row between aStartRowIndex and aEndRowIndex (or the end of the table),
// walk across every edge and compute the border at that edge. // walk across every edge and compute the border at that edge.
// We compute each edge only once, arbitrarily choosing to compute right and bottom edges,
// except for exterior cells that share a left or top edge with the table itself.
// Distribute half the computed border to the appropriate adjacent objects // Distribute half the computed border to the appropriate adjacent objects
// (always a cell frame or the table frame.) In the case of odd width, // (always a cell frame or the table frame.) In the case of odd width,
// the object on the right/bottom gets the extra portion // the object on the right/bottom gets the extra portion
@ -1205,8 +1205,6 @@ void nsTableFrame::ComputeCollapsingBorders(PRInt32 aStartRowIndex,
PRInt32 colIndex=0; PRInt32 colIndex=0;
for ( ; colIndex<colCount; colIndex++) for ( ; colIndex<colCount; colIndex++)
{ {
/*
// compute vertical edges // compute vertical edges
if (0==colIndex) if (0==colIndex)
{ // table is left neighbor { // table is left neighbor
@ -1216,30 +1214,93 @@ void nsTableFrame::ComputeCollapsingBorders(PRInt32 aStartRowIndex,
// compute horizontal edges // compute horizontal edges
if (0==rowIndex) if (0==rowIndex)
{ { // table is top neighbor
ComputeTopBorderForEdgeAt(rowIndex, colIndex); ComputeTopBorderForEdgeAt(rowIndex, colIndex);
} }
ComputeBottomBorderForEdgeAt(rowIndex, colIndex); ComputeBottomBorderForEdgeAt(rowIndex, colIndex);
}
}
}
void nsTableFrame::ComputeLeftBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex)
{
// this method just uses mCellMap, because it can't get called unless nCellMap!=nsnull
PRInt32 numSegments = mBorderEdges[NS_SIDE_LEFT].Count();
while (numSegments<=aRowIndex)
{
nsBorder *borderToAdd = new nsBorder();
mBorderEdges[NS_SIDE_LEFT].AppendElement(borderToAdd);
numSegments++;
}
// "border" is the border segment we are going to set
nsBorder *border = (nsBorder *)(mBorderEdges[NS_SIDE_LEFT].ElementAt(aRowIndex));
// collect all the incident frames and compute the dominant border
nsVoidArray styles;
// styles are added to the array in the order least dominant -> most dominant
// 1. table
const nsStyleSpacing *spacing;
GetStyleData(eStyleStruct_Spacing, ((const nsStyleStruct *&)spacing));
styles.AppendElement((void*)spacing);
// 2. colgroup
nsTableColFrame *colFrame = mCellMap->GetColumnFrame(aColIndex);
nsIFrame *colGroupFrame;
colFrame->GetContentParent(colGroupFrame);
colGroupFrame->GetStyleData(eStyleStruct_Spacing, ((const nsStyleStruct *&)spacing));
styles.AppendElement((void*)spacing);
// 3. col
colFrame->GetStyleData(eStyleStruct_Spacing, ((const nsStyleStruct *&)spacing));
styles.AppendElement((void*)spacing);
// 4. rowgroup
nsTableCellFrame *cellFrame = mCellMap->GetCellFrameAt(aRowIndex, aColIndex);
if (nsnull!=cellFrame)
{
nsIFrame *rowFrame;
cellFrame->GetContentParent(rowFrame);
nsIFrame *rowGroupFrame;
rowFrame->GetContentParent(rowGroupFrame);
rowGroupFrame->GetStyleData(eStyleStruct_Spacing, ((const nsStyleStruct *&)spacing));
styles.AppendElement((void*)spacing);
// 5. row
rowFrame->GetStyleData(eStyleStruct_Spacing, ((const nsStyleStruct *&)spacing));
styles.AppendElement((void*)spacing);
// 5. cell (need to do something smart for rowspanner with row frame)
cellFrame->GetStyleData(eStyleStruct_Spacing, ((const nsStyleStruct *&)spacing));
styles.AppendElement((void*)spacing);
}
if ((colCount-1)==colIndex) }
void nsTableFrame::ComputeRightBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex)
{
// this method just uses mCellMap, because it can't get called unless nCellMap!=nsnull
PRInt32 colCount = mCellMap->GetColCount();
if ((colCount-1)==aColIndex)
{ // table is right neighbor { // table is right neighbor
} }
else else
{ // interior cell { // interior cell
} }
if ((rowCount-1)==rowIndex) }
void nsTableFrame::ComputeTopBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex)
{
// this method just uses mCellMap, because it can't get called unless nCellMap!=nsnull
}
void nsTableFrame::ComputeBottomBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex)
{
// this method just uses mCellMap, because it can't get called unless nCellMap!=nsnull
PRInt32 rowCount = mCellMap->GetRowCount();
if ((rowCount-1)==aRowIndex)
{ {
} }
else else
{ {
} }
*/
}
}
} }
void nsTableFrame::RecalcLayoutData() void nsTableFrame::RecalcLayoutData()
@ -3691,7 +3752,7 @@ nscoord nsTableFrame::GetCellSpacingX()
GetStyleData(eStyleStruct_Table, (const nsStyleStruct *&)tableStyle); GetStyleData(eStyleStruct_Table, (const nsStyleStruct *&)tableStyle);
nscoord cellSpacing = 0; nscoord cellSpacing = 0;
PRUint8 borderCollapseStyle = GetBorderCollapseStyle(); PRUint8 borderCollapseStyle = GetBorderCollapseStyle();
if (NS_STYLE_TABLE_BORDER_COLLAPSE_COLLAPSE!=borderCollapseStyle) if (NS_STYLE_BORDER_COLLAPSE!=borderCollapseStyle)
{ {
if (tableStyle->mBorderSpacingX.GetUnit() == eStyleUnit_Coord) { if (tableStyle->mBorderSpacingX.GetUnit() == eStyleUnit_Coord) {
cellSpacing = tableStyle->mBorderSpacingX.GetCoordValue(); cellSpacing = tableStyle->mBorderSpacingX.GetCoordValue();
@ -3710,7 +3771,7 @@ nscoord nsTableFrame::GetCellSpacingY()
GetStyleData(eStyleStruct_Table, (const nsStyleStruct *&)tableStyle); GetStyleData(eStyleStruct_Table, (const nsStyleStruct *&)tableStyle);
nscoord cellSpacing = 0; nscoord cellSpacing = 0;
PRUint8 borderCollapseStyle = GetBorderCollapseStyle(); PRUint8 borderCollapseStyle = GetBorderCollapseStyle();
if (NS_STYLE_TABLE_BORDER_COLLAPSE_COLLAPSE!=borderCollapseStyle) if (NS_STYLE_BORDER_COLLAPSE!=borderCollapseStyle)
{ {
if (tableStyle->mBorderSpacingY.GetUnit() == eStyleUnit_Coord) { if (tableStyle->mBorderSpacingY.GetUnit() == eStyleUnit_Coord) {
cellSpacing = tableStyle->mBorderSpacingY.GetCoordValue(); cellSpacing = tableStyle->mBorderSpacingY.GetCoordValue();

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

@ -19,6 +19,7 @@
#define nsTableFrame_h__ #define nsTableFrame_h__
#include "nscore.h" #include "nscore.h"
#include "nsVoidArray.h"
#include "nsHTMLContainerFrame.h" #include "nsHTMLContainerFrame.h"
#include "nsStyleCoord.h" #include "nsStyleCoord.h"
#include "nsStyleConsts.h" #include "nsStyleConsts.h"
@ -26,7 +27,6 @@
class nsCellMap; class nsCellMap;
class nsVoidArray;
class nsTableCellFrame; class nsTableCellFrame;
class nsTableColFrame; class nsTableColFrame;
class nsTableRowGroupFrame; class nsTableRowGroupFrame;
@ -210,6 +210,10 @@ public:
/* compute all the collapsed borders between aStartRowIndex and aEndRowIndex, inclusive */ /* compute all the collapsed borders between aStartRowIndex and aEndRowIndex, inclusive */
void ComputeCollapsingBorders(PRInt32 aStartRowIndex, PRInt32 aEndRowIndex); void ComputeCollapsingBorders(PRInt32 aStartRowIndex, PRInt32 aEndRowIndex);
void ComputeLeftBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex);
void ComputeRightBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex);
void ComputeTopBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex);
void ComputeBottomBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex);
void RecalcLayoutData(); void RecalcLayoutData();
@ -640,6 +644,9 @@ private:
nscoord mDefaultCellSpacingX;// the default cell spacing X for this table nscoord mDefaultCellSpacingX;// the default cell spacing X for this table
nscoord mDefaultCellSpacingY;// the default cell spacing X for this table nscoord mDefaultCellSpacingY;// the default cell spacing X for this table
nscoord mDefaultCellPadding; // the default cell padding for this table nscoord mDefaultCellPadding; // the default cell padding for this table
nsVoidArray mBorderEdges[4]; // one list of border segments for each side of the table frame
// used only for the collapsing border model
}; };

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

@ -34,6 +34,7 @@
#include "nsIPresContext.h" #include "nsIPresContext.h"
#include "nsCSSRendering.h" #include "nsCSSRendering.h"
#include "nsBorder.h"
#include "nsStyleConsts.h" #include "nsStyleConsts.h"
#include "nsVoidArray.h" #include "nsVoidArray.h"
#include "nsIPtr.h" #include "nsIPtr.h"
@ -1182,12 +1183,9 @@ void nsTableFrame::AppendLayoutData(nsVoidArray* aList, nsTableCellFrame* aTable
void nsTableFrame::ComputeCollapsingBorders(PRInt32 aStartRowIndex, void nsTableFrame::ComputeCollapsingBorders(PRInt32 aStartRowIndex,
PRInt32 aEndRowIndex) PRInt32 aEndRowIndex)
{ {
nsCellMap *cellMap = GetCellMap(); // this method just uses mCellMap, because it can't get called unless nCellMap!=nsnull
if (nsnull==cellMap) PRInt32 colCount = mCellMap->GetColCount();
return; // no info yet, so nothing useful to do PRInt32 rowCount = mCellMap->GetRowCount();
PRInt32 colCount = cellMap->GetColCount();
PRInt32 rowCount = cellMap->GetRowCount();
if (aStartRowIndex>=rowCount) if (aStartRowIndex>=rowCount)
{ {
NS_ASSERTION(PR_FALSE, "aStartRowIndex>=rowCount in ComputeCollapsingBorders"); NS_ASSERTION(PR_FALSE, "aStartRowIndex>=rowCount in ComputeCollapsingBorders");
@ -1196,6 +1194,8 @@ void nsTableFrame::ComputeCollapsingBorders(PRInt32 aStartRowIndex,
// For every row between aStartRowIndex and aEndRowIndex (or the end of the table), // For every row between aStartRowIndex and aEndRowIndex (or the end of the table),
// walk across every edge and compute the border at that edge. // walk across every edge and compute the border at that edge.
// We compute each edge only once, arbitrarily choosing to compute right and bottom edges,
// except for exterior cells that share a left or top edge with the table itself.
// Distribute half the computed border to the appropriate adjacent objects // Distribute half the computed border to the appropriate adjacent objects
// (always a cell frame or the table frame.) In the case of odd width, // (always a cell frame or the table frame.) In the case of odd width,
// the object on the right/bottom gets the extra portion // the object on the right/bottom gets the extra portion
@ -1205,8 +1205,6 @@ void nsTableFrame::ComputeCollapsingBorders(PRInt32 aStartRowIndex,
PRInt32 colIndex=0; PRInt32 colIndex=0;
for ( ; colIndex<colCount; colIndex++) for ( ; colIndex<colCount; colIndex++)
{ {
/*
// compute vertical edges // compute vertical edges
if (0==colIndex) if (0==colIndex)
{ // table is left neighbor { // table is left neighbor
@ -1216,30 +1214,93 @@ void nsTableFrame::ComputeCollapsingBorders(PRInt32 aStartRowIndex,
// compute horizontal edges // compute horizontal edges
if (0==rowIndex) if (0==rowIndex)
{ { // table is top neighbor
ComputeTopBorderForEdgeAt(rowIndex, colIndex); ComputeTopBorderForEdgeAt(rowIndex, colIndex);
} }
ComputeBottomBorderForEdgeAt(rowIndex, colIndex); ComputeBottomBorderForEdgeAt(rowIndex, colIndex);
}
}
}
void nsTableFrame::ComputeLeftBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex)
{
// this method just uses mCellMap, because it can't get called unless nCellMap!=nsnull
PRInt32 numSegments = mBorderEdges[NS_SIDE_LEFT].Count();
while (numSegments<=aRowIndex)
{
nsBorder *borderToAdd = new nsBorder();
mBorderEdges[NS_SIDE_LEFT].AppendElement(borderToAdd);
numSegments++;
}
// "border" is the border segment we are going to set
nsBorder *border = (nsBorder *)(mBorderEdges[NS_SIDE_LEFT].ElementAt(aRowIndex));
// collect all the incident frames and compute the dominant border
nsVoidArray styles;
// styles are added to the array in the order least dominant -> most dominant
// 1. table
const nsStyleSpacing *spacing;
GetStyleData(eStyleStruct_Spacing, ((const nsStyleStruct *&)spacing));
styles.AppendElement((void*)spacing);
// 2. colgroup
nsTableColFrame *colFrame = mCellMap->GetColumnFrame(aColIndex);
nsIFrame *colGroupFrame;
colFrame->GetContentParent(colGroupFrame);
colGroupFrame->GetStyleData(eStyleStruct_Spacing, ((const nsStyleStruct *&)spacing));
styles.AppendElement((void*)spacing);
// 3. col
colFrame->GetStyleData(eStyleStruct_Spacing, ((const nsStyleStruct *&)spacing));
styles.AppendElement((void*)spacing);
// 4. rowgroup
nsTableCellFrame *cellFrame = mCellMap->GetCellFrameAt(aRowIndex, aColIndex);
if (nsnull!=cellFrame)
{
nsIFrame *rowFrame;
cellFrame->GetContentParent(rowFrame);
nsIFrame *rowGroupFrame;
rowFrame->GetContentParent(rowGroupFrame);
rowGroupFrame->GetStyleData(eStyleStruct_Spacing, ((const nsStyleStruct *&)spacing));
styles.AppendElement((void*)spacing);
// 5. row
rowFrame->GetStyleData(eStyleStruct_Spacing, ((const nsStyleStruct *&)spacing));
styles.AppendElement((void*)spacing);
// 5. cell (need to do something smart for rowspanner with row frame)
cellFrame->GetStyleData(eStyleStruct_Spacing, ((const nsStyleStruct *&)spacing));
styles.AppendElement((void*)spacing);
}
if ((colCount-1)==colIndex) }
void nsTableFrame::ComputeRightBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex)
{
// this method just uses mCellMap, because it can't get called unless nCellMap!=nsnull
PRInt32 colCount = mCellMap->GetColCount();
if ((colCount-1)==aColIndex)
{ // table is right neighbor { // table is right neighbor
} }
else else
{ // interior cell { // interior cell
} }
if ((rowCount-1)==rowIndex) }
void nsTableFrame::ComputeTopBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex)
{
// this method just uses mCellMap, because it can't get called unless nCellMap!=nsnull
}
void nsTableFrame::ComputeBottomBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex)
{
// this method just uses mCellMap, because it can't get called unless nCellMap!=nsnull
PRInt32 rowCount = mCellMap->GetRowCount();
if ((rowCount-1)==aRowIndex)
{ {
} }
else else
{ {
} }
*/
}
}
} }
void nsTableFrame::RecalcLayoutData() void nsTableFrame::RecalcLayoutData()
@ -3691,7 +3752,7 @@ nscoord nsTableFrame::GetCellSpacingX()
GetStyleData(eStyleStruct_Table, (const nsStyleStruct *&)tableStyle); GetStyleData(eStyleStruct_Table, (const nsStyleStruct *&)tableStyle);
nscoord cellSpacing = 0; nscoord cellSpacing = 0;
PRUint8 borderCollapseStyle = GetBorderCollapseStyle(); PRUint8 borderCollapseStyle = GetBorderCollapseStyle();
if (NS_STYLE_TABLE_BORDER_COLLAPSE_COLLAPSE!=borderCollapseStyle) if (NS_STYLE_BORDER_COLLAPSE!=borderCollapseStyle)
{ {
if (tableStyle->mBorderSpacingX.GetUnit() == eStyleUnit_Coord) { if (tableStyle->mBorderSpacingX.GetUnit() == eStyleUnit_Coord) {
cellSpacing = tableStyle->mBorderSpacingX.GetCoordValue(); cellSpacing = tableStyle->mBorderSpacingX.GetCoordValue();
@ -3710,7 +3771,7 @@ nscoord nsTableFrame::GetCellSpacingY()
GetStyleData(eStyleStruct_Table, (const nsStyleStruct *&)tableStyle); GetStyleData(eStyleStruct_Table, (const nsStyleStruct *&)tableStyle);
nscoord cellSpacing = 0; nscoord cellSpacing = 0;
PRUint8 borderCollapseStyle = GetBorderCollapseStyle(); PRUint8 borderCollapseStyle = GetBorderCollapseStyle();
if (NS_STYLE_TABLE_BORDER_COLLAPSE_COLLAPSE!=borderCollapseStyle) if (NS_STYLE_BORDER_COLLAPSE!=borderCollapseStyle)
{ {
if (tableStyle->mBorderSpacingY.GetUnit() == eStyleUnit_Coord) { if (tableStyle->mBorderSpacingY.GetUnit() == eStyleUnit_Coord) {
cellSpacing = tableStyle->mBorderSpacingY.GetCoordValue(); cellSpacing = tableStyle->mBorderSpacingY.GetCoordValue();

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

@ -19,6 +19,7 @@
#define nsTableFrame_h__ #define nsTableFrame_h__
#include "nscore.h" #include "nscore.h"
#include "nsVoidArray.h"
#include "nsHTMLContainerFrame.h" #include "nsHTMLContainerFrame.h"
#include "nsStyleCoord.h" #include "nsStyleCoord.h"
#include "nsStyleConsts.h" #include "nsStyleConsts.h"
@ -26,7 +27,6 @@
class nsCellMap; class nsCellMap;
class nsVoidArray;
class nsTableCellFrame; class nsTableCellFrame;
class nsTableColFrame; class nsTableColFrame;
class nsTableRowGroupFrame; class nsTableRowGroupFrame;
@ -210,6 +210,10 @@ public:
/* compute all the collapsed borders between aStartRowIndex and aEndRowIndex, inclusive */ /* compute all the collapsed borders between aStartRowIndex and aEndRowIndex, inclusive */
void ComputeCollapsingBorders(PRInt32 aStartRowIndex, PRInt32 aEndRowIndex); void ComputeCollapsingBorders(PRInt32 aStartRowIndex, PRInt32 aEndRowIndex);
void ComputeLeftBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex);
void ComputeRightBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex);
void ComputeTopBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex);
void ComputeBottomBorderForEdgeAt(PRInt32 aRowIndex, PRInt32 aColIndex);
void RecalcLayoutData(); void RecalcLayoutData();
@ -640,6 +644,9 @@ private:
nscoord mDefaultCellSpacingX;// the default cell spacing X for this table nscoord mDefaultCellSpacingX;// the default cell spacing X for this table
nscoord mDefaultCellSpacingY;// the default cell spacing X for this table nscoord mDefaultCellSpacingY;// the default cell spacing X for this table
nscoord mDefaultCellPadding; // the default cell padding for this table nscoord mDefaultCellPadding; // the default cell padding for this table
nsVoidArray mBorderEdges[4]; // one list of border segments for each side of the table frame
// used only for the collapsing border model
}; };