bugs 47163, 60807 and others, sr=buster

simplified BasicTableLayoutStrategy's CalculateTotals and CanAllocate
better calculation of proportional cols
calculation of adjusted widths due to colspans honors the fixed and pct widths of cols being spanned
This commit is contained in:
karnaze%netscape.com 2000-12-19 20:29:46 +00:00
parent e888c0ae25
commit 164543525f
10 changed files with 980 additions and 854 deletions

File diff suppressed because it is too large Load Diff

View File

@ -109,11 +109,9 @@ protected:
/**
* Calculate the adjusted widths (min, desired, fixed, or pct) for a cell
* spanning multiple columns.
* @param aWidthIndex - the width to calculate (see nsTableColFrame.h for enums)
* @param aCellFrame - the frame of the cell with a colspan
* @param aColIndex - the column index of the cell in the table
* @param aColSpan - the colspan of the cell
* @param aReflowState - the reflow state of the table
* @param aConsiderPct - if true, consider columns that have pct widths and are spanned by the cell
* @param aPixelToTwips- the number of twips in a pixel.
*/
void ComputeNonPctColspanWidths(const nsHTMLReflowState& aReflowState,
PRBool aConsiderPct,
@ -121,17 +119,21 @@ protected:
/**
* main helper for above. For min width calculations, it can get called up to
* 3 times, 1st to let constrained (fix or pct) cols reach their limit, 2nd
* to let auto cols reach their limit and 3rd to spread any remainder among
* 3 times, 1st to let constrained pct cols reach their limit, 2nd
* to let fix cols reach their limit and 3rd to spread any remainder among
* auto cols. If there are no auto cols then only constrained cols are considered.
* @param aCellWidth - the width of the cell
* @param aLimitType - value indicating which type of width is being targeted
* to reach a limit
* @return - true if the computation completed, false otherwise
* @param aWidthIndex - the width to calculate (see nsTableColFrame.h for enums)
* @param aCellFrame - the frame of the cell with a colspan
* @param aCellWidth - the width of the cell with a colspan
* @param aColIndex - the column index of the cell in the table
* @param aColSpan - the colspan of the cell
* @param aLimitType - the type of limit (ie. pct, fix, none).
* @param aPixelToTwips- the number of twips in a pixel.
* @return - true if all of aCellWidth was allocated, false otherwise
*/
PRBool ComputeNonPctColspanWidths(PRInt32 aWidthIndex,
nsTableCellFrame* aCellFrame,
nscoord aCellWidth,
PRInt32 aCellWidth,
PRInt32 aColIndex,
PRInt32 aColSpan,
PRInt32& aLimitType,
@ -147,14 +149,12 @@ protected:
void CalculateTotals(PRInt32& aCellSpacing,
PRInt32* aTotalCounts,
PRInt32* aTotalWidths,
PRInt32* aTotalAvailWidths,
PRInt32* aMinWidths,
PRInt32& a0ProportionalCount);
void AllocateFully(nscoord& aTotalAllocated,
PRInt32* aAllocTypes,
PRInt32 aWidthType,
PRBool aMarkAllocated = PR_TRUE);
PRInt32 aWidthType);
void AllocateConstrained(PRInt32 aAvailWidth,
PRInt32 aWidthType,
@ -164,7 +164,10 @@ protected:
void AllocateUnconstrained(PRInt32 aAllocAmount,
PRInt32* aAllocTypes,
PRBool aSkip0Proportional,
PRBool aExcludePct,
PRBool aExcludeFix,
PRBool aExcludePro,
PRBool aExclude0Pro,
float aPixelToTwips);
/** return true if the colIndex is in the list of colIndexes */

View File

@ -1369,6 +1369,8 @@ nsCellMap::RebuildConsideringRows(nsIPresContext* aPresContext,
delete row;
}
delete [] origRows;
// remove any unused cols
aMap.RemoveUnusedCols(aMap.GetColCount());
}
void nsCellMap::RebuildConsideringCells(nsTableCellMap& aMap,

View File

@ -453,14 +453,29 @@ PRInt32 nsTableFrame::GetRowCount () const
return rowCount;
}
/* return the effective col count */
/* return the col count including dead cols */
PRInt32 nsTableFrame::GetColCount ()
{
PRInt32 colCount = 0;
nsTableCellMap* cellMap = GetCellMap();
NS_ASSERTION(nsnull != cellMap, "GetColCount null cellmap");
if (nsnull != cellMap)
if (nsnull != cellMap) {
colCount = cellMap->GetColCount();
}
return colCount;
}
/* return the effective col count */
PRInt32 nsTableFrame::GetEffectiveColCount ()
{
PRInt32 colCount = GetColCount();
// don't count cols at the end that don't have originating cells
for (PRInt32 colX = colCount - 1; colX >= 0; colX--) {
if (GetNumCellsOriginatingInCol(colX) <= 0) {
colCount--;
}
else break;
}
return colCount;
}

View File

@ -776,6 +776,7 @@ public: /* ----- Cell Map public methods ----- */
/** returns the number of columns in this table after redundant columns have been removed
*/
virtual PRInt32 GetEffectiveColCount();
virtual PRInt32 GetColCount();
/** return the column frame at colIndex.

File diff suppressed because it is too large Load Diff

View File

@ -109,11 +109,9 @@ protected:
/**
* Calculate the adjusted widths (min, desired, fixed, or pct) for a cell
* spanning multiple columns.
* @param aWidthIndex - the width to calculate (see nsTableColFrame.h for enums)
* @param aCellFrame - the frame of the cell with a colspan
* @param aColIndex - the column index of the cell in the table
* @param aColSpan - the colspan of the cell
* @param aReflowState - the reflow state of the table
* @param aConsiderPct - if true, consider columns that have pct widths and are spanned by the cell
* @param aPixelToTwips- the number of twips in a pixel.
*/
void ComputeNonPctColspanWidths(const nsHTMLReflowState& aReflowState,
PRBool aConsiderPct,
@ -121,17 +119,21 @@ protected:
/**
* main helper for above. For min width calculations, it can get called up to
* 3 times, 1st to let constrained (fix or pct) cols reach their limit, 2nd
* to let auto cols reach their limit and 3rd to spread any remainder among
* 3 times, 1st to let constrained pct cols reach their limit, 2nd
* to let fix cols reach their limit and 3rd to spread any remainder among
* auto cols. If there are no auto cols then only constrained cols are considered.
* @param aCellWidth - the width of the cell
* @param aLimitType - value indicating which type of width is being targeted
* to reach a limit
* @return - true if the computation completed, false otherwise
* @param aWidthIndex - the width to calculate (see nsTableColFrame.h for enums)
* @param aCellFrame - the frame of the cell with a colspan
* @param aCellWidth - the width of the cell with a colspan
* @param aColIndex - the column index of the cell in the table
* @param aColSpan - the colspan of the cell
* @param aLimitType - the type of limit (ie. pct, fix, none).
* @param aPixelToTwips- the number of twips in a pixel.
* @return - true if all of aCellWidth was allocated, false otherwise
*/
PRBool ComputeNonPctColspanWidths(PRInt32 aWidthIndex,
nsTableCellFrame* aCellFrame,
nscoord aCellWidth,
PRInt32 aCellWidth,
PRInt32 aColIndex,
PRInt32 aColSpan,
PRInt32& aLimitType,
@ -147,14 +149,12 @@ protected:
void CalculateTotals(PRInt32& aCellSpacing,
PRInt32* aTotalCounts,
PRInt32* aTotalWidths,
PRInt32* aTotalAvailWidths,
PRInt32* aMinWidths,
PRInt32& a0ProportionalCount);
void AllocateFully(nscoord& aTotalAllocated,
PRInt32* aAllocTypes,
PRInt32 aWidthType,
PRBool aMarkAllocated = PR_TRUE);
PRInt32 aWidthType);
void AllocateConstrained(PRInt32 aAvailWidth,
PRInt32 aWidthType,
@ -164,7 +164,10 @@ protected:
void AllocateUnconstrained(PRInt32 aAllocAmount,
PRInt32* aAllocTypes,
PRBool aSkip0Proportional,
PRBool aExcludePct,
PRBool aExcludeFix,
PRBool aExcludePro,
PRBool aExclude0Pro,
float aPixelToTwips);
/** return true if the colIndex is in the list of colIndexes */

View File

@ -1369,6 +1369,8 @@ nsCellMap::RebuildConsideringRows(nsIPresContext* aPresContext,
delete row;
}
delete [] origRows;
// remove any unused cols
aMap.RemoveUnusedCols(aMap.GetColCount());
}
void nsCellMap::RebuildConsideringCells(nsTableCellMap& aMap,

View File

@ -453,14 +453,29 @@ PRInt32 nsTableFrame::GetRowCount () const
return rowCount;
}
/* return the effective col count */
/* return the col count including dead cols */
PRInt32 nsTableFrame::GetColCount ()
{
PRInt32 colCount = 0;
nsTableCellMap* cellMap = GetCellMap();
NS_ASSERTION(nsnull != cellMap, "GetColCount null cellmap");
if (nsnull != cellMap)
if (nsnull != cellMap) {
colCount = cellMap->GetColCount();
}
return colCount;
}
/* return the effective col count */
PRInt32 nsTableFrame::GetEffectiveColCount ()
{
PRInt32 colCount = GetColCount();
// don't count cols at the end that don't have originating cells
for (PRInt32 colX = colCount - 1; colX >= 0; colX--) {
if (GetNumCellsOriginatingInCol(colX) <= 0) {
colCount--;
}
else break;
}
return colCount;
}

View File

@ -776,6 +776,7 @@ public: /* ----- Cell Map public methods ----- */
/** returns the number of columns in this table after redundant columns have been removed
*/
virtual PRInt32 GetEffectiveColCount();
virtual PRInt32 GetColCount();
/** return the column frame at colIndex.