Port to removal of nsStyleMolecule

git-svn-id: svn://10.0.0.236/trunk@665 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
kipp 1998-04-25 18:48:48 +00:00
parent 93894c3b99
commit b87f9199b6
45 changed files with 2038 additions and 1510 deletions

View File

@ -25,7 +25,7 @@
#include "nsRect.h"
#include "nsIPtr.h"
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
NS_DEF_PTR(nsIStyleContext);
@ -64,10 +64,8 @@ nscoord nsCSSLayout::VerticallyAlignChildren(nsIPresContext* aCX,
kid->GetStyleContext(aCX, kidSC.AssignRef());
kid->GetContent(kidContent.AssignRef());
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
PRIntn verticalAlign = kidMol->verticalAlign;
float verticalAlignPct = kidMol->verticalAlignPct;
nsStyleText* textStyle = (nsStyleText*)kidSC->GetData(kStyleTextSID);
PRIntn verticalAlign = textStyle->mVerticalAlign;
kid->GetRect(kidRect);
@ -146,9 +144,8 @@ nscoord nsCSSLayout::VerticallyAlignChildren(nsIPresContext* aCX,
kid->GetStyleContext(aCX, kidSC.AssignRef());
kid->GetContent(kidContent.AssignRef());
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
PRIntn verticalAlign = kidMol->verticalAlign;
nsStyleText* textStyle = (nsStyleText*)kidSC->GetData(kStyleTextSID);
PRIntn verticalAlign = textStyle->mVerticalAlign;
// Vertically align the child
if (verticalAlign == NS_STYLE_VERTICAL_ALIGN_BOTTOM) {
@ -174,14 +171,13 @@ nscoord nsCSSLayout::VerticallyAlignChildren(nsIPresContext* aCX,
*/
void nsCSSLayout::HorizontallyPlaceChildren(nsIPresContext* aCX,
nsIFrame* aContainer,
nsStyleMolecule* aContainerStyle,
nsStyleText* aContainerStyle,
nsIFrame* aFirstChild,
PRInt32 aChildCount,
nscoord aLineWidth,
nscoord aMaxWidth)
{
PRIntn textAlign = aContainerStyle->textAlign;
PRIntn textAlign = aContainerStyle->mTextAlign;
nscoord dx = 0;
switch (textAlign) {
case NS_STYLE_TEXT_ALIGN_LEFT:
@ -213,7 +209,6 @@ void nsCSSLayout::HorizontallyPlaceChildren(nsIPresContext* aCX,
*/
void nsCSSLayout::RelativePositionChildren(nsIPresContext* aCX,
nsIFrame* aContainer,
nsStyleMolecule* aContainerStyle,
nsIFrame* aFirstChild,
PRInt32 aChildCount)
{
@ -225,7 +220,8 @@ void nsCSSLayout::RelativePositionChildren(nsIPresContext* aCX,
kid->GetContent(kidContent.AssignRef());
kid->GetStyleContext(aCX, kidSC.AssignRef());
nsStylePosition* kidPosition = (nsStylePosition*)kidSC->GetData(kStylePositionSID);
nsStylePosition* kidPosition = (nsStylePosition*)
kidSC->GetData(kStylePositionSID);
if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) {
kid->GetOrigin(origin);
// XXX Check the flags: could be auto or percent (not just length)

View File

@ -35,6 +35,7 @@
#undef NOISY
#endif
static NS_DEFINE_IID(kIStyleSpacingSID, NS_STYLESPACING_SID);
static NS_DEFINE_IID(kIRunaroundIID, NS_IRUNAROUND_IID);
nsContainerFrame::nsContainerFrame(nsIContent* aContent,
@ -435,7 +436,6 @@ nsContainerFrame::ReflowChild(nsIFrame* aKidFrame,
nsIFrame::ReflowStatus
nsContainerFrame::ReflowChild(nsIFrame* aKidFrame,
nsIPresContext* aPresContext,
nsStyleMolecule* aKidMol,
nsISpaceManager* aSpaceManager,
const nsSize& aMaxSize,
nsRect& aDesiredRect,
@ -487,6 +487,9 @@ nsContainerFrame::ReflowChild(nsIFrame* aKidFrame,
// Get the bounding rect of the available trapezoid
nsRect rect;
nsIStyleContext* kidSC;
aKidFrame->GetStyleContext(aPresContext, kidSC);
nsStyleSpacing* spacing = (nsStyleSpacing*)kidSC->GetData(kIStyleSpacingSID);
availSpace->GetRect(rect);
if (aMaxSize.width != NS_UNCONSTRAINEDSIZE) {
@ -496,13 +499,13 @@ nsContainerFrame::ReflowChild(nsIFrame* aKidFrame,
}
// Reduce the available width by the kid's left/right margin
availSize.width -= aKidMol->margin.left + aKidMol->margin.right;
availSize.width -= spacing->mMargin.left + spacing->mMargin.right;
}
// Does the child frame support interface nsIRunaround?
if (NS_OK == aKidFrame->QueryInterface(kIRunaroundIID, (void**)&reflowRunaround)) {
// Yes, the child frame wants to interact directly with the space manager.
nscoord tx = rect.x + aKidMol->margin.left;
nscoord tx = rect.x + spacing->mMargin.left;
// Translate the local coordinate space to the current left edge plus any
// left margin the child wants
@ -543,6 +546,8 @@ nsContainerFrame::ReflowChild(nsIFrame* aKidFrame,
((nsContainerFrame*)parent)->DeleteChildsNextInFlow(aKidFrame);
}
}
NS_RELEASE(kidSC);
return status;
}

View File

@ -20,8 +20,6 @@
#include "nsSplittableFrame.h"
struct nsStyleMolecule;
/**
* Implementation of a container frame. Supports being used a pseudo-
* frame (a frame that maps the same content as its parent).
@ -239,7 +237,6 @@ protected:
*/
ReflowStatus ReflowChild(nsIFrame* aKidFrame,
nsIPresContext* aPresContext,
nsStyleMolecule* aKidMol,
nsISpaceManager* aSpaceManager,
const nsSize& aMaxSize,
nsRect& aDesiredRect,

View File

@ -48,9 +48,12 @@
static NS_DEFINE_IID(kIRunaroundIID, NS_IRUNAROUND_IID);
static NS_DEFINE_IID(kIFloaterContainerIID, NS_IFLOATERCONTAINER_IID);
static NS_DEFINE_IID(kIAnchoredItemsIID, NS_IANCHOREDITEMS_IID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleDisplaySID, NS_STYLEDISPLAY_SID);
static NS_DEFINE_IID(kStyleFontSID, NS_STYLEFONT_SID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
NS_DEF_PTR(nsIStyleContext);
NS_DEF_PTR(nsIContent);
@ -100,8 +103,7 @@ nsBlockReflowState::nsBlockReflowState()
void nsBlockReflowState::Init(const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleFont* aFont,
nsStyleMolecule* aMol,
nsIStyleContext* aBlockSC,
nsISpaceManager* aSpaceManager)
{
firstLine = PR_TRUE;
@ -114,8 +116,15 @@ void nsBlockReflowState::Init(const nsSize& aMaxSize,
spaceManager = aSpaceManager;
currentBand = new BlockBandData;
font = aFont;
mol = aMol;
styleContext = aBlockSC;
styleText = (nsStyleText*) aBlockSC->GetData(kStyleTextSID);
styleFont = (nsStyleFont*) aBlockSC->GetData(kStyleFontSID);
styleDisplay = (nsStyleDisplay*) aBlockSC->GetData(kStyleDisplaySID);
justifying = (NS_STYLE_TEXT_ALIGN_JUSTIFY == styleText->mTextAlign) &&
(NS_STYLE_WHITESPACE_PRE != styleText->mWhiteSpace);
availSize.width = aMaxSize.width;
availSize.height = aMaxSize.height;
maxElementSize = aMaxElementSize;
@ -155,8 +164,6 @@ void nsBlockReflowState::Init(const nsSize& aMaxSize,
unconstrainedWidth = PRBool(aMaxSize.width == NS_UNCONSTRAINEDSIZE);
unconstrainedHeight = PRBool(aMaxSize.height == NS_UNCONSTRAINEDSIZE);
justifying = (NS_STYLE_TEXT_ALIGN_JUSTIFY == mol->textAlign) &&
(NS_STYLE_WHITESPACE_PRE != mol->whiteSpace);
reflowStatus = nsIFrame::frNotComplete;
}
@ -300,11 +307,11 @@ nsBlockFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
// type and the display type of the previous child frame.
//
// Adjacent vertical margins between block-level elements are collapsed.
nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol,
PRBool aIsInline)
nsIFrame* aKidFrame,
nsIStyleContext* aKidSC,
PRBool aIsInline)
{
if (aIsInline) {
// Just use whatever the previous bottom margin was
@ -318,10 +325,11 @@ nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
if (nsnull == kidPrevInFlow) {
nscoord maxNegTopMargin = 0;
nscoord maxPosTopMargin = 0;
if (aKidMol->margin.top < 0) {
maxNegTopMargin = -aKidMol->margin.top;
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
if (ss->mMargin.top < 0) {
maxNegTopMargin = -ss->mMargin.top;
} else {
maxPosTopMargin = aKidMol->margin.top;
maxPosTopMargin = ss->mMargin.top;
}
nscoord maxPos = PR_MAX(aState.prevMaxPosBottomMargin, maxPosTopMargin);
@ -354,20 +362,22 @@ void nsBlockFrame::PlaceBelowCurrentLineFloaters(nsIPresContext* aCX,
nsIStyleContextPtr styleContext;
floater->GetStyleContext(aCX, styleContext.AssignRef());
nsStyleMolecule* mol = (nsStyleMolecule*)styleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* sd = (nsStyleDisplay*)
styleContext->GetData(kStyleDisplaySID);
floater->GetRect(region);
region.y = mCurrentState->currentBand->trapezoids[0].yTop;
if (NS_STYLE_FLOAT_LEFT == mol->floats) {
if (NS_STYLE_FLOAT_LEFT == sd->mFloats) {
region.x = mCurrentState->currentBand->trapezoids[0].xTopLeft;
} else {
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == mol->floats, "bad float type");
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == sd->mFloats, "bad float type");
region.x = mCurrentState->currentBand->trapezoids[0].xTopRight - region.width;
}
// XXX Don't forget the floater's margins...
mCurrentState->spaceManager->Translate(mCurrentState->borderPadding.left, 0);
mCurrentState->spaceManager->Translate(mCurrentState->borderPadding.left,
0);
mCurrentState->spaceManager->AddRectRegion(region, floater);
// Set the origin of the floater in world coordinates
@ -398,9 +408,13 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
if (aState.isInline) {
// Vertically align the children on this line, returning the height of
// the line upon completion.
lineHeight = nsCSSLayout::VerticallyAlignChildren(aCX, this, aState.font, y,
aState.lineStart, aState.lineLength,
aState.ascents, aState.maxAscent);
lineHeight = nsCSSLayout::VerticallyAlignChildren(aCX, this,
aState.styleFont,
y,
aState.lineStart,
aState.lineLength,
aState.ascents,
aState.maxAscent);
// Any below current line floaters to place?
if (aState.floaterToDo.Count() > 0) {
@ -445,7 +459,7 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
// doing an unconstrained (in x) reflow. There's no point in doing
// the work if we *know* we are going to reflowed again.
if (!aState.unconstrainedWidth) {
nsCSSLayout::HorizontallyPlaceChildren(aCX, this, aState.mol,
nsCSSLayout::HorizontallyPlaceChildren(aCX, this, aState.styleText,
aState.lineStart, aState.lineLength,
aState.lineWidth,
aState.availSize.width);
@ -453,7 +467,7 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
// Finally, now that the in-flow positions of the line's frames are
// known we can apply relative positioning if any of them need it.
if (!aState.justifying) {
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol,
nsCSSLayout::RelativePositionChildren(aCX, this,
aState.lineStart,
aState.lineLength);
}
@ -499,17 +513,15 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
nsIFrame* aKidFrame,
nsReflowMetrics& aKidSize,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
NS_PRECONDITION(nsnull != aState.lineStart, "bad line");
nsStylePosition* kidPosition;
// Get the position style data
aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition);
nsStyleDisplay* ds = (nsStyleDisplay*) aKidSC->GetData(kStyleDisplaySID);
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
nsStylePosition* sp = (nsStylePosition*) aKidSC->GetData(kStylePositionSID);
PRIntn direction = aState.mol->direction;
if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) {
if (NS_STYLE_POSITION_RELATIVE == sp->mPosition) {
aState.needRelativePos = PR_TRUE;
}
@ -519,15 +531,16 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
r.y = aState.y;
r.width = aKidSize.width;
r.height = aKidSize.height;
if (NS_STYLE_DIRECTION_LTR == aState.mol->direction) {
if (NS_STYLE_DIRECTION_LTR == aState.styleDisplay->mDirection) {
// Left to right positioning.
r.x = aState.borderPadding.left + aState.x + aKidMol->margin.left;
aState.x += aKidSize.width + aKidMol->margin.left + aKidMol->margin.right;
r.x = aState.borderPadding.left + aState.x + ss->mMargin.left;
aState.x += aKidSize.width + ss->mMargin.left + ss->mMargin.right;
} else {
// Right to left positioning
// XXX what should we do when aState.x goes negative???
r.x = aState.x - aState.borderPadding.right - aKidMol->margin.right - aKidSize.width;
aState.x -= aKidSize.width + aKidMol->margin.right + aKidMol->margin.left;
r.x = aState.x - aState.borderPadding.right - ss->mMargin.right -
aKidSize.width;
aState.x -= aKidSize.width + ss->mMargin.right + ss->mMargin.left;
}
aKidFrame->SetRect(r);
aState.AddAscent(aKidSize.ascent);
@ -551,7 +564,7 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
#if 0
// XXX CSS2 spec says that top/bottom margin don't affect line height
// calculation. We're waiting for clarification on this issue...
if ((margin = aKidMol->margin.top) < 0) {
if ((margin = ss->mMargin.top) < 0) {
margin = -margin;
if (margin > aState.maxNegTopMargin) {
aState.maxNegTopMargin = margin;
@ -562,7 +575,7 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
}
}
#endif
if ((margin = aKidMol->margin.bottom) < 0) {
if ((margin = ss->mMargin.bottom) < 0) {
margin = -margin;
if (margin > aState.maxNegBottomMargin) {
aState.maxNegBottomMargin = margin;
@ -593,20 +606,20 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
nsIFrame* aKidFrame,
nsRect& aKidRect,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
NS_PRECONDITION(nsnull != aState.lineStart, "bad line");
nsStylePosition* kidPosition;
// Get the position style data
aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition);
if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) {
nsStyleDisplay* ds = (nsStyleDisplay*) aKidSC->GetData(kStyleDisplaySID);
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
nsStylePosition* sp = (nsStylePosition*) aKidSC->GetData(kStylePositionSID);
if (NS_STYLE_POSITION_RELATIVE == sp->mPosition) {
aState.needRelativePos = PR_TRUE;
}
// Translate from the kid's coordinate space to our coordinate space
aKidRect.x += aState.borderPadding.left + aKidMol->margin.left;
aKidRect.x += aState.borderPadding.left + ss->mMargin.left;
aKidRect.y += aState.y + aState.topMargin;
// Place and size the child
@ -616,7 +629,7 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
aState.lineLength++;
// Is this the widest child frame?
nscoord xMost = aKidRect.XMost() + aKidMol->margin.right;
nscoord xMost = aKidRect.XMost() + ss->mMargin.right;
if (xMost > aState.kidXMost) {
aState.kidXMost = xMost;
}
@ -633,17 +646,17 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
// and the bottom line margin information which we'll use when placing
// the next child
if (aKidMol->margin.bottom < 0) {
aState.maxNegBottomMargin = -aKidMol->margin.bottom;
if (ss->mMargin.bottom < 0) {
aState.maxNegBottomMargin = -ss->mMargin.bottom;
} else {
aState.maxPosBottomMargin = aKidMol->margin.bottom;
aState.maxPosBottomMargin = ss->mMargin.bottom;
}
// Update the running y-offset
aState.y += aKidRect.height + aState.topMargin;
// Apply relative positioning if necessary
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol, aKidFrame, 1);
nsCSSLayout::RelativePositionChildren(aCX, this, aKidFrame, 1);
// Advance to the next line
aState.AdvanceToNextLine(aKidFrame, aKidRect.height);
@ -656,19 +669,19 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
*/
void nsBlockFrame::GetAvailSize(nsSize& aResult,
nsBlockReflowState& aState,
nsStyleMolecule* aKidMol,
nsIStyleContext* aKidSC,
PRBool aIsInline)
{
// Determine the maximum available reflow height for the child
nscoord yb = aState.borderPadding.top + aState.availSize.height;
aResult.height = aState.unconstrainedHeight ? NS_UNCONSTRAINEDSIZE :
yb - aState.y - aState.topMargin;
yb - aState.y - aState.topMargin;
// Determine the maximum available reflow width for the child
if (aState.unconstrainedWidth) {
aResult.width = NS_UNCONSTRAINEDSIZE;
} else if (aIsInline) {
if (NS_STYLE_DIRECTION_LTR == aState.mol->direction) {
if (NS_STYLE_DIRECTION_LTR == aState.styleDisplay->mDirection) {
aResult.width = aState.currentBand->trapezoids[0].xTopRight - aState.x;
} else {
aResult.width = aState.x - aState.currentBand->trapezoids[0].xTopLeft;
@ -830,13 +843,15 @@ getBand:
}
if (isLeftFloater) {
if ((aClear == NS_STYLE_CLEAR_LEFT) || (aClear == NS_STYLE_CLEAR_BOTH)) {
if ((aClear == NS_STYLE_CLEAR_LEFT) ||
(aClear == NS_STYLE_CLEAR_LEFT_AND_RIGHT)) {
aState.y += aState.currentBand->trapezoids[0].GetHeight();
goto getBand;
}
}
if (isRightFloater) {
if ((aClear == NS_STYLE_CLEAR_RIGHT) || (aClear == NS_STYLE_CLEAR_BOTH)) {
if ((aClear == NS_STYLE_CLEAR_RIGHT) ||
(aClear == NS_STYLE_CLEAR_LEFT_AND_RIGHT)) {
aState.y += aState.currentBand->trapezoids[0].GetHeight();
goto getBand;
}
@ -853,7 +868,7 @@ PRIntn
nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
nsSize kidMaxElementSize;
nsSize* pKidMaxElementSize =
@ -866,17 +881,12 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
// Get kid and its style
// XXX How is this any different than what was passed in to us as aKidMol?
nsIContentPtr kid;
nsIStyleContextPtr kidSC;
aKidFrame->GetContent(kid.AssignRef());
aKidFrame->GetStyleContext(aCX, kidSC.AssignRef());
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStyleDisplay* styleDisplay = (nsStyleDisplay*)
aKidSC->GetData(kStyleDisplaySID);
// Figure out if kid is a block element or not
PRBool isInline = PR_TRUE;
PRIntn display = kidMol->display;
PRIntn display = styleDisplay->mDisplay;
if (aState.firstChildIsInsideBullet && (mFirstChild == aKidFrame)) {
// XXX Special hack for properly reflowing bullets that have the
// inside value for list-style-position.
@ -909,15 +919,20 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
aState.lineStart = aKidFrame;
// Get the style for the last child, and see if it wanted to clear floaters.
// This handles the BR tag, which is the only inline element for which clear
// applies
// Get the style for the last child, and see if it wanted to clear
// floaters. This handles the BR tag, which is the only inline
// element for which clear applies
nsIStyleContextPtr lastChildSC;
lastFrame->GetStyleContext(aCX, lastChildSC.AssignRef());
nsStyleMolecule* lastChildMol = (nsStyleMolecule*)lastChildSC->GetData(kStyleMoleculeSID);
if (lastChildMol->clear != NS_STYLE_CLEAR_NONE) {
ClearFloaters(aState, lastChildMol->clear);
nsStyleDisplay* lastChildDisplay = (nsStyleDisplay*)
lastChildSC->GetData(kStyleDisplaySID);
switch (lastChildDisplay->mBreakType) {
case NS_STYLE_CLEAR_LEFT:
case NS_STYLE_CLEAR_RIGHT:
case NS_STYLE_CLEAR_LEFT_AND_RIGHT:
ClearFloaters(aState, lastChildDisplay->mBreakType);
break;
}
}
@ -929,7 +944,8 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// should use
if (aState.lineStart == aKidFrame) {
// Compute the top margin to use for this line
aState.topMargin = GetTopMarginFor(aCX, aState, aKidFrame, kidMol, aState.isInline);
aState.topMargin = GetTopMarginFor(aCX, aState, aKidFrame, aKidSC,
aState.isInline);
// If it's an inline element then get a band of available space
//
@ -943,7 +959,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// Compute the available space to reflow the child into and then
// reflow it into that space.
nsSize kidAvailSize;
GetAvailSize(kidAvailSize, aState, kidMol, aState.isInline);
GetAvailSize(kidAvailSize, aState, aKidSC, aState.isInline);
if ((aState.currentLineNumber > 0) && (kidAvailSize.height <= 0)) {
// No more room
return 0;
@ -990,7 +1006,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
GetAvailableSpaceBand(aState, aState.y + aState.topMargin);
// Reflow child now that it has the line to itself
GetAvailSize(kidAvailSize, aState, kidMol, PR_TRUE);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_TRUE);
status = ReflowChild(aKidFrame, aCX, kidSize, kidAvailSize,
pKidMaxElementSize);
}
@ -1017,7 +1033,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
if (isSplittable != frNotSplittable) {
// Update size info now that we are on the next line. Then
// reflow the child into the new available space.
GetAvailSize(kidAvailSize, aState, kidMol, PR_TRUE);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_TRUE);
status = ReflowChild(aKidFrame, aCX, kidSize, kidAvailSize,
pKidMaxElementSize);
@ -1044,21 +1060,27 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
// Add child to the line
AddInlineChildToLine(aCX, aState, aKidFrame, kidSize, pKidMaxElementSize, kidMol);
AddInlineChildToLine(aCX, aState, aKidFrame, kidSize,
pKidMaxElementSize, aKidSC);
} else {
nsRect kidRect;
// Does the block-level element want to clear any floaters that impact
// it? Note that the clear property only applies to block-level elements
// and the BR tag
if (aKidMol->clear != NS_STYLE_CLEAR_NONE) {
ClearFloaters(aState, aKidMol->clear);
GetAvailSize(kidAvailSize, aState, kidMol, PR_FALSE);
nsStyleDisplay* styleDisplay = (nsStyleDisplay*)
aKidSC->GetData(kStyleDisplaySID);
switch (styleDisplay->mBreakType) {
case NS_STYLE_CLEAR_LEFT:
case NS_STYLE_CLEAR_RIGHT:
case NS_STYLE_CLEAR_LEFT_AND_RIGHT:
ClearFloaters(aState, styleDisplay->mBreakType);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_FALSE);
if ((aState.currentLineNumber > 0) && (kidAvailSize.height <= 0)) {
// No more room
return 0;
}
break;
}
// Give the block its own local coordinate space.. Note: ReflowChild()
@ -1066,8 +1088,8 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// current left/right edge
aState.spaceManager->Translate(aState.borderPadding.left, 0);
// Give the block-level element the opportunity to use the space manager
status = ReflowChild(aKidFrame, aCX, kidMol, aState.spaceManager, kidAvailSize,
kidRect, pKidMaxElementSize);
status = ReflowChild(aKidFrame, aCX, aState.spaceManager,
kidAvailSize, kidRect, pKidMaxElementSize);
aState.spaceManager->Translate(-aState.borderPadding.left, 0);
// For first children, we skip all the fit checks because we must
@ -1087,7 +1109,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// calls AdvaneceToNextLine(). We need to restructure the flow of control,
// and use a state machine...
aState.lastContentIsComplete = PRBool(status == frComplete);
AddBlockChild(aCX, aState, aKidFrame, kidRect, pKidMaxElementSize, kidMol);
AddBlockChild(aCX, aState, aKidFrame, kidRect, pKidMaxElementSize, aKidSC);
}
// If we just reflowed our last child then update the
@ -1147,7 +1169,6 @@ nsBlockFrame::ReflowMappedChildren(nsIPresContext* aCX,
kidFrame->GetContent(kid.AssignRef());
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
// Attempt to place and reflow the child
@ -1155,7 +1176,7 @@ nsBlockFrame::ReflowMappedChildren(nsIPresContext* aCX,
// it is, otherwise advance to the next line and place it there if
// possible
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
ReflowStatus status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// The child doesn't fit. Push it and any remaining children.
@ -1237,8 +1258,9 @@ PRBool nsBlockFrame::MoreToReflow(nsIPresContext* aCX)
if (nsnull != kid) {
// Resolve style for the kid
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
switch (kidMol->display) {
nsStyleDisplay* kidStyleDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
switch (kidStyleDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Block pseudo-frames do not contain other block elements
@ -1303,21 +1325,23 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// Resolve style for the kid
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStylePosition* kidPosition = (nsStylePosition*)kidSC->GetData(kStylePositionSID);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStylePosition* kidPosition = (nsStylePosition*)
kidSC->GetData(kStylePositionSID);
nsStyleDisplay* kidDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
// Check whether it wants to floated or absolutely positioned
if (NS_STYLE_POSITION_ABSOLUTE == kidPosition->mPosition) {
AbsoluteFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidSC);
} else if (kidMol->floats != NS_STYLE_FLOAT_NONE) {
} else if (kidDisplay->mFloats != NS_STYLE_FLOAT_NONE) {
PlaceholderFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidSC);
} else if (nsnull == kidPrevInFlow) {
// Create initial frame for the child
nsIContentDelegate* kidDel;
nsresult fr;
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Pseudo block frames do not contain other block elements
@ -1378,7 +1402,7 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// complete.
ReflowStatus status;
do {
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// We ran out of room.
@ -1411,7 +1435,6 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// Switch to new kid style
kidFrame->GetStyleContext(aCX, kidSC.AssignRef());
kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
}
#ifdef NS_DEBUG
nsIFrame* kidNextInFlow;
@ -1493,11 +1516,10 @@ nsBlockFrame::PullUpChildren(nsIPresContext* aCX,
kidFrame->GetContent(kid.AssignRef());
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
ReflowStatus status;
do {
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// Push the kids that didn't fit back down to the next-in-flow
@ -1534,7 +1556,6 @@ nsBlockFrame::PullUpChildren(nsIPresContext* aCX,
// Switch to new kid style
kidFrame->GetStyleContext(aCX, kidSC.AssignRef());
kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
} else {
// The child has a next-in-flow, but it's not one of ours.
// It *must* be in one of our next-in-flows. Collect it
@ -1597,20 +1618,19 @@ void nsBlockFrame::SetupState(nsIPresContext* aCX,
nsISpaceManager* aSpaceManager)
{
// Setup reflow state
nsStyleMolecule* mol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsStyleFont* font =
(nsStyleFont*)mStyleContext->GetData(kStyleFontSID);
aState.Init(aMaxSize, aMaxElementSize, font, mol, aSpaceManager);
aState.Init(aMaxSize, aMaxElementSize, mStyleContext, aSpaceManager);
nsStyleSpacing* mySpacing = (nsStyleSpacing*)
mStyleContext->GetData(kStyleSpacingSID);
// Apply border and padding adjustments for regular frames only
if (PR_FALSE == IsPseudoFrame()) {
aState.borderPadding = mol->borderPadding;
aState.y = mol->borderPadding.top;
aState.borderPadding = mySpacing->mBorderPadding;
aState.y = mySpacing->mBorderPadding.top;
aState.availSize.width -=
(mol->borderPadding.left + mol->borderPadding.right);
(mySpacing->mBorderPadding.left + mySpacing->mBorderPadding.right);
aState.availSize.height -=
(mol->borderPadding.top + mol->borderPadding.bottom);
(mySpacing->mBorderPadding.top + mySpacing->mBorderPadding.bottom);
} else {
aState.borderPadding.SizeTo(0, 0, 0, 0);
}
@ -1830,8 +1850,7 @@ void nsBlockFrame::JustifyLines(nsIPresContext* aCX,
// Finally, now that the in-flow positions of the line's frames are
// known we can apply relative positioning if any of them need it.
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol,
lineStart, mLines[i]);
nsCSSLayout::RelativePositionChildren(aCX, this, lineStart, mLines[i]);
}
}
@ -1952,7 +1971,8 @@ void nsBlockFrame::PlaceFloater(nsIPresContext* aCX,
nsIStyleContextPtr styleContext;
aFloater->GetStyleContext(aCX, styleContext.AssignRef());
nsStyleMolecule* mol = (nsStyleMolecule*)styleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* floaterDisplay = (nsStyleDisplay*)
styleContext->GetData(kStyleDisplaySID);
if (!mCurrentState->isInline) {
// Get the current band for this line
@ -1965,10 +1985,10 @@ void nsBlockFrame::PlaceFloater(nsIPresContext* aCX,
aFloater->GetRect(region);
region.y = mCurrentState->currentBand->trapezoids[0].yTop;
if (NS_STYLE_FLOAT_LEFT == mol->floats) {
if (NS_STYLE_FLOAT_LEFT == floaterDisplay->mFloats) {
region.x = mCurrentState->currentBand->trapezoids[0].xTopLeft;
} else {
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == mol->floats, "bad float type");
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == floaterDisplay->mFloats, "bad float type");
region.x = mCurrentState->currentBand->trapezoids[0].xTopRight - region.width;
}
@ -1997,9 +2017,10 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
{
// Get the last-in-flow
nsBlockFrame* flow = (nsBlockFrame*)GetLastInFlow();
PRInt32 kidIndex = flow->NextChildOffset();
PRInt32 startIndex = kidIndex;
#if 0
nsIFrame* kidFrame = nsnull;
nsIFrame* prevKidFrame;
@ -2013,16 +2034,17 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
// Resolve style for the kid
nsIStyleContextPtr kidSC = aPresContext->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStyleDisplay* kidDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
// Is it a floater?
if (kidMol->floats != NS_STYLE_FLOAT_NONE) {
if (kidDisplay->mFloats != NS_STYLE_FLOAT_NONE) {
PlaceholderFrame::NewFrame(&kidFrame, kid, kidIndex, this);
} else {
// Create initial frame for the child
nsIContentDelegate* kidDel;
nsresult fr;
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Pseudo block frames do not contain other block elements
@ -2073,6 +2095,7 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
mChildCount++;
}
SetLastContentOffset(prevKidFrame);
#endif
// If this is a pseudo-frame then our parent will generate the
// reflow command. Otherwise, if the container is us then we should
@ -2106,7 +2129,14 @@ nsHTMLFrameType nsBlockFrame::GetFrameType() const
NS_METHOD nsBlockFrame::ListTag(FILE* out) const
{
if ((nsnull != mGeometricParent) && IsPseudoFrame()) {
fprintf(out, "*block(%d)@%p", mIndexInParent, this);
fprintf(out, "*block<");
nsIAtom* atom = mContent->GetTag();
if (nsnull != atom) {
nsAutoString tmp;
atom->ToString(tmp);
fputs(tmp, out);
}
fprintf(out, ">(%d)@%p", mIndexInParent, this);
} else {
nsHTMLContainerFrame::ListTag(out);
}

View File

@ -25,7 +25,9 @@
#include "nsVoidArray.h"
struct BlockBandData;
struct nsMargin;
struct nsStyleDisplay;
struct nsStyleFont;
struct nsStyleText;
/**
* Block frames have some state which needs to be made
@ -65,9 +67,11 @@ struct nsBlockReflowState {
// Space manager to use
nsISpaceManager* spaceManager;
// Block's style data
nsStyleFont* font;
nsStyleMolecule* mol;
// Block's style context
nsIStyleContext* styleContext;
nsStyleText* styleText;
nsStyleFont* styleFont;
nsStyleDisplay* styleDisplay;
// Block's available size (computed from the block's parent)
nsSize availSize;
@ -139,7 +143,7 @@ struct nsBlockReflowState {
~nsBlockReflowState();
void Init(const nsSize& aMaxSize, nsSize* aMaxElementSize,
nsStyleFont* aFont, nsStyleMolecule* aMol, nsISpaceManager* aSpaceManager);
nsIStyleContext* aStyleContext, nsISpaceManager* aSpaceManager);
void AddAscent(nscoord aAscent);
void AdvanceToNextLine(nsIFrame* aPrevLineLastFrame, nscoord aPrevLineHeight);
@ -247,7 +251,7 @@ protected:
nscoord GetTopMarginFor(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol,
nsIStyleContext* aKidSC,
PRBool aIsInline);
PRBool AdvanceToNextLine(nsIPresContext* aPresContext,
@ -258,24 +262,24 @@ protected:
nsIFrame* aKidFrame,
nsReflowMetrics& aKidSize,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol);
nsIStyleContext* aKidSC);
void AddBlockChild(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsRect& aKidRect,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol);
nsIStyleContext* aKidSC);
void GetAvailSize(nsSize& aResult,
nsBlockReflowState& aState,
nsStyleMolecule* aKidMol,
nsIStyleContext* aKidSC,
PRBool aIsInline);
PRIntn PlaceAndReflowChild(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* kidFrame,
nsStyleMolecule* aKidMol);
nsIStyleContext* aKidSC);
void PushKids(nsBlockReflowState& aState);

View File

@ -48,9 +48,12 @@
static NS_DEFINE_IID(kIRunaroundIID, NS_IRUNAROUND_IID);
static NS_DEFINE_IID(kIFloaterContainerIID, NS_IFLOATERCONTAINER_IID);
static NS_DEFINE_IID(kIAnchoredItemsIID, NS_IANCHOREDITEMS_IID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleDisplaySID, NS_STYLEDISPLAY_SID);
static NS_DEFINE_IID(kStyleFontSID, NS_STYLEFONT_SID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
NS_DEF_PTR(nsIStyleContext);
NS_DEF_PTR(nsIContent);
@ -100,8 +103,7 @@ nsBlockReflowState::nsBlockReflowState()
void nsBlockReflowState::Init(const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleFont* aFont,
nsStyleMolecule* aMol,
nsIStyleContext* aBlockSC,
nsISpaceManager* aSpaceManager)
{
firstLine = PR_TRUE;
@ -114,8 +116,15 @@ void nsBlockReflowState::Init(const nsSize& aMaxSize,
spaceManager = aSpaceManager;
currentBand = new BlockBandData;
font = aFont;
mol = aMol;
styleContext = aBlockSC;
styleText = (nsStyleText*) aBlockSC->GetData(kStyleTextSID);
styleFont = (nsStyleFont*) aBlockSC->GetData(kStyleFontSID);
styleDisplay = (nsStyleDisplay*) aBlockSC->GetData(kStyleDisplaySID);
justifying = (NS_STYLE_TEXT_ALIGN_JUSTIFY == styleText->mTextAlign) &&
(NS_STYLE_WHITESPACE_PRE != styleText->mWhiteSpace);
availSize.width = aMaxSize.width;
availSize.height = aMaxSize.height;
maxElementSize = aMaxElementSize;
@ -155,8 +164,6 @@ void nsBlockReflowState::Init(const nsSize& aMaxSize,
unconstrainedWidth = PRBool(aMaxSize.width == NS_UNCONSTRAINEDSIZE);
unconstrainedHeight = PRBool(aMaxSize.height == NS_UNCONSTRAINEDSIZE);
justifying = (NS_STYLE_TEXT_ALIGN_JUSTIFY == mol->textAlign) &&
(NS_STYLE_WHITESPACE_PRE != mol->whiteSpace);
reflowStatus = nsIFrame::frNotComplete;
}
@ -300,11 +307,11 @@ nsBlockFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
// type and the display type of the previous child frame.
//
// Adjacent vertical margins between block-level elements are collapsed.
nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol,
PRBool aIsInline)
nsIFrame* aKidFrame,
nsIStyleContext* aKidSC,
PRBool aIsInline)
{
if (aIsInline) {
// Just use whatever the previous bottom margin was
@ -318,10 +325,11 @@ nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
if (nsnull == kidPrevInFlow) {
nscoord maxNegTopMargin = 0;
nscoord maxPosTopMargin = 0;
if (aKidMol->margin.top < 0) {
maxNegTopMargin = -aKidMol->margin.top;
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
if (ss->mMargin.top < 0) {
maxNegTopMargin = -ss->mMargin.top;
} else {
maxPosTopMargin = aKidMol->margin.top;
maxPosTopMargin = ss->mMargin.top;
}
nscoord maxPos = PR_MAX(aState.prevMaxPosBottomMargin, maxPosTopMargin);
@ -354,20 +362,22 @@ void nsBlockFrame::PlaceBelowCurrentLineFloaters(nsIPresContext* aCX,
nsIStyleContextPtr styleContext;
floater->GetStyleContext(aCX, styleContext.AssignRef());
nsStyleMolecule* mol = (nsStyleMolecule*)styleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* sd = (nsStyleDisplay*)
styleContext->GetData(kStyleDisplaySID);
floater->GetRect(region);
region.y = mCurrentState->currentBand->trapezoids[0].yTop;
if (NS_STYLE_FLOAT_LEFT == mol->floats) {
if (NS_STYLE_FLOAT_LEFT == sd->mFloats) {
region.x = mCurrentState->currentBand->trapezoids[0].xTopLeft;
} else {
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == mol->floats, "bad float type");
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == sd->mFloats, "bad float type");
region.x = mCurrentState->currentBand->trapezoids[0].xTopRight - region.width;
}
// XXX Don't forget the floater's margins...
mCurrentState->spaceManager->Translate(mCurrentState->borderPadding.left, 0);
mCurrentState->spaceManager->Translate(mCurrentState->borderPadding.left,
0);
mCurrentState->spaceManager->AddRectRegion(region, floater);
// Set the origin of the floater in world coordinates
@ -398,9 +408,13 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
if (aState.isInline) {
// Vertically align the children on this line, returning the height of
// the line upon completion.
lineHeight = nsCSSLayout::VerticallyAlignChildren(aCX, this, aState.font, y,
aState.lineStart, aState.lineLength,
aState.ascents, aState.maxAscent);
lineHeight = nsCSSLayout::VerticallyAlignChildren(aCX, this,
aState.styleFont,
y,
aState.lineStart,
aState.lineLength,
aState.ascents,
aState.maxAscent);
// Any below current line floaters to place?
if (aState.floaterToDo.Count() > 0) {
@ -445,7 +459,7 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
// doing an unconstrained (in x) reflow. There's no point in doing
// the work if we *know* we are going to reflowed again.
if (!aState.unconstrainedWidth) {
nsCSSLayout::HorizontallyPlaceChildren(aCX, this, aState.mol,
nsCSSLayout::HorizontallyPlaceChildren(aCX, this, aState.styleText,
aState.lineStart, aState.lineLength,
aState.lineWidth,
aState.availSize.width);
@ -453,7 +467,7 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
// Finally, now that the in-flow positions of the line's frames are
// known we can apply relative positioning if any of them need it.
if (!aState.justifying) {
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol,
nsCSSLayout::RelativePositionChildren(aCX, this,
aState.lineStart,
aState.lineLength);
}
@ -499,17 +513,15 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
nsIFrame* aKidFrame,
nsReflowMetrics& aKidSize,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
NS_PRECONDITION(nsnull != aState.lineStart, "bad line");
nsStylePosition* kidPosition;
// Get the position style data
aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition);
nsStyleDisplay* ds = (nsStyleDisplay*) aKidSC->GetData(kStyleDisplaySID);
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
nsStylePosition* sp = (nsStylePosition*) aKidSC->GetData(kStylePositionSID);
PRIntn direction = aState.mol->direction;
if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) {
if (NS_STYLE_POSITION_RELATIVE == sp->mPosition) {
aState.needRelativePos = PR_TRUE;
}
@ -519,15 +531,16 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
r.y = aState.y;
r.width = aKidSize.width;
r.height = aKidSize.height;
if (NS_STYLE_DIRECTION_LTR == aState.mol->direction) {
if (NS_STYLE_DIRECTION_LTR == aState.styleDisplay->mDirection) {
// Left to right positioning.
r.x = aState.borderPadding.left + aState.x + aKidMol->margin.left;
aState.x += aKidSize.width + aKidMol->margin.left + aKidMol->margin.right;
r.x = aState.borderPadding.left + aState.x + ss->mMargin.left;
aState.x += aKidSize.width + ss->mMargin.left + ss->mMargin.right;
} else {
// Right to left positioning
// XXX what should we do when aState.x goes negative???
r.x = aState.x - aState.borderPadding.right - aKidMol->margin.right - aKidSize.width;
aState.x -= aKidSize.width + aKidMol->margin.right + aKidMol->margin.left;
r.x = aState.x - aState.borderPadding.right - ss->mMargin.right -
aKidSize.width;
aState.x -= aKidSize.width + ss->mMargin.right + ss->mMargin.left;
}
aKidFrame->SetRect(r);
aState.AddAscent(aKidSize.ascent);
@ -551,7 +564,7 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
#if 0
// XXX CSS2 spec says that top/bottom margin don't affect line height
// calculation. We're waiting for clarification on this issue...
if ((margin = aKidMol->margin.top) < 0) {
if ((margin = ss->mMargin.top) < 0) {
margin = -margin;
if (margin > aState.maxNegTopMargin) {
aState.maxNegTopMargin = margin;
@ -562,7 +575,7 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
}
}
#endif
if ((margin = aKidMol->margin.bottom) < 0) {
if ((margin = ss->mMargin.bottom) < 0) {
margin = -margin;
if (margin > aState.maxNegBottomMargin) {
aState.maxNegBottomMargin = margin;
@ -593,20 +606,20 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
nsIFrame* aKidFrame,
nsRect& aKidRect,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
NS_PRECONDITION(nsnull != aState.lineStart, "bad line");
nsStylePosition* kidPosition;
// Get the position style data
aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition);
if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) {
nsStyleDisplay* ds = (nsStyleDisplay*) aKidSC->GetData(kStyleDisplaySID);
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
nsStylePosition* sp = (nsStylePosition*) aKidSC->GetData(kStylePositionSID);
if (NS_STYLE_POSITION_RELATIVE == sp->mPosition) {
aState.needRelativePos = PR_TRUE;
}
// Translate from the kid's coordinate space to our coordinate space
aKidRect.x += aState.borderPadding.left + aKidMol->margin.left;
aKidRect.x += aState.borderPadding.left + ss->mMargin.left;
aKidRect.y += aState.y + aState.topMargin;
// Place and size the child
@ -616,7 +629,7 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
aState.lineLength++;
// Is this the widest child frame?
nscoord xMost = aKidRect.XMost() + aKidMol->margin.right;
nscoord xMost = aKidRect.XMost() + ss->mMargin.right;
if (xMost > aState.kidXMost) {
aState.kidXMost = xMost;
}
@ -633,17 +646,17 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
// and the bottom line margin information which we'll use when placing
// the next child
if (aKidMol->margin.bottom < 0) {
aState.maxNegBottomMargin = -aKidMol->margin.bottom;
if (ss->mMargin.bottom < 0) {
aState.maxNegBottomMargin = -ss->mMargin.bottom;
} else {
aState.maxPosBottomMargin = aKidMol->margin.bottom;
aState.maxPosBottomMargin = ss->mMargin.bottom;
}
// Update the running y-offset
aState.y += aKidRect.height + aState.topMargin;
// Apply relative positioning if necessary
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol, aKidFrame, 1);
nsCSSLayout::RelativePositionChildren(aCX, this, aKidFrame, 1);
// Advance to the next line
aState.AdvanceToNextLine(aKidFrame, aKidRect.height);
@ -656,19 +669,19 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
*/
void nsBlockFrame::GetAvailSize(nsSize& aResult,
nsBlockReflowState& aState,
nsStyleMolecule* aKidMol,
nsIStyleContext* aKidSC,
PRBool aIsInline)
{
// Determine the maximum available reflow height for the child
nscoord yb = aState.borderPadding.top + aState.availSize.height;
aResult.height = aState.unconstrainedHeight ? NS_UNCONSTRAINEDSIZE :
yb - aState.y - aState.topMargin;
yb - aState.y - aState.topMargin;
// Determine the maximum available reflow width for the child
if (aState.unconstrainedWidth) {
aResult.width = NS_UNCONSTRAINEDSIZE;
} else if (aIsInline) {
if (NS_STYLE_DIRECTION_LTR == aState.mol->direction) {
if (NS_STYLE_DIRECTION_LTR == aState.styleDisplay->mDirection) {
aResult.width = aState.currentBand->trapezoids[0].xTopRight - aState.x;
} else {
aResult.width = aState.x - aState.currentBand->trapezoids[0].xTopLeft;
@ -830,13 +843,15 @@ getBand:
}
if (isLeftFloater) {
if ((aClear == NS_STYLE_CLEAR_LEFT) || (aClear == NS_STYLE_CLEAR_BOTH)) {
if ((aClear == NS_STYLE_CLEAR_LEFT) ||
(aClear == NS_STYLE_CLEAR_LEFT_AND_RIGHT)) {
aState.y += aState.currentBand->trapezoids[0].GetHeight();
goto getBand;
}
}
if (isRightFloater) {
if ((aClear == NS_STYLE_CLEAR_RIGHT) || (aClear == NS_STYLE_CLEAR_BOTH)) {
if ((aClear == NS_STYLE_CLEAR_RIGHT) ||
(aClear == NS_STYLE_CLEAR_LEFT_AND_RIGHT)) {
aState.y += aState.currentBand->trapezoids[0].GetHeight();
goto getBand;
}
@ -853,7 +868,7 @@ PRIntn
nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
nsSize kidMaxElementSize;
nsSize* pKidMaxElementSize =
@ -866,17 +881,12 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
// Get kid and its style
// XXX How is this any different than what was passed in to us as aKidMol?
nsIContentPtr kid;
nsIStyleContextPtr kidSC;
aKidFrame->GetContent(kid.AssignRef());
aKidFrame->GetStyleContext(aCX, kidSC.AssignRef());
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStyleDisplay* styleDisplay = (nsStyleDisplay*)
aKidSC->GetData(kStyleDisplaySID);
// Figure out if kid is a block element or not
PRBool isInline = PR_TRUE;
PRIntn display = kidMol->display;
PRIntn display = styleDisplay->mDisplay;
if (aState.firstChildIsInsideBullet && (mFirstChild == aKidFrame)) {
// XXX Special hack for properly reflowing bullets that have the
// inside value for list-style-position.
@ -909,15 +919,20 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
aState.lineStart = aKidFrame;
// Get the style for the last child, and see if it wanted to clear floaters.
// This handles the BR tag, which is the only inline element for which clear
// applies
// Get the style for the last child, and see if it wanted to clear
// floaters. This handles the BR tag, which is the only inline
// element for which clear applies
nsIStyleContextPtr lastChildSC;
lastFrame->GetStyleContext(aCX, lastChildSC.AssignRef());
nsStyleMolecule* lastChildMol = (nsStyleMolecule*)lastChildSC->GetData(kStyleMoleculeSID);
if (lastChildMol->clear != NS_STYLE_CLEAR_NONE) {
ClearFloaters(aState, lastChildMol->clear);
nsStyleDisplay* lastChildDisplay = (nsStyleDisplay*)
lastChildSC->GetData(kStyleDisplaySID);
switch (lastChildDisplay->mBreakType) {
case NS_STYLE_CLEAR_LEFT:
case NS_STYLE_CLEAR_RIGHT:
case NS_STYLE_CLEAR_LEFT_AND_RIGHT:
ClearFloaters(aState, lastChildDisplay->mBreakType);
break;
}
}
@ -929,7 +944,8 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// should use
if (aState.lineStart == aKidFrame) {
// Compute the top margin to use for this line
aState.topMargin = GetTopMarginFor(aCX, aState, aKidFrame, kidMol, aState.isInline);
aState.topMargin = GetTopMarginFor(aCX, aState, aKidFrame, aKidSC,
aState.isInline);
// If it's an inline element then get a band of available space
//
@ -943,7 +959,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// Compute the available space to reflow the child into and then
// reflow it into that space.
nsSize kidAvailSize;
GetAvailSize(kidAvailSize, aState, kidMol, aState.isInline);
GetAvailSize(kidAvailSize, aState, aKidSC, aState.isInline);
if ((aState.currentLineNumber > 0) && (kidAvailSize.height <= 0)) {
// No more room
return 0;
@ -990,7 +1006,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
GetAvailableSpaceBand(aState, aState.y + aState.topMargin);
// Reflow child now that it has the line to itself
GetAvailSize(kidAvailSize, aState, kidMol, PR_TRUE);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_TRUE);
status = ReflowChild(aKidFrame, aCX, kidSize, kidAvailSize,
pKidMaxElementSize);
}
@ -1017,7 +1033,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
if (isSplittable != frNotSplittable) {
// Update size info now that we are on the next line. Then
// reflow the child into the new available space.
GetAvailSize(kidAvailSize, aState, kidMol, PR_TRUE);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_TRUE);
status = ReflowChild(aKidFrame, aCX, kidSize, kidAvailSize,
pKidMaxElementSize);
@ -1044,21 +1060,27 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
// Add child to the line
AddInlineChildToLine(aCX, aState, aKidFrame, kidSize, pKidMaxElementSize, kidMol);
AddInlineChildToLine(aCX, aState, aKidFrame, kidSize,
pKidMaxElementSize, aKidSC);
} else {
nsRect kidRect;
// Does the block-level element want to clear any floaters that impact
// it? Note that the clear property only applies to block-level elements
// and the BR tag
if (aKidMol->clear != NS_STYLE_CLEAR_NONE) {
ClearFloaters(aState, aKidMol->clear);
GetAvailSize(kidAvailSize, aState, kidMol, PR_FALSE);
nsStyleDisplay* styleDisplay = (nsStyleDisplay*)
aKidSC->GetData(kStyleDisplaySID);
switch (styleDisplay->mBreakType) {
case NS_STYLE_CLEAR_LEFT:
case NS_STYLE_CLEAR_RIGHT:
case NS_STYLE_CLEAR_LEFT_AND_RIGHT:
ClearFloaters(aState, styleDisplay->mBreakType);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_FALSE);
if ((aState.currentLineNumber > 0) && (kidAvailSize.height <= 0)) {
// No more room
return 0;
}
break;
}
// Give the block its own local coordinate space.. Note: ReflowChild()
@ -1066,8 +1088,8 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// current left/right edge
aState.spaceManager->Translate(aState.borderPadding.left, 0);
// Give the block-level element the opportunity to use the space manager
status = ReflowChild(aKidFrame, aCX, kidMol, aState.spaceManager, kidAvailSize,
kidRect, pKidMaxElementSize);
status = ReflowChild(aKidFrame, aCX, aState.spaceManager,
kidAvailSize, kidRect, pKidMaxElementSize);
aState.spaceManager->Translate(-aState.borderPadding.left, 0);
// For first children, we skip all the fit checks because we must
@ -1087,7 +1109,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// calls AdvaneceToNextLine(). We need to restructure the flow of control,
// and use a state machine...
aState.lastContentIsComplete = PRBool(status == frComplete);
AddBlockChild(aCX, aState, aKidFrame, kidRect, pKidMaxElementSize, kidMol);
AddBlockChild(aCX, aState, aKidFrame, kidRect, pKidMaxElementSize, aKidSC);
}
// If we just reflowed our last child then update the
@ -1147,7 +1169,6 @@ nsBlockFrame::ReflowMappedChildren(nsIPresContext* aCX,
kidFrame->GetContent(kid.AssignRef());
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
// Attempt to place and reflow the child
@ -1155,7 +1176,7 @@ nsBlockFrame::ReflowMappedChildren(nsIPresContext* aCX,
// it is, otherwise advance to the next line and place it there if
// possible
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
ReflowStatus status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// The child doesn't fit. Push it and any remaining children.
@ -1237,8 +1258,9 @@ PRBool nsBlockFrame::MoreToReflow(nsIPresContext* aCX)
if (nsnull != kid) {
// Resolve style for the kid
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
switch (kidMol->display) {
nsStyleDisplay* kidStyleDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
switch (kidStyleDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Block pseudo-frames do not contain other block elements
@ -1303,21 +1325,23 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// Resolve style for the kid
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStylePosition* kidPosition = (nsStylePosition*)kidSC->GetData(kStylePositionSID);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStylePosition* kidPosition = (nsStylePosition*)
kidSC->GetData(kStylePositionSID);
nsStyleDisplay* kidDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
// Check whether it wants to floated or absolutely positioned
if (NS_STYLE_POSITION_ABSOLUTE == kidPosition->mPosition) {
AbsoluteFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidSC);
} else if (kidMol->floats != NS_STYLE_FLOAT_NONE) {
} else if (kidDisplay->mFloats != NS_STYLE_FLOAT_NONE) {
PlaceholderFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidSC);
} else if (nsnull == kidPrevInFlow) {
// Create initial frame for the child
nsIContentDelegate* kidDel;
nsresult fr;
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Pseudo block frames do not contain other block elements
@ -1378,7 +1402,7 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// complete.
ReflowStatus status;
do {
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// We ran out of room.
@ -1411,7 +1435,6 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// Switch to new kid style
kidFrame->GetStyleContext(aCX, kidSC.AssignRef());
kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
}
#ifdef NS_DEBUG
nsIFrame* kidNextInFlow;
@ -1493,11 +1516,10 @@ nsBlockFrame::PullUpChildren(nsIPresContext* aCX,
kidFrame->GetContent(kid.AssignRef());
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
ReflowStatus status;
do {
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// Push the kids that didn't fit back down to the next-in-flow
@ -1534,7 +1556,6 @@ nsBlockFrame::PullUpChildren(nsIPresContext* aCX,
// Switch to new kid style
kidFrame->GetStyleContext(aCX, kidSC.AssignRef());
kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
} else {
// The child has a next-in-flow, but it's not one of ours.
// It *must* be in one of our next-in-flows. Collect it
@ -1597,20 +1618,19 @@ void nsBlockFrame::SetupState(nsIPresContext* aCX,
nsISpaceManager* aSpaceManager)
{
// Setup reflow state
nsStyleMolecule* mol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsStyleFont* font =
(nsStyleFont*)mStyleContext->GetData(kStyleFontSID);
aState.Init(aMaxSize, aMaxElementSize, font, mol, aSpaceManager);
aState.Init(aMaxSize, aMaxElementSize, mStyleContext, aSpaceManager);
nsStyleSpacing* mySpacing = (nsStyleSpacing*)
mStyleContext->GetData(kStyleSpacingSID);
// Apply border and padding adjustments for regular frames only
if (PR_FALSE == IsPseudoFrame()) {
aState.borderPadding = mol->borderPadding;
aState.y = mol->borderPadding.top;
aState.borderPadding = mySpacing->mBorderPadding;
aState.y = mySpacing->mBorderPadding.top;
aState.availSize.width -=
(mol->borderPadding.left + mol->borderPadding.right);
(mySpacing->mBorderPadding.left + mySpacing->mBorderPadding.right);
aState.availSize.height -=
(mol->borderPadding.top + mol->borderPadding.bottom);
(mySpacing->mBorderPadding.top + mySpacing->mBorderPadding.bottom);
} else {
aState.borderPadding.SizeTo(0, 0, 0, 0);
}
@ -1830,8 +1850,7 @@ void nsBlockFrame::JustifyLines(nsIPresContext* aCX,
// Finally, now that the in-flow positions of the line's frames are
// known we can apply relative positioning if any of them need it.
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol,
lineStart, mLines[i]);
nsCSSLayout::RelativePositionChildren(aCX, this, lineStart, mLines[i]);
}
}
@ -1952,7 +1971,8 @@ void nsBlockFrame::PlaceFloater(nsIPresContext* aCX,
nsIStyleContextPtr styleContext;
aFloater->GetStyleContext(aCX, styleContext.AssignRef());
nsStyleMolecule* mol = (nsStyleMolecule*)styleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* floaterDisplay = (nsStyleDisplay*)
styleContext->GetData(kStyleDisplaySID);
if (!mCurrentState->isInline) {
// Get the current band for this line
@ -1965,10 +1985,10 @@ void nsBlockFrame::PlaceFloater(nsIPresContext* aCX,
aFloater->GetRect(region);
region.y = mCurrentState->currentBand->trapezoids[0].yTop;
if (NS_STYLE_FLOAT_LEFT == mol->floats) {
if (NS_STYLE_FLOAT_LEFT == floaterDisplay->mFloats) {
region.x = mCurrentState->currentBand->trapezoids[0].xTopLeft;
} else {
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == mol->floats, "bad float type");
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == floaterDisplay->mFloats, "bad float type");
region.x = mCurrentState->currentBand->trapezoids[0].xTopRight - region.width;
}
@ -1997,9 +2017,10 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
{
// Get the last-in-flow
nsBlockFrame* flow = (nsBlockFrame*)GetLastInFlow();
PRInt32 kidIndex = flow->NextChildOffset();
PRInt32 startIndex = kidIndex;
#if 0
nsIFrame* kidFrame = nsnull;
nsIFrame* prevKidFrame;
@ -2013,16 +2034,17 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
// Resolve style for the kid
nsIStyleContextPtr kidSC = aPresContext->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStyleDisplay* kidDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
// Is it a floater?
if (kidMol->floats != NS_STYLE_FLOAT_NONE) {
if (kidDisplay->mFloats != NS_STYLE_FLOAT_NONE) {
PlaceholderFrame::NewFrame(&kidFrame, kid, kidIndex, this);
} else {
// Create initial frame for the child
nsIContentDelegate* kidDel;
nsresult fr;
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Pseudo block frames do not contain other block elements
@ -2073,6 +2095,7 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
mChildCount++;
}
SetLastContentOffset(prevKidFrame);
#endif
// If this is a pseudo-frame then our parent will generate the
// reflow command. Otherwise, if the container is us then we should
@ -2106,7 +2129,14 @@ nsHTMLFrameType nsBlockFrame::GetFrameType() const
NS_METHOD nsBlockFrame::ListTag(FILE* out) const
{
if ((nsnull != mGeometricParent) && IsPseudoFrame()) {
fprintf(out, "*block(%d)@%p", mIndexInParent, this);
fprintf(out, "*block<");
nsIAtom* atom = mContent->GetTag();
if (nsnull != atom) {
nsAutoString tmp;
atom->ToString(tmp);
fputs(tmp, out);
}
fprintf(out, ">(%d)@%p", mIndexInParent, this);
} else {
nsHTMLContainerFrame::ListTag(out);
}

View File

@ -48,9 +48,12 @@
static NS_DEFINE_IID(kIRunaroundIID, NS_IRUNAROUND_IID);
static NS_DEFINE_IID(kIFloaterContainerIID, NS_IFLOATERCONTAINER_IID);
static NS_DEFINE_IID(kIAnchoredItemsIID, NS_IANCHOREDITEMS_IID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleDisplaySID, NS_STYLEDISPLAY_SID);
static NS_DEFINE_IID(kStyleFontSID, NS_STYLEFONT_SID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
NS_DEF_PTR(nsIStyleContext);
NS_DEF_PTR(nsIContent);
@ -100,8 +103,7 @@ nsBlockReflowState::nsBlockReflowState()
void nsBlockReflowState::Init(const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleFont* aFont,
nsStyleMolecule* aMol,
nsIStyleContext* aBlockSC,
nsISpaceManager* aSpaceManager)
{
firstLine = PR_TRUE;
@ -114,8 +116,15 @@ void nsBlockReflowState::Init(const nsSize& aMaxSize,
spaceManager = aSpaceManager;
currentBand = new BlockBandData;
font = aFont;
mol = aMol;
styleContext = aBlockSC;
styleText = (nsStyleText*) aBlockSC->GetData(kStyleTextSID);
styleFont = (nsStyleFont*) aBlockSC->GetData(kStyleFontSID);
styleDisplay = (nsStyleDisplay*) aBlockSC->GetData(kStyleDisplaySID);
justifying = (NS_STYLE_TEXT_ALIGN_JUSTIFY == styleText->mTextAlign) &&
(NS_STYLE_WHITESPACE_PRE != styleText->mWhiteSpace);
availSize.width = aMaxSize.width;
availSize.height = aMaxSize.height;
maxElementSize = aMaxElementSize;
@ -155,8 +164,6 @@ void nsBlockReflowState::Init(const nsSize& aMaxSize,
unconstrainedWidth = PRBool(aMaxSize.width == NS_UNCONSTRAINEDSIZE);
unconstrainedHeight = PRBool(aMaxSize.height == NS_UNCONSTRAINEDSIZE);
justifying = (NS_STYLE_TEXT_ALIGN_JUSTIFY == mol->textAlign) &&
(NS_STYLE_WHITESPACE_PRE != mol->whiteSpace);
reflowStatus = nsIFrame::frNotComplete;
}
@ -300,11 +307,11 @@ nsBlockFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
// type and the display type of the previous child frame.
//
// Adjacent vertical margins between block-level elements are collapsed.
nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol,
PRBool aIsInline)
nsIFrame* aKidFrame,
nsIStyleContext* aKidSC,
PRBool aIsInline)
{
if (aIsInline) {
// Just use whatever the previous bottom margin was
@ -318,10 +325,11 @@ nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
if (nsnull == kidPrevInFlow) {
nscoord maxNegTopMargin = 0;
nscoord maxPosTopMargin = 0;
if (aKidMol->margin.top < 0) {
maxNegTopMargin = -aKidMol->margin.top;
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
if (ss->mMargin.top < 0) {
maxNegTopMargin = -ss->mMargin.top;
} else {
maxPosTopMargin = aKidMol->margin.top;
maxPosTopMargin = ss->mMargin.top;
}
nscoord maxPos = PR_MAX(aState.prevMaxPosBottomMargin, maxPosTopMargin);
@ -354,20 +362,22 @@ void nsBlockFrame::PlaceBelowCurrentLineFloaters(nsIPresContext* aCX,
nsIStyleContextPtr styleContext;
floater->GetStyleContext(aCX, styleContext.AssignRef());
nsStyleMolecule* mol = (nsStyleMolecule*)styleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* sd = (nsStyleDisplay*)
styleContext->GetData(kStyleDisplaySID);
floater->GetRect(region);
region.y = mCurrentState->currentBand->trapezoids[0].yTop;
if (NS_STYLE_FLOAT_LEFT == mol->floats) {
if (NS_STYLE_FLOAT_LEFT == sd->mFloats) {
region.x = mCurrentState->currentBand->trapezoids[0].xTopLeft;
} else {
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == mol->floats, "bad float type");
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == sd->mFloats, "bad float type");
region.x = mCurrentState->currentBand->trapezoids[0].xTopRight - region.width;
}
// XXX Don't forget the floater's margins...
mCurrentState->spaceManager->Translate(mCurrentState->borderPadding.left, 0);
mCurrentState->spaceManager->Translate(mCurrentState->borderPadding.left,
0);
mCurrentState->spaceManager->AddRectRegion(region, floater);
// Set the origin of the floater in world coordinates
@ -398,9 +408,13 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
if (aState.isInline) {
// Vertically align the children on this line, returning the height of
// the line upon completion.
lineHeight = nsCSSLayout::VerticallyAlignChildren(aCX, this, aState.font, y,
aState.lineStart, aState.lineLength,
aState.ascents, aState.maxAscent);
lineHeight = nsCSSLayout::VerticallyAlignChildren(aCX, this,
aState.styleFont,
y,
aState.lineStart,
aState.lineLength,
aState.ascents,
aState.maxAscent);
// Any below current line floaters to place?
if (aState.floaterToDo.Count() > 0) {
@ -445,7 +459,7 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
// doing an unconstrained (in x) reflow. There's no point in doing
// the work if we *know* we are going to reflowed again.
if (!aState.unconstrainedWidth) {
nsCSSLayout::HorizontallyPlaceChildren(aCX, this, aState.mol,
nsCSSLayout::HorizontallyPlaceChildren(aCX, this, aState.styleText,
aState.lineStart, aState.lineLength,
aState.lineWidth,
aState.availSize.width);
@ -453,7 +467,7 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
// Finally, now that the in-flow positions of the line's frames are
// known we can apply relative positioning if any of them need it.
if (!aState.justifying) {
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol,
nsCSSLayout::RelativePositionChildren(aCX, this,
aState.lineStart,
aState.lineLength);
}
@ -499,17 +513,15 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
nsIFrame* aKidFrame,
nsReflowMetrics& aKidSize,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
NS_PRECONDITION(nsnull != aState.lineStart, "bad line");
nsStylePosition* kidPosition;
// Get the position style data
aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition);
nsStyleDisplay* ds = (nsStyleDisplay*) aKidSC->GetData(kStyleDisplaySID);
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
nsStylePosition* sp = (nsStylePosition*) aKidSC->GetData(kStylePositionSID);
PRIntn direction = aState.mol->direction;
if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) {
if (NS_STYLE_POSITION_RELATIVE == sp->mPosition) {
aState.needRelativePos = PR_TRUE;
}
@ -519,15 +531,16 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
r.y = aState.y;
r.width = aKidSize.width;
r.height = aKidSize.height;
if (NS_STYLE_DIRECTION_LTR == aState.mol->direction) {
if (NS_STYLE_DIRECTION_LTR == aState.styleDisplay->mDirection) {
// Left to right positioning.
r.x = aState.borderPadding.left + aState.x + aKidMol->margin.left;
aState.x += aKidSize.width + aKidMol->margin.left + aKidMol->margin.right;
r.x = aState.borderPadding.left + aState.x + ss->mMargin.left;
aState.x += aKidSize.width + ss->mMargin.left + ss->mMargin.right;
} else {
// Right to left positioning
// XXX what should we do when aState.x goes negative???
r.x = aState.x - aState.borderPadding.right - aKidMol->margin.right - aKidSize.width;
aState.x -= aKidSize.width + aKidMol->margin.right + aKidMol->margin.left;
r.x = aState.x - aState.borderPadding.right - ss->mMargin.right -
aKidSize.width;
aState.x -= aKidSize.width + ss->mMargin.right + ss->mMargin.left;
}
aKidFrame->SetRect(r);
aState.AddAscent(aKidSize.ascent);
@ -551,7 +564,7 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
#if 0
// XXX CSS2 spec says that top/bottom margin don't affect line height
// calculation. We're waiting for clarification on this issue...
if ((margin = aKidMol->margin.top) < 0) {
if ((margin = ss->mMargin.top) < 0) {
margin = -margin;
if (margin > aState.maxNegTopMargin) {
aState.maxNegTopMargin = margin;
@ -562,7 +575,7 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
}
}
#endif
if ((margin = aKidMol->margin.bottom) < 0) {
if ((margin = ss->mMargin.bottom) < 0) {
margin = -margin;
if (margin > aState.maxNegBottomMargin) {
aState.maxNegBottomMargin = margin;
@ -593,20 +606,20 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
nsIFrame* aKidFrame,
nsRect& aKidRect,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
NS_PRECONDITION(nsnull != aState.lineStart, "bad line");
nsStylePosition* kidPosition;
// Get the position style data
aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition);
if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) {
nsStyleDisplay* ds = (nsStyleDisplay*) aKidSC->GetData(kStyleDisplaySID);
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
nsStylePosition* sp = (nsStylePosition*) aKidSC->GetData(kStylePositionSID);
if (NS_STYLE_POSITION_RELATIVE == sp->mPosition) {
aState.needRelativePos = PR_TRUE;
}
// Translate from the kid's coordinate space to our coordinate space
aKidRect.x += aState.borderPadding.left + aKidMol->margin.left;
aKidRect.x += aState.borderPadding.left + ss->mMargin.left;
aKidRect.y += aState.y + aState.topMargin;
// Place and size the child
@ -616,7 +629,7 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
aState.lineLength++;
// Is this the widest child frame?
nscoord xMost = aKidRect.XMost() + aKidMol->margin.right;
nscoord xMost = aKidRect.XMost() + ss->mMargin.right;
if (xMost > aState.kidXMost) {
aState.kidXMost = xMost;
}
@ -633,17 +646,17 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
// and the bottom line margin information which we'll use when placing
// the next child
if (aKidMol->margin.bottom < 0) {
aState.maxNegBottomMargin = -aKidMol->margin.bottom;
if (ss->mMargin.bottom < 0) {
aState.maxNegBottomMargin = -ss->mMargin.bottom;
} else {
aState.maxPosBottomMargin = aKidMol->margin.bottom;
aState.maxPosBottomMargin = ss->mMargin.bottom;
}
// Update the running y-offset
aState.y += aKidRect.height + aState.topMargin;
// Apply relative positioning if necessary
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol, aKidFrame, 1);
nsCSSLayout::RelativePositionChildren(aCX, this, aKidFrame, 1);
// Advance to the next line
aState.AdvanceToNextLine(aKidFrame, aKidRect.height);
@ -656,19 +669,19 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
*/
void nsBlockFrame::GetAvailSize(nsSize& aResult,
nsBlockReflowState& aState,
nsStyleMolecule* aKidMol,
nsIStyleContext* aKidSC,
PRBool aIsInline)
{
// Determine the maximum available reflow height for the child
nscoord yb = aState.borderPadding.top + aState.availSize.height;
aResult.height = aState.unconstrainedHeight ? NS_UNCONSTRAINEDSIZE :
yb - aState.y - aState.topMargin;
yb - aState.y - aState.topMargin;
// Determine the maximum available reflow width for the child
if (aState.unconstrainedWidth) {
aResult.width = NS_UNCONSTRAINEDSIZE;
} else if (aIsInline) {
if (NS_STYLE_DIRECTION_LTR == aState.mol->direction) {
if (NS_STYLE_DIRECTION_LTR == aState.styleDisplay->mDirection) {
aResult.width = aState.currentBand->trapezoids[0].xTopRight - aState.x;
} else {
aResult.width = aState.x - aState.currentBand->trapezoids[0].xTopLeft;
@ -830,13 +843,15 @@ getBand:
}
if (isLeftFloater) {
if ((aClear == NS_STYLE_CLEAR_LEFT) || (aClear == NS_STYLE_CLEAR_BOTH)) {
if ((aClear == NS_STYLE_CLEAR_LEFT) ||
(aClear == NS_STYLE_CLEAR_LEFT_AND_RIGHT)) {
aState.y += aState.currentBand->trapezoids[0].GetHeight();
goto getBand;
}
}
if (isRightFloater) {
if ((aClear == NS_STYLE_CLEAR_RIGHT) || (aClear == NS_STYLE_CLEAR_BOTH)) {
if ((aClear == NS_STYLE_CLEAR_RIGHT) ||
(aClear == NS_STYLE_CLEAR_LEFT_AND_RIGHT)) {
aState.y += aState.currentBand->trapezoids[0].GetHeight();
goto getBand;
}
@ -853,7 +868,7 @@ PRIntn
nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
nsSize kidMaxElementSize;
nsSize* pKidMaxElementSize =
@ -866,17 +881,12 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
// Get kid and its style
// XXX How is this any different than what was passed in to us as aKidMol?
nsIContentPtr kid;
nsIStyleContextPtr kidSC;
aKidFrame->GetContent(kid.AssignRef());
aKidFrame->GetStyleContext(aCX, kidSC.AssignRef());
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStyleDisplay* styleDisplay = (nsStyleDisplay*)
aKidSC->GetData(kStyleDisplaySID);
// Figure out if kid is a block element or not
PRBool isInline = PR_TRUE;
PRIntn display = kidMol->display;
PRIntn display = styleDisplay->mDisplay;
if (aState.firstChildIsInsideBullet && (mFirstChild == aKidFrame)) {
// XXX Special hack for properly reflowing bullets that have the
// inside value for list-style-position.
@ -909,15 +919,20 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
aState.lineStart = aKidFrame;
// Get the style for the last child, and see if it wanted to clear floaters.
// This handles the BR tag, which is the only inline element for which clear
// applies
// Get the style for the last child, and see if it wanted to clear
// floaters. This handles the BR tag, which is the only inline
// element for which clear applies
nsIStyleContextPtr lastChildSC;
lastFrame->GetStyleContext(aCX, lastChildSC.AssignRef());
nsStyleMolecule* lastChildMol = (nsStyleMolecule*)lastChildSC->GetData(kStyleMoleculeSID);
if (lastChildMol->clear != NS_STYLE_CLEAR_NONE) {
ClearFloaters(aState, lastChildMol->clear);
nsStyleDisplay* lastChildDisplay = (nsStyleDisplay*)
lastChildSC->GetData(kStyleDisplaySID);
switch (lastChildDisplay->mBreakType) {
case NS_STYLE_CLEAR_LEFT:
case NS_STYLE_CLEAR_RIGHT:
case NS_STYLE_CLEAR_LEFT_AND_RIGHT:
ClearFloaters(aState, lastChildDisplay->mBreakType);
break;
}
}
@ -929,7 +944,8 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// should use
if (aState.lineStart == aKidFrame) {
// Compute the top margin to use for this line
aState.topMargin = GetTopMarginFor(aCX, aState, aKidFrame, kidMol, aState.isInline);
aState.topMargin = GetTopMarginFor(aCX, aState, aKidFrame, aKidSC,
aState.isInline);
// If it's an inline element then get a band of available space
//
@ -943,7 +959,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// Compute the available space to reflow the child into and then
// reflow it into that space.
nsSize kidAvailSize;
GetAvailSize(kidAvailSize, aState, kidMol, aState.isInline);
GetAvailSize(kidAvailSize, aState, aKidSC, aState.isInline);
if ((aState.currentLineNumber > 0) && (kidAvailSize.height <= 0)) {
// No more room
return 0;
@ -990,7 +1006,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
GetAvailableSpaceBand(aState, aState.y + aState.topMargin);
// Reflow child now that it has the line to itself
GetAvailSize(kidAvailSize, aState, kidMol, PR_TRUE);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_TRUE);
status = ReflowChild(aKidFrame, aCX, kidSize, kidAvailSize,
pKidMaxElementSize);
}
@ -1017,7 +1033,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
if (isSplittable != frNotSplittable) {
// Update size info now that we are on the next line. Then
// reflow the child into the new available space.
GetAvailSize(kidAvailSize, aState, kidMol, PR_TRUE);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_TRUE);
status = ReflowChild(aKidFrame, aCX, kidSize, kidAvailSize,
pKidMaxElementSize);
@ -1044,21 +1060,27 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
// Add child to the line
AddInlineChildToLine(aCX, aState, aKidFrame, kidSize, pKidMaxElementSize, kidMol);
AddInlineChildToLine(aCX, aState, aKidFrame, kidSize,
pKidMaxElementSize, aKidSC);
} else {
nsRect kidRect;
// Does the block-level element want to clear any floaters that impact
// it? Note that the clear property only applies to block-level elements
// and the BR tag
if (aKidMol->clear != NS_STYLE_CLEAR_NONE) {
ClearFloaters(aState, aKidMol->clear);
GetAvailSize(kidAvailSize, aState, kidMol, PR_FALSE);
nsStyleDisplay* styleDisplay = (nsStyleDisplay*)
aKidSC->GetData(kStyleDisplaySID);
switch (styleDisplay->mBreakType) {
case NS_STYLE_CLEAR_LEFT:
case NS_STYLE_CLEAR_RIGHT:
case NS_STYLE_CLEAR_LEFT_AND_RIGHT:
ClearFloaters(aState, styleDisplay->mBreakType);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_FALSE);
if ((aState.currentLineNumber > 0) && (kidAvailSize.height <= 0)) {
// No more room
return 0;
}
break;
}
// Give the block its own local coordinate space.. Note: ReflowChild()
@ -1066,8 +1088,8 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// current left/right edge
aState.spaceManager->Translate(aState.borderPadding.left, 0);
// Give the block-level element the opportunity to use the space manager
status = ReflowChild(aKidFrame, aCX, kidMol, aState.spaceManager, kidAvailSize,
kidRect, pKidMaxElementSize);
status = ReflowChild(aKidFrame, aCX, aState.spaceManager,
kidAvailSize, kidRect, pKidMaxElementSize);
aState.spaceManager->Translate(-aState.borderPadding.left, 0);
// For first children, we skip all the fit checks because we must
@ -1087,7 +1109,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// calls AdvaneceToNextLine(). We need to restructure the flow of control,
// and use a state machine...
aState.lastContentIsComplete = PRBool(status == frComplete);
AddBlockChild(aCX, aState, aKidFrame, kidRect, pKidMaxElementSize, kidMol);
AddBlockChild(aCX, aState, aKidFrame, kidRect, pKidMaxElementSize, aKidSC);
}
// If we just reflowed our last child then update the
@ -1147,7 +1169,6 @@ nsBlockFrame::ReflowMappedChildren(nsIPresContext* aCX,
kidFrame->GetContent(kid.AssignRef());
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
// Attempt to place and reflow the child
@ -1155,7 +1176,7 @@ nsBlockFrame::ReflowMappedChildren(nsIPresContext* aCX,
// it is, otherwise advance to the next line and place it there if
// possible
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
ReflowStatus status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// The child doesn't fit. Push it and any remaining children.
@ -1237,8 +1258,9 @@ PRBool nsBlockFrame::MoreToReflow(nsIPresContext* aCX)
if (nsnull != kid) {
// Resolve style for the kid
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
switch (kidMol->display) {
nsStyleDisplay* kidStyleDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
switch (kidStyleDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Block pseudo-frames do not contain other block elements
@ -1303,21 +1325,23 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// Resolve style for the kid
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStylePosition* kidPosition = (nsStylePosition*)kidSC->GetData(kStylePositionSID);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStylePosition* kidPosition = (nsStylePosition*)
kidSC->GetData(kStylePositionSID);
nsStyleDisplay* kidDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
// Check whether it wants to floated or absolutely positioned
if (NS_STYLE_POSITION_ABSOLUTE == kidPosition->mPosition) {
AbsoluteFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidSC);
} else if (kidMol->floats != NS_STYLE_FLOAT_NONE) {
} else if (kidDisplay->mFloats != NS_STYLE_FLOAT_NONE) {
PlaceholderFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidSC);
} else if (nsnull == kidPrevInFlow) {
// Create initial frame for the child
nsIContentDelegate* kidDel;
nsresult fr;
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Pseudo block frames do not contain other block elements
@ -1378,7 +1402,7 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// complete.
ReflowStatus status;
do {
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// We ran out of room.
@ -1411,7 +1435,6 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// Switch to new kid style
kidFrame->GetStyleContext(aCX, kidSC.AssignRef());
kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
}
#ifdef NS_DEBUG
nsIFrame* kidNextInFlow;
@ -1493,11 +1516,10 @@ nsBlockFrame::PullUpChildren(nsIPresContext* aCX,
kidFrame->GetContent(kid.AssignRef());
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
ReflowStatus status;
do {
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// Push the kids that didn't fit back down to the next-in-flow
@ -1534,7 +1556,6 @@ nsBlockFrame::PullUpChildren(nsIPresContext* aCX,
// Switch to new kid style
kidFrame->GetStyleContext(aCX, kidSC.AssignRef());
kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
} else {
// The child has a next-in-flow, but it's not one of ours.
// It *must* be in one of our next-in-flows. Collect it
@ -1597,20 +1618,19 @@ void nsBlockFrame::SetupState(nsIPresContext* aCX,
nsISpaceManager* aSpaceManager)
{
// Setup reflow state
nsStyleMolecule* mol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsStyleFont* font =
(nsStyleFont*)mStyleContext->GetData(kStyleFontSID);
aState.Init(aMaxSize, aMaxElementSize, font, mol, aSpaceManager);
aState.Init(aMaxSize, aMaxElementSize, mStyleContext, aSpaceManager);
nsStyleSpacing* mySpacing = (nsStyleSpacing*)
mStyleContext->GetData(kStyleSpacingSID);
// Apply border and padding adjustments for regular frames only
if (PR_FALSE == IsPseudoFrame()) {
aState.borderPadding = mol->borderPadding;
aState.y = mol->borderPadding.top;
aState.borderPadding = mySpacing->mBorderPadding;
aState.y = mySpacing->mBorderPadding.top;
aState.availSize.width -=
(mol->borderPadding.left + mol->borderPadding.right);
(mySpacing->mBorderPadding.left + mySpacing->mBorderPadding.right);
aState.availSize.height -=
(mol->borderPadding.top + mol->borderPadding.bottom);
(mySpacing->mBorderPadding.top + mySpacing->mBorderPadding.bottom);
} else {
aState.borderPadding.SizeTo(0, 0, 0, 0);
}
@ -1830,8 +1850,7 @@ void nsBlockFrame::JustifyLines(nsIPresContext* aCX,
// Finally, now that the in-flow positions of the line's frames are
// known we can apply relative positioning if any of them need it.
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol,
lineStart, mLines[i]);
nsCSSLayout::RelativePositionChildren(aCX, this, lineStart, mLines[i]);
}
}
@ -1952,7 +1971,8 @@ void nsBlockFrame::PlaceFloater(nsIPresContext* aCX,
nsIStyleContextPtr styleContext;
aFloater->GetStyleContext(aCX, styleContext.AssignRef());
nsStyleMolecule* mol = (nsStyleMolecule*)styleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* floaterDisplay = (nsStyleDisplay*)
styleContext->GetData(kStyleDisplaySID);
if (!mCurrentState->isInline) {
// Get the current band for this line
@ -1965,10 +1985,10 @@ void nsBlockFrame::PlaceFloater(nsIPresContext* aCX,
aFloater->GetRect(region);
region.y = mCurrentState->currentBand->trapezoids[0].yTop;
if (NS_STYLE_FLOAT_LEFT == mol->floats) {
if (NS_STYLE_FLOAT_LEFT == floaterDisplay->mFloats) {
region.x = mCurrentState->currentBand->trapezoids[0].xTopLeft;
} else {
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == mol->floats, "bad float type");
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == floaterDisplay->mFloats, "bad float type");
region.x = mCurrentState->currentBand->trapezoids[0].xTopRight - region.width;
}
@ -1997,9 +2017,10 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
{
// Get the last-in-flow
nsBlockFrame* flow = (nsBlockFrame*)GetLastInFlow();
PRInt32 kidIndex = flow->NextChildOffset();
PRInt32 startIndex = kidIndex;
#if 0
nsIFrame* kidFrame = nsnull;
nsIFrame* prevKidFrame;
@ -2013,16 +2034,17 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
// Resolve style for the kid
nsIStyleContextPtr kidSC = aPresContext->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStyleDisplay* kidDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
// Is it a floater?
if (kidMol->floats != NS_STYLE_FLOAT_NONE) {
if (kidDisplay->mFloats != NS_STYLE_FLOAT_NONE) {
PlaceholderFrame::NewFrame(&kidFrame, kid, kidIndex, this);
} else {
// Create initial frame for the child
nsIContentDelegate* kidDel;
nsresult fr;
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Pseudo block frames do not contain other block elements
@ -2073,6 +2095,7 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
mChildCount++;
}
SetLastContentOffset(prevKidFrame);
#endif
// If this is a pseudo-frame then our parent will generate the
// reflow command. Otherwise, if the container is us then we should
@ -2106,7 +2129,14 @@ nsHTMLFrameType nsBlockFrame::GetFrameType() const
NS_METHOD nsBlockFrame::ListTag(FILE* out) const
{
if ((nsnull != mGeometricParent) && IsPseudoFrame()) {
fprintf(out, "*block(%d)@%p", mIndexInParent, this);
fprintf(out, "*block<");
nsIAtom* atom = mContent->GetTag();
if (nsnull != atom) {
nsAutoString tmp;
atom->ToString(tmp);
fputs(tmp, out);
}
fprintf(out, ">(%d)@%p", mIndexInParent, this);
} else {
nsHTMLContainerFrame::ListTag(out);
}

View File

@ -26,6 +26,7 @@
#include "nsCSSLayout.h"
#include "nsPlaceholderFrame.h"
#include "nsReflowCommand.h"
#include "nsHTMLAtoms.h"
#include "nsAbsoluteFrame.h"
// XXX To Do:
@ -36,16 +37,22 @@
// 6. direction support
// 7. CSS line-height property
/* XXX */
#include "nsHTMLIIDs.h"
#include "nsBlockFrame.h"
#define DEFAULT_ASCENT_LEN 10
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleFontSID, NS_STYLEFONT_SID);
static NS_DEFINE_IID(kStyleDisplaySID, NS_STYLEDISPLAY_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
class nsInlineState
{
public:
nsStyleFont* font; // style font
nsStyleMolecule* mol; // style molecule
nsStyleSpacing* spacing; // style spacing
nsSize availSize; // available space in which to reflow (starts as max size minus insets)
nsSize* maxElementSize; // maximum element size (may be null)
nscoord x; // running x-offset (starts at left inner edge)
@ -58,14 +65,14 @@ public:
// Constructor
nsInlineState(nsStyleFont* aStyleFont,
nsStyleMolecule* aStyleMolecule,
nsStyleSpacing* aSpacing,
const nsSize& aMaxSize,
nsSize* aMaxElementSize)
: x(aStyleMolecule->borderPadding.left), // determined by inner edge
y(aStyleMolecule->borderPadding.top) // determined by inner edge
: x(aSpacing->mBorderPadding.left), // determined by inner edge
y(aSpacing->mBorderPadding.top) // determined by inner edge
{
font = aStyleFont;
mol = aStyleMolecule;
spacing = aSpacing;
unconstrainedWidth = PRBool(aMaxSize.width == NS_UNCONSTRAINEDSIZE);
unconstrainedHeight = PRBool(aMaxSize.height == NS_UNCONSTRAINEDSIZE);
@ -74,11 +81,11 @@ public:
// needed for border/padding
availSize.width = aMaxSize.width;
if (PR_FALSE == unconstrainedWidth) {
availSize.width -= mol->borderPadding.left + mol->borderPadding.right;
availSize.width -= aSpacing->mBorderPadding.left + aSpacing->mBorderPadding.right;
}
availSize.height = aMaxSize.height;
if (PR_FALSE == unconstrainedHeight) {
availSize.height -= mol->borderPadding.top + mol->borderPadding.bottom;
availSize.height -= aSpacing->mBorderPadding.top + aSpacing->mBorderPadding.bottom;
}
// Initialize max element size
@ -360,6 +367,10 @@ PRBool nsInlineFrame::PullUpChildren(nsIPresContext* aPresContext,
}
}
// XXX if the frame being pulled up is not appropriate (e.g. a block
// frame) then we should stop! If we have an inline BR tag we should
// stop too!
// See if the child fits in the available space. If it fits or
// it's splittable then reflow it. The reason we can't just move
// it is that we still need ascent/descent information
@ -531,6 +542,7 @@ nsInlineFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
PRInt32 kidIndex = NextChildOffset();
nsIFrame* prevKidFrame;
PRBool breakAfter = PR_FALSE;
LastChild(prevKidFrame);
for (;;) {
// Get the next content object
@ -553,19 +565,21 @@ nsInlineFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
// Figure out how we should treat the child
nsIFrame* kidFrame;
nsStylePosition* kidPosition = (nsStylePosition*)kidStyleContext->GetData(kStylePositionSID);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidStyleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* kidDisplay =
(nsStyleDisplay*)kidStyleContext->GetData(kStyleDisplaySID);
nsStylePosition* kidPosition = (nsStylePosition*)
kidStyleContext->GetData(kStylePositionSID);
// Check whether it wants to floated or absolutely positioned
if (NS_STYLE_POSITION_ABSOLUTE == kidPosition->mPosition) {
AbsoluteFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidStyleContext);
} else if (kidMol->floats != NS_STYLE_FLOAT_NONE) {
} else if (kidDisplay->mFloats != NS_STYLE_FLOAT_NONE) {
PlaceholderFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidStyleContext);
} else if (nsnull == kidPrevInFlow) {
nsIContentDelegate* kidDel;
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
if (kidIndex != mFirstContentOffset) {
@ -578,6 +592,42 @@ nsInlineFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
// FALLTHROUGH
case NS_STYLE_DISPLAY_INLINE:
// XXX temporary hack to make plain BR's in inlines "work"
// get style for break-before-after; get break-type (line, page, etc.)
{
nsIAtom* tag = kid->GetTag();
if (nsHTMLAtoms::br == tag) {
// Set break-after flag so we stop mapping children (we
// will end up being continued if there are more children)
breakAfter = PR_TRUE;
// Get cached state for containing block frame
// XXX how about QueryInterface(kIHTMLBlockFrameIID)? DOH!
nsBlockReflowState* state = nsnull;
nsIFrame* parent = mGeometricParent;
while (nsnull != parent) {
nsIHTMLFrameType* ft;
nsresult status =
parent->QueryInterface(kIHTMLFrameTypeIID, (void**) &ft);
if (NS_OK == status) {
nsHTMLFrameType type = ft->GetFrameType();
if (eHTMLFrame_Block == type) {
break;
}
}
parent->GetGeometricParent(parent);
}
if (nsnull != parent) {
nsIPresShell* shell = aPresContext->GetShell();
state = (nsBlockReflowState*) shell->GetCachedData(parent);
// XXX Of course this won't work if the inline span is nested
// in another inline span!
state->breakAfterChild = PR_TRUE;
NS_RELEASE(shell);
}
}
NS_IF_RELEASE(tag);
}
kidDel = kid->GetDelegate(aPresContext);
kidFrame = kidDel->CreateFrame(aPresContext, kid, kidIndex, this);
NS_RELEASE(kidDel);
@ -634,6 +684,11 @@ nsInlineFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
break;
}
kidPrevInFlow = nsnull;
// If we need to break after the kidFrame, then do so now
if (breakAfter) {
break;
}
}
done:;
@ -668,15 +723,15 @@ NS_METHOD nsInlineFrame::ResizeReflow(nsIPresContext* aPresContext,
// Get the style molecule
nsStyleFont* styleFont =
(nsStyleFont*)mStyleContext->GetData(kStyleFontSID);
nsStyleMolecule* styleMolecule =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsStyleSpacing* styleSpacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
// Check for an overflow list
MoveOverflowToChildList();
// Initialize our reflow state. We must wait until after we've processed
// the overflow list, because our first content offset might change
nsInlineState state(styleFont, styleMolecule, aMaxSize, aMaxElementSize);
nsInlineState state(styleFont, styleSpacing, aMaxSize, aMaxElementSize);
state.SetNumAscents(mContent->ChildCount() - mFirstContentOffset);
// Reflow any existing frames
@ -710,7 +765,7 @@ NS_METHOD nsInlineFrame::ResizeReflow(nsIPresContext* aPresContext,
}
}
const nsMargin& insets = styleMolecule->borderPadding;
const nsMargin& insets = styleSpacing->mBorderPadding;
// Vertically align the children
nscoord lineHeight =
@ -895,9 +950,7 @@ NS_METHOD nsInlineFrame::IncrementalReflow(nsIPresContext* aPresContext,
// Recover the reflow state as if we had reflowed our children up
// to but not including the child that is next in the reflow chain
nsStyleMolecule* styleMolecule =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsInlineState state(styleMolecule, aMaxSize, nsnull);
nsInlineState state(aMaxSize, nsnull);
state.SetNumAscents(mChildCount);
PRIntn nextIndex = RecoverState(aPresContext, state, nextInChain);
@ -981,8 +1034,8 @@ nsInlineFrame::AdjustChildren(nsIPresContext* aPresContext,
nsReflowMetrics& aKidMetrics,
ReflowStatus aKidReflowStatus)
{
nsStyleMolecule* mol = aState.mol;
nscoord xr = aState.availSize.width + mol->borderPadding.left;
nsStyleSpacing* spacing = aState.spacing;
nscoord xr = aState.availSize.width + spacing->mBorderPadding.left;
nscoord remainingSpace = xr - aState.x;
nscoord x = aState.x;
@ -1000,7 +1053,7 @@ nsInlineFrame::AdjustChildren(nsIPresContext* aPresContext,
}
// Vertically align the children
const nsMargin& insets = mol->borderPadding;
const nsMargin& insets = spacing->mBorderPadding;
nsCSSLayout::VerticallyAlignChildren(aPresContext, this, aState.font,
insets.top, mFirstChild, mChildCount,
aState.ascents, aState.maxAscent);

View File

@ -29,7 +29,6 @@
#include "nsViewsCID.h"
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kIScrollableViewIID, NS_ISCROLLABLEVIEW_IID);
NS_DEF_PTR(nsIStyleContext);

View File

@ -48,9 +48,12 @@
static NS_DEFINE_IID(kIRunaroundIID, NS_IRUNAROUND_IID);
static NS_DEFINE_IID(kIFloaterContainerIID, NS_IFLOATERCONTAINER_IID);
static NS_DEFINE_IID(kIAnchoredItemsIID, NS_IANCHOREDITEMS_IID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleDisplaySID, NS_STYLEDISPLAY_SID);
static NS_DEFINE_IID(kStyleFontSID, NS_STYLEFONT_SID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
NS_DEF_PTR(nsIStyleContext);
NS_DEF_PTR(nsIContent);
@ -100,8 +103,7 @@ nsBlockReflowState::nsBlockReflowState()
void nsBlockReflowState::Init(const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleFont* aFont,
nsStyleMolecule* aMol,
nsIStyleContext* aBlockSC,
nsISpaceManager* aSpaceManager)
{
firstLine = PR_TRUE;
@ -114,8 +116,15 @@ void nsBlockReflowState::Init(const nsSize& aMaxSize,
spaceManager = aSpaceManager;
currentBand = new BlockBandData;
font = aFont;
mol = aMol;
styleContext = aBlockSC;
styleText = (nsStyleText*) aBlockSC->GetData(kStyleTextSID);
styleFont = (nsStyleFont*) aBlockSC->GetData(kStyleFontSID);
styleDisplay = (nsStyleDisplay*) aBlockSC->GetData(kStyleDisplaySID);
justifying = (NS_STYLE_TEXT_ALIGN_JUSTIFY == styleText->mTextAlign) &&
(NS_STYLE_WHITESPACE_PRE != styleText->mWhiteSpace);
availSize.width = aMaxSize.width;
availSize.height = aMaxSize.height;
maxElementSize = aMaxElementSize;
@ -155,8 +164,6 @@ void nsBlockReflowState::Init(const nsSize& aMaxSize,
unconstrainedWidth = PRBool(aMaxSize.width == NS_UNCONSTRAINEDSIZE);
unconstrainedHeight = PRBool(aMaxSize.height == NS_UNCONSTRAINEDSIZE);
justifying = (NS_STYLE_TEXT_ALIGN_JUSTIFY == mol->textAlign) &&
(NS_STYLE_WHITESPACE_PRE != mol->whiteSpace);
reflowStatus = nsIFrame::frNotComplete;
}
@ -300,11 +307,11 @@ nsBlockFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
// type and the display type of the previous child frame.
//
// Adjacent vertical margins between block-level elements are collapsed.
nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol,
PRBool aIsInline)
nsIFrame* aKidFrame,
nsIStyleContext* aKidSC,
PRBool aIsInline)
{
if (aIsInline) {
// Just use whatever the previous bottom margin was
@ -318,10 +325,11 @@ nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
if (nsnull == kidPrevInFlow) {
nscoord maxNegTopMargin = 0;
nscoord maxPosTopMargin = 0;
if (aKidMol->margin.top < 0) {
maxNegTopMargin = -aKidMol->margin.top;
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
if (ss->mMargin.top < 0) {
maxNegTopMargin = -ss->mMargin.top;
} else {
maxPosTopMargin = aKidMol->margin.top;
maxPosTopMargin = ss->mMargin.top;
}
nscoord maxPos = PR_MAX(aState.prevMaxPosBottomMargin, maxPosTopMargin);
@ -354,20 +362,22 @@ void nsBlockFrame::PlaceBelowCurrentLineFloaters(nsIPresContext* aCX,
nsIStyleContextPtr styleContext;
floater->GetStyleContext(aCX, styleContext.AssignRef());
nsStyleMolecule* mol = (nsStyleMolecule*)styleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* sd = (nsStyleDisplay*)
styleContext->GetData(kStyleDisplaySID);
floater->GetRect(region);
region.y = mCurrentState->currentBand->trapezoids[0].yTop;
if (NS_STYLE_FLOAT_LEFT == mol->floats) {
if (NS_STYLE_FLOAT_LEFT == sd->mFloats) {
region.x = mCurrentState->currentBand->trapezoids[0].xTopLeft;
} else {
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == mol->floats, "bad float type");
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == sd->mFloats, "bad float type");
region.x = mCurrentState->currentBand->trapezoids[0].xTopRight - region.width;
}
// XXX Don't forget the floater's margins...
mCurrentState->spaceManager->Translate(mCurrentState->borderPadding.left, 0);
mCurrentState->spaceManager->Translate(mCurrentState->borderPadding.left,
0);
mCurrentState->spaceManager->AddRectRegion(region, floater);
// Set the origin of the floater in world coordinates
@ -398,9 +408,13 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
if (aState.isInline) {
// Vertically align the children on this line, returning the height of
// the line upon completion.
lineHeight = nsCSSLayout::VerticallyAlignChildren(aCX, this, aState.font, y,
aState.lineStart, aState.lineLength,
aState.ascents, aState.maxAscent);
lineHeight = nsCSSLayout::VerticallyAlignChildren(aCX, this,
aState.styleFont,
y,
aState.lineStart,
aState.lineLength,
aState.ascents,
aState.maxAscent);
// Any below current line floaters to place?
if (aState.floaterToDo.Count() > 0) {
@ -445,7 +459,7 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
// doing an unconstrained (in x) reflow. There's no point in doing
// the work if we *know* we are going to reflowed again.
if (!aState.unconstrainedWidth) {
nsCSSLayout::HorizontallyPlaceChildren(aCX, this, aState.mol,
nsCSSLayout::HorizontallyPlaceChildren(aCX, this, aState.styleText,
aState.lineStart, aState.lineLength,
aState.lineWidth,
aState.availSize.width);
@ -453,7 +467,7 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
// Finally, now that the in-flow positions of the line's frames are
// known we can apply relative positioning if any of them need it.
if (!aState.justifying) {
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol,
nsCSSLayout::RelativePositionChildren(aCX, this,
aState.lineStart,
aState.lineLength);
}
@ -499,17 +513,15 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
nsIFrame* aKidFrame,
nsReflowMetrics& aKidSize,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
NS_PRECONDITION(nsnull != aState.lineStart, "bad line");
nsStylePosition* kidPosition;
// Get the position style data
aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition);
nsStyleDisplay* ds = (nsStyleDisplay*) aKidSC->GetData(kStyleDisplaySID);
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
nsStylePosition* sp = (nsStylePosition*) aKidSC->GetData(kStylePositionSID);
PRIntn direction = aState.mol->direction;
if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) {
if (NS_STYLE_POSITION_RELATIVE == sp->mPosition) {
aState.needRelativePos = PR_TRUE;
}
@ -519,15 +531,16 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
r.y = aState.y;
r.width = aKidSize.width;
r.height = aKidSize.height;
if (NS_STYLE_DIRECTION_LTR == aState.mol->direction) {
if (NS_STYLE_DIRECTION_LTR == aState.styleDisplay->mDirection) {
// Left to right positioning.
r.x = aState.borderPadding.left + aState.x + aKidMol->margin.left;
aState.x += aKidSize.width + aKidMol->margin.left + aKidMol->margin.right;
r.x = aState.borderPadding.left + aState.x + ss->mMargin.left;
aState.x += aKidSize.width + ss->mMargin.left + ss->mMargin.right;
} else {
// Right to left positioning
// XXX what should we do when aState.x goes negative???
r.x = aState.x - aState.borderPadding.right - aKidMol->margin.right - aKidSize.width;
aState.x -= aKidSize.width + aKidMol->margin.right + aKidMol->margin.left;
r.x = aState.x - aState.borderPadding.right - ss->mMargin.right -
aKidSize.width;
aState.x -= aKidSize.width + ss->mMargin.right + ss->mMargin.left;
}
aKidFrame->SetRect(r);
aState.AddAscent(aKidSize.ascent);
@ -551,7 +564,7 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
#if 0
// XXX CSS2 spec says that top/bottom margin don't affect line height
// calculation. We're waiting for clarification on this issue...
if ((margin = aKidMol->margin.top) < 0) {
if ((margin = ss->mMargin.top) < 0) {
margin = -margin;
if (margin > aState.maxNegTopMargin) {
aState.maxNegTopMargin = margin;
@ -562,7 +575,7 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
}
}
#endif
if ((margin = aKidMol->margin.bottom) < 0) {
if ((margin = ss->mMargin.bottom) < 0) {
margin = -margin;
if (margin > aState.maxNegBottomMargin) {
aState.maxNegBottomMargin = margin;
@ -593,20 +606,20 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
nsIFrame* aKidFrame,
nsRect& aKidRect,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
NS_PRECONDITION(nsnull != aState.lineStart, "bad line");
nsStylePosition* kidPosition;
// Get the position style data
aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition);
if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) {
nsStyleDisplay* ds = (nsStyleDisplay*) aKidSC->GetData(kStyleDisplaySID);
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
nsStylePosition* sp = (nsStylePosition*) aKidSC->GetData(kStylePositionSID);
if (NS_STYLE_POSITION_RELATIVE == sp->mPosition) {
aState.needRelativePos = PR_TRUE;
}
// Translate from the kid's coordinate space to our coordinate space
aKidRect.x += aState.borderPadding.left + aKidMol->margin.left;
aKidRect.x += aState.borderPadding.left + ss->mMargin.left;
aKidRect.y += aState.y + aState.topMargin;
// Place and size the child
@ -616,7 +629,7 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
aState.lineLength++;
// Is this the widest child frame?
nscoord xMost = aKidRect.XMost() + aKidMol->margin.right;
nscoord xMost = aKidRect.XMost() + ss->mMargin.right;
if (xMost > aState.kidXMost) {
aState.kidXMost = xMost;
}
@ -633,17 +646,17 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
// and the bottom line margin information which we'll use when placing
// the next child
if (aKidMol->margin.bottom < 0) {
aState.maxNegBottomMargin = -aKidMol->margin.bottom;
if (ss->mMargin.bottom < 0) {
aState.maxNegBottomMargin = -ss->mMargin.bottom;
} else {
aState.maxPosBottomMargin = aKidMol->margin.bottom;
aState.maxPosBottomMargin = ss->mMargin.bottom;
}
// Update the running y-offset
aState.y += aKidRect.height + aState.topMargin;
// Apply relative positioning if necessary
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol, aKidFrame, 1);
nsCSSLayout::RelativePositionChildren(aCX, this, aKidFrame, 1);
// Advance to the next line
aState.AdvanceToNextLine(aKidFrame, aKidRect.height);
@ -656,19 +669,19 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
*/
void nsBlockFrame::GetAvailSize(nsSize& aResult,
nsBlockReflowState& aState,
nsStyleMolecule* aKidMol,
nsIStyleContext* aKidSC,
PRBool aIsInline)
{
// Determine the maximum available reflow height for the child
nscoord yb = aState.borderPadding.top + aState.availSize.height;
aResult.height = aState.unconstrainedHeight ? NS_UNCONSTRAINEDSIZE :
yb - aState.y - aState.topMargin;
yb - aState.y - aState.topMargin;
// Determine the maximum available reflow width for the child
if (aState.unconstrainedWidth) {
aResult.width = NS_UNCONSTRAINEDSIZE;
} else if (aIsInline) {
if (NS_STYLE_DIRECTION_LTR == aState.mol->direction) {
if (NS_STYLE_DIRECTION_LTR == aState.styleDisplay->mDirection) {
aResult.width = aState.currentBand->trapezoids[0].xTopRight - aState.x;
} else {
aResult.width = aState.x - aState.currentBand->trapezoids[0].xTopLeft;
@ -830,13 +843,15 @@ getBand:
}
if (isLeftFloater) {
if ((aClear == NS_STYLE_CLEAR_LEFT) || (aClear == NS_STYLE_CLEAR_BOTH)) {
if ((aClear == NS_STYLE_CLEAR_LEFT) ||
(aClear == NS_STYLE_CLEAR_LEFT_AND_RIGHT)) {
aState.y += aState.currentBand->trapezoids[0].GetHeight();
goto getBand;
}
}
if (isRightFloater) {
if ((aClear == NS_STYLE_CLEAR_RIGHT) || (aClear == NS_STYLE_CLEAR_BOTH)) {
if ((aClear == NS_STYLE_CLEAR_RIGHT) ||
(aClear == NS_STYLE_CLEAR_LEFT_AND_RIGHT)) {
aState.y += aState.currentBand->trapezoids[0].GetHeight();
goto getBand;
}
@ -853,7 +868,7 @@ PRIntn
nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
nsSize kidMaxElementSize;
nsSize* pKidMaxElementSize =
@ -866,17 +881,12 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
// Get kid and its style
// XXX How is this any different than what was passed in to us as aKidMol?
nsIContentPtr kid;
nsIStyleContextPtr kidSC;
aKidFrame->GetContent(kid.AssignRef());
aKidFrame->GetStyleContext(aCX, kidSC.AssignRef());
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStyleDisplay* styleDisplay = (nsStyleDisplay*)
aKidSC->GetData(kStyleDisplaySID);
// Figure out if kid is a block element or not
PRBool isInline = PR_TRUE;
PRIntn display = kidMol->display;
PRIntn display = styleDisplay->mDisplay;
if (aState.firstChildIsInsideBullet && (mFirstChild == aKidFrame)) {
// XXX Special hack for properly reflowing bullets that have the
// inside value for list-style-position.
@ -909,15 +919,20 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
aState.lineStart = aKidFrame;
// Get the style for the last child, and see if it wanted to clear floaters.
// This handles the BR tag, which is the only inline element for which clear
// applies
// Get the style for the last child, and see if it wanted to clear
// floaters. This handles the BR tag, which is the only inline
// element for which clear applies
nsIStyleContextPtr lastChildSC;
lastFrame->GetStyleContext(aCX, lastChildSC.AssignRef());
nsStyleMolecule* lastChildMol = (nsStyleMolecule*)lastChildSC->GetData(kStyleMoleculeSID);
if (lastChildMol->clear != NS_STYLE_CLEAR_NONE) {
ClearFloaters(aState, lastChildMol->clear);
nsStyleDisplay* lastChildDisplay = (nsStyleDisplay*)
lastChildSC->GetData(kStyleDisplaySID);
switch (lastChildDisplay->mBreakType) {
case NS_STYLE_CLEAR_LEFT:
case NS_STYLE_CLEAR_RIGHT:
case NS_STYLE_CLEAR_LEFT_AND_RIGHT:
ClearFloaters(aState, lastChildDisplay->mBreakType);
break;
}
}
@ -929,7 +944,8 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// should use
if (aState.lineStart == aKidFrame) {
// Compute the top margin to use for this line
aState.topMargin = GetTopMarginFor(aCX, aState, aKidFrame, kidMol, aState.isInline);
aState.topMargin = GetTopMarginFor(aCX, aState, aKidFrame, aKidSC,
aState.isInline);
// If it's an inline element then get a band of available space
//
@ -943,7 +959,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// Compute the available space to reflow the child into and then
// reflow it into that space.
nsSize kidAvailSize;
GetAvailSize(kidAvailSize, aState, kidMol, aState.isInline);
GetAvailSize(kidAvailSize, aState, aKidSC, aState.isInline);
if ((aState.currentLineNumber > 0) && (kidAvailSize.height <= 0)) {
// No more room
return 0;
@ -990,7 +1006,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
GetAvailableSpaceBand(aState, aState.y + aState.topMargin);
// Reflow child now that it has the line to itself
GetAvailSize(kidAvailSize, aState, kidMol, PR_TRUE);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_TRUE);
status = ReflowChild(aKidFrame, aCX, kidSize, kidAvailSize,
pKidMaxElementSize);
}
@ -1017,7 +1033,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
if (isSplittable != frNotSplittable) {
// Update size info now that we are on the next line. Then
// reflow the child into the new available space.
GetAvailSize(kidAvailSize, aState, kidMol, PR_TRUE);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_TRUE);
status = ReflowChild(aKidFrame, aCX, kidSize, kidAvailSize,
pKidMaxElementSize);
@ -1044,21 +1060,27 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
// Add child to the line
AddInlineChildToLine(aCX, aState, aKidFrame, kidSize, pKidMaxElementSize, kidMol);
AddInlineChildToLine(aCX, aState, aKidFrame, kidSize,
pKidMaxElementSize, aKidSC);
} else {
nsRect kidRect;
// Does the block-level element want to clear any floaters that impact
// it? Note that the clear property only applies to block-level elements
// and the BR tag
if (aKidMol->clear != NS_STYLE_CLEAR_NONE) {
ClearFloaters(aState, aKidMol->clear);
GetAvailSize(kidAvailSize, aState, kidMol, PR_FALSE);
nsStyleDisplay* styleDisplay = (nsStyleDisplay*)
aKidSC->GetData(kStyleDisplaySID);
switch (styleDisplay->mBreakType) {
case NS_STYLE_CLEAR_LEFT:
case NS_STYLE_CLEAR_RIGHT:
case NS_STYLE_CLEAR_LEFT_AND_RIGHT:
ClearFloaters(aState, styleDisplay->mBreakType);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_FALSE);
if ((aState.currentLineNumber > 0) && (kidAvailSize.height <= 0)) {
// No more room
return 0;
}
break;
}
// Give the block its own local coordinate space.. Note: ReflowChild()
@ -1066,8 +1088,8 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// current left/right edge
aState.spaceManager->Translate(aState.borderPadding.left, 0);
// Give the block-level element the opportunity to use the space manager
status = ReflowChild(aKidFrame, aCX, kidMol, aState.spaceManager, kidAvailSize,
kidRect, pKidMaxElementSize);
status = ReflowChild(aKidFrame, aCX, aState.spaceManager,
kidAvailSize, kidRect, pKidMaxElementSize);
aState.spaceManager->Translate(-aState.borderPadding.left, 0);
// For first children, we skip all the fit checks because we must
@ -1087,7 +1109,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// calls AdvaneceToNextLine(). We need to restructure the flow of control,
// and use a state machine...
aState.lastContentIsComplete = PRBool(status == frComplete);
AddBlockChild(aCX, aState, aKidFrame, kidRect, pKidMaxElementSize, kidMol);
AddBlockChild(aCX, aState, aKidFrame, kidRect, pKidMaxElementSize, aKidSC);
}
// If we just reflowed our last child then update the
@ -1147,7 +1169,6 @@ nsBlockFrame::ReflowMappedChildren(nsIPresContext* aCX,
kidFrame->GetContent(kid.AssignRef());
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
// Attempt to place and reflow the child
@ -1155,7 +1176,7 @@ nsBlockFrame::ReflowMappedChildren(nsIPresContext* aCX,
// it is, otherwise advance to the next line and place it there if
// possible
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
ReflowStatus status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// The child doesn't fit. Push it and any remaining children.
@ -1237,8 +1258,9 @@ PRBool nsBlockFrame::MoreToReflow(nsIPresContext* aCX)
if (nsnull != kid) {
// Resolve style for the kid
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
switch (kidMol->display) {
nsStyleDisplay* kidStyleDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
switch (kidStyleDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Block pseudo-frames do not contain other block elements
@ -1303,21 +1325,23 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// Resolve style for the kid
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStylePosition* kidPosition = (nsStylePosition*)kidSC->GetData(kStylePositionSID);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStylePosition* kidPosition = (nsStylePosition*)
kidSC->GetData(kStylePositionSID);
nsStyleDisplay* kidDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
// Check whether it wants to floated or absolutely positioned
if (NS_STYLE_POSITION_ABSOLUTE == kidPosition->mPosition) {
AbsoluteFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidSC);
} else if (kidMol->floats != NS_STYLE_FLOAT_NONE) {
} else if (kidDisplay->mFloats != NS_STYLE_FLOAT_NONE) {
PlaceholderFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidSC);
} else if (nsnull == kidPrevInFlow) {
// Create initial frame for the child
nsIContentDelegate* kidDel;
nsresult fr;
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Pseudo block frames do not contain other block elements
@ -1378,7 +1402,7 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// complete.
ReflowStatus status;
do {
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// We ran out of room.
@ -1411,7 +1435,6 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// Switch to new kid style
kidFrame->GetStyleContext(aCX, kidSC.AssignRef());
kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
}
#ifdef NS_DEBUG
nsIFrame* kidNextInFlow;
@ -1493,11 +1516,10 @@ nsBlockFrame::PullUpChildren(nsIPresContext* aCX,
kidFrame->GetContent(kid.AssignRef());
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
ReflowStatus status;
do {
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// Push the kids that didn't fit back down to the next-in-flow
@ -1534,7 +1556,6 @@ nsBlockFrame::PullUpChildren(nsIPresContext* aCX,
// Switch to new kid style
kidFrame->GetStyleContext(aCX, kidSC.AssignRef());
kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
} else {
// The child has a next-in-flow, but it's not one of ours.
// It *must* be in one of our next-in-flows. Collect it
@ -1597,20 +1618,19 @@ void nsBlockFrame::SetupState(nsIPresContext* aCX,
nsISpaceManager* aSpaceManager)
{
// Setup reflow state
nsStyleMolecule* mol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsStyleFont* font =
(nsStyleFont*)mStyleContext->GetData(kStyleFontSID);
aState.Init(aMaxSize, aMaxElementSize, font, mol, aSpaceManager);
aState.Init(aMaxSize, aMaxElementSize, mStyleContext, aSpaceManager);
nsStyleSpacing* mySpacing = (nsStyleSpacing*)
mStyleContext->GetData(kStyleSpacingSID);
// Apply border and padding adjustments for regular frames only
if (PR_FALSE == IsPseudoFrame()) {
aState.borderPadding = mol->borderPadding;
aState.y = mol->borderPadding.top;
aState.borderPadding = mySpacing->mBorderPadding;
aState.y = mySpacing->mBorderPadding.top;
aState.availSize.width -=
(mol->borderPadding.left + mol->borderPadding.right);
(mySpacing->mBorderPadding.left + mySpacing->mBorderPadding.right);
aState.availSize.height -=
(mol->borderPadding.top + mol->borderPadding.bottom);
(mySpacing->mBorderPadding.top + mySpacing->mBorderPadding.bottom);
} else {
aState.borderPadding.SizeTo(0, 0, 0, 0);
}
@ -1830,8 +1850,7 @@ void nsBlockFrame::JustifyLines(nsIPresContext* aCX,
// Finally, now that the in-flow positions of the line's frames are
// known we can apply relative positioning if any of them need it.
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol,
lineStart, mLines[i]);
nsCSSLayout::RelativePositionChildren(aCX, this, lineStart, mLines[i]);
}
}
@ -1952,7 +1971,8 @@ void nsBlockFrame::PlaceFloater(nsIPresContext* aCX,
nsIStyleContextPtr styleContext;
aFloater->GetStyleContext(aCX, styleContext.AssignRef());
nsStyleMolecule* mol = (nsStyleMolecule*)styleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* floaterDisplay = (nsStyleDisplay*)
styleContext->GetData(kStyleDisplaySID);
if (!mCurrentState->isInline) {
// Get the current band for this line
@ -1965,10 +1985,10 @@ void nsBlockFrame::PlaceFloater(nsIPresContext* aCX,
aFloater->GetRect(region);
region.y = mCurrentState->currentBand->trapezoids[0].yTop;
if (NS_STYLE_FLOAT_LEFT == mol->floats) {
if (NS_STYLE_FLOAT_LEFT == floaterDisplay->mFloats) {
region.x = mCurrentState->currentBand->trapezoids[0].xTopLeft;
} else {
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == mol->floats, "bad float type");
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == floaterDisplay->mFloats, "bad float type");
region.x = mCurrentState->currentBand->trapezoids[0].xTopRight - region.width;
}
@ -1997,9 +2017,10 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
{
// Get the last-in-flow
nsBlockFrame* flow = (nsBlockFrame*)GetLastInFlow();
PRInt32 kidIndex = flow->NextChildOffset();
PRInt32 startIndex = kidIndex;
#if 0
nsIFrame* kidFrame = nsnull;
nsIFrame* prevKidFrame;
@ -2013,16 +2034,17 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
// Resolve style for the kid
nsIStyleContextPtr kidSC = aPresContext->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStyleDisplay* kidDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
// Is it a floater?
if (kidMol->floats != NS_STYLE_FLOAT_NONE) {
if (kidDisplay->mFloats != NS_STYLE_FLOAT_NONE) {
PlaceholderFrame::NewFrame(&kidFrame, kid, kidIndex, this);
} else {
// Create initial frame for the child
nsIContentDelegate* kidDel;
nsresult fr;
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Pseudo block frames do not contain other block elements
@ -2073,6 +2095,7 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
mChildCount++;
}
SetLastContentOffset(prevKidFrame);
#endif
// If this is a pseudo-frame then our parent will generate the
// reflow command. Otherwise, if the container is us then we should
@ -2106,7 +2129,14 @@ nsHTMLFrameType nsBlockFrame::GetFrameType() const
NS_METHOD nsBlockFrame::ListTag(FILE* out) const
{
if ((nsnull != mGeometricParent) && IsPseudoFrame()) {
fprintf(out, "*block(%d)@%p", mIndexInParent, this);
fprintf(out, "*block<");
nsIAtom* atom = mContent->GetTag();
if (nsnull != atom) {
nsAutoString tmp;
atom->ToString(tmp);
fputs(tmp, out);
}
fprintf(out, ">(%d)@%p", mIndexInParent, this);
} else {
nsHTMLContainerFrame::ListTag(out);
}

View File

@ -25,7 +25,9 @@
#include "nsVoidArray.h"
struct BlockBandData;
struct nsMargin;
struct nsStyleDisplay;
struct nsStyleFont;
struct nsStyleText;
/**
* Block frames have some state which needs to be made
@ -65,9 +67,11 @@ struct nsBlockReflowState {
// Space manager to use
nsISpaceManager* spaceManager;
// Block's style data
nsStyleFont* font;
nsStyleMolecule* mol;
// Block's style context
nsIStyleContext* styleContext;
nsStyleText* styleText;
nsStyleFont* styleFont;
nsStyleDisplay* styleDisplay;
// Block's available size (computed from the block's parent)
nsSize availSize;
@ -139,7 +143,7 @@ struct nsBlockReflowState {
~nsBlockReflowState();
void Init(const nsSize& aMaxSize, nsSize* aMaxElementSize,
nsStyleFont* aFont, nsStyleMolecule* aMol, nsISpaceManager* aSpaceManager);
nsIStyleContext* aStyleContext, nsISpaceManager* aSpaceManager);
void AddAscent(nscoord aAscent);
void AdvanceToNextLine(nsIFrame* aPrevLineLastFrame, nscoord aPrevLineHeight);
@ -247,7 +251,7 @@ protected:
nscoord GetTopMarginFor(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol,
nsIStyleContext* aKidSC,
PRBool aIsInline);
PRBool AdvanceToNextLine(nsIPresContext* aPresContext,
@ -258,24 +262,24 @@ protected:
nsIFrame* aKidFrame,
nsReflowMetrics& aKidSize,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol);
nsIStyleContext* aKidSC);
void AddBlockChild(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsRect& aKidRect,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol);
nsIStyleContext* aKidSC);
void GetAvailSize(nsSize& aResult,
nsBlockReflowState& aState,
nsStyleMolecule* aKidMol,
nsIStyleContext* aKidSC,
PRBool aIsInline);
PRIntn PlaceAndReflowChild(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* kidFrame,
nsStyleMolecule* aKidMol);
nsIStyleContext* aKidSC);
void PushKids(nsBlockReflowState& aState);

View File

@ -48,9 +48,12 @@
static NS_DEFINE_IID(kIRunaroundIID, NS_IRUNAROUND_IID);
static NS_DEFINE_IID(kIFloaterContainerIID, NS_IFLOATERCONTAINER_IID);
static NS_DEFINE_IID(kIAnchoredItemsIID, NS_IANCHOREDITEMS_IID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleDisplaySID, NS_STYLEDISPLAY_SID);
static NS_DEFINE_IID(kStyleFontSID, NS_STYLEFONT_SID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
NS_DEF_PTR(nsIStyleContext);
NS_DEF_PTR(nsIContent);
@ -100,8 +103,7 @@ nsBlockReflowState::nsBlockReflowState()
void nsBlockReflowState::Init(const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleFont* aFont,
nsStyleMolecule* aMol,
nsIStyleContext* aBlockSC,
nsISpaceManager* aSpaceManager)
{
firstLine = PR_TRUE;
@ -114,8 +116,15 @@ void nsBlockReflowState::Init(const nsSize& aMaxSize,
spaceManager = aSpaceManager;
currentBand = new BlockBandData;
font = aFont;
mol = aMol;
styleContext = aBlockSC;
styleText = (nsStyleText*) aBlockSC->GetData(kStyleTextSID);
styleFont = (nsStyleFont*) aBlockSC->GetData(kStyleFontSID);
styleDisplay = (nsStyleDisplay*) aBlockSC->GetData(kStyleDisplaySID);
justifying = (NS_STYLE_TEXT_ALIGN_JUSTIFY == styleText->mTextAlign) &&
(NS_STYLE_WHITESPACE_PRE != styleText->mWhiteSpace);
availSize.width = aMaxSize.width;
availSize.height = aMaxSize.height;
maxElementSize = aMaxElementSize;
@ -155,8 +164,6 @@ void nsBlockReflowState::Init(const nsSize& aMaxSize,
unconstrainedWidth = PRBool(aMaxSize.width == NS_UNCONSTRAINEDSIZE);
unconstrainedHeight = PRBool(aMaxSize.height == NS_UNCONSTRAINEDSIZE);
justifying = (NS_STYLE_TEXT_ALIGN_JUSTIFY == mol->textAlign) &&
(NS_STYLE_WHITESPACE_PRE != mol->whiteSpace);
reflowStatus = nsIFrame::frNotComplete;
}
@ -300,11 +307,11 @@ nsBlockFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
// type and the display type of the previous child frame.
//
// Adjacent vertical margins between block-level elements are collapsed.
nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol,
PRBool aIsInline)
nsIFrame* aKidFrame,
nsIStyleContext* aKidSC,
PRBool aIsInline)
{
if (aIsInline) {
// Just use whatever the previous bottom margin was
@ -318,10 +325,11 @@ nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
if (nsnull == kidPrevInFlow) {
nscoord maxNegTopMargin = 0;
nscoord maxPosTopMargin = 0;
if (aKidMol->margin.top < 0) {
maxNegTopMargin = -aKidMol->margin.top;
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
if (ss->mMargin.top < 0) {
maxNegTopMargin = -ss->mMargin.top;
} else {
maxPosTopMargin = aKidMol->margin.top;
maxPosTopMargin = ss->mMargin.top;
}
nscoord maxPos = PR_MAX(aState.prevMaxPosBottomMargin, maxPosTopMargin);
@ -354,20 +362,22 @@ void nsBlockFrame::PlaceBelowCurrentLineFloaters(nsIPresContext* aCX,
nsIStyleContextPtr styleContext;
floater->GetStyleContext(aCX, styleContext.AssignRef());
nsStyleMolecule* mol = (nsStyleMolecule*)styleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* sd = (nsStyleDisplay*)
styleContext->GetData(kStyleDisplaySID);
floater->GetRect(region);
region.y = mCurrentState->currentBand->trapezoids[0].yTop;
if (NS_STYLE_FLOAT_LEFT == mol->floats) {
if (NS_STYLE_FLOAT_LEFT == sd->mFloats) {
region.x = mCurrentState->currentBand->trapezoids[0].xTopLeft;
} else {
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == mol->floats, "bad float type");
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == sd->mFloats, "bad float type");
region.x = mCurrentState->currentBand->trapezoids[0].xTopRight - region.width;
}
// XXX Don't forget the floater's margins...
mCurrentState->spaceManager->Translate(mCurrentState->borderPadding.left, 0);
mCurrentState->spaceManager->Translate(mCurrentState->borderPadding.left,
0);
mCurrentState->spaceManager->AddRectRegion(region, floater);
// Set the origin of the floater in world coordinates
@ -398,9 +408,13 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
if (aState.isInline) {
// Vertically align the children on this line, returning the height of
// the line upon completion.
lineHeight = nsCSSLayout::VerticallyAlignChildren(aCX, this, aState.font, y,
aState.lineStart, aState.lineLength,
aState.ascents, aState.maxAscent);
lineHeight = nsCSSLayout::VerticallyAlignChildren(aCX, this,
aState.styleFont,
y,
aState.lineStart,
aState.lineLength,
aState.ascents,
aState.maxAscent);
// Any below current line floaters to place?
if (aState.floaterToDo.Count() > 0) {
@ -445,7 +459,7 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
// doing an unconstrained (in x) reflow. There's no point in doing
// the work if we *know* we are going to reflowed again.
if (!aState.unconstrainedWidth) {
nsCSSLayout::HorizontallyPlaceChildren(aCX, this, aState.mol,
nsCSSLayout::HorizontallyPlaceChildren(aCX, this, aState.styleText,
aState.lineStart, aState.lineLength,
aState.lineWidth,
aState.availSize.width);
@ -453,7 +467,7 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
// Finally, now that the in-flow positions of the line's frames are
// known we can apply relative positioning if any of them need it.
if (!aState.justifying) {
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol,
nsCSSLayout::RelativePositionChildren(aCX, this,
aState.lineStart,
aState.lineLength);
}
@ -499,17 +513,15 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
nsIFrame* aKidFrame,
nsReflowMetrics& aKidSize,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
NS_PRECONDITION(nsnull != aState.lineStart, "bad line");
nsStylePosition* kidPosition;
// Get the position style data
aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition);
nsStyleDisplay* ds = (nsStyleDisplay*) aKidSC->GetData(kStyleDisplaySID);
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
nsStylePosition* sp = (nsStylePosition*) aKidSC->GetData(kStylePositionSID);
PRIntn direction = aState.mol->direction;
if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) {
if (NS_STYLE_POSITION_RELATIVE == sp->mPosition) {
aState.needRelativePos = PR_TRUE;
}
@ -519,15 +531,16 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
r.y = aState.y;
r.width = aKidSize.width;
r.height = aKidSize.height;
if (NS_STYLE_DIRECTION_LTR == aState.mol->direction) {
if (NS_STYLE_DIRECTION_LTR == aState.styleDisplay->mDirection) {
// Left to right positioning.
r.x = aState.borderPadding.left + aState.x + aKidMol->margin.left;
aState.x += aKidSize.width + aKidMol->margin.left + aKidMol->margin.right;
r.x = aState.borderPadding.left + aState.x + ss->mMargin.left;
aState.x += aKidSize.width + ss->mMargin.left + ss->mMargin.right;
} else {
// Right to left positioning
// XXX what should we do when aState.x goes negative???
r.x = aState.x - aState.borderPadding.right - aKidMol->margin.right - aKidSize.width;
aState.x -= aKidSize.width + aKidMol->margin.right + aKidMol->margin.left;
r.x = aState.x - aState.borderPadding.right - ss->mMargin.right -
aKidSize.width;
aState.x -= aKidSize.width + ss->mMargin.right + ss->mMargin.left;
}
aKidFrame->SetRect(r);
aState.AddAscent(aKidSize.ascent);
@ -551,7 +564,7 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
#if 0
// XXX CSS2 spec says that top/bottom margin don't affect line height
// calculation. We're waiting for clarification on this issue...
if ((margin = aKidMol->margin.top) < 0) {
if ((margin = ss->mMargin.top) < 0) {
margin = -margin;
if (margin > aState.maxNegTopMargin) {
aState.maxNegTopMargin = margin;
@ -562,7 +575,7 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
}
}
#endif
if ((margin = aKidMol->margin.bottom) < 0) {
if ((margin = ss->mMargin.bottom) < 0) {
margin = -margin;
if (margin > aState.maxNegBottomMargin) {
aState.maxNegBottomMargin = margin;
@ -593,20 +606,20 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
nsIFrame* aKidFrame,
nsRect& aKidRect,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
NS_PRECONDITION(nsnull != aState.lineStart, "bad line");
nsStylePosition* kidPosition;
// Get the position style data
aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition);
if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) {
nsStyleDisplay* ds = (nsStyleDisplay*) aKidSC->GetData(kStyleDisplaySID);
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
nsStylePosition* sp = (nsStylePosition*) aKidSC->GetData(kStylePositionSID);
if (NS_STYLE_POSITION_RELATIVE == sp->mPosition) {
aState.needRelativePos = PR_TRUE;
}
// Translate from the kid's coordinate space to our coordinate space
aKidRect.x += aState.borderPadding.left + aKidMol->margin.left;
aKidRect.x += aState.borderPadding.left + ss->mMargin.left;
aKidRect.y += aState.y + aState.topMargin;
// Place and size the child
@ -616,7 +629,7 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
aState.lineLength++;
// Is this the widest child frame?
nscoord xMost = aKidRect.XMost() + aKidMol->margin.right;
nscoord xMost = aKidRect.XMost() + ss->mMargin.right;
if (xMost > aState.kidXMost) {
aState.kidXMost = xMost;
}
@ -633,17 +646,17 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
// and the bottom line margin information which we'll use when placing
// the next child
if (aKidMol->margin.bottom < 0) {
aState.maxNegBottomMargin = -aKidMol->margin.bottom;
if (ss->mMargin.bottom < 0) {
aState.maxNegBottomMargin = -ss->mMargin.bottom;
} else {
aState.maxPosBottomMargin = aKidMol->margin.bottom;
aState.maxPosBottomMargin = ss->mMargin.bottom;
}
// Update the running y-offset
aState.y += aKidRect.height + aState.topMargin;
// Apply relative positioning if necessary
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol, aKidFrame, 1);
nsCSSLayout::RelativePositionChildren(aCX, this, aKidFrame, 1);
// Advance to the next line
aState.AdvanceToNextLine(aKidFrame, aKidRect.height);
@ -656,19 +669,19 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
*/
void nsBlockFrame::GetAvailSize(nsSize& aResult,
nsBlockReflowState& aState,
nsStyleMolecule* aKidMol,
nsIStyleContext* aKidSC,
PRBool aIsInline)
{
// Determine the maximum available reflow height for the child
nscoord yb = aState.borderPadding.top + aState.availSize.height;
aResult.height = aState.unconstrainedHeight ? NS_UNCONSTRAINEDSIZE :
yb - aState.y - aState.topMargin;
yb - aState.y - aState.topMargin;
// Determine the maximum available reflow width for the child
if (aState.unconstrainedWidth) {
aResult.width = NS_UNCONSTRAINEDSIZE;
} else if (aIsInline) {
if (NS_STYLE_DIRECTION_LTR == aState.mol->direction) {
if (NS_STYLE_DIRECTION_LTR == aState.styleDisplay->mDirection) {
aResult.width = aState.currentBand->trapezoids[0].xTopRight - aState.x;
} else {
aResult.width = aState.x - aState.currentBand->trapezoids[0].xTopLeft;
@ -830,13 +843,15 @@ getBand:
}
if (isLeftFloater) {
if ((aClear == NS_STYLE_CLEAR_LEFT) || (aClear == NS_STYLE_CLEAR_BOTH)) {
if ((aClear == NS_STYLE_CLEAR_LEFT) ||
(aClear == NS_STYLE_CLEAR_LEFT_AND_RIGHT)) {
aState.y += aState.currentBand->trapezoids[0].GetHeight();
goto getBand;
}
}
if (isRightFloater) {
if ((aClear == NS_STYLE_CLEAR_RIGHT) || (aClear == NS_STYLE_CLEAR_BOTH)) {
if ((aClear == NS_STYLE_CLEAR_RIGHT) ||
(aClear == NS_STYLE_CLEAR_LEFT_AND_RIGHT)) {
aState.y += aState.currentBand->trapezoids[0].GetHeight();
goto getBand;
}
@ -853,7 +868,7 @@ PRIntn
nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
nsSize kidMaxElementSize;
nsSize* pKidMaxElementSize =
@ -866,17 +881,12 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
// Get kid and its style
// XXX How is this any different than what was passed in to us as aKidMol?
nsIContentPtr kid;
nsIStyleContextPtr kidSC;
aKidFrame->GetContent(kid.AssignRef());
aKidFrame->GetStyleContext(aCX, kidSC.AssignRef());
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStyleDisplay* styleDisplay = (nsStyleDisplay*)
aKidSC->GetData(kStyleDisplaySID);
// Figure out if kid is a block element or not
PRBool isInline = PR_TRUE;
PRIntn display = kidMol->display;
PRIntn display = styleDisplay->mDisplay;
if (aState.firstChildIsInsideBullet && (mFirstChild == aKidFrame)) {
// XXX Special hack for properly reflowing bullets that have the
// inside value for list-style-position.
@ -909,15 +919,20 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
aState.lineStart = aKidFrame;
// Get the style for the last child, and see if it wanted to clear floaters.
// This handles the BR tag, which is the only inline element for which clear
// applies
// Get the style for the last child, and see if it wanted to clear
// floaters. This handles the BR tag, which is the only inline
// element for which clear applies
nsIStyleContextPtr lastChildSC;
lastFrame->GetStyleContext(aCX, lastChildSC.AssignRef());
nsStyleMolecule* lastChildMol = (nsStyleMolecule*)lastChildSC->GetData(kStyleMoleculeSID);
if (lastChildMol->clear != NS_STYLE_CLEAR_NONE) {
ClearFloaters(aState, lastChildMol->clear);
nsStyleDisplay* lastChildDisplay = (nsStyleDisplay*)
lastChildSC->GetData(kStyleDisplaySID);
switch (lastChildDisplay->mBreakType) {
case NS_STYLE_CLEAR_LEFT:
case NS_STYLE_CLEAR_RIGHT:
case NS_STYLE_CLEAR_LEFT_AND_RIGHT:
ClearFloaters(aState, lastChildDisplay->mBreakType);
break;
}
}
@ -929,7 +944,8 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// should use
if (aState.lineStart == aKidFrame) {
// Compute the top margin to use for this line
aState.topMargin = GetTopMarginFor(aCX, aState, aKidFrame, kidMol, aState.isInline);
aState.topMargin = GetTopMarginFor(aCX, aState, aKidFrame, aKidSC,
aState.isInline);
// If it's an inline element then get a band of available space
//
@ -943,7 +959,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// Compute the available space to reflow the child into and then
// reflow it into that space.
nsSize kidAvailSize;
GetAvailSize(kidAvailSize, aState, kidMol, aState.isInline);
GetAvailSize(kidAvailSize, aState, aKidSC, aState.isInline);
if ((aState.currentLineNumber > 0) && (kidAvailSize.height <= 0)) {
// No more room
return 0;
@ -990,7 +1006,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
GetAvailableSpaceBand(aState, aState.y + aState.topMargin);
// Reflow child now that it has the line to itself
GetAvailSize(kidAvailSize, aState, kidMol, PR_TRUE);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_TRUE);
status = ReflowChild(aKidFrame, aCX, kidSize, kidAvailSize,
pKidMaxElementSize);
}
@ -1017,7 +1033,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
if (isSplittable != frNotSplittable) {
// Update size info now that we are on the next line. Then
// reflow the child into the new available space.
GetAvailSize(kidAvailSize, aState, kidMol, PR_TRUE);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_TRUE);
status = ReflowChild(aKidFrame, aCX, kidSize, kidAvailSize,
pKidMaxElementSize);
@ -1044,21 +1060,27 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
// Add child to the line
AddInlineChildToLine(aCX, aState, aKidFrame, kidSize, pKidMaxElementSize, kidMol);
AddInlineChildToLine(aCX, aState, aKidFrame, kidSize,
pKidMaxElementSize, aKidSC);
} else {
nsRect kidRect;
// Does the block-level element want to clear any floaters that impact
// it? Note that the clear property only applies to block-level elements
// and the BR tag
if (aKidMol->clear != NS_STYLE_CLEAR_NONE) {
ClearFloaters(aState, aKidMol->clear);
GetAvailSize(kidAvailSize, aState, kidMol, PR_FALSE);
nsStyleDisplay* styleDisplay = (nsStyleDisplay*)
aKidSC->GetData(kStyleDisplaySID);
switch (styleDisplay->mBreakType) {
case NS_STYLE_CLEAR_LEFT:
case NS_STYLE_CLEAR_RIGHT:
case NS_STYLE_CLEAR_LEFT_AND_RIGHT:
ClearFloaters(aState, styleDisplay->mBreakType);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_FALSE);
if ((aState.currentLineNumber > 0) && (kidAvailSize.height <= 0)) {
// No more room
return 0;
}
break;
}
// Give the block its own local coordinate space.. Note: ReflowChild()
@ -1066,8 +1088,8 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// current left/right edge
aState.spaceManager->Translate(aState.borderPadding.left, 0);
// Give the block-level element the opportunity to use the space manager
status = ReflowChild(aKidFrame, aCX, kidMol, aState.spaceManager, kidAvailSize,
kidRect, pKidMaxElementSize);
status = ReflowChild(aKidFrame, aCX, aState.spaceManager,
kidAvailSize, kidRect, pKidMaxElementSize);
aState.spaceManager->Translate(-aState.borderPadding.left, 0);
// For first children, we skip all the fit checks because we must
@ -1087,7 +1109,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// calls AdvaneceToNextLine(). We need to restructure the flow of control,
// and use a state machine...
aState.lastContentIsComplete = PRBool(status == frComplete);
AddBlockChild(aCX, aState, aKidFrame, kidRect, pKidMaxElementSize, kidMol);
AddBlockChild(aCX, aState, aKidFrame, kidRect, pKidMaxElementSize, aKidSC);
}
// If we just reflowed our last child then update the
@ -1147,7 +1169,6 @@ nsBlockFrame::ReflowMappedChildren(nsIPresContext* aCX,
kidFrame->GetContent(kid.AssignRef());
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
// Attempt to place and reflow the child
@ -1155,7 +1176,7 @@ nsBlockFrame::ReflowMappedChildren(nsIPresContext* aCX,
// it is, otherwise advance to the next line and place it there if
// possible
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
ReflowStatus status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// The child doesn't fit. Push it and any remaining children.
@ -1237,8 +1258,9 @@ PRBool nsBlockFrame::MoreToReflow(nsIPresContext* aCX)
if (nsnull != kid) {
// Resolve style for the kid
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
switch (kidMol->display) {
nsStyleDisplay* kidStyleDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
switch (kidStyleDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Block pseudo-frames do not contain other block elements
@ -1303,21 +1325,23 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// Resolve style for the kid
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStylePosition* kidPosition = (nsStylePosition*)kidSC->GetData(kStylePositionSID);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStylePosition* kidPosition = (nsStylePosition*)
kidSC->GetData(kStylePositionSID);
nsStyleDisplay* kidDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
// Check whether it wants to floated or absolutely positioned
if (NS_STYLE_POSITION_ABSOLUTE == kidPosition->mPosition) {
AbsoluteFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidSC);
} else if (kidMol->floats != NS_STYLE_FLOAT_NONE) {
} else if (kidDisplay->mFloats != NS_STYLE_FLOAT_NONE) {
PlaceholderFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidSC);
} else if (nsnull == kidPrevInFlow) {
// Create initial frame for the child
nsIContentDelegate* kidDel;
nsresult fr;
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Pseudo block frames do not contain other block elements
@ -1378,7 +1402,7 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// complete.
ReflowStatus status;
do {
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// We ran out of room.
@ -1411,7 +1435,6 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// Switch to new kid style
kidFrame->GetStyleContext(aCX, kidSC.AssignRef());
kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
}
#ifdef NS_DEBUG
nsIFrame* kidNextInFlow;
@ -1493,11 +1516,10 @@ nsBlockFrame::PullUpChildren(nsIPresContext* aCX,
kidFrame->GetContent(kid.AssignRef());
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
ReflowStatus status;
do {
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// Push the kids that didn't fit back down to the next-in-flow
@ -1534,7 +1556,6 @@ nsBlockFrame::PullUpChildren(nsIPresContext* aCX,
// Switch to new kid style
kidFrame->GetStyleContext(aCX, kidSC.AssignRef());
kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
} else {
// The child has a next-in-flow, but it's not one of ours.
// It *must* be in one of our next-in-flows. Collect it
@ -1597,20 +1618,19 @@ void nsBlockFrame::SetupState(nsIPresContext* aCX,
nsISpaceManager* aSpaceManager)
{
// Setup reflow state
nsStyleMolecule* mol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsStyleFont* font =
(nsStyleFont*)mStyleContext->GetData(kStyleFontSID);
aState.Init(aMaxSize, aMaxElementSize, font, mol, aSpaceManager);
aState.Init(aMaxSize, aMaxElementSize, mStyleContext, aSpaceManager);
nsStyleSpacing* mySpacing = (nsStyleSpacing*)
mStyleContext->GetData(kStyleSpacingSID);
// Apply border and padding adjustments for regular frames only
if (PR_FALSE == IsPseudoFrame()) {
aState.borderPadding = mol->borderPadding;
aState.y = mol->borderPadding.top;
aState.borderPadding = mySpacing->mBorderPadding;
aState.y = mySpacing->mBorderPadding.top;
aState.availSize.width -=
(mol->borderPadding.left + mol->borderPadding.right);
(mySpacing->mBorderPadding.left + mySpacing->mBorderPadding.right);
aState.availSize.height -=
(mol->borderPadding.top + mol->borderPadding.bottom);
(mySpacing->mBorderPadding.top + mySpacing->mBorderPadding.bottom);
} else {
aState.borderPadding.SizeTo(0, 0, 0, 0);
}
@ -1830,8 +1850,7 @@ void nsBlockFrame::JustifyLines(nsIPresContext* aCX,
// Finally, now that the in-flow positions of the line's frames are
// known we can apply relative positioning if any of them need it.
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol,
lineStart, mLines[i]);
nsCSSLayout::RelativePositionChildren(aCX, this, lineStart, mLines[i]);
}
}
@ -1952,7 +1971,8 @@ void nsBlockFrame::PlaceFloater(nsIPresContext* aCX,
nsIStyleContextPtr styleContext;
aFloater->GetStyleContext(aCX, styleContext.AssignRef());
nsStyleMolecule* mol = (nsStyleMolecule*)styleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* floaterDisplay = (nsStyleDisplay*)
styleContext->GetData(kStyleDisplaySID);
if (!mCurrentState->isInline) {
// Get the current band for this line
@ -1965,10 +1985,10 @@ void nsBlockFrame::PlaceFloater(nsIPresContext* aCX,
aFloater->GetRect(region);
region.y = mCurrentState->currentBand->trapezoids[0].yTop;
if (NS_STYLE_FLOAT_LEFT == mol->floats) {
if (NS_STYLE_FLOAT_LEFT == floaterDisplay->mFloats) {
region.x = mCurrentState->currentBand->trapezoids[0].xTopLeft;
} else {
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == mol->floats, "bad float type");
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == floaterDisplay->mFloats, "bad float type");
region.x = mCurrentState->currentBand->trapezoids[0].xTopRight - region.width;
}
@ -1997,9 +2017,10 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
{
// Get the last-in-flow
nsBlockFrame* flow = (nsBlockFrame*)GetLastInFlow();
PRInt32 kidIndex = flow->NextChildOffset();
PRInt32 startIndex = kidIndex;
#if 0
nsIFrame* kidFrame = nsnull;
nsIFrame* prevKidFrame;
@ -2013,16 +2034,17 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
// Resolve style for the kid
nsIStyleContextPtr kidSC = aPresContext->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStyleDisplay* kidDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
// Is it a floater?
if (kidMol->floats != NS_STYLE_FLOAT_NONE) {
if (kidDisplay->mFloats != NS_STYLE_FLOAT_NONE) {
PlaceholderFrame::NewFrame(&kidFrame, kid, kidIndex, this);
} else {
// Create initial frame for the child
nsIContentDelegate* kidDel;
nsresult fr;
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Pseudo block frames do not contain other block elements
@ -2073,6 +2095,7 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
mChildCount++;
}
SetLastContentOffset(prevKidFrame);
#endif
// If this is a pseudo-frame then our parent will generate the
// reflow command. Otherwise, if the container is us then we should
@ -2106,7 +2129,14 @@ nsHTMLFrameType nsBlockFrame::GetFrameType() const
NS_METHOD nsBlockFrame::ListTag(FILE* out) const
{
if ((nsnull != mGeometricParent) && IsPseudoFrame()) {
fprintf(out, "*block(%d)@%p", mIndexInParent, this);
fprintf(out, "*block<");
nsIAtom* atom = mContent->GetTag();
if (nsnull != atom) {
nsAutoString tmp;
atom->ToString(tmp);
fputs(tmp, out);
}
fprintf(out, ">(%d)@%p", mIndexInParent, this);
} else {
nsHTMLContainerFrame::ListTag(out);
}

View File

@ -48,9 +48,12 @@
static NS_DEFINE_IID(kIRunaroundIID, NS_IRUNAROUND_IID);
static NS_DEFINE_IID(kIFloaterContainerIID, NS_IFLOATERCONTAINER_IID);
static NS_DEFINE_IID(kIAnchoredItemsIID, NS_IANCHOREDITEMS_IID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleDisplaySID, NS_STYLEDISPLAY_SID);
static NS_DEFINE_IID(kStyleFontSID, NS_STYLEFONT_SID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
NS_DEF_PTR(nsIStyleContext);
NS_DEF_PTR(nsIContent);
@ -100,8 +103,7 @@ nsBlockReflowState::nsBlockReflowState()
void nsBlockReflowState::Init(const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleFont* aFont,
nsStyleMolecule* aMol,
nsIStyleContext* aBlockSC,
nsISpaceManager* aSpaceManager)
{
firstLine = PR_TRUE;
@ -114,8 +116,15 @@ void nsBlockReflowState::Init(const nsSize& aMaxSize,
spaceManager = aSpaceManager;
currentBand = new BlockBandData;
font = aFont;
mol = aMol;
styleContext = aBlockSC;
styleText = (nsStyleText*) aBlockSC->GetData(kStyleTextSID);
styleFont = (nsStyleFont*) aBlockSC->GetData(kStyleFontSID);
styleDisplay = (nsStyleDisplay*) aBlockSC->GetData(kStyleDisplaySID);
justifying = (NS_STYLE_TEXT_ALIGN_JUSTIFY == styleText->mTextAlign) &&
(NS_STYLE_WHITESPACE_PRE != styleText->mWhiteSpace);
availSize.width = aMaxSize.width;
availSize.height = aMaxSize.height;
maxElementSize = aMaxElementSize;
@ -155,8 +164,6 @@ void nsBlockReflowState::Init(const nsSize& aMaxSize,
unconstrainedWidth = PRBool(aMaxSize.width == NS_UNCONSTRAINEDSIZE);
unconstrainedHeight = PRBool(aMaxSize.height == NS_UNCONSTRAINEDSIZE);
justifying = (NS_STYLE_TEXT_ALIGN_JUSTIFY == mol->textAlign) &&
(NS_STYLE_WHITESPACE_PRE != mol->whiteSpace);
reflowStatus = nsIFrame::frNotComplete;
}
@ -300,11 +307,11 @@ nsBlockFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
// type and the display type of the previous child frame.
//
// Adjacent vertical margins between block-level elements are collapsed.
nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol,
PRBool aIsInline)
nsIFrame* aKidFrame,
nsIStyleContext* aKidSC,
PRBool aIsInline)
{
if (aIsInline) {
// Just use whatever the previous bottom margin was
@ -318,10 +325,11 @@ nscoord nsBlockFrame::GetTopMarginFor(nsIPresContext* aCX,
if (nsnull == kidPrevInFlow) {
nscoord maxNegTopMargin = 0;
nscoord maxPosTopMargin = 0;
if (aKidMol->margin.top < 0) {
maxNegTopMargin = -aKidMol->margin.top;
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
if (ss->mMargin.top < 0) {
maxNegTopMargin = -ss->mMargin.top;
} else {
maxPosTopMargin = aKidMol->margin.top;
maxPosTopMargin = ss->mMargin.top;
}
nscoord maxPos = PR_MAX(aState.prevMaxPosBottomMargin, maxPosTopMargin);
@ -354,20 +362,22 @@ void nsBlockFrame::PlaceBelowCurrentLineFloaters(nsIPresContext* aCX,
nsIStyleContextPtr styleContext;
floater->GetStyleContext(aCX, styleContext.AssignRef());
nsStyleMolecule* mol = (nsStyleMolecule*)styleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* sd = (nsStyleDisplay*)
styleContext->GetData(kStyleDisplaySID);
floater->GetRect(region);
region.y = mCurrentState->currentBand->trapezoids[0].yTop;
if (NS_STYLE_FLOAT_LEFT == mol->floats) {
if (NS_STYLE_FLOAT_LEFT == sd->mFloats) {
region.x = mCurrentState->currentBand->trapezoids[0].xTopLeft;
} else {
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == mol->floats, "bad float type");
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == sd->mFloats, "bad float type");
region.x = mCurrentState->currentBand->trapezoids[0].xTopRight - region.width;
}
// XXX Don't forget the floater's margins...
mCurrentState->spaceManager->Translate(mCurrentState->borderPadding.left, 0);
mCurrentState->spaceManager->Translate(mCurrentState->borderPadding.left,
0);
mCurrentState->spaceManager->AddRectRegion(region, floater);
// Set the origin of the floater in world coordinates
@ -398,9 +408,13 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
if (aState.isInline) {
// Vertically align the children on this line, returning the height of
// the line upon completion.
lineHeight = nsCSSLayout::VerticallyAlignChildren(aCX, this, aState.font, y,
aState.lineStart, aState.lineLength,
aState.ascents, aState.maxAscent);
lineHeight = nsCSSLayout::VerticallyAlignChildren(aCX, this,
aState.styleFont,
y,
aState.lineStart,
aState.lineLength,
aState.ascents,
aState.maxAscent);
// Any below current line floaters to place?
if (aState.floaterToDo.Count() > 0) {
@ -445,7 +459,7 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
// doing an unconstrained (in x) reflow. There's no point in doing
// the work if we *know* we are going to reflowed again.
if (!aState.unconstrainedWidth) {
nsCSSLayout::HorizontallyPlaceChildren(aCX, this, aState.mol,
nsCSSLayout::HorizontallyPlaceChildren(aCX, this, aState.styleText,
aState.lineStart, aState.lineLength,
aState.lineWidth,
aState.availSize.width);
@ -453,7 +467,7 @@ PRBool nsBlockFrame::AdvanceToNextLine(nsIPresContext* aCX,
// Finally, now that the in-flow positions of the line's frames are
// known we can apply relative positioning if any of them need it.
if (!aState.justifying) {
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol,
nsCSSLayout::RelativePositionChildren(aCX, this,
aState.lineStart,
aState.lineLength);
}
@ -499,17 +513,15 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
nsIFrame* aKidFrame,
nsReflowMetrics& aKidSize,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
NS_PRECONDITION(nsnull != aState.lineStart, "bad line");
nsStylePosition* kidPosition;
// Get the position style data
aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition);
nsStyleDisplay* ds = (nsStyleDisplay*) aKidSC->GetData(kStyleDisplaySID);
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
nsStylePosition* sp = (nsStylePosition*) aKidSC->GetData(kStylePositionSID);
PRIntn direction = aState.mol->direction;
if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) {
if (NS_STYLE_POSITION_RELATIVE == sp->mPosition) {
aState.needRelativePos = PR_TRUE;
}
@ -519,15 +531,16 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
r.y = aState.y;
r.width = aKidSize.width;
r.height = aKidSize.height;
if (NS_STYLE_DIRECTION_LTR == aState.mol->direction) {
if (NS_STYLE_DIRECTION_LTR == aState.styleDisplay->mDirection) {
// Left to right positioning.
r.x = aState.borderPadding.left + aState.x + aKidMol->margin.left;
aState.x += aKidSize.width + aKidMol->margin.left + aKidMol->margin.right;
r.x = aState.borderPadding.left + aState.x + ss->mMargin.left;
aState.x += aKidSize.width + ss->mMargin.left + ss->mMargin.right;
} else {
// Right to left positioning
// XXX what should we do when aState.x goes negative???
r.x = aState.x - aState.borderPadding.right - aKidMol->margin.right - aKidSize.width;
aState.x -= aKidSize.width + aKidMol->margin.right + aKidMol->margin.left;
r.x = aState.x - aState.borderPadding.right - ss->mMargin.right -
aKidSize.width;
aState.x -= aKidSize.width + ss->mMargin.right + ss->mMargin.left;
}
aKidFrame->SetRect(r);
aState.AddAscent(aKidSize.ascent);
@ -551,7 +564,7 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
#if 0
// XXX CSS2 spec says that top/bottom margin don't affect line height
// calculation. We're waiting for clarification on this issue...
if ((margin = aKidMol->margin.top) < 0) {
if ((margin = ss->mMargin.top) < 0) {
margin = -margin;
if (margin > aState.maxNegTopMargin) {
aState.maxNegTopMargin = margin;
@ -562,7 +575,7 @@ void nsBlockFrame::AddInlineChildToLine(nsIPresContext* aCX,
}
}
#endif
if ((margin = aKidMol->margin.bottom) < 0) {
if ((margin = ss->mMargin.bottom) < 0) {
margin = -margin;
if (margin > aState.maxNegBottomMargin) {
aState.maxNegBottomMargin = margin;
@ -593,20 +606,20 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
nsIFrame* aKidFrame,
nsRect& aKidRect,
nsSize* aKidMaxElementSize,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
NS_PRECONDITION(nsnull != aState.lineStart, "bad line");
nsStylePosition* kidPosition;
// Get the position style data
aKidFrame->GetStyleData(kStylePositionSID, (nsStyleStruct*&)kidPosition);
if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) {
nsStyleDisplay* ds = (nsStyleDisplay*) aKidSC->GetData(kStyleDisplaySID);
nsStyleSpacing* ss = (nsStyleSpacing*) aKidSC->GetData(kStyleSpacingSID);
nsStylePosition* sp = (nsStylePosition*) aKidSC->GetData(kStylePositionSID);
if (NS_STYLE_POSITION_RELATIVE == sp->mPosition) {
aState.needRelativePos = PR_TRUE;
}
// Translate from the kid's coordinate space to our coordinate space
aKidRect.x += aState.borderPadding.left + aKidMol->margin.left;
aKidRect.x += aState.borderPadding.left + ss->mMargin.left;
aKidRect.y += aState.y + aState.topMargin;
// Place and size the child
@ -616,7 +629,7 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
aState.lineLength++;
// Is this the widest child frame?
nscoord xMost = aKidRect.XMost() + aKidMol->margin.right;
nscoord xMost = aKidRect.XMost() + ss->mMargin.right;
if (xMost > aState.kidXMost) {
aState.kidXMost = xMost;
}
@ -633,17 +646,17 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
// and the bottom line margin information which we'll use when placing
// the next child
if (aKidMol->margin.bottom < 0) {
aState.maxNegBottomMargin = -aKidMol->margin.bottom;
if (ss->mMargin.bottom < 0) {
aState.maxNegBottomMargin = -ss->mMargin.bottom;
} else {
aState.maxPosBottomMargin = aKidMol->margin.bottom;
aState.maxPosBottomMargin = ss->mMargin.bottom;
}
// Update the running y-offset
aState.y += aKidRect.height + aState.topMargin;
// Apply relative positioning if necessary
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol, aKidFrame, 1);
nsCSSLayout::RelativePositionChildren(aCX, this, aKidFrame, 1);
// Advance to the next line
aState.AdvanceToNextLine(aKidFrame, aKidRect.height);
@ -656,19 +669,19 @@ void nsBlockFrame::AddBlockChild(nsIPresContext* aCX,
*/
void nsBlockFrame::GetAvailSize(nsSize& aResult,
nsBlockReflowState& aState,
nsStyleMolecule* aKidMol,
nsIStyleContext* aKidSC,
PRBool aIsInline)
{
// Determine the maximum available reflow height for the child
nscoord yb = aState.borderPadding.top + aState.availSize.height;
aResult.height = aState.unconstrainedHeight ? NS_UNCONSTRAINEDSIZE :
yb - aState.y - aState.topMargin;
yb - aState.y - aState.topMargin;
// Determine the maximum available reflow width for the child
if (aState.unconstrainedWidth) {
aResult.width = NS_UNCONSTRAINEDSIZE;
} else if (aIsInline) {
if (NS_STYLE_DIRECTION_LTR == aState.mol->direction) {
if (NS_STYLE_DIRECTION_LTR == aState.styleDisplay->mDirection) {
aResult.width = aState.currentBand->trapezoids[0].xTopRight - aState.x;
} else {
aResult.width = aState.x - aState.currentBand->trapezoids[0].xTopLeft;
@ -830,13 +843,15 @@ getBand:
}
if (isLeftFloater) {
if ((aClear == NS_STYLE_CLEAR_LEFT) || (aClear == NS_STYLE_CLEAR_BOTH)) {
if ((aClear == NS_STYLE_CLEAR_LEFT) ||
(aClear == NS_STYLE_CLEAR_LEFT_AND_RIGHT)) {
aState.y += aState.currentBand->trapezoids[0].GetHeight();
goto getBand;
}
}
if (isRightFloater) {
if ((aClear == NS_STYLE_CLEAR_RIGHT) || (aClear == NS_STYLE_CLEAR_BOTH)) {
if ((aClear == NS_STYLE_CLEAR_RIGHT) ||
(aClear == NS_STYLE_CLEAR_LEFT_AND_RIGHT)) {
aState.y += aState.currentBand->trapezoids[0].GetHeight();
goto getBand;
}
@ -853,7 +868,7 @@ PRIntn
nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
nsBlockReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol)
nsIStyleContext* aKidSC)
{
nsSize kidMaxElementSize;
nsSize* pKidMaxElementSize =
@ -866,17 +881,12 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
// Get kid and its style
// XXX How is this any different than what was passed in to us as aKidMol?
nsIContentPtr kid;
nsIStyleContextPtr kidSC;
aKidFrame->GetContent(kid.AssignRef());
aKidFrame->GetStyleContext(aCX, kidSC.AssignRef());
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStyleDisplay* styleDisplay = (nsStyleDisplay*)
aKidSC->GetData(kStyleDisplaySID);
// Figure out if kid is a block element or not
PRBool isInline = PR_TRUE;
PRIntn display = kidMol->display;
PRIntn display = styleDisplay->mDisplay;
if (aState.firstChildIsInsideBullet && (mFirstChild == aKidFrame)) {
// XXX Special hack for properly reflowing bullets that have the
// inside value for list-style-position.
@ -909,15 +919,20 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
aState.lineStart = aKidFrame;
// Get the style for the last child, and see if it wanted to clear floaters.
// This handles the BR tag, which is the only inline element for which clear
// applies
// Get the style for the last child, and see if it wanted to clear
// floaters. This handles the BR tag, which is the only inline
// element for which clear applies
nsIStyleContextPtr lastChildSC;
lastFrame->GetStyleContext(aCX, lastChildSC.AssignRef());
nsStyleMolecule* lastChildMol = (nsStyleMolecule*)lastChildSC->GetData(kStyleMoleculeSID);
if (lastChildMol->clear != NS_STYLE_CLEAR_NONE) {
ClearFloaters(aState, lastChildMol->clear);
nsStyleDisplay* lastChildDisplay = (nsStyleDisplay*)
lastChildSC->GetData(kStyleDisplaySID);
switch (lastChildDisplay->mBreakType) {
case NS_STYLE_CLEAR_LEFT:
case NS_STYLE_CLEAR_RIGHT:
case NS_STYLE_CLEAR_LEFT_AND_RIGHT:
ClearFloaters(aState, lastChildDisplay->mBreakType);
break;
}
}
@ -929,7 +944,8 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// should use
if (aState.lineStart == aKidFrame) {
// Compute the top margin to use for this line
aState.topMargin = GetTopMarginFor(aCX, aState, aKidFrame, kidMol, aState.isInline);
aState.topMargin = GetTopMarginFor(aCX, aState, aKidFrame, aKidSC,
aState.isInline);
// If it's an inline element then get a band of available space
//
@ -943,7 +959,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// Compute the available space to reflow the child into and then
// reflow it into that space.
nsSize kidAvailSize;
GetAvailSize(kidAvailSize, aState, kidMol, aState.isInline);
GetAvailSize(kidAvailSize, aState, aKidSC, aState.isInline);
if ((aState.currentLineNumber > 0) && (kidAvailSize.height <= 0)) {
// No more room
return 0;
@ -990,7 +1006,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
GetAvailableSpaceBand(aState, aState.y + aState.topMargin);
// Reflow child now that it has the line to itself
GetAvailSize(kidAvailSize, aState, kidMol, PR_TRUE);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_TRUE);
status = ReflowChild(aKidFrame, aCX, kidSize, kidAvailSize,
pKidMaxElementSize);
}
@ -1017,7 +1033,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
if (isSplittable != frNotSplittable) {
// Update size info now that we are on the next line. Then
// reflow the child into the new available space.
GetAvailSize(kidAvailSize, aState, kidMol, PR_TRUE);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_TRUE);
status = ReflowChild(aKidFrame, aCX, kidSize, kidAvailSize,
pKidMaxElementSize);
@ -1044,21 +1060,27 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
}
// Add child to the line
AddInlineChildToLine(aCX, aState, aKidFrame, kidSize, pKidMaxElementSize, kidMol);
AddInlineChildToLine(aCX, aState, aKidFrame, kidSize,
pKidMaxElementSize, aKidSC);
} else {
nsRect kidRect;
// Does the block-level element want to clear any floaters that impact
// it? Note that the clear property only applies to block-level elements
// and the BR tag
if (aKidMol->clear != NS_STYLE_CLEAR_NONE) {
ClearFloaters(aState, aKidMol->clear);
GetAvailSize(kidAvailSize, aState, kidMol, PR_FALSE);
nsStyleDisplay* styleDisplay = (nsStyleDisplay*)
aKidSC->GetData(kStyleDisplaySID);
switch (styleDisplay->mBreakType) {
case NS_STYLE_CLEAR_LEFT:
case NS_STYLE_CLEAR_RIGHT:
case NS_STYLE_CLEAR_LEFT_AND_RIGHT:
ClearFloaters(aState, styleDisplay->mBreakType);
GetAvailSize(kidAvailSize, aState, aKidSC, PR_FALSE);
if ((aState.currentLineNumber > 0) && (kidAvailSize.height <= 0)) {
// No more room
return 0;
}
break;
}
// Give the block its own local coordinate space.. Note: ReflowChild()
@ -1066,8 +1088,8 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// current left/right edge
aState.spaceManager->Translate(aState.borderPadding.left, 0);
// Give the block-level element the opportunity to use the space manager
status = ReflowChild(aKidFrame, aCX, kidMol, aState.spaceManager, kidAvailSize,
kidRect, pKidMaxElementSize);
status = ReflowChild(aKidFrame, aCX, aState.spaceManager,
kidAvailSize, kidRect, pKidMaxElementSize);
aState.spaceManager->Translate(-aState.borderPadding.left, 0);
// For first children, we skip all the fit checks because we must
@ -1087,7 +1109,7 @@ nsBlockFrame::PlaceAndReflowChild(nsIPresContext* aCX,
// calls AdvaneceToNextLine(). We need to restructure the flow of control,
// and use a state machine...
aState.lastContentIsComplete = PRBool(status == frComplete);
AddBlockChild(aCX, aState, aKidFrame, kidRect, pKidMaxElementSize, kidMol);
AddBlockChild(aCX, aState, aKidFrame, kidRect, pKidMaxElementSize, aKidSC);
}
// If we just reflowed our last child then update the
@ -1147,7 +1169,6 @@ nsBlockFrame::ReflowMappedChildren(nsIPresContext* aCX,
kidFrame->GetContent(kid.AssignRef());
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
// Attempt to place and reflow the child
@ -1155,7 +1176,7 @@ nsBlockFrame::ReflowMappedChildren(nsIPresContext* aCX,
// it is, otherwise advance to the next line and place it there if
// possible
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
ReflowStatus status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// The child doesn't fit. Push it and any remaining children.
@ -1237,8 +1258,9 @@ PRBool nsBlockFrame::MoreToReflow(nsIPresContext* aCX)
if (nsnull != kid) {
// Resolve style for the kid
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
switch (kidMol->display) {
nsStyleDisplay* kidStyleDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
switch (kidStyleDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Block pseudo-frames do not contain other block elements
@ -1303,21 +1325,23 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// Resolve style for the kid
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStylePosition* kidPosition = (nsStylePosition*)kidSC->GetData(kStylePositionSID);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStylePosition* kidPosition = (nsStylePosition*)
kidSC->GetData(kStylePositionSID);
nsStyleDisplay* kidDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
// Check whether it wants to floated or absolutely positioned
if (NS_STYLE_POSITION_ABSOLUTE == kidPosition->mPosition) {
AbsoluteFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidSC);
} else if (kidMol->floats != NS_STYLE_FLOAT_NONE) {
} else if (kidDisplay->mFloats != NS_STYLE_FLOAT_NONE) {
PlaceholderFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidSC);
} else if (nsnull == kidPrevInFlow) {
// Create initial frame for the child
nsIContentDelegate* kidDel;
nsresult fr;
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Pseudo block frames do not contain other block elements
@ -1378,7 +1402,7 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// complete.
ReflowStatus status;
do {
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// We ran out of room.
@ -1411,7 +1435,6 @@ nsBlockFrame::ReflowAppendedChildren(nsIPresContext* aCX,
// Switch to new kid style
kidFrame->GetStyleContext(aCX, kidSC.AssignRef());
kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
}
#ifdef NS_DEBUG
nsIFrame* kidNextInFlow;
@ -1493,11 +1516,10 @@ nsBlockFrame::PullUpChildren(nsIPresContext* aCX,
kidFrame->GetContent(kid.AssignRef());
nsIStyleContextPtr kidSC = aCX->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
ReflowStatus status;
do {
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidMol);
PRIntn placeStatus = PlaceAndReflowChild(aCX, aState, kidFrame, kidSC);
status = aState.reflowStatus;
if (0 == (placeStatus & PLACE_FIT)) {
// Push the kids that didn't fit back down to the next-in-flow
@ -1534,7 +1556,6 @@ nsBlockFrame::PullUpChildren(nsIPresContext* aCX,
// Switch to new kid style
kidFrame->GetStyleContext(aCX, kidSC.AssignRef());
kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
} else {
// The child has a next-in-flow, but it's not one of ours.
// It *must* be in one of our next-in-flows. Collect it
@ -1597,20 +1618,19 @@ void nsBlockFrame::SetupState(nsIPresContext* aCX,
nsISpaceManager* aSpaceManager)
{
// Setup reflow state
nsStyleMolecule* mol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsStyleFont* font =
(nsStyleFont*)mStyleContext->GetData(kStyleFontSID);
aState.Init(aMaxSize, aMaxElementSize, font, mol, aSpaceManager);
aState.Init(aMaxSize, aMaxElementSize, mStyleContext, aSpaceManager);
nsStyleSpacing* mySpacing = (nsStyleSpacing*)
mStyleContext->GetData(kStyleSpacingSID);
// Apply border and padding adjustments for regular frames only
if (PR_FALSE == IsPseudoFrame()) {
aState.borderPadding = mol->borderPadding;
aState.y = mol->borderPadding.top;
aState.borderPadding = mySpacing->mBorderPadding;
aState.y = mySpacing->mBorderPadding.top;
aState.availSize.width -=
(mol->borderPadding.left + mol->borderPadding.right);
(mySpacing->mBorderPadding.left + mySpacing->mBorderPadding.right);
aState.availSize.height -=
(mol->borderPadding.top + mol->borderPadding.bottom);
(mySpacing->mBorderPadding.top + mySpacing->mBorderPadding.bottom);
} else {
aState.borderPadding.SizeTo(0, 0, 0, 0);
}
@ -1830,8 +1850,7 @@ void nsBlockFrame::JustifyLines(nsIPresContext* aCX,
// Finally, now that the in-flow positions of the line's frames are
// known we can apply relative positioning if any of them need it.
nsCSSLayout::RelativePositionChildren(aCX, this, aState.mol,
lineStart, mLines[i]);
nsCSSLayout::RelativePositionChildren(aCX, this, lineStart, mLines[i]);
}
}
@ -1952,7 +1971,8 @@ void nsBlockFrame::PlaceFloater(nsIPresContext* aCX,
nsIStyleContextPtr styleContext;
aFloater->GetStyleContext(aCX, styleContext.AssignRef());
nsStyleMolecule* mol = (nsStyleMolecule*)styleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* floaterDisplay = (nsStyleDisplay*)
styleContext->GetData(kStyleDisplaySID);
if (!mCurrentState->isInline) {
// Get the current band for this line
@ -1965,10 +1985,10 @@ void nsBlockFrame::PlaceFloater(nsIPresContext* aCX,
aFloater->GetRect(region);
region.y = mCurrentState->currentBand->trapezoids[0].yTop;
if (NS_STYLE_FLOAT_LEFT == mol->floats) {
if (NS_STYLE_FLOAT_LEFT == floaterDisplay->mFloats) {
region.x = mCurrentState->currentBand->trapezoids[0].xTopLeft;
} else {
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == mol->floats, "bad float type");
NS_ASSERTION(NS_STYLE_FLOAT_RIGHT == floaterDisplay->mFloats, "bad float type");
region.x = mCurrentState->currentBand->trapezoids[0].xTopRight - region.width;
}
@ -1997,9 +2017,10 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
{
// Get the last-in-flow
nsBlockFrame* flow = (nsBlockFrame*)GetLastInFlow();
PRInt32 kidIndex = flow->NextChildOffset();
PRInt32 startIndex = kidIndex;
#if 0
nsIFrame* kidFrame = nsnull;
nsIFrame* prevKidFrame;
@ -2013,16 +2034,17 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
// Resolve style for the kid
nsIStyleContextPtr kidSC = aPresContext->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStyleDisplay* kidDisplay = (nsStyleDisplay*)
kidSC->GetData(kStyleDisplaySID);
// Is it a floater?
if (kidMol->floats != NS_STYLE_FLOAT_NONE) {
if (kidDisplay->mFloats != NS_STYLE_FLOAT_NONE) {
PlaceholderFrame::NewFrame(&kidFrame, kid, kidIndex, this);
} else {
// Create initial frame for the child
nsIContentDelegate* kidDel;
nsresult fr;
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
// Pseudo block frames do not contain other block elements
@ -2073,6 +2095,7 @@ NS_METHOD nsBlockFrame::ContentAppended(nsIPresShell* aShell,
mChildCount++;
}
SetLastContentOffset(prevKidFrame);
#endif
// If this is a pseudo-frame then our parent will generate the
// reflow command. Otherwise, if the container is us then we should
@ -2106,7 +2129,14 @@ nsHTMLFrameType nsBlockFrame::GetFrameType() const
NS_METHOD nsBlockFrame::ListTag(FILE* out) const
{
if ((nsnull != mGeometricParent) && IsPseudoFrame()) {
fprintf(out, "*block(%d)@%p", mIndexInParent, this);
fprintf(out, "*block<");
nsIAtom* atom = mContent->GetTag();
if (nsnull != atom) {
nsAutoString tmp;
atom->ToString(tmp);
fputs(tmp, out);
}
fprintf(out, ">(%d)@%p", mIndexInParent, this);
} else {
nsHTMLContainerFrame::ListTag(out);
}

View File

@ -31,7 +31,8 @@
static NS_DEFINE_IID(kIRunaroundIID, NS_IRUNAROUND_IID);
static NS_DEFINE_IID(kIAnchoredItemsIID, NS_IANCHOREDITEMS_IID);
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
nsresult nsBodyFrame::NewFrame(nsIFrame** aInstancePtrResult,
nsIContent* aContent,
@ -104,7 +105,7 @@ void nsBodyFrame::CreateColumnFrame(nsIPresContext* aPresContext)
}
nsSize nsBodyFrame::GetColumnAvailSpace(nsIPresContext* aPresContext,
nsStyleMolecule* aMol,
nsStyleSpacing* aSpacing,
const nsSize& aMaxSize)
{
nsSize result(aMaxSize);
@ -114,7 +115,8 @@ nsSize nsBodyFrame::GetColumnAvailSpace(nsIPresContext* aPresContext,
if (!IsPseudoFrame()) {
// If our width is constrained then subtract for the border/padding
if (aMaxSize.width != NS_UNCONSTRAINEDSIZE) {
result.width -= aMol->borderPadding.left + aMol->borderPadding.right;
result.width -= aSpacing->mBorderPadding.left +
aSpacing->mBorderPadding.right;
if (! aPresContext->IsPaginated()) {
nsIDeviceContext* dc = aPresContext->GetDeviceContext();
result.width -= NS_TO_INT_ROUND(dc->GetScrollBarWidth());
@ -123,7 +125,8 @@ nsSize nsBodyFrame::GetColumnAvailSpace(nsIPresContext* aPresContext,
}
// If our height is constrained then subtract for the border/padding
if (aMaxSize.height != NS_UNCONSTRAINEDSIZE) {
result.height -= aMol->borderPadding.top + aMol->borderPadding.bottom;
result.height -= aSpacing->mBorderPadding.top +
aSpacing->mBorderPadding.bottom;
}
}
@ -150,18 +153,19 @@ NS_METHOD nsBodyFrame::ResizeReflow(nsIPresContext* aPresContext,
mSpaceManager->ClearRegions();
// Get our border/padding info
nsStyleMolecule* myMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsStyleSpacing* mySpacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
// Compute the column's max size
nsSize columnMaxSize = GetColumnAvailSpace(aPresContext, myMol, aMaxSize);
nsSize columnMaxSize = GetColumnAvailSpace(aPresContext, mySpacing,
aMaxSize);
// XXX Style code should be dealing with this...
PRBool isPseudoFrame = IsPseudoFrame();
nscoord leftInset = 0, topInset = 0;
if (!isPseudoFrame) {
leftInset = myMol->borderPadding.left;
topInset = myMol->borderPadding.top;
leftInset = mySpacing->mBorderPadding.left;
topInset = mySpacing->mBorderPadding.top;
}
// Get the column's desired rect
@ -188,8 +192,8 @@ NS_METHOD nsBodyFrame::ResizeReflow(nsIPresContext* aPresContext,
aDesiredSize.height = PR_MAX(desiredRect.YMost(), mSpaceManager->YMost());
if (!isPseudoFrame) {
aDesiredSize.width += myMol->borderPadding.left + myMol->borderPadding.right;
aDesiredSize.height += myMol->borderPadding.top + myMol->borderPadding.bottom;
aDesiredSize.width += mySpacing->mBorderPadding.left + mySpacing->mBorderPadding.right;
aDesiredSize.height += mySpacing->mBorderPadding.top + mySpacing->mBorderPadding.bottom;
}
aDesiredSize.ascent = aDesiredSize.height;
aDesiredSize.descent = 0;
@ -247,15 +251,15 @@ NS_METHOD nsBodyFrame::IncrementalReflow(nsIPresContext* aPresContext,
ReflowStatus& aStatus)
{
// Get our border/padding info
nsStyleMolecule* myMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsStyleSpacing* mySpacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
// XXX Style code should be dealing with this...
PRBool isPseudoFrame = IsPseudoFrame();
nscoord leftInset = 0, topInset = 0;
if (!isPseudoFrame) {
leftInset = myMol->borderPadding.left;
topInset = myMol->borderPadding.top;
leftInset = mySpacing->mBorderPadding.left;
topInset = mySpacing->mBorderPadding.top;
}
// XXX Clear the list of regions. This fixes a problem with the way reflow
@ -271,7 +275,8 @@ NS_METHOD nsBodyFrame::IncrementalReflow(nsIPresContext* aPresContext,
}
// Compute the column's max size
nsSize columnMaxSize = GetColumnAvailSpace(aPresContext, myMol, aMaxSize);
nsSize columnMaxSize = GetColumnAvailSpace(aPresContext, mySpacing,
aMaxSize);
// Pass the command along to our column pseudo frame
nsIRunaround* reflowRunaround;
@ -295,8 +300,8 @@ NS_METHOD nsBodyFrame::IncrementalReflow(nsIPresContext* aPresContext,
aDesiredSize.width = aDesiredRect.XMost();
aDesiredSize.height = aDesiredRect.YMost();
if (!isPseudoFrame) {
aDesiredSize.width += myMol->borderPadding.left + myMol->borderPadding.right;
aDesiredSize.height += myMol->borderPadding.top + myMol->borderPadding.bottom;
aDesiredSize.width += mySpacing->mBorderPadding.left + mySpacing->mBorderPadding.right;
aDesiredSize.height += mySpacing->mBorderPadding.top + mySpacing->mBorderPadding.bottom;
}
aDesiredSize.ascent = aDesiredSize.height;
aDesiredSize.descent = 0;

View File

@ -23,6 +23,7 @@
struct nsBodyReflowState;
class SpaceManager;
struct nsStyleSpacing;
class nsBodyFrame : public nsHTMLContainerFrame, public nsIAnchoredItems {
public:
@ -74,9 +75,9 @@ private:
SpaceManager* mSpaceManager;
void CreateColumnFrame(nsIPresContext* aPresContext);
nsSize GetColumnAvailSpace(nsIPresContext* aPresContext,
nsStyleMolecule* aStyleMolecule,
const nsSize& aMaxSize);
nsSize GetColumnAvailSpace(nsIPresContext* aPresContext,
nsStyleSpacing* aSpacing,
const nsSize& aMaxSize);
};
#endif /* nsBodyFrame_h___ */

View File

@ -39,7 +39,8 @@
#endif
static NS_DEFINE_IID(kIRunaroundIID, NS_IRUNAROUND_IID);
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
static NS_DEFINE_IID(kStyleDisplaySID, NS_STYLEDISPLAY_SID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
NS_DEF_PTR(nsIStyleContext);
@ -49,9 +50,6 @@ struct ColumnReflowState {
// The space manager to use
nsISpaceManager* spaceManager;
// The body's style molecule
nsStyleMolecule* mol;
// The body's available size (computed from the body's parent)
nsSize availSize;
@ -72,11 +70,9 @@ struct ColumnReflowState {
ColumnReflowState(nsIPresContext* aPresContext,
nsISpaceManager* aSpaceManager,
const nsSize& aMaxSize,
nsStyleMolecule* aMol)
const nsSize& aMaxSize)
{
spaceManager = aSpaceManager;
mol = aMol;
availSize.width = aMaxSize.width;
availSize.height = aMaxSize.height;
kidXMost = 0;
@ -122,7 +118,7 @@ nsresult ColumnFrame::QueryInterface(const nsIID& aIID, void** aInstancePtr)
nscoord ColumnFrame::GetTopMarginFor(nsIPresContext* aCX,
ColumnReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol)
nsStyleSpacing* aKidSpacing)
{
// Does the frame have a prev-in-flow?
nsIFrame* kidPrevInFlow;
@ -136,7 +132,7 @@ nscoord ColumnFrame::GetTopMarginFor(nsIPresContext* aCX,
// XXX Style system should be zero'ing out margins for pseudo frames...
if (!ChildIsPseudoFrame(aKidFrame)) {
if ((margin = aKidMol->margin.top) < 0) {
if ((margin = aKidSpacing->mMargin.top) < 0) {
maxNegTopMargin = -margin;
} else {
maxPosTopMargin = margin;
@ -159,8 +155,8 @@ nscoord ColumnFrame::GetTopMarginFor(nsIPresContext* aCX,
void ColumnFrame::PlaceChild(nsIPresContext* aPresContext,
ColumnReflowState& aState,
nsIFrame* aKidFrame,
nsStyleSpacing* aKidSpacing,
const nsRect& aKidRect,
nsStyleMolecule* aKidMol,
nsSize* aMaxElementSize,
nsSize& aKidMaxElementSize)
{
@ -172,7 +168,7 @@ void ColumnFrame::PlaceChild(nsIPresContext* aPresContext,
aState.spaceManager->Translate(0, aKidRect.height);
// Update the x-most
nscoord xMost = aKidRect.XMost() + aKidMol->margin.right;
nscoord xMost = aKidRect.XMost() + aKidSpacing->mMargin.right;
if (xMost > aState.kidXMost) {
aState.kidXMost = xMost;
}
@ -249,10 +245,15 @@ PRBool ColumnFrame::ReflowMappedChildren(nsIPresContext* aPresContext,
nsIStyleContextPtr kidSC;
kidFrame->GetStyleContext(aPresContext, kidSC.AssignRef());
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidFrame, kidMol);
nsStyleSpacing* kidSpacing = (nsStyleSpacing*)
kidSC->GetData(kStyleSpacingSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState,
kidFrame, kidSpacing);
// XXX Style system should do this...
nscoord bottomMargin = ChildIsPseudoFrame(kidFrame) ? 0 : kidMol->margin.bottom;
nscoord bottomMargin = ChildIsPseudoFrame(kidFrame)
? 0
: kidSpacing->mMargin.bottom;
// Figure out the amount of available size for the child (subtract
// off the top margin we are going to apply to it)
@ -268,7 +269,7 @@ PRBool ColumnFrame::ReflowMappedChildren(nsIPresContext* aPresContext,
if ((kidFrame == mFirstChild) || (kidAvailSize.height > 0)) {
// Reflow the child into the available space
aState.spaceManager->Translate(0, topMargin);
status = ReflowChild(kidFrame, aPresContext, kidMol, aState.spaceManager,
status = ReflowChild(kidFrame, aPresContext, aState.spaceManager,
kidAvailSize, kidRect, pKidMaxElementSize);
aState.spaceManager->Translate(0, -topMargin);
}
@ -298,10 +299,10 @@ PRBool ColumnFrame::ReflowMappedChildren(nsIPresContext* aPresContext,
// Place the child after taking into account it's margin
aState.y += topMargin;
aState.spaceManager->Translate(0, topMargin);
kidRect.x += kidMol->margin.left;
kidRect.x += kidSpacing->mMargin.left;
kidRect.y += aState.y;
PlaceChild(aPresContext, aState, kidFrame, kidRect, kidMol, aMaxElementSize,
kidMaxElementSize);
PlaceChild(aPresContext, aState, kidFrame, kidSpacing,
kidRect, aMaxElementSize, kidMaxElementSize);
if (bottomMargin < 0) {
aState.prevMaxNegBottomMargin = -bottomMargin;
} else {
@ -448,10 +449,15 @@ PRBool ColumnFrame::PullUpChildren(nsIPresContext* aPresContext,
nsIStyleContextPtr kidSC;
kidFrame->GetStyleContext(aPresContext, kidSC.AssignRef());
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidFrame, kidMol);
nsStyleSpacing* kidSpacing = (nsStyleSpacing*)
kidSC->GetData(kStyleSpacingSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState,
kidFrame, kidSpacing);
// XXX Style system should do this...
nscoord bottomMargin = ChildIsPseudoFrame(kidFrame) ? 0 : kidMol->margin.bottom;
nscoord bottomMargin = ChildIsPseudoFrame(kidFrame)
? 0
: kidSpacing->mMargin.bottom;
// Figure out the amount of available size for the child (subtract
// off the top margin we are going to apply to it)
@ -468,7 +474,7 @@ PRBool ColumnFrame::PullUpChildren(nsIPresContext* aPresContext,
// out of space.
if ((kidFrame == mFirstChild) || (kidAvailSize.height > 0)) {
aState.spaceManager->Translate(0, topMargin);
status = ReflowChild(kidFrame, aPresContext, kidMol, aState.spaceManager,
status = ReflowChild(kidFrame, aPresContext, aState.spaceManager,
kidAvailSize, kidRect, pKidMaxElementSize);
aState.spaceManager->Translate(0, -topMargin);
}
@ -497,10 +503,10 @@ PRBool ColumnFrame::PullUpChildren(nsIPresContext* aPresContext,
// Place the child
aState.y += topMargin;
aState.spaceManager->Translate(0, topMargin);
kidRect.x += kidMol->margin.left;
kidRect.x += kidSpacing->mMargin.left;
kidRect.y += aState.y;
PlaceChild(aPresContext, aState, kidFrame, kidRect, kidMol, aMaxElementSize,
kidMaxElementSize);
PlaceChild(aPresContext, aState, kidFrame, kidSpacing,
kidRect, aMaxElementSize, kidMaxElementSize);
if (bottomMargin < 0) {
aState.prevMaxNegBottomMargin = -bottomMargin;
} else {
@ -669,9 +675,12 @@ ColumnFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
// Resolve style
nsIStyleContextPtr kidStyleContext =
aPresContext->ResolveStyleContextFor(kid, this);
nsStylePosition* kidPosition = (nsStylePosition*)kidStyleContext->GetData(kStylePositionSID);
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidStyleContext->GetData(kStyleMoleculeSID);
nsStyleSpacing* kidSpacing = (nsStyleSpacing*)
kidStyleContext->GetData(kStyleSpacingSID);
nsStyleDisplay* kidDisplay = (nsStyleDisplay*)
kidStyleContext->GetData(kStyleDisplaySID);
nsStylePosition* kidPosition = (nsStylePosition*)
kidStyleContext->GetData(kStylePositionSID);
nsBlockFrame* pseudoFrame = nsnull;
nsIFrame* kidFrame;
@ -685,7 +694,7 @@ ColumnFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
} else if (nsnull == kidPrevInFlow) {
// Figure out how to treat the content
nsIContentDelegate* kidDel = nsnull;
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_NONE:
// Create a placeholder frame that takes up no space
NS_ASSERTION(nsnull == kidPrevInFlow, "bad prev in flow");
@ -720,9 +729,13 @@ ColumnFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
}
// Get the child's margins
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidFrame, kidMol);
nscoord topMargin = GetTopMarginFor(aPresContext, aState,
kidFrame, kidSpacing);
// XXX Style system should do this...
nscoord bottomMargin = ChildIsPseudoFrame(kidFrame) ? 0 : kidMol->margin.bottom;
nscoord bottomMargin = ChildIsPseudoFrame(kidFrame)
? 0
: kidSpacing->mMargin.bottom;
// Link the child frame into the list of children and update the
// child count
@ -757,7 +770,7 @@ ColumnFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
// fit or might need continuing
if (kidAvailSize.height > 0) {
aState.spaceManager->Translate(0, topMargin);
status = ReflowChild(kidFrame, aPresContext, kidMol, aState.spaceManager,
status = ReflowChild(kidFrame, aPresContext, aState.spaceManager,
kidAvailSize, kidRect, pKidMaxElementSize);
aState.spaceManager->Translate(0, -topMargin);
}
@ -803,10 +816,10 @@ ColumnFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
// finish).
aState.y += topMargin;
aState.spaceManager->Translate(0, topMargin);
kidRect.x += kidMol->margin.left;
kidRect.x += kidSpacing->mMargin.left;
kidRect.y += aState.y;
PlaceChild(aPresContext, aState, kidFrame, kidRect, kidMol, aMaxElementSize,
kidMaxElementSize);
PlaceChild(aPresContext, aState, kidFrame, kidSpacing,
kidRect, aMaxElementSize, kidMaxElementSize);
if (bottomMargin < 0) {
aState.prevMaxNegBottomMargin = -bottomMargin;
} else {
@ -891,9 +904,7 @@ NS_METHOD ColumnFrame::ResizeReflow(nsIPresContext* aPresContext,
}
// Initialize body reflow state
nsStyleMolecule* myMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
ColumnReflowState state(aPresContext, aSpaceManager, aMaxSize, myMol);
ColumnReflowState state(aPresContext, aSpaceManager, aMaxSize);
// Check for an overflow list
MoveOverflowToChildList();
@ -992,10 +1003,9 @@ NS_METHOD ColumnFrame::IncrementalReflow(nsIPresContext* aPresContext,
NS_NOTYETIMPLEMENTED("unexpected reflow command");
}
#if 0
// Initialize body reflow state
nsStyleMolecule* myMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
ColumnReflowState state(aPresContext, aSpaceManager, aMaxSize, myMol);
ColumnReflowState state(aPresContext, aSpaceManager, aMaxSize);
// Get to the frame that we should begin reflowing (where the
// append occured).
@ -1037,10 +1047,12 @@ NS_METHOD ColumnFrame::IncrementalReflow(nsIPresContext* aPresContext,
nsIStyleContextPtr kidSC;
prevKidFrame->GetStyleContext(aPresContext, kidSC.AssignRef());
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nsStyleSpacing* kidSpacing = (nsStyleSpacing*)
kidSC->GetData(kStyleSpacingSID);
// XXX Style system should do this...
nscoord bottomMargin = ChildIsPseudoFrame(prevKidFrame) ? 0 : kidMol->margin.bottom;
nscoord bottomMargin = ChildIsPseudoFrame(prevKidFrame)
? 0
: kidSpacing->mMargin.bottom;
state.y = startKidRect.YMost();
if (bottomMargin < 0) {
@ -1070,9 +1082,10 @@ NS_METHOD ColumnFrame::IncrementalReflow(nsIPresContext* aPresContext,
nsIStyleContextPtr kidSC;
kidFrame->GetStyleContext(aPresContext, kidSC.AssignRef());
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nscoord topMargin = GetTopMarginFor(aPresContext, state, kidFrame, kidMol);
nsStyleSpacing* kidSpacing = (nsStyleSpacing*)
kidSC->GetData(kStyleSpacingSID);
nscoord topMargin = GetTopMarginFor(aPresContext, state,
kidFrame, kidSpacing);
nsRect kidRect;
nsSize kidAvailSize(state.availSize);
@ -1083,7 +1096,7 @@ NS_METHOD ColumnFrame::IncrementalReflow(nsIPresContext* aPresContext,
// Reflow the child
state.spaceManager->Translate(0, topMargin);
aStatus = ReflowChild(kidFrame, aPresContext, kidMol, state.spaceManager,
aStatus = ReflowChild(kidFrame, aPresContext, state.spaceManager,
kidAvailSize, kidRect, nsnull);
state.spaceManager->Translate(0, -topMargin);
@ -1103,12 +1116,15 @@ NS_METHOD ColumnFrame::IncrementalReflow(nsIPresContext* aPresContext,
state.y += topMargin;
state.spaceManager->Translate(0, topMargin);
nsSize kidMaxElementSize; // XXX unused
kidRect.x += kidMol->margin.left;
kidRect.x += kidSpacing->mMargin.left;
kidRect.y += state.y;
PlaceChild(aPresContext, state, kidFrame, kidRect, kidMol, nsnull,
kidMaxElementSize);
PlaceChild(aPresContext, state, kidFrame, kidSpacing,
kidRect, nsnull, kidMaxElementSize);
// XXX Style system should do this...
nscoord bottomMargin = ChildIsPseudoFrame(kidFrame) ? 0 : kidMol->margin.bottom;
nscoord bottomMargin = ChildIsPseudoFrame(kidFrame)
? 0
: kidSpacing->mMargin.bottom;
if (bottomMargin < 0) {
state.prevMaxNegBottomMargin = -bottomMargin;
} else {
@ -1147,7 +1163,9 @@ NS_METHOD ColumnFrame::IncrementalReflow(nsIPresContext* aPresContext,
aDesiredRect.y = 0;
aDesiredRect.width = state.kidXMost;/* XXX */
aDesiredRect.height = state.y;
#endif
return ResizeReflow(aPresContext, aSpaceManager, aMaxSize, aDesiredRect,
nsnull, aStatus);
} else if (aReflowCommand.GetTarget() == this) {
// The reflow command is targeted for us. This could be a deleted or
// changed reflow command
@ -1171,6 +1189,7 @@ NS_METHOD ColumnFrame::ContentAppended(nsIPresShell* aShell,
nsIPresContext* aPresContext,
nsIContent* aContainer)
{
#if 0
// We must only be called by the body frame since we are a
// pseudo-frame; the body frame makes sure that it's dealing with
// it's last-in-flow therefore we must also be a last-in-flow
@ -1200,32 +1219,18 @@ NS_METHOD ColumnFrame::ContentAppended(nsIPresShell* aShell,
// Get style context for the kid
nsIStyleContextPtr kidStyleContext =
aPresContext->ResolveStyleContextFor(kid, this);
nsStylePosition* kidPosition = (nsStylePosition*)kidStyleContext->GetData(kStylePositionSID);
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidStyleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* kidDisplay = (nsStyleDisplay*)
kidStyleContext->GetData(kStyleDisplaySID);
nsStylePosition* kidPosition = (nsStylePosition*)
kidStyleContext->GetData(kStylePositionSID);
// See what display mode it has
nsIFrame* kidFrame;
nsIContentDelegate* del;
if (NS_STYLE_POSITION_ABSOLUTE == kidPosition->mPosition) {
AbsoluteFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidStyleContext);
// Append it to the child list
if (nsnull == prevKidFrame) {
mFirstChild = kidFrame;
mFirstContentOffset = kidIndex;
} else {
prevKidFrame->SetNextSibling(kidFrame);
}
mChildCount++;
prevKidFrame = kidFrame;
pseudoFrame = nsnull;
kidIndex++;
mLastContentOffset = kidIndex;
} else {
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_NONE:
// Create place holder frame
nsFrame::NewFrame(&kidFrame, kid, kidIndex, this);
@ -1320,6 +1325,7 @@ NS_METHOD ColumnFrame::ContentAppended(nsIPresShell* aShell,
SetLastContentOffset(prevKidFrame);
// Note: Column frames *never* directly generate reflow commands
// because they are always pseudo-frames for bodies.
#endif
return NS_OK;
}

View File

@ -21,6 +21,8 @@
#include "nsHTMLContainerFrame.h"
#include "nsIRunaround.h"
struct nsStyleSpacing;
struct ColumnReflowState;
class ColumnFrame : public nsHTMLContainerFrame, public nsIRunaround {
@ -64,13 +66,13 @@ protected:
nscoord GetTopMarginFor(nsIPresContext* aCX,
ColumnReflowState& aState,
nsIFrame* aKidFrame,
nsStyleMolecule* aKidMol);
nsStyleSpacing* aKidSpacing);
void PlaceChild(nsIPresContext* aPresContext,
ColumnReflowState& aState,
nsIFrame* aKidFrame,
nsStyleSpacing* aKidSpacing,
const nsRect& aKidRect,
nsStyleMolecule* aKidMol,
nsSize* aMaxElementSize,
nsSize& aKidMaxElementSize);

View File

@ -32,9 +32,9 @@
#undef DEBUG_HR_REFCNT
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleFontSID, NS_STYLEFONT_SID);
static NS_DEFINE_IID(kStyleColorSID, NS_STYLECOLOR_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
// Default alignment value (so we can tell an unset value from a set value)
#define ALIGN_UNSET PRUint8(-1)
@ -117,16 +117,16 @@ NS_METHOD HRuleFrame::Paint(nsIPresContext& aPresContext,
nscoord thickness = nscoord(p2t * ((HRulePart*)mContent)->mThickness);
// Get style data
nsStyleMolecule* mol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsStyleSpacing* spacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
nsStyleColor* color =
(nsStyleColor*)mStyleContext->GetData(kStyleColorSID);
nscoord x0 = mol->borderPadding.left;
nscoord y0 = mol->borderPadding.top;
nscoord x0 = spacing->mBorderPadding.left;
nscoord y0 = spacing->mBorderPadding.top;
nscoord width = mRect.width -
(mol->borderPadding.left + mol->borderPadding.right);
(spacing->mBorderPadding.left + spacing->mBorderPadding.right);
nscoord height = mRect.height -
(mol->borderPadding.top + mol->borderPadding.bottom);
(spacing->mBorderPadding.top + spacing->mBorderPadding.bottom);
// Center hrule vertically within the available space
y0 += (height - thickness) / 2;

View File

@ -34,11 +34,11 @@
#include "nsIURL.h"
#include "prprf.h"
static NS_DEFINE_IID(kStyleDisplaySID, NS_STYLEDISPLAY_SID);
static NS_DEFINE_IID(kStyleFontSID, NS_STYLEFONT_SID);
static NS_DEFINE_IID(kStyleColorSID, NS_STYLECOLOR_SID);
static NS_DEFINE_IID(kStyleListSID, NS_STYLELIST_SID);
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
nsresult
NS_NewHTMLContainer(nsIHTMLContent** aInstancePtrResult,
@ -189,13 +189,13 @@ nsIFrame* nsHTMLContainer::CreateFrame(nsIPresContext* aPresContext,
// Resolve style for the piece of content
nsIStyleContext* styleContext =
aPresContext->ResolveStyleContextFor(this, aParentFrame);
nsStyleMolecule* mol =
(nsStyleMolecule*)styleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* styleDisplay =
(nsStyleDisplay*)styleContext->GetData(kStyleDisplaySID);
// Use style to choose what kind of frame to create
nsIFrame* rv;
nsresult fr;
switch (mol->display) {
switch (styleDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
fr = nsBlockFrame::NewFrame(&rv, this, aIndexInParent, aParentFrame);
break;
@ -459,7 +459,8 @@ void nsHTMLContainer::MapAttributesInto(nsIStyleContext* aContext,
// align: enum
GetAttribute(nsHTMLAtoms::align, value);
if (value.GetUnit() == eHTMLUnit_Enumerated) {
// XXX set align from enum
nsStyleText* text = (nsStyleText*)aContext->GetData(kStyleTextSID);
text->mTextAlign = value.GetIntValue();
}
}
else if (mTag == nsHTMLAtoms::a) {

View File

@ -26,6 +26,7 @@
#include "nsCSSLayout.h"
#include "nsPlaceholderFrame.h"
#include "nsReflowCommand.h"
#include "nsHTMLAtoms.h"
#include "nsAbsoluteFrame.h"
// XXX To Do:
@ -36,16 +37,22 @@
// 6. direction support
// 7. CSS line-height property
/* XXX */
#include "nsHTMLIIDs.h"
#include "nsBlockFrame.h"
#define DEFAULT_ASCENT_LEN 10
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleFontSID, NS_STYLEFONT_SID);
static NS_DEFINE_IID(kStyleDisplaySID, NS_STYLEDISPLAY_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
class nsInlineState
{
public:
nsStyleFont* font; // style font
nsStyleMolecule* mol; // style molecule
nsStyleSpacing* spacing; // style spacing
nsSize availSize; // available space in which to reflow (starts as max size minus insets)
nsSize* maxElementSize; // maximum element size (may be null)
nscoord x; // running x-offset (starts at left inner edge)
@ -58,14 +65,14 @@ public:
// Constructor
nsInlineState(nsStyleFont* aStyleFont,
nsStyleMolecule* aStyleMolecule,
nsStyleSpacing* aSpacing,
const nsSize& aMaxSize,
nsSize* aMaxElementSize)
: x(aStyleMolecule->borderPadding.left), // determined by inner edge
y(aStyleMolecule->borderPadding.top) // determined by inner edge
: x(aSpacing->mBorderPadding.left), // determined by inner edge
y(aSpacing->mBorderPadding.top) // determined by inner edge
{
font = aStyleFont;
mol = aStyleMolecule;
spacing = aSpacing;
unconstrainedWidth = PRBool(aMaxSize.width == NS_UNCONSTRAINEDSIZE);
unconstrainedHeight = PRBool(aMaxSize.height == NS_UNCONSTRAINEDSIZE);
@ -74,11 +81,11 @@ public:
// needed for border/padding
availSize.width = aMaxSize.width;
if (PR_FALSE == unconstrainedWidth) {
availSize.width -= mol->borderPadding.left + mol->borderPadding.right;
availSize.width -= aSpacing->mBorderPadding.left + aSpacing->mBorderPadding.right;
}
availSize.height = aMaxSize.height;
if (PR_FALSE == unconstrainedHeight) {
availSize.height -= mol->borderPadding.top + mol->borderPadding.bottom;
availSize.height -= aSpacing->mBorderPadding.top + aSpacing->mBorderPadding.bottom;
}
// Initialize max element size
@ -360,6 +367,10 @@ PRBool nsInlineFrame::PullUpChildren(nsIPresContext* aPresContext,
}
}
// XXX if the frame being pulled up is not appropriate (e.g. a block
// frame) then we should stop! If we have an inline BR tag we should
// stop too!
// See if the child fits in the available space. If it fits or
// it's splittable then reflow it. The reason we can't just move
// it is that we still need ascent/descent information
@ -531,6 +542,7 @@ nsInlineFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
PRInt32 kidIndex = NextChildOffset();
nsIFrame* prevKidFrame;
PRBool breakAfter = PR_FALSE;
LastChild(prevKidFrame);
for (;;) {
// Get the next content object
@ -553,19 +565,21 @@ nsInlineFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
// Figure out how we should treat the child
nsIFrame* kidFrame;
nsStylePosition* kidPosition = (nsStylePosition*)kidStyleContext->GetData(kStylePositionSID);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidStyleContext->GetData(kStyleMoleculeSID);
nsStyleDisplay* kidDisplay =
(nsStyleDisplay*)kidStyleContext->GetData(kStyleDisplaySID);
nsStylePosition* kidPosition = (nsStylePosition*)
kidStyleContext->GetData(kStylePositionSID);
// Check whether it wants to floated or absolutely positioned
if (NS_STYLE_POSITION_ABSOLUTE == kidPosition->mPosition) {
AbsoluteFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidStyleContext);
} else if (kidMol->floats != NS_STYLE_FLOAT_NONE) {
} else if (kidDisplay->mFloats != NS_STYLE_FLOAT_NONE) {
PlaceholderFrame::NewFrame(&kidFrame, kid, kidIndex, this);
kidFrame->SetStyleContext(kidStyleContext);
} else if (nsnull == kidPrevInFlow) {
nsIContentDelegate* kidDel;
switch (kidMol->display) {
switch (kidDisplay->mDisplay) {
case NS_STYLE_DISPLAY_BLOCK:
case NS_STYLE_DISPLAY_LIST_ITEM:
if (kidIndex != mFirstContentOffset) {
@ -578,6 +592,42 @@ nsInlineFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
// FALLTHROUGH
case NS_STYLE_DISPLAY_INLINE:
// XXX temporary hack to make plain BR's in inlines "work"
// get style for break-before-after; get break-type (line, page, etc.)
{
nsIAtom* tag = kid->GetTag();
if (nsHTMLAtoms::br == tag) {
// Set break-after flag so we stop mapping children (we
// will end up being continued if there are more children)
breakAfter = PR_TRUE;
// Get cached state for containing block frame
// XXX how about QueryInterface(kIHTMLBlockFrameIID)? DOH!
nsBlockReflowState* state = nsnull;
nsIFrame* parent = mGeometricParent;
while (nsnull != parent) {
nsIHTMLFrameType* ft;
nsresult status =
parent->QueryInterface(kIHTMLFrameTypeIID, (void**) &ft);
if (NS_OK == status) {
nsHTMLFrameType type = ft->GetFrameType();
if (eHTMLFrame_Block == type) {
break;
}
}
parent->GetGeometricParent(parent);
}
if (nsnull != parent) {
nsIPresShell* shell = aPresContext->GetShell();
state = (nsBlockReflowState*) shell->GetCachedData(parent);
// XXX Of course this won't work if the inline span is nested
// in another inline span!
state->breakAfterChild = PR_TRUE;
NS_RELEASE(shell);
}
}
NS_IF_RELEASE(tag);
}
kidDel = kid->GetDelegate(aPresContext);
kidFrame = kidDel->CreateFrame(aPresContext, kid, kidIndex, this);
NS_RELEASE(kidDel);
@ -634,6 +684,11 @@ nsInlineFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
break;
}
kidPrevInFlow = nsnull;
// If we need to break after the kidFrame, then do so now
if (breakAfter) {
break;
}
}
done:;
@ -668,15 +723,15 @@ NS_METHOD nsInlineFrame::ResizeReflow(nsIPresContext* aPresContext,
// Get the style molecule
nsStyleFont* styleFont =
(nsStyleFont*)mStyleContext->GetData(kStyleFontSID);
nsStyleMolecule* styleMolecule =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsStyleSpacing* styleSpacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
// Check for an overflow list
MoveOverflowToChildList();
// Initialize our reflow state. We must wait until after we've processed
// the overflow list, because our first content offset might change
nsInlineState state(styleFont, styleMolecule, aMaxSize, aMaxElementSize);
nsInlineState state(styleFont, styleSpacing, aMaxSize, aMaxElementSize);
state.SetNumAscents(mContent->ChildCount() - mFirstContentOffset);
// Reflow any existing frames
@ -710,7 +765,7 @@ NS_METHOD nsInlineFrame::ResizeReflow(nsIPresContext* aPresContext,
}
}
const nsMargin& insets = styleMolecule->borderPadding;
const nsMargin& insets = styleSpacing->mBorderPadding;
// Vertically align the children
nscoord lineHeight =
@ -895,9 +950,7 @@ NS_METHOD nsInlineFrame::IncrementalReflow(nsIPresContext* aPresContext,
// Recover the reflow state as if we had reflowed our children up
// to but not including the child that is next in the reflow chain
nsStyleMolecule* styleMolecule =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsInlineState state(styleMolecule, aMaxSize, nsnull);
nsInlineState state(aMaxSize, nsnull);
state.SetNumAscents(mChildCount);
PRIntn nextIndex = RecoverState(aPresContext, state, nextInChain);
@ -981,8 +1034,8 @@ nsInlineFrame::AdjustChildren(nsIPresContext* aPresContext,
nsReflowMetrics& aKidMetrics,
ReflowStatus aKidReflowStatus)
{
nsStyleMolecule* mol = aState.mol;
nscoord xr = aState.availSize.width + mol->borderPadding.left;
nsStyleSpacing* spacing = aState.spacing;
nscoord xr = aState.availSize.width + spacing->mBorderPadding.left;
nscoord remainingSpace = xr - aState.x;
nscoord x = aState.x;
@ -1000,7 +1053,7 @@ nsInlineFrame::AdjustChildren(nsIPresContext* aPresContext,
}
// Vertically align the children
const nsMargin& insets = mol->borderPadding;
const nsMargin& insets = spacing->mBorderPadding;
nsCSSLayout::VerticallyAlignChildren(aPresContext, this, aState.font,
insets.top, mFirstChild, mChildCount,
aState.ascents, aState.maxAscent);

View File

@ -46,7 +46,7 @@
#include "nsHTMLForms.h"
static NS_DEFINE_IID(kStyleFontSID, NS_STYLEFONT_SID);
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
struct nsInputCallbackData
{
@ -353,14 +353,17 @@ NS_METHOD nsInputFrame::HandleEvent(nsIPresContext& aPresContext,
return nsEventStatus_eConsumeDoDefault;
}
void nsInputFrame::GetStyleSize(nsIPresContext& aPresContext, const nsSize& aMaxSize, nsSize& aSize)
void nsInputFrame::GetStyleSize(nsIPresContext& aPresContext,
const nsSize& aMaxSize, nsSize& aSize)
{
nsInput* input;
GetContent((nsIContent *&) input); // this must be an nsInput
nsStyleMolecule* mol = (nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsStylePosition* position = (nsStylePosition*)
mStyleContext->GetData(kStylePositionSID);
//printf("\n ** %d %d", mol->fixedWidth, mol->proportionalWidth);
// set the width, height
#if 0
aSize.width = mol->fixedWidth;
if ((CSS_NOTSET == aSize.width) && (CSS_NOTSET != mol->proportionalWidth)) {
aSize.width = (aMaxSize.width * mol->proportionalWidth) / 100;
@ -369,6 +372,10 @@ void nsInputFrame::GetStyleSize(nsIPresContext& aPresContext, const nsSize& aMax
if ((CSS_NOTSET == aSize.height) && (CSS_NOTSET != mol->proportionalHeight)) {
aSize.height = (aMaxSize.height * mol->proportionalHeight) / 100;
}
#else
aSize.width = -1;
aSize.height = -1;
#endif
NS_RELEASE(input);
}

View File

@ -25,7 +25,7 @@
#include "nsRect.h"
#include "nsIPtr.h"
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
NS_DEF_PTR(nsIStyleContext);
@ -64,10 +64,8 @@ nscoord nsCSSLayout::VerticallyAlignChildren(nsIPresContext* aCX,
kid->GetStyleContext(aCX, kidSC.AssignRef());
kid->GetContent(kidContent.AssignRef());
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
PRIntn verticalAlign = kidMol->verticalAlign;
float verticalAlignPct = kidMol->verticalAlignPct;
nsStyleText* textStyle = (nsStyleText*)kidSC->GetData(kStyleTextSID);
PRIntn verticalAlign = textStyle->mVerticalAlign;
kid->GetRect(kidRect);
@ -146,9 +144,8 @@ nscoord nsCSSLayout::VerticallyAlignChildren(nsIPresContext* aCX,
kid->GetStyleContext(aCX, kidSC.AssignRef());
kid->GetContent(kidContent.AssignRef());
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
PRIntn verticalAlign = kidMol->verticalAlign;
nsStyleText* textStyle = (nsStyleText*)kidSC->GetData(kStyleTextSID);
PRIntn verticalAlign = textStyle->mVerticalAlign;
// Vertically align the child
if (verticalAlign == NS_STYLE_VERTICAL_ALIGN_BOTTOM) {
@ -174,14 +171,13 @@ nscoord nsCSSLayout::VerticallyAlignChildren(nsIPresContext* aCX,
*/
void nsCSSLayout::HorizontallyPlaceChildren(nsIPresContext* aCX,
nsIFrame* aContainer,
nsStyleMolecule* aContainerStyle,
nsStyleText* aContainerStyle,
nsIFrame* aFirstChild,
PRInt32 aChildCount,
nscoord aLineWidth,
nscoord aMaxWidth)
{
PRIntn textAlign = aContainerStyle->textAlign;
PRIntn textAlign = aContainerStyle->mTextAlign;
nscoord dx = 0;
switch (textAlign) {
case NS_STYLE_TEXT_ALIGN_LEFT:
@ -213,7 +209,6 @@ void nsCSSLayout::HorizontallyPlaceChildren(nsIPresContext* aCX,
*/
void nsCSSLayout::RelativePositionChildren(nsIPresContext* aCX,
nsIFrame* aContainer,
nsStyleMolecule* aContainerStyle,
nsIFrame* aFirstChild,
PRInt32 aChildCount)
{
@ -225,7 +220,8 @@ void nsCSSLayout::RelativePositionChildren(nsIPresContext* aCX,
kid->GetContent(kidContent.AssignRef());
kid->GetStyleContext(aCX, kidSC.AssignRef());
nsStylePosition* kidPosition = (nsStylePosition*)kidSC->GetData(kStylePositionSID);
nsStylePosition* kidPosition = (nsStylePosition*)
kidSC->GetData(kStylePositionSID);
if (NS_STYLE_POSITION_RELATIVE == kidPosition->mPosition) {
kid->GetOrigin(origin);
// XXX Check the flags: could be auto or percent (not just length)

View File

@ -21,7 +21,7 @@
#include "nsCoord.h"
class nsIPresContext;
struct nsStyleFont;
struct nsStyleMolecule;
struct nsStyleText;
class nsIFrame;
class nsCSSLayout {
@ -44,7 +44,7 @@ public:
*/
static void HorizontallyPlaceChildren(nsIPresContext* aPresContext,
nsIFrame* aContainer,
nsStyleMolecule* aContainerStyle,
nsStyleText* aContainerStyle,
nsIFrame* aFirstChild,
PRInt32 aChildCount,
nscoord aLineWidth,
@ -55,7 +55,6 @@ public:
*/
static void RelativePositionChildren(nsIPresContext* aPresContext,
nsIFrame* aContainer,
nsStyleMolecule* aContainerStyle,
nsIFrame* aFirstChild,
PRInt32 aChildCount);
};

View File

@ -33,9 +33,10 @@ static PRBool gsDebug = PR_FALSE;
static const PRBool gsDebug = PR_FALSE;
#endif
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleBorderSID, NS_STYLEBORDER_SID);
static NS_DEFINE_IID(kStyleColorSID, NS_STYLECOLOR_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
/**
*/
@ -124,26 +125,20 @@ NS_METHOD nsTableCaptionFrame::Paint(nsIPresContext& aPresContext,
}
/**
*
* Align the frame's child frame within the caption
*
**/
* Align the frame's child frame within the caption
*/
void nsTableCaptionFrame::VerticallyAlignChild(nsIPresContext* aPresContext)
{
{
nsStyleMolecule* mol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
NS_ASSERTION(nsnull!=mol, "bad style molecule");
nscoord topInset=0, bottomInset=0;
PRInt32 verticalAlign = NS_STYLE_VERTICAL_ALIGN_MIDDLE;
nsStyleText* textStyle =
(nsStyleText*)mStyleContext->GetData(kStyleTextSID);
nsStyleSpacing* spacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
if (nsnull!=mol)
{
topInset = mol->borderPadding.top;
bottomInset =mol->borderPadding.bottom;
verticalAlign = mol->verticalAlign;
}
nscoord topInset = spacing->mBorderPadding.top;
nscoord bottomInset = spacing->mBorderPadding.bottom;
PRUint8 verticalAlign = textStyle->mVerticalAlign;
nscoord height = mRect.height;
nsRect kidRect;
@ -208,17 +203,12 @@ NS_METHOD nsTableCaptionFrame::ResizeReflow(nsIPresContext* aPresContext,
// SEC: what about ascent and decent???
// Compute the insets (sum of border and padding)
nsStyleMolecule* myMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
NS_ASSERTION(nsnull!=myMol, "bad style molecule");
nscoord topInset=0,rightInset=0, bottomInset=0, leftInset=0;
if (nsnull!=myMol)
{
topInset = myMol->borderPadding.top;
rightInset = myMol->borderPadding.right;
bottomInset =myMol->borderPadding.bottom;
leftInset = myMol->borderPadding.left;
}
nsStyleSpacing* spacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
nscoord topInset = spacing->mBorderPadding.top;
nscoord rightInset = spacing->mBorderPadding.right;
nscoord bottomInset = spacing->mBorderPadding.bottom;
nscoord leftInset = spacing->mBorderPadding.left;
// reduce available space by insets
if (NS_UNCONSTRAINEDSIZE!=availSize.width)

View File

@ -22,8 +22,6 @@
#include "nsContainerFrame.h"
#include "nsTableCaption.h"
struct nsStyleMolecule;
/**
* nsTableCaptionFrame
* data structure to maintain information about a single table caption geometry

View File

@ -35,9 +35,10 @@ static PRBool gsDebug = PR_FALSE;
static const PRBool gsDebug = PR_FALSE;
#endif
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
static NS_DEFINE_IID(kStyleBorderSID, NS_STYLEBORDER_SID);
static NS_DEFINE_IID(kStyleColorSID, NS_STYLECOLOR_SID);
static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
/**
*/
@ -86,20 +87,15 @@ NS_METHOD nsTableCellFrame::Paint(nsIPresContext& aPresContext,
**/
void nsTableCellFrame::VerticallyAlignChild(nsIPresContext* aPresContext)
{
{
nsStyleSpacing* spacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
nsStyleText* textStyle =
(nsStyleText*)mStyleContext->GetData(kStyleTextSID);
nsStyleMolecule* mol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
NS_ASSERTION(nsnull!=mol, "bad style molecule");
nscoord topInset=0, bottomInset=0;
PRInt32 verticalAlign = NS_STYLE_VERTICAL_ALIGN_MIDDLE;
if (nsnull!=mol)
{
topInset = mol->borderPadding.top;
bottomInset =mol->borderPadding.bottom;
verticalAlign = mol->verticalAlign;
}
nscoord topInset = spacing->mBorderPadding.top;
nscoord bottomInset = spacing->mBorderPadding.bottom;
PRUint8 verticalAlign = textStyle->mVerticalAlign;
nscoord height = mRect.height;
nsRect kidRect;
@ -225,17 +221,12 @@ NS_METHOD nsTableCellFrame::ResizeReflow(nsIPresContext* aPresContext,
// SEC: what about ascent and decent???
// Compute the insets (sum of border and padding)
nsStyleMolecule* myMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
NS_ASSERTION(nsnull!=myMol, "bad style molecule");
nscoord topInset=0,rightInset=0, bottomInset=0, leftInset=0;
if (nsnull!=myMol)
{
topInset = myMol->borderPadding.top;
rightInset = myMol->borderPadding.right;
bottomInset =myMol->borderPadding.bottom;
leftInset = myMol->borderPadding.left;
}
nsStyleSpacing* spacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
nscoord topInset = spacing->mBorderPadding.top;
nscoord rightInset = spacing->mBorderPadding.right;
nscoord bottomInset = spacing->mBorderPadding.bottom;
nscoord leftInset = spacing->mBorderPadding.left;
// reduce available space by insets
if (NS_UNCONSTRAINEDSIZE!=availSize.width)

View File

@ -22,8 +22,6 @@
#include "nsContainerFrame.h"
#include "nsTableCell.h"
struct nsStyleMolecule;
/**
* nsTableCellFrame
* data structure to maintain information about a single table cell's frame

View File

@ -56,9 +56,10 @@ static const PRBool gsDebugMBP = PR_FALSE;
#define max(x, y) ((x) > (y) ? (x) : (y))
#endif
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleBorderSID, NS_STYLEBORDER_SID);
static NS_DEFINE_IID(kStyleColorSID, NS_STYLECOLOR_SID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
NS_DEF_PTR(nsIStyleContext);
NS_DEF_PTR(nsIContent);
@ -71,11 +72,12 @@ NS_DEF_PTR(nsTableCell);
struct InnerTableReflowState {
// The body's style molecule
nsStyleMolecule* mol;
// The body's available size (computed from the body's parent)
nsSize availSize;
nscoord leftInset, topInset;
// Margin tracking information
nscoord prevMaxPosBottomMargin;
nscoord prevMaxNegBottomMargin;
@ -98,16 +100,28 @@ struct InnerTableReflowState {
InnerTableReflowState(nsIPresContext* aPresContext,
const nsSize& aMaxSize,
nsStyleMolecule* aMol)
nsStyleSpacing* aStyleSpacing)
{
mol = aMol;
availSize.width = aMaxSize.width;
availSize.height = aMaxSize.height;
prevMaxPosBottomMargin = 0;
prevMaxNegBottomMargin = 0;
y=0; // border/padding/margin???
unconstrainedWidth = PRBool(aMaxSize.width == NS_UNCONSTRAINEDSIZE);
availSize.width = aMaxSize.width;
if (!unconstrainedWidth) {
availSize.width -= aStyleSpacing->mBorderPadding.left +
aStyleSpacing->mBorderPadding.right;
}
leftInset = aStyleSpacing->mBorderPadding.left;
unconstrainedHeight = PRBool(aMaxSize.height == NS_UNCONSTRAINEDSIZE);
availSize.height = aMaxSize.height;
if (!unconstrainedHeight) {
availSize.height -= aStyleSpacing->mBorderPadding.top +
aStyleSpacing->mBorderPadding.bottom;
}
topInset = aStyleSpacing->mBorderPadding.top;
firstRowGroup = PR_TRUE;
footerHeight = 0;
footerList = nsnull;
@ -483,37 +497,39 @@ NS_METHOD nsTableFrame::ResizeReflow(nsIPresContext* aPresContext,
aStatus = frComplete;
PRIntervalTime startTime = PR_IntervalNow();
PRIntervalTime startTime;
if (gsTiming) {
startTime = PR_IntervalNow();
}
if (PR_TRUE==gsDebug)
printf ("*** tableframe reflow\t\t%p\n", this);
if (PR_TRUE==NeedsReflow(aMaxSize))
{
nsStyleMolecule* tableStyleMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
NS_ASSERTION(nsnull != tableStyleMol, "null style molecule");
if (nsnull==tableStyleMol)
return frComplete; // SEC: this is an error!
if (PR_FALSE==IsFirstPassValid())
{ // we treat the table as if we've never seen the layout data before
mPass = kPASS_FIRST;
aStatus = ResizeReflowPass1(aPresContext, aDesiredSize, aMaxSize, aMaxElementSize, tableStyleMol);
aStatus = ResizeReflowPass1(aPresContext, aDesiredSize,
aMaxSize, aMaxElementSize);
// check result
}
mPass = kPASS_SECOND;
// assign column widths, and assign aMaxElementSize->width
BalanceColumnWidths(aPresContext, tableStyleMol, aMaxSize, aMaxElementSize);
BalanceColumnWidths(aPresContext, aMaxSize, aMaxElementSize);
// assign table width
SetTableWidth(aPresContext, tableStyleMol);
SetTableWidth(aPresContext);
aStatus = ResizeReflowPass2(aPresContext, aDesiredSize, aMaxSize, aMaxElementSize, tableStyleMol, 0, 0);
aStatus = ResizeReflowPass2(aPresContext, aDesiredSize, aMaxSize,
aMaxElementSize, 0, 0);
PRIntervalTime endTime = PR_IntervalNow();
if (gsTiming) printf("Table reflow took %ld ticks for frame %d\n", endTime-startTime, this);
if (gsTiming) {
PRIntervalTime endTime = PR_IntervalNow();
printf("Table reflow took %ld ticks for frame %d\n",
endTime-startTime, this);/* XXX need to use LL_* macros! */
}
mPass = kPASS_UNDEFINED;
}
@ -540,11 +556,9 @@ NS_METHOD nsTableFrame::ResizeReflow(nsIPresContext* aPresContext,
nsIFrame::ReflowStatus nsTableFrame::ResizeReflowPass1(nsIPresContext* aPresContext,
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle)
nsSize* aMaxElementSize)
{
NS_ASSERTION(nsnull!=aPresContext, "bad pres context param");
NS_ASSERTION(nsnull!=aTableStyle, "bad style param");
NS_ASSERTION(nsnull==mPrevInFlow, "illegal call, cannot call pass 1 on a continuing frame.");
if (gsDebug==PR_TRUE) printf("nsTableFrame::ResizeReflow Pass1: maxSize=%d,%d\n",
@ -573,10 +587,12 @@ nsIFrame::ReflowStatus nsTableFrame::ResizeReflowPass1(nsIPresContext* aPresCont
nsIFrame* prevKidFrame = nsnull;/* XXX incremental reflow! */
// Compute the insets (sum of border and padding)
nscoord topInset = aTableStyle->borderPadding.top;
nscoord rightInset = aTableStyle->borderPadding.right;
nscoord bottomInset =aTableStyle->borderPadding.bottom;
nscoord leftInset = aTableStyle->borderPadding.left;
nsStyleSpacing* spacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
nscoord topInset = spacing->mBorderPadding.top;
nscoord rightInset = spacing->mBorderPadding.right;
nscoord bottomInset =spacing->mBorderPadding.bottom;
nscoord leftInset = spacing->mBorderPadding.left;
/* assumes that Table's children are in the following order:
* Captions
@ -601,9 +617,6 @@ nsIFrame::ReflowStatus nsTableFrame::ResizeReflowPass1(nsIPresContext* aPresCont
nsIStyleContextPtr kidStyleContext =
aPresContext->ResolveStyleContextFor(kid, this);
NS_ASSERTION(nsnull != kidStyleContext, "null style context for kid");
nsStyleMolecule* kidStyle =
(nsStyleMolecule*)kidStyleContext->GetData(kStyleMoleculeSID);
NS_ASSERTION(nsnull != kidStyle, "null style molecule for kid");
// SEC: TODO: when content is appended or deleted, be sure to clear out the frame hierarchy!!!!
@ -701,7 +714,6 @@ nsIFrame::ReflowStatus nsTableFrame::ResizeReflowPass2(nsIPresContext* aPresCont
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle,
PRInt32 aMinCaptionWidth,
PRInt32 mMaxCaptionWidth)
{
@ -737,9 +749,9 @@ nsIFrame::ReflowStatus nsTableFrame::ResizeReflowPass2(nsIPresContext* aPresCont
// Check for an overflow list
MoveOverflowToChildList();
nsStyleMolecule* myMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
InnerTableReflowState state(aPresContext, aMaxSize, myMol);
nsStyleSpacing* mySpacing = (nsStyleSpacing*)
mStyleContext->GetData(kStyleSpacingSID);
InnerTableReflowState state(aPresContext, aMaxSize, mySpacing);
// Reflow the existing frames
if (nsnull != mFirstChild) {
@ -795,13 +807,11 @@ nsIFrame::ReflowStatus nsTableFrame::ResizeReflowPass2(nsIPresContext* aPresCont
if (gsDebug==PR_TRUE)
{
if (nsnull!=aMaxElementSize)
printf("Reflow complete, returning %s with aDesiredSize = %d,%d and aMaxElementSize=%d,%d\n",
status==frComplete ? "Complete" : "Not Complete",
printf("Reflow complete, returning aDesiredSize = %d,%d and aMaxElementSize=%d,%d\n",
aDesiredSize.width, aDesiredSize.height,
aMaxElementSize->width, aMaxElementSize->height);
else
printf("Reflow complete, returning %s with aDesiredSize = %d,%d and NSNULL aMaxElementSize\n",
status==frComplete ? "Complete" : "Not Complete",
printf("Reflow complete, returning aDesiredSize = %d,%d and NSNULL aMaxElementSize\n",
aDesiredSize.width, aDesiredSize.height);
}
@ -820,12 +830,12 @@ nsIFrame::ReflowStatus nsTableFrame::ResizeReflowPass2(nsIPresContext* aPresCont
// Collapse child's top margin with previous bottom margin
nscoord nsTableFrame::GetTopMarginFor(nsIPresContext* aCX,
InnerTableReflowState& aState,
nsStyleMolecule* aKidMol)
nsStyleSpacing* aKidSpacing)
{
nscoord margin;
nscoord maxNegTopMargin = 0;
nscoord maxPosTopMargin = 0;
if ((margin = aKidMol->margin.top) < 0) {
if ((margin = aKidSpacing->mMargin.top) < 0) {
maxNegTopMargin = -margin;
} else {
maxPosTopMargin = margin;
@ -976,9 +986,10 @@ PRBool nsTableFrame::ReflowMappedChildren( nsIPresContext* aPresContext,
nsIStyleContextPtr kidSC;
kidFrame->GetStyleContext(aPresContext, kidSC.AssignRef());
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidMol);
nscoord bottomMargin = kidMol->margin.bottom;
nsStyleSpacing* kidSpacing = (nsStyleSpacing*)
kidSC->GetData(kStyleSpacingSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidSpacing);
nscoord bottomMargin = kidSpacing->mMargin.bottom;
// Figure out the amount of available size for the child (subtract
// off the top margin we are going to apply to it)
@ -987,7 +998,8 @@ PRBool nsTableFrame::ReflowMappedChildren( nsIPresContext* aPresContext,
}
// Subtract off for left and right margin
if (PR_FALSE == aState.unconstrainedWidth) {
kidAvailSize.width -= kidMol->margin.left + kidMol->margin.right;
kidAvailSize.width -= kidSpacing->mMargin.left +
kidSpacing->mMargin.right;
}
// Reflow the child into the available space
@ -1013,9 +1025,10 @@ PRBool nsTableFrame::ReflowMappedChildren( nsIPresContext* aPresContext,
// Place the child after taking into account it's margin
aState.y += topMargin;
nsRect kidRect (0, 0, desiredSize.width, desiredSize.height);
kidRect.x += kidMol->margin.left;
kidRect.y += aState.y;
PlaceChild(aPresContext, aState, kidFrame, kidRect, aMaxElementSize, kidMaxElementSize);
kidRect.x += aState.leftInset + kidSpacing->mMargin.left;
kidRect.y += aState.topInset + aState.y ;
PlaceChild(aPresContext, aState, kidFrame, kidRect,
aMaxElementSize, kidMaxElementSize);
if (bottomMargin < 0) {
aState.prevMaxNegBottomMargin = -bottomMargin;
} else {
@ -1389,8 +1402,6 @@ nsTableFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
// Figure out how we should treat the child
nsIFrame* kidFrame;
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidStyleContext->GetData(kStyleMoleculeSID);
// Create a child frame
if (nsnull == kidPrevInFlow) {
@ -1427,7 +1438,6 @@ nsTableFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
// finish).
//aState.y += topMargin;
nsRect kidRect (0, 0, kidSize.width, kidSize.height);
//kidRect.x += kidMol->margin.left;
kidRect.y += aState.y;
PlaceChild(aPresContext, aState, kidFrame, kidRect, aMaxElementSize, *pKidMaxElementSize);
@ -1474,7 +1484,6 @@ nsTableFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
*/
// use the cell map to determine which cell is in which column.
void nsTableFrame::BalanceColumnWidths(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyle,
const nsSize& aMaxSize,
nsSize* aMaxElementSize)
{
@ -1498,21 +1507,34 @@ void nsTableFrame::BalanceColumnWidths(nsIPresContext* aPresContext,
PRInt32 maxTableWidth = 0;
PRInt32 totalFixedWidth = 0;
nsStyleSpacing* spacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
// need to figure out the overall table width constraint
PRInt32 maxWidth = aMaxSize.width; // default case, get 100% of available space
if (-1!=aTableStyle->fixedWidth) // if there is a fixed width attribute, use it
{
maxWidth = aTableStyle->fixedWidth;
// default case, get 100% of available space
PRInt32 maxWidth;
nsStylePosition* position =
(nsStylePosition*)mStyleContext->GetData(kStylePositionSID);
switch (position->mWidthFlags) {
case NS_STYLE_POSITION_VALUE_LENGTH:
maxWidth = position->mWidth;
break;
case NS_STYLE_POSITION_VALUE_PCT:
case NS_STYLE_POSITION_VALUE_PROPORTIONAL:
// XXX for now these fall through
default:
case NS_STYLE_POSITION_VALUE_AUTO:
case NS_STYLE_POSITION_VALUE_INHERIT:
maxWidth = aMaxSize.width;
break;
}
else if ((NS_UNCONSTRAINEDSIZE!=maxWidth) &&
(-1!=aTableStyle->proportionalWidth && 0!=aTableStyle->proportionalWidth))
{
maxWidth = (maxWidth*aTableStyle->proportionalWidth)/100;
}
// now, if maxWidth is not NS_UNCONSTRAINED, subtract out my border and padding
// now, if maxWidth is not NS_UNCONSTRAINED, subtract out my border
// and padding
if (NS_UNCONSTRAINEDSIZE!=maxWidth)
{
maxWidth -= aTableStyle->borderPadding.left + aTableStyle->borderPadding.right;
maxWidth -= spacing->mBorderPadding.left + spacing->mBorderPadding.right;
if (0>maxWidth) // nonsense style specification
maxWidth = 0;
}
@ -1520,7 +1542,7 @@ void nsTableFrame::BalanceColumnWidths(nsIPresContext* aPresContext,
if (gsDebug) printf (" maxWidth=%d from aMaxSize=%d,%d\n", maxWidth, aMaxSize.width, aMaxSize.height);
// Step 1 - assign the width of all fixed-width columns
AssignFixedColumnWidths(aPresContext, maxWidth, numCols, aTableStyle,
AssignFixedColumnWidths(aPresContext, maxWidth, numCols,
totalFixedWidth, minTableWidth, maxTableWidth);
if (nsnull!=aMaxElementSize)
@ -1539,14 +1561,14 @@ void nsTableFrame::BalanceColumnWidths(nsIPresContext* aPresContext,
if (TableIsAutoWidth())
{
if (gsDebug==PR_TRUE) printf (" calling BalanceProportionalColumnsForAutoWidthTable\n");
BalanceProportionalColumnsForAutoWidthTable(aPresContext, aTableStyle,
BalanceProportionalColumnsForAutoWidthTable(aPresContext,
availWidth, maxWidth,
minTableWidth, maxTableWidth);
}
else
{
if (gsDebug==PR_TRUE) printf (" calling BalanceProportionalColumnsForSpecifiedWidthTable\n");
BalanceProportionalColumnsForSpecifiedWidthTable(aPresContext, aTableStyle,
BalanceProportionalColumnsForSpecifiedWidthTable(aPresContext,
availWidth, maxWidth,
minTableWidth, maxTableWidth);
}
@ -1590,11 +1612,13 @@ if there is space left over
}
// Step 1 - assign the width of all fixed-width columns,
// and calculate min/max table width
PRBool nsTableFrame::AssignFixedColumnWidths(nsIPresContext* aPresContext, PRInt32 maxWidth,
PRInt32 aNumCols, nsStyleMolecule* aTableStyleMol,
// and calculate min/max table width
PRBool nsTableFrame::AssignFixedColumnWidths(nsIPresContext* aPresContext,
PRInt32 maxWidth,
PRInt32 aNumCols,
PRInt32 &aTotalFixedWidth,
PRInt32 &aMinTableWidth, PRInt32 &aMaxTableWidth)
PRInt32 &aMinTableWidth,
PRInt32 &aMaxTableWidth)
{
NS_ASSERTION(nsnull==mPrevInFlow, "never ever call me on a continuing frame!");
@ -1606,15 +1630,44 @@ PRBool nsTableFrame::AssignFixedColumnWidths(nsIPresContext* aPresContext, PRInt
NS_ASSERTION(nsnull != colData, "bad column data");
nsTableColPtr col = colData->GetCol(); // col: ADDREF++
NS_ASSERTION(nsnull != col, "bad col");
nsStyleMolecule* colStyle =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
NS_ASSERTION(nsnull != colStyle, "bad style for col.");
// need to track min/max column width for setting min/max table widths
PRInt32 minColWidth = 0;
PRInt32 maxColWidth = 0;
nsVoidArray *cells = colData->GetCells();
PRInt32 numCells = cells->Count();
if (gsDebug==PR_TRUE) printf (" for column %d numCells = %d\n", colIndex, numCells);
#if XXX_need_access_to_column_frame_help
// Get the columns's style
nsIStyleContextPtr colSC;
colFrame->GetStyleContext(aPresContext, colSC.AssignRef());
nsStylePosition* colPosition = (nsStylePosition*)
colSC->GetData(kStylePositionSID);
// Get column width if it has one
PRBool haveColWidth = PR_FALSE;
nscoord colWidth;
switch (colPosition->mWidthFlags) {
default:
case NS_STYLE_POSITION_VALUE_AUTO:
case NS_STYLE_POSITION_VALUE_INHERIT:
break;
case NS_STYLE_POSITION_VALUE_LENGTH:
haveColWidth = PR_TRUE;
colWidth = colPosition->mWidth;
break;
case NS_STYLE_POSITION_VALUE_PCT:
case NS_STYLE_POSITION_VALUE_PROPORTIONAL:
//XXX haveColWidth = PR_TRUE;
//XXX colWidth = colPosition->mWidthPCT * something;
break;
}
#endif
// Scan the column
for (PRInt32 cellIndex = 0; cellIndex<numCells; cellIndex++)
{
nsCellLayoutData * data = (nsCellLayoutData *)(cells->ElementAt(cellIndex));
@ -1625,62 +1678,112 @@ PRBool nsTableFrame::AssignFixedColumnWidths(nsIPresContext* aPresContext, PRInt
if (gsDebug==PR_TRUE)
printf (" for cell %d min = %d,%d and des = %d,%d\n", cellIndex, cellMinSize->width, cellMinSize->height,
cellDesiredSize->width, cellDesiredSize->height);
/* the first cell in a column (in row 0) has special standing.
* if the first cell has a width specification, it overrides the COL width
PRBool haveCellWidth = PR_FALSE;
nscoord cellWidth;
/*
* The first cell in a column (in row 0) has special standing.
* if the first cell has a width specification, it overrides the
* COL width
*/
if (0==cellIndex)
{
// SEC: TODO -- when we have a style system, set the mol for the col
nsCellLayoutData * data = (nsCellLayoutData *)(cells->ElementAt(0));
nsTableCellFrame *cellFrame = data->GetCellFrame();
nsTableCellPtr cell;
cellFrame->GetContent((nsIContent*&)(cell.AssignRef())); // cell: REFCNT++
nsStyleMolecule* cellStyle = (nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
NS_ASSERTION(nsnull != cellStyle, "bad style for cell.");
// SEC: this is the code to replace
if (-1!=cellStyle->fixedWidth)
colStyle->proportionalWidth = cellStyle->proportionalWidth;
if (-1!=cellStyle->proportionalWidth)
colStyle->proportionalWidth = cellStyle->proportionalWidth;
// SEC: end code to replace
}
if (-1!=colStyle->fixedWidth)
{ // this col has fixed width, so set the cell's width
// to the larger of (specified width, largest max_element_size of the cells in the column)
PRInt32 widthForThisCell = max(cellMinSize->width, colStyle->fixedWidth);
if (mColumnWidths[colIndex] < widthForThisCell)
{
if (gsDebug) printf (" setting fixed width to %d\n",widthForThisCell);
mColumnWidths[colIndex] = widthForThisCell;
maxColWidth = widthForThisCell;
// Get the cell's style
nsIStyleContextPtr cellSC;
cellFrame->GetStyleContext(aPresContext, cellSC.AssignRef());
nsStylePosition* cellPosition = (nsStylePosition*)
cellSC->GetData(kStylePositionSID);
switch (cellPosition->mWidthFlags) {
case NS_STYLE_POSITION_VALUE_LENGTH:
haveCellWidth = PR_TRUE;
cellWidth = cellPosition->mWidth;
break;
case NS_STYLE_POSITION_VALUE_PCT:
case NS_STYLE_POSITION_VALUE_PROPORTIONAL:
// XXX write me when pct/proportional are supported
// XXX haveCellWidth = PR_TRUE;
// XXX cellWidth = cellPosition->mWidth;
break;
default:
case NS_STYLE_POSITION_VALUE_INHERIT:
case NS_STYLE_POSITION_VALUE_AUTO:
break;
}
}
// regardless of the width specification, keep track of the min/max column widths
/* TODO: must distribute COLSPAN'd cell widths between columns, either here
* or in the subsequent Balance***ColumnWidth routines
#if XXX_need_access_to_column_frame_help
switch (colPosition->mWidthFlags) {
default:
case NS_STYLE_POSITION_VALUE_AUTO:
case NS_STYLE_POSITION_VALUE_INHERIT:
break;
case NS_STYLE_POSITION_VALUE_LENGTH:
{
// This col has a fixed width, so set the cell's width to the
// larger of (specified width, largest max_element_size of the
// cells in the column)
PRInt32 widthForThisCell = max(cellMinSize->width, colPosition->mWidth);
if (mColumnWidths[colIndex] < widthForThisCell)
{
if (gsDebug) printf (" setting fixed width to %d\n",widthForThisCell);
mColumnWidths[colIndex] = widthForThisCell;
maxColWidth = widthForThisCell;
}
}
break;
case NS_STYLE_POSITION_VALUE_PCT:
case NS_STYLE_POSITION_VALUE_PROPORTIONAL:
// XXX write me when pct/proportional are supported
break;
}
#endif
// regardless of the width specification, keep track of the
// min/max column widths
/* TODO: must distribute COLSPAN'd cell widths between columns,
* either here or in the subsequent Balance***ColumnWidth
* routines
*/
if (minColWidth < cellMinSize->width)
minColWidth = cellMinSize->width;
if (maxColWidth < cellDesiredSize->width)
maxColWidth = cellDesiredSize->width;
if (gsDebug==PR_TRUE)
printf (" after cell %d, minColWidth = %d and maxColWidth = %d\n", cellIndex, minColWidth, maxColWidth);
if (gsDebug) {
printf (" after cell %d, minColWidth = %d and maxColWidth = %d\n",
cellIndex, minColWidth, maxColWidth);
}
/* take colspan into account? */
/*
PRInt32 colSpan = col->GetColSpan();
cellIndex += colSpan-1;
*/
}
if (-1!=colStyle->fixedWidth)
{
// if the col is fixed-width, expand the col to the specified fixed width if necessary
if (colStyle->fixedWidth > mColumnWidths[colIndex])
mColumnWidths[colIndex] = colStyle->fixedWidth;
// keep a running total of the amount of space taken up by all fixed-width columns
aTotalFixedWidth += mColumnWidths[colIndex];
if (gsDebug)
printf (" after col %d, aTotalFixedWidth = %d\n", colIndex, aTotalFixedWidth);
#if 0
// if the col is fixed-width, expand the col to the specified
// fixed width if necessary
if (colStyle->fixedWidth > mColumnWidths[colIndex])
mColumnWidths[colIndex] = colStyle->fixedWidth;
// keep a running total of the amount of space taken up by all
// fixed-width columns
aTotalFixedWidth += mColumnWidths[colIndex];
if (gsDebug) {
printf (" after col %d, aTotalFixedWidth = %d\n",
colIndex, aTotalFixedWidth);
}
#endif
// add col[i] metrics to the running totals for the table min/max width
if (NS_UNCONSTRAINEDSIZE!=aMinTableWidth)
aMinTableWidth += minColWidth; // SEC: insets!
@ -1698,7 +1801,6 @@ PRBool nsTableFrame::AssignFixedColumnWidths(nsIPresContext* aPresContext, PRInt
}
PRBool nsTableFrame::BalanceProportionalColumnsForSpecifiedWidthTable(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth,
PRInt32 aMaxWidth,
PRInt32 aMinTableWidth,
@ -1711,7 +1813,7 @@ PRBool nsTableFrame::BalanceProportionalColumnsForSpecifiedWidthTable(nsIPresCon
if (NS_UNCONSTRAINEDSIZE==aMaxWidth)
{ // the max width of the table fits comfortably in the available space
if (gsDebug) printf (" * table laying out in NS_UNCONSTRAINEDSIZE, calling BalanceColumnsTableFits\n");
result = BalanceColumnsTableFits(aPresContext, aTableStyleMol, aAvailWidth);
result = BalanceColumnsTableFits(aPresContext, aAvailWidth);
}
else if (aMinTableWidth > aMaxWidth)
{ // the table doesn't fit in the available space
@ -1721,19 +1823,18 @@ PRBool nsTableFrame::BalanceProportionalColumnsForSpecifiedWidthTable(nsIPresCon
else if (aMaxTableWidth <= aMaxWidth)
{ // the max width of the table fits comfortably in the available space
if (gsDebug) printf (" * table desired size fits, calling BalanceColumnsTableFits\n");
result = BalanceColumnsTableFits(aPresContext, aTableStyleMol, aAvailWidth);
result = BalanceColumnsTableFits(aPresContext, aAvailWidth);
}
else
{ // the table fits somewhere between its min and desired size
if (gsDebug) printf (" * table desired size does not fit, calling BalanceColumnsHTML4Constrained\n");
result = BalanceColumnsHTML4Constrained(aPresContext, aTableStyleMol, aAvailWidth,
result = BalanceColumnsHTML4Constrained(aPresContext, aAvailWidth,
aMaxWidth, aMinTableWidth, aMaxTableWidth);
}
return result;
}
PRBool nsTableFrame::BalanceProportionalColumnsForAutoWidthTable( nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth,
PRInt32 aMaxWidth,
PRInt32 aMinTableWidth,
@ -1744,7 +1845,7 @@ PRBool nsTableFrame::BalanceProportionalColumnsForAutoWidthTable( nsIPresContext
if (NS_UNCONSTRAINEDSIZE==aMaxWidth)
{ // the max width of the table fits comfortably in the available space
if (gsDebug) printf (" * table laying out in NS_UNCONSTRAINEDSIZE, calling BalanceColumnsTableFits\n");
result = BalanceColumnsTableFits(aPresContext, aTableStyleMol, aAvailWidth);
result = BalanceColumnsTableFits(aPresContext, aAvailWidth);
}
else if (aMinTableWidth > aMaxWidth)
{ // the table doesn't fit in the available space
@ -1754,12 +1855,12 @@ PRBool nsTableFrame::BalanceProportionalColumnsForAutoWidthTable( nsIPresContext
else if (aMaxTableWidth <= aMaxWidth)
{ // the max width of the table fits comfortably in the available space
if (gsDebug) printf (" * table desired size fits, calling BalanceColumnsTableFits\n");
result = BalanceColumnsTableFits(aPresContext, aTableStyleMol, aAvailWidth);
result = BalanceColumnsTableFits(aPresContext, aAvailWidth);
}
else
{ // the table fits somewhere between its min and desired size
if (gsDebug) printf (" * table desired size does not fit, calling BalanceColumnsHTML4Constrained\n");
result = BalanceColumnsHTML4Constrained(aPresContext, aTableStyleMol, aAvailWidth,
result = BalanceColumnsHTML4Constrained(aPresContext, aAvailWidth,
aMaxWidth, aMinTableWidth, aMaxTableWidth);
}
return result;
@ -1774,14 +1875,16 @@ PRBool nsTableFrame::SetColumnsToMinWidth(nsIPresContext* aPresContext)
{
nsColLayoutData * colData = (nsColLayoutData *)(columnLayoutData->ElementAt(colIndex));
nsTableColPtr col = colData->GetCol(); // col: ADDREF++
nsStyleMolecule* colStyle =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsVoidArray *cells = colData->GetCells();
PRInt32 minColWidth = 0;
PRInt32 maxColWidth = 0;
PRInt32 numCells = cells->Count();
if (gsDebug==PR_TRUE) printf (" for col %d\n", colIndex);
if (PR_TRUE==IsProportionalWidth(colStyle))
// XXX need column frame to ask this question
nsStylePosition* colPosition = nsnull;
if (PR_TRUE==IsProportionalWidth(colPosition))
{
for (PRInt32 cellIndex = 0; cellIndex<numCells; cellIndex++)
{ // this col has proportional width, so determine its width requirements
@ -1804,10 +1907,13 @@ PRBool nsTableFrame::SetColumnsToMinWidth(nsIPresContext* aPresContext)
if (gsDebug==PR_TRUE)
{
printf (" for determining width of col %d %s:\n",colIndex, IsProportionalWidth(colStyle)? "(P)":"(A)");
printf (" for determining width of col %d %s:\n",colIndex, IsProportionalWidth(colPosition)? "(P)":"(A)");
printf (" minColWidth = %d and maxColWidth = %d\n", minColWidth, maxColWidth);
}
if (PR_TRUE==IsProportionalWidth(colStyle))
// XXX BUG: why are we asking this again? this if is already in a
// IsProportionalWidth == PR_TRUE case!
if (PR_TRUE==IsProportionalWidth(colPosition))
{ // this col has proportional width, so set its width based on the table width
mColumnWidths[colIndex] = minColWidth;
if (gsDebug==PR_TRUE)
@ -1819,7 +1925,6 @@ PRBool nsTableFrame::SetColumnsToMinWidth(nsIPresContext* aPresContext)
}
PRBool nsTableFrame::BalanceColumnsTableFits(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth)
{
NS_ASSERTION(nsnull==mPrevInFlow, "never ever call me on a continuing frame!");
@ -1831,8 +1936,6 @@ PRBool nsTableFrame::BalanceColumnsTableFits(nsIPresContext* aPresContext,
{
nsColLayoutData * colData = (nsColLayoutData *)(columnLayoutData->ElementAt(colIndex));
nsTableColPtr col = colData->GetCol(); // col: ADDREF++
nsStyleMolecule* colStyle =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsVoidArray *cells = colData->GetCells();
PRInt32 minColWidth = 0;
PRInt32 maxColWidth = 0;
@ -1841,7 +1944,11 @@ PRBool nsTableFrame::BalanceColumnsTableFits(nsIPresContext* aPresContext,
/* TODO: must distribute COLSPAN'd cell widths between columns, either here
* or in the prior Balance***ColumnWidth routines
*/
if (PR_TRUE==IsProportionalWidth(colStyle))
// XXX Need columnFrame to ask the style question
nsStylePosition* colPosition = nsnull;
if (PR_TRUE==IsProportionalWidth(colPosition))
{
for (PRInt32 cellIndex = 0; cellIndex<numCells; cellIndex++)
{ // this col has proportional width, so determine its width requirements
@ -1862,12 +1969,16 @@ PRBool nsTableFrame::BalanceColumnsTableFits(nsIPresContext* aPresContext,
if (gsDebug==PR_TRUE)
{
printf (" for determining width of col %d %s:\n",colIndex, IsProportionalWidth(colStyle)? "(P)":"(A)");
printf (" for determining width of col %d %s:\n",colIndex, IsProportionalWidth(colPosition)? "(P)":"(A)");
printf (" minColWidth = %d and maxColWidth = %d\n", minColWidth, maxColWidth);
printf (" aAvailWidth = %d\n", aAvailWidth);
}
if (PR_TRUE==IsProportionalWidth(colStyle))
// XXX BUG: why are we asking this again? this if is already in a
// IsProportionalWidth == PR_TRUE case!
if (PR_TRUE==IsProportionalWidth(colPosition))
{ // this col has proportional width, so set its width based on the table width
#if XXX_bug_kipp_about_this
if (0==colStyle->proportionalWidth)
{ // col width is specified to be the minimum
mColumnWidths[colIndex] = minColWidth;
@ -1875,7 +1986,9 @@ PRBool nsTableFrame::BalanceColumnsTableFits(nsIPresContext* aPresContext,
printf (" 3 (0): col %d set to min width = %d because style set proportionalWidth=0\n",
colIndex, mColumnWidths[colIndex]);
}
if (PR_TRUE==AutoColumnWidths(aTableStyleMol))
else // BUG? else? other code below has the else
#endif
if (PR_TRUE==AutoColumnWidths())
{ // give each remaining column it's desired width
// if there is width left over, we'll factor that in after this loop is complete
mColumnWidths[colIndex] = maxColWidth;
@ -1892,8 +2005,10 @@ PRBool nsTableFrame::BalanceColumnsTableFits(nsIPresContext* aPresContext,
}
else
{
#if XXX_bug_kipp_about_this
percentage = colStyle->proportionalWidth;
if (-1==percentage)
#endif
percentage = 100/numCols;
mColumnWidths[colIndex] = (percentage*aAvailWidth)/100;
// if the column was computed to be too small, enlarge the column
@ -1911,7 +2026,6 @@ PRBool nsTableFrame::BalanceColumnsTableFits(nsIPresContext* aPresContext,
}
PRBool nsTableFrame::BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth,
PRInt32 aMaxWidth,
PRInt32 aMinTableWidth,
@ -1927,14 +2041,22 @@ PRBool nsTableFrame::BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext
{
nsColLayoutData * colData = (nsColLayoutData *)(columnLayoutData->ElementAt(colIndex));
nsTableColPtr col = colData->GetCol(); // col: ADDREF++
#if XXX_bug_kipp_about_this
// XXX BUG: mStyleContext is for the table frame not for the column.
nsStyleMolecule* colStyle =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
#else
nsStylePosition* colPosition = nsnull;
#endif
nsVoidArray *cells = colData->GetCells();
PRInt32 minColWidth = 0;
PRInt32 maxColWidth = 0;
PRInt32 numCells = cells->Count();
if (gsDebug==PR_TRUE) printf (" for col %d\n", colIndex);
if (PR_TRUE==IsProportionalWidth(colStyle))
if (PR_TRUE==IsProportionalWidth(colPosition))
{
for (PRInt32 cellIndex = 0; cellIndex<numCells; cellIndex++)
{ // this col has proportional width, so determine its width requirements
@ -1957,15 +2079,19 @@ PRBool nsTableFrame::BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext
if (gsDebug==PR_TRUE)
{
printf (" for determining width of col %d %s:\n",colIndex, IsProportionalWidth(colStyle)? "(P)":"(A)");
printf (" for determining width of col %d %s:\n",colIndex, IsProportionalWidth(colPosition)? "(P)":"(A)");
printf (" minTableWidth = %d and maxTableWidth = %d\n", aMinTableWidth, aMaxTableWidth);
printf (" minColWidth = %d and maxColWidth = %d\n", minColWidth, maxColWidth);
printf (" aAvailWidth = %d\n", aAvailWidth);
}
if (PR_TRUE==IsProportionalWidth(colStyle))
// XXX BUG: why are we asking this again? this if is already in a
// IsProportionalWidth == PR_TRUE case!
if (PR_TRUE==IsProportionalWidth(colPosition))
{ // this col has proportional width, so set its width based on the table width
// the table fits in the space somewhere between its min and max size
// so dole out the available space appropriately
#if XXX_bug_kipp_about_this
if (0==colStyle->proportionalWidth)
{ // col width is specified to be the minimum
mColumnWidths[colIndex] = minColWidth;
@ -1973,7 +2099,9 @@ PRBool nsTableFrame::BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext
printf (" 4 (0): col %d set to min width = %d because style set proportionalWidth=0\n",
colIndex, mColumnWidths[colIndex]);
}
else if (AutoColumnWidths(aTableStyleMol))
else
#endif
if (AutoColumnWidths())
{
PRInt32 W = aMaxWidth - aMinTableWidth;
PRInt32 D = aMaxTableWidth - aMinTableWidth;
@ -1985,9 +2113,11 @@ PRBool nsTableFrame::BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext
}
else
{ // give each remaining column an equal percentage of the remaining space
#if XXX_bug_kipp_about_this
PRInt32 percentage = colStyle->proportionalWidth;
if (-1==percentage)
percentage = 100/numCols;
#endif
PRInt32 percentage = 100/numCols;
mColumnWidths[colIndex] = (percentage*aAvailWidth)/100;
// if the column was computed to be too small, enlarge the column
if (mColumnWidths[colIndex] <= minColWidth)
@ -2012,7 +2142,7 @@ PRBool nsTableFrame::BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext
// if columns have equal width, and some column's content couldn't squeeze into the computed size,
// then expand every column to the min size of the column with the largest min size
if (!AutoColumnWidths(aTableStyleMol) && 0!=maxOfAllMinColWidths)
if (!AutoColumnWidths() && 0!=maxOfAllMinColWidths)
{
if (gsDebug==PR_TRUE) printf(" EqualColWidths specified, so setting all col widths to %d\n", maxOfAllMinColWidths);
for (PRInt32 colIndex = 0; colIndex<numCols; colIndex++)
@ -2028,8 +2158,7 @@ PRBool nsTableFrame::BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext
add in table insets
set rect
*/
void nsTableFrame::SetTableWidth(nsIPresContext* aPresContext,
nsStyleMolecule *aTableStyle)
void nsTableFrame::SetTableWidth(nsIPresContext* aPresContext)
{
NS_ASSERTION(nsnull==mPrevInFlow, "never ever call me on a continuing frame!");
@ -2044,8 +2173,10 @@ void nsTableFrame::SetTableWidth(nsIPresContext* aPresContext,
}
// Compute the insets (sum of border and padding)
nscoord rightInset = aTableStyle->borderPadding.right;
nscoord leftInset = aTableStyle->borderPadding.left;
nsStyleSpacing* spacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
nscoord rightInset = spacing->mBorderPadding.right;
nscoord leftInset = spacing->mBorderPadding.left;
tableWidth += (leftInset + rightInset);
nsRect tableSize = mRect;
tableSize.width = tableWidth;
@ -2069,7 +2200,14 @@ void nsTableFrame::ShrinkWrapChildren(nsIPresContext* aPresContext,
#endif
// iterate children, tell all row groups to ShrinkWrap
PRBool atLeastOneRowSpanningCell = PR_FALSE;
PRInt32 tableHeight = 0;
nsStyleSpacing* spacing = (nsStyleSpacing*)
mStyleContext->GetData(kStyleSpacingSID);
tableHeight +=
spacing->mBorderPadding.top + spacing->mBorderPadding.bottom;
PRInt32 childCount = mChildCount;
nsIFrame * kidFrame;
for (PRInt32 i = 0; i < childCount; i++)
@ -2277,12 +2415,31 @@ void nsTableFrame::ShrinkWrapChildren(nsIPresContext* aPresContext,
#endif
}
PRBool nsTableFrame::IsProportionalWidth(nsStyleMolecule* aMol)
// XXX Kipp wonders: what does this really mean? Are you really asking
// "Is it fixed width"? If so, then VALUE_PCT may be wrong and the
// name of the method should be changed.
PRBool nsTableFrame::IsProportionalWidth(nsStylePosition* aStylePosition)
{
PRBool result = PR_FALSE;
if ((-1!=aMol->proportionalWidth) ||
((-1==aMol->proportionalWidth) && (-1==aMol->fixedWidth)))
if (nsnull == aStylePosition) {
// Assume NS_STYLE_POSITION_VALUE_AUTO when no style is available
result = PR_TRUE;
}
else {
switch (aStylePosition->mWidthFlags) {
case NS_STYLE_POSITION_VALUE_LENGTH:
case NS_STYLE_POSITION_VALUE_PCT:
break;
default:
case NS_STYLE_POSITION_VALUE_AUTO:
case NS_STYLE_POSITION_VALUE_INHERIT:
case NS_STYLE_POSITION_VALUE_PROPORTIONAL:
result = PR_TRUE;
break;
}
}
return result;
}
@ -2487,7 +2644,7 @@ PRBool nsTableFrame::TableIsAutoWidth()
return isTableAutoWidth;
}
PRBool nsTableFrame::AutoColumnWidths(nsStyleMolecule* aTableStyleMol)
PRBool nsTableFrame::AutoColumnWidths()
{ // ZZZ: TOTAL HACK
return isAutoColumnWidths;
}
@ -2525,8 +2682,6 @@ NS_METHOD nsTableFrame::CreateContinuingFrame(nsIPresContext* aPresContext,
// Resolve style for the child
nsIStyleContext* kidStyleContext =
aPresContext->ResolveStyleContextFor(content, cf); // kidStyleContext: REFCNT++
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidStyleContext->GetData(kStyleMoleculeSID);
nsIContentDelegate* kidDel = nsnull;
kidDel = content->GetDelegate(aPresContext); // kidDel: REFCNT++
nsIFrame * duplicateFrame = kidDel->CreateFrame(aPresContext, content, index, cf);
@ -2577,6 +2732,12 @@ PRInt32 nsTableFrame::GetColumnWidth(PRInt32 aColIndex)
//printf("GET_COL_WIDTH: %p, FIF=%p getting col %d and returning %d\n", this, firstInFlow, aColIndex, result);
// XXX hack
#if 0
if (result <= 0) {
result = 100;
}
#endif
return result;
}

View File

@ -26,8 +26,9 @@ class nsTableCell;
class nsVoidArray;
class nsTableCellFrame;
class CellData;
struct nsStyleMolecule;
struct InnerTableReflowState;
struct nsStylePosition;
struct nsStyleSpacing;
/** nsTableFrame maps the inner portion of a table (everything except captions.)
* Used as a pseudo-frame within nsTableOuterFrame,
@ -133,7 +134,7 @@ public:
/** returns PR_TRUE if this table has proportional width
*/
PRBool IsProportionalWidth(nsStyleMolecule* aMol);
PRBool IsProportionalWidth(nsStylePosition* aStylePosition);
@ -193,11 +194,10 @@ protected:
*
* @see ResizeReflow
*/
virtual nsIFrame::ReflowStatus ResizeReflowPass1(nsIPresContext* aPresContext,
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle);
virtual ReflowStatus ResizeReflowPass1(nsIPresContext* aPresContext,
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize);
/** second pass of ResizeReflow.
* lays out all table content with aMaxSize(computed_table_width, given_table_height)
@ -210,17 +210,16 @@ protected:
* @see ResizeReflow
* @see NeedsReflow
*/
virtual nsIFrame::ReflowStatus ResizeReflowPass2(nsIPresContext* aPresContext,
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle,
PRInt32 aMinCaptionWidth,
PRInt32 mMaxCaptionWidth);
virtual ReflowStatus ResizeReflowPass2(nsIPresContext* aPresContext,
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
PRInt32 aMinCaptionWidth,
PRInt32 mMaxCaptionWidth);
nscoord GetTopMarginFor(nsIPresContext* aCX,
InnerTableReflowState& aState,
nsStyleMolecule* aKidMol);
nsStyleSpacing* aKidSpacing);
void PlaceChild(nsIPresContext* aPresContext,
InnerTableReflowState& aState,
@ -273,7 +272,6 @@ protected:
* @param aMaxElementSize the min size of the largest indivisible object
*/
virtual void BalanceColumnWidths(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyle,
const nsSize& aMaxSize,
nsSize* aMaxElementSize);
@ -296,7 +294,6 @@ protected:
virtual PRBool AssignFixedColumnWidths(nsIPresContext* aPresContext,
PRInt32 aMaxWidth,
PRInt32 aNumCols,
nsStyleMolecule* aTableStyleMol,
PRInt32 & aTotalFixedWidth,
PRInt32 & aMinTableWidth,
PRInt32 & aMaxTableWidth);
@ -317,7 +314,6 @@ protected:
* TODO: rename this method to reflect that it is a Nav4 compatibility method
*/
virtual PRBool BalanceProportionalColumnsForSpecifiedWidthTable(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth,
PRInt32 aMaxWidth,
PRInt32 aMinTableWidth,
@ -339,7 +335,6 @@ protected:
* TODO: rename this method to reflect that it is a Nav4 compatibility method
*/
virtual PRBool BalanceProportionalColumnsForAutoWidthTable(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth,
PRInt32 aMaxWidth,
PRInt32 aMinTableWidth,
@ -366,7 +361,6 @@ protected:
* @return PR_TRUE if all is well, PR_FALSE if there was an unrecoverable error
*/
virtual PRBool BalanceColumnsTableFits(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth);
/** assign widths for each column that has proportional width inside a table that
@ -386,15 +380,13 @@ protected:
* TODO: rename this method to reflect that it is a Nav4 compatibility method
*/
virtual PRBool BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth,
PRInt32 aMaxWidth,
PRInt32 aMinTableWidth,
PRInt32 aMaxTableWidth);
/** sets the width of the table according to the computed widths of each column. */
virtual void SetTableWidth(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyle);
virtual void SetTableWidth(nsIPresContext* aPresContext);
/**
*/
@ -413,7 +405,7 @@ protected:
* according to its content.
* In NAV4, this is when there is a COLS attribute on the table.
*/
virtual PRBool AutoColumnWidths(nsStyleMolecule* aTableStyleMol);
virtual PRBool AutoColumnWidths();
/** given the new parent size, do I really need to do a reflow? */
virtual PRBool NeedsReflow(const nsSize& aMaxSize);

View File

@ -43,7 +43,8 @@ static PRBool gsDebug = PR_FALSE;
static const PRBool gsDebug = PR_FALSE;
#endif
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
static NS_DEFINE_IID(kITableContentIID, NS_ITABLECONTENT_IID);
NS_DEF_PTR(nsIStyleContext);
@ -54,9 +55,6 @@ struct OuterTableReflowState {
// The presentation context
nsIPresContext *pc;
// The body's style molecule
nsStyleMolecule* mol;
// The total available size (computed from the parent)
nsSize availSize;
// The available size for the inner table frame
@ -78,11 +76,9 @@ struct OuterTableReflowState {
PRBool processingCaption;
OuterTableReflowState(nsIPresContext* aPresContext,
const nsSize& aMaxSize,
nsStyleMolecule* aMol)
const nsSize& aMaxSize)
{
pc = aPresContext;
mol = aMol;
availSize.width = aMaxSize.width;
availSize.height = aMaxSize.height;
prevMaxPosBottomMargin = 0;
@ -213,17 +209,14 @@ NS_METHOD nsTableOuterFrame::ResizeReflow(nsIPresContext* aPresContext,
aStatus = frComplete;
return NS_OK;
}
nsStyleMolecule* tableStyleMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
OuterTableReflowState state(aPresContext, aMaxSize, tableStyleMol);
OuterTableReflowState state(aPresContext, aMaxSize);
// lay out captions pass 1, if necessary
if (PR_FALSE==IsFirstPassValid())
{
mFirstPassValid = PR_TRUE;
aStatus = ResizeReflowCaptionsPass1(aPresContext, tableStyleMol);
aStatus = ResizeReflowCaptionsPass1(aPresContext);
}
@ -232,7 +225,7 @@ NS_METHOD nsTableOuterFrame::ResizeReflow(nsIPresContext* aPresContext,
{ // we treat the table as if we've never seen the layout data before
mInnerTableFrame->SetReflowPass(nsTableFrame::kPASS_FIRST);
aStatus = mInnerTableFrame->ResizeReflowPass1(aPresContext, aDesiredSize, aMaxSize,
&innerTableMaxElementSize, tableStyleMol);
&innerTableMaxElementSize);
#ifdef NOISY_MARGINS
nsIContentPtr content = mInnerTableFrame->GetContent();
@ -252,9 +245,9 @@ NS_METHOD nsTableOuterFrame::ResizeReflow(nsIPresContext* aPresContext,
if (nsnull==prevInFlow)
{
// assign column widths, and assign aMaxElementSize->width
mInnerTableFrame->BalanceColumnWidths(aPresContext, tableStyleMol, aMaxSize, aMaxElementSize);
mInnerTableFrame->BalanceColumnWidths(aPresContext, aMaxSize, aMaxElementSize);
// assign table width
mInnerTableFrame->SetTableWidth(aPresContext, tableStyleMol);
mInnerTableFrame->SetTableWidth(aPresContext);
}
// inner table max is now the computed width and assigned height
nsSize innerTableSize;
@ -350,12 +343,12 @@ NS_METHOD nsTableOuterFrame::ResizeReflow(nsIPresContext* aPresContext,
// Collapse child's top margin with previous bottom margin
nscoord nsTableOuterFrame::GetTopMarginFor(nsIPresContext* aCX,
OuterTableReflowState& aState,
nsStyleMolecule* aKidMol)
nsStyleSpacing* aKidSpacing)
{
nscoord margin;
nscoord maxNegTopMargin = 0;
nscoord maxPosTopMargin = 0;
if ((margin = aKidMol->margin.top) < 0) {
if ((margin = aKidSpacing->mMargin.top) < 0) {
maxNegTopMargin = -margin;
} else {
maxPosTopMargin = margin;
@ -468,9 +461,10 @@ PRBool nsTableOuterFrame::ReflowMappedChildren( nsIPresContext* aPresContex
nsIStyleContextPtr kidSC;
kidFrame->GetStyleContext(aPresContext, kidSC.AssignRef());
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidMol);
nscoord bottomMargin = kidMol->margin.bottom;
nsStyleSpacing* kidSpacing =
(nsStyleSpacing*)kidSC->GetData(kStyleSpacingSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidSpacing);
nscoord bottomMargin = kidSpacing->mMargin.bottom;
// Figure out the amount of available size for the child (subtract
// off the top margin we are going to apply to it)
@ -479,7 +473,7 @@ PRBool nsTableOuterFrame::ReflowMappedChildren( nsIPresContext* aPresContex
}
// Subtract off for left and right margin
if (PR_FALSE == aState.unconstrainedWidth) {
aState.availSize.width -= kidMol->margin.left + kidMol->margin.right;
aState.availSize.width -= kidSpacing->mMargin.left + kidSpacing->mMargin.right;
}
// Only skip the reflow if this is not our first child and we are
@ -509,7 +503,7 @@ PRBool nsTableOuterFrame::ReflowMappedChildren( nsIPresContext* aPresContex
// Place the child after taking into account it's margin
aState.y += topMargin;
nsRect kidRect (0, 0, kidSize.width, kidSize.height);
kidRect.x += kidMol->margin.left;
kidRect.x += kidSpacing->mMargin.left;
kidRect.y += aState.y;
PlaceChild(aState, kidFrame, kidRect, aMaxElementSize, kidMaxElementSize);
if (bottomMargin < 0) {
@ -894,29 +888,28 @@ nsTableOuterFrame::ReflowChild( nsIFrame* aKidFrame,
aKidFrame->GetStyleContext(aPresContext, captionStyleContext.AssignRef());
NS_ASSERTION(nsnull != captionStyleContext, "null style context for caption");
nsStyleMolecule* captionStyle =
(nsStyleMolecule*)captionStyleContext->GetData(kStyleMoleculeSID);
nsStyleText* captionStyle =
(nsStyleText*)captionStyleContext->GetData(kStyleTextSID);
NS_ASSERTION(nsnull != captionStyle, "null style molecule for caption");
if (NS_STYLE_VERTICAL_ALIGN_BOTTOM==captionStyle->verticalAlign)
if (NS_STYLE_VERTICAL_ALIGN_BOTTOM==captionStyle->mVerticalAlign)
{
if (PR_TRUE==gsDebug) printf("reflowChild called with a bottom caption\n");
status = ResizeReflowBottomCaptionsPass2(aPresContext, aDesiredSize,
aMaxSize, aMaxElementSize,
aState.mol, aState.y);
aState.y);
}
else
{
if (PR_TRUE==gsDebug) printf("reflowChild called with a top caption\n");
status = ResizeReflowTopCaptionsPass2(aPresContext, aDesiredSize,
aMaxSize, aMaxElementSize,
aState.mol);
aMaxSize, aMaxElementSize);
}
}
else
{
if (PR_TRUE==gsDebug) printf("reflowChild called with a table body\n");
status = ((nsTableFrame*)aKidFrame)->ResizeReflowPass2(aPresContext, aDesiredSize, aState.availSize,
aMaxElementSize, aState.mol,
status = ((nsTableFrame*)aKidFrame)->ResizeReflowPass2(aPresContext, aDesiredSize, aState.innerTableMaxSize,
aMaxElementSize,
mMinCaptionWidth, mMaxCaptionWidth);
}
if (PR_TRUE==gsDebug)
@ -977,12 +970,12 @@ void nsTableOuterFrame::CreateChildFrames(nsIPresContext* aPresContext)
nsIStyleContextPtr captionStyleContext =
aPresContext->ResolveStyleContextFor(caption, this);
NS_ASSERTION(nsnull!=captionStyleContext, "bad style context for caption.");
nsStyleMolecule* captionStyle =
(nsStyleMolecule*)captionStyleContext->GetData(kStyleMoleculeSID);
nsStyleText* captionStyle =
(nsStyleText*)captionStyleContext->GetData(kStyleTextSID);
captionFrame->SetStyleContext(captionStyleContext);
mChildCount++;
// Link child frame into the list of children
if (NS_STYLE_VERTICAL_ALIGN_BOTTOM==captionStyle->verticalAlign)
if (NS_STYLE_VERTICAL_ALIGN_BOTTOM==captionStyle->mVerticalAlign)
{ // bottom captions get added to the end of the outer frame child list
prevKidFrame->SetNextSibling(captionFrame);
prevKidFrame = captionFrame;
@ -1018,7 +1011,7 @@ void nsTableOuterFrame::CreateChildFrames(nsIPresContext* aPresContext)
nsIFrame::ReflowStatus
nsTableOuterFrame::ResizeReflowCaptionsPass1(nsIPresContext* aPresContext, nsStyleMolecule* aTableStyle)
nsTableOuterFrame::ResizeReflowCaptionsPass1(nsIPresContext* aPresContext)
{
if (nsnull!=mCaptionFrames)
{
@ -1046,8 +1039,7 @@ nsIFrame::ReflowStatus
nsTableOuterFrame::ResizeReflowTopCaptionsPass2(nsIPresContext* aPresContext,
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle)
nsSize* aMaxElementSize)
{
ReflowStatus result = frComplete;
nscoord topCaptionY = 0;
@ -1064,11 +1056,11 @@ nsTableOuterFrame::ResizeReflowTopCaptionsPass2(nsIPresContext* aPresContext,
captionFrame->GetStyleContext(aPresContext, captionStyleContext.AssignRef());
NS_ASSERTION(nsnull != captionStyleContext, "null style context for caption");
nsStyleMolecule* captionStyle =
(nsStyleMolecule*)captionStyleContext->GetData(kStyleMoleculeSID);
nsStyleText* captionStyle =
(nsStyleText*)captionStyleContext->GetData(kStyleTextSID);
NS_ASSERTION(nsnull != captionStyle, "null style molecule for caption");
if (NS_STYLE_VERTICAL_ALIGN_BOTTOM==captionStyle->verticalAlign)
if (NS_STYLE_VERTICAL_ALIGN_BOTTOM==captionStyle->mVerticalAlign)
{
}
else
@ -1113,7 +1105,6 @@ nsTableOuterFrame::ResizeReflowBottomCaptionsPass2(nsIPresContext* aPresContext
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle,
nscoord aYOffset)
{
ReflowStatus result = frComplete;

View File

@ -23,9 +23,9 @@
class nsTableFrame;
class nsVoidArray;
struct nsStyleMolecule;
class nsTableCaptionFrame;
struct OuterTableReflowState;
struct nsStyleSpacing;
/**
* main frame for an nsTable content object,
@ -137,8 +137,7 @@ protected:
/** reflow the captions in an infinite space, caching the min/max sizes for each
*/
virtual ReflowStatus ResizeReflowCaptionsPass1(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyle);
virtual ReflowStatus ResizeReflowCaptionsPass1(nsIPresContext* aPresContext);
/** reflow the top captions in a space constrained by the computed table width
* and the heigth given to us by our parent. Top captions are laid down
@ -147,8 +146,7 @@ protected:
virtual ReflowStatus ResizeReflowTopCaptionsPass2(nsIPresContext* aPresContext,
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle);
nsSize* aMaxElementSize);
/** reflow the bottom captions in a space constrained by the computed table width
* and the heigth given to us by our parent. Bottom captions are laid down
@ -158,12 +156,11 @@ protected:
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle,
nscoord aYOffset);
nscoord GetTopMarginFor(nsIPresContext* aCX,
OuterTableReflowState& aState,
nsStyleMolecule* aKidMol);
nsStyleSpacing* aKidSpacing);
void PlaceChild( OuterTableReflowState& aState,
nsIFrame* aKidFrame,

View File

@ -38,15 +38,11 @@ static const PRBool gsDebug1 = PR_FALSE;
static const PRBool gsDebug2 = PR_FALSE;
#endif
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
/* ----------- RowReflowState ---------- */
struct RowReflowState {
// The body's style molecule
nsStyleMolecule* mol;
// The body's available size (computed from the body's parent)
nsSize availSize;
@ -68,10 +64,8 @@ struct RowReflowState {
RowReflowState( nsIPresContext* aPresContext,
const nsSize& aMaxSize,
nsStyleMolecule* aMol)
const nsSize& aMaxSize)
{
mol = aMol;
availSize.width = aMaxSize.width;
availSize.height = aMaxSize.height;
prevMaxPosBottomMargin = 0;
@ -175,12 +169,12 @@ PRInt32 nsTableRowFrame::GetTallestChild() const
// Collapse child's top margin with previous bottom margin
nscoord nsTableRowFrame::GetTopMarginFor( nsIPresContext* aCX,
RowReflowState& aState,
nsStyleMolecule* aKidMol)
nsStyleSpacing* aKidSpacing)
{
nscoord margin;
nscoord maxNegTopMargin = 0;
nscoord maxPosTopMargin = 0;
if ((margin = aKidMol->margin.top) < 0) {
if ((margin = aKidSpacing->mMargin.top) < 0) {
maxNegTopMargin = -margin;
} else {
maxPosTopMargin = margin;
@ -284,9 +278,10 @@ PRBool nsTableRowFrame::ReflowMappedChildren(nsIPresContext* aPresContext,
// Get top margin for this kid
nsIStyleContext* kidSC;
kidFrame->GetStyleContext(aPresContext, kidSC);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidMol);
nscoord bottomMargin = kidMol->margin.bottom;
nsStyleSpacing* kidSpacing = (nsStyleSpacing*)
kidSC->GetData(kStyleSpacingSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidSpacing);
nscoord bottomMargin = kidSpacing->mMargin.bottom;
NS_RELEASE(kidSC);
// Figure out the amount of available size for the child (subtract
@ -296,7 +291,7 @@ PRBool nsTableRowFrame::ReflowMappedChildren(nsIPresContext* aPresContext,
}
// Subtract off for left and right margin
if (PR_FALSE == aState.unconstrainedWidth) {
kidAvailSize.width -= kidMol->margin.left + kidMol->margin.right;
kidAvailSize.width -= kidSpacing->mMargin.left + kidSpacing->mMargin.right;
}
if (NS_UNCONSTRAINEDSIZE == aState.availSize.width)
@ -315,7 +310,7 @@ PRBool nsTableRowFrame::ReflowMappedChildren(nsIPresContext* aPresContext,
nscoord availWidth = 0;
for (PRInt32 numColSpan=0; numColSpan<cellColSpan; numColSpan++)
availWidth += aState.tableFrame->GetColumnWidth(cellStartingCol+numColSpan);
NS_ASSERTION(0<availWidth, "illegal width for this column");
// NS_ASSERTION(0<availWidth, "illegal width for this column");
kidAvailSize.width = availWidth;
status = ReflowChild(kidFrame, aPresContext, desiredSize,
kidAvailSize, pKidMaxElementSize);
@ -427,7 +422,7 @@ PRBool nsTableRowFrame::ReflowMappedChildren(nsIPresContext* aPresContext,
// Add back in the left and right margins, because one row does not
// impact another row's width
if (PR_FALSE == aState.unconstrainedWidth) {
kidAvailSize.width += kidMol->margin.left + kidMol->margin.right;
kidAvailSize.width += kidSpacing->mMargin.left + kidSpacing->mMargin.right;
}
// Get the next child
@ -801,10 +796,10 @@ nsTableRowFrame::ReflowUnmappedChildren( nsIPresContext* aPresContext,
// Resolve style
nsIStyleContext* kidStyleContext =
aPresContext->ResolveStyleContextFor(cell, this);
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidStyleContext->GetData(kStyleMoleculeSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidMol);
nscoord bottomMargin = kidMol->margin.bottom;
nsStyleSpacing* kidSpacing = (nsStyleSpacing*)
kidStyleContext->GetData(kStyleSpacingSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidSpacing);
nscoord bottomMargin = kidSpacing->mMargin.bottom;
nsIFrame* kidFrame;
@ -956,9 +951,7 @@ nsTableRowFrame::ResizeReflow(nsIPresContext* aPresContext,
// Check for an overflow list
MoveOverflowToChildList();
nsStyleMolecule* myMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
RowReflowState state(aPresContext, aMaxSize, myMol);
RowReflowState state(aPresContext, aMaxSize);
mContentParent->GetContentParent((nsIFrame*&)(state.tableFrame));
// Reflow the existing frames

View File

@ -22,7 +22,7 @@
#include "nsContainerFrame.h"
struct RowReflowState;
struct nsStyleSpacing;
/**
* nsTableRowFrame is the frame that maps table rows
@ -121,7 +121,7 @@ protected:
nscoord GetTopMarginFor(nsIPresContext* aCX,
RowReflowState& aState,
nsStyleMolecule* aKidMol);
nsStyleSpacing* aKidSpacing);
void PlaceChild( nsIPresContext* aPresContext,
RowReflowState& aState,

View File

@ -37,7 +37,7 @@ static const PRBool gsDebug1 = PR_FALSE;
static const PRBool gsDebug2 = PR_FALSE;
#endif
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
NS_DEF_PTR(nsIStyleContext);
NS_DEF_PTR(nsIContent);
@ -45,10 +45,6 @@ NS_DEF_PTR(nsIContent);
/* ----------- RowGroupReflowState ---------- */
struct RowGroupReflowState {
// The body's style molecule
nsStyleMolecule* mol;
// The body's available size (computed from the body's parent)
nsSize availSize;
@ -70,10 +66,8 @@ struct RowGroupReflowState {
nscoord firstRowHeight;
RowGroupReflowState(nsIPresContext* aPresContext,
const nsSize& aMaxSize,
nsStyleMolecule* aMol)
const nsSize& aMaxSize)
{
mol = aMol;
availSize.width = aMaxSize.width;
availSize.height = aMaxSize.height;
prevMaxPosBottomMargin = 0;
@ -170,12 +164,12 @@ void nsTableRowGroupFrame::PaintChildren(nsIPresContext& aPresContext,
// Collapse child's top margin with previous bottom margin
nscoord nsTableRowGroupFrame::GetTopMarginFor(nsIPresContext* aCX,
RowGroupReflowState& aState,
nsStyleMolecule* aKidMol)
nsStyleSpacing* aKidSpacing)
{
nscoord margin;
nscoord maxNegTopMargin = 0;
nscoord maxPosTopMargin = 0;
if ((margin = aKidMol->margin.top) < 0) {
if ((margin = aKidSpacing->mMargin.top) < 0) {
maxNegTopMargin = -margin;
} else {
maxPosTopMargin = margin;
@ -286,9 +280,10 @@ PRBool nsTableRowGroupFrame::ReflowMappedChildren( nsIPresContext* aPresCon
nsIStyleContextPtr kidSC;
kidFrame->GetStyleContext(aPresContext, kidSC.AssignRef());
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidMol);
nscoord bottomMargin = kidMol->margin.bottom;
nsStyleSpacing* kidSpacing = (nsStyleSpacing*)
kidSC->GetData(kStyleSpacingSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidSpacing);
nscoord bottomMargin = kidSpacing->mMargin.bottom;
// Figure out the amount of available size for the child (subtract
// off the top margin we are going to apply to it)
@ -297,7 +292,7 @@ PRBool nsTableRowGroupFrame::ReflowMappedChildren( nsIPresContext* aPresCon
}
// Subtract off for left and right margin
if (PR_FALSE == aState.unconstrainedWidth) {
kidAvailSize.width -= kidMol->margin.left + kidMol->margin.right;
kidAvailSize.width -= kidSpacing->mMargin.left + kidSpacing->mMargin.right;
}
// Reflow the child into the available space
@ -330,7 +325,7 @@ PRBool nsTableRowGroupFrame::ReflowMappedChildren( nsIPresContext* aPresCon
// Place the child after taking into account it's margin
aState.y += topMargin;
nsRect kidRect (0, 0, desiredSize.width, desiredSize.height);
kidRect.x += kidMol->margin.left;
kidRect.x += kidSpacing->mMargin.left;
kidRect.y += aState.y;
PlaceChild(aPresContext, aState, kidFrame, kidRect, aMaxElementSize,
kidMaxElementSize);
@ -396,7 +391,7 @@ PRBool nsTableRowGroupFrame::ReflowMappedChildren( nsIPresContext* aPresCon
// Add back in the left and right margins, because one row does not
// impact another row's width
if (PR_FALSE == aState.unconstrainedWidth) {
kidAvailSize.width += kidMol->margin.left + kidMol->margin.right;
kidAvailSize.width += kidSpacing->mMargin.left + kidSpacing->mMargin.right;
}
// Get the next child
@ -731,12 +726,12 @@ nsTableRowGroupFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
}
// Resolve style
nsIStyleContextPtr kidStyleContext =
nsIStyleContextPtr kidSC =
aPresContext->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidStyleContext->GetData(kStyleMoleculeSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidMol);
nscoord bottomMargin = kidMol->margin.bottom;
nsStyleSpacing* kidSpacing = (nsStyleSpacing*)
kidSC->GetData(kStyleSpacingSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidSpacing);
nscoord bottomMargin = kidSpacing->mMargin.bottom;
nsIFrame* kidFrame;
@ -746,7 +741,7 @@ nsTableRowGroupFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
kidDel = kid->GetDelegate(aPresContext);
kidFrame = kidDel->CreateFrame(aPresContext, kid, kidIndex, this);
NS_RELEASE(kidDel);
kidFrame->SetStyleContext(kidStyleContext);
kidFrame->SetStyleContext(kidSC);
} else {
kidPrevInFlow->CreateContinuingFrame(aPresContext, this, kidFrame);
}
@ -840,9 +835,7 @@ nsTableRowGroupFrame::ResizeReflow( nsIPresContext* aPresContext,
// Check for an overflow list
MoveOverflowToChildList();
nsStyleMolecule* myMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
RowGroupReflowState state(aPresContext, aMaxSize, myMol);
RowGroupReflowState state(aPresContext, aMaxSize);
// Reflow the existing frames
if (nsnull != mFirstChild) {

View File

@ -23,7 +23,7 @@
#include "nsIAtom.h"
struct RowGroupReflowState;
struct nsStyleMolecule;
struct nsStyleSpacing;
/**
* nsTableRowGroupFrame is the frame that maps row groups
@ -114,7 +114,7 @@ protected:
nscoord GetTopMarginFor(nsIPresContext* aCX,
RowGroupReflowState& aState,
nsStyleMolecule* aKidMol);
nsStyleSpacing* aKidSpacing);
void PlaceChild( nsIPresContext* aPresContext,
RowGroupReflowState& aState,

View File

@ -35,9 +35,10 @@ static PRBool gsDebug = PR_FALSE;
static const PRBool gsDebug = PR_FALSE;
#endif
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
static NS_DEFINE_IID(kStyleBorderSID, NS_STYLEBORDER_SID);
static NS_DEFINE_IID(kStyleColorSID, NS_STYLECOLOR_SID);
static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
/**
*/
@ -86,20 +87,15 @@ NS_METHOD nsTableCellFrame::Paint(nsIPresContext& aPresContext,
**/
void nsTableCellFrame::VerticallyAlignChild(nsIPresContext* aPresContext)
{
{
nsStyleSpacing* spacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
nsStyleText* textStyle =
(nsStyleText*)mStyleContext->GetData(kStyleTextSID);
nsStyleMolecule* mol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
NS_ASSERTION(nsnull!=mol, "bad style molecule");
nscoord topInset=0, bottomInset=0;
PRInt32 verticalAlign = NS_STYLE_VERTICAL_ALIGN_MIDDLE;
if (nsnull!=mol)
{
topInset = mol->borderPadding.top;
bottomInset =mol->borderPadding.bottom;
verticalAlign = mol->verticalAlign;
}
nscoord topInset = spacing->mBorderPadding.top;
nscoord bottomInset = spacing->mBorderPadding.bottom;
PRUint8 verticalAlign = textStyle->mVerticalAlign;
nscoord height = mRect.height;
nsRect kidRect;
@ -225,17 +221,12 @@ NS_METHOD nsTableCellFrame::ResizeReflow(nsIPresContext* aPresContext,
// SEC: what about ascent and decent???
// Compute the insets (sum of border and padding)
nsStyleMolecule* myMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
NS_ASSERTION(nsnull!=myMol, "bad style molecule");
nscoord topInset=0,rightInset=0, bottomInset=0, leftInset=0;
if (nsnull!=myMol)
{
topInset = myMol->borderPadding.top;
rightInset = myMol->borderPadding.right;
bottomInset =myMol->borderPadding.bottom;
leftInset = myMol->borderPadding.left;
}
nsStyleSpacing* spacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
nscoord topInset = spacing->mBorderPadding.top;
nscoord rightInset = spacing->mBorderPadding.right;
nscoord bottomInset = spacing->mBorderPadding.bottom;
nscoord leftInset = spacing->mBorderPadding.left;
// reduce available space by insets
if (NS_UNCONSTRAINEDSIZE!=availSize.width)

View File

@ -22,8 +22,6 @@
#include "nsContainerFrame.h"
#include "nsTableCell.h"
struct nsStyleMolecule;
/**
* nsTableCellFrame
* data structure to maintain information about a single table cell's frame

View File

@ -56,9 +56,10 @@ static const PRBool gsDebugMBP = PR_FALSE;
#define max(x, y) ((x) > (y) ? (x) : (y))
#endif
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleBorderSID, NS_STYLEBORDER_SID);
static NS_DEFINE_IID(kStyleColorSID, NS_STYLECOLOR_SID);
static NS_DEFINE_IID(kStylePositionSID, NS_STYLEPOSITION_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
NS_DEF_PTR(nsIStyleContext);
NS_DEF_PTR(nsIContent);
@ -71,11 +72,12 @@ NS_DEF_PTR(nsTableCell);
struct InnerTableReflowState {
// The body's style molecule
nsStyleMolecule* mol;
// The body's available size (computed from the body's parent)
nsSize availSize;
nscoord leftInset, topInset;
// Margin tracking information
nscoord prevMaxPosBottomMargin;
nscoord prevMaxNegBottomMargin;
@ -98,16 +100,28 @@ struct InnerTableReflowState {
InnerTableReflowState(nsIPresContext* aPresContext,
const nsSize& aMaxSize,
nsStyleMolecule* aMol)
nsStyleSpacing* aStyleSpacing)
{
mol = aMol;
availSize.width = aMaxSize.width;
availSize.height = aMaxSize.height;
prevMaxPosBottomMargin = 0;
prevMaxNegBottomMargin = 0;
y=0; // border/padding/margin???
unconstrainedWidth = PRBool(aMaxSize.width == NS_UNCONSTRAINEDSIZE);
availSize.width = aMaxSize.width;
if (!unconstrainedWidth) {
availSize.width -= aStyleSpacing->mBorderPadding.left +
aStyleSpacing->mBorderPadding.right;
}
leftInset = aStyleSpacing->mBorderPadding.left;
unconstrainedHeight = PRBool(aMaxSize.height == NS_UNCONSTRAINEDSIZE);
availSize.height = aMaxSize.height;
if (!unconstrainedHeight) {
availSize.height -= aStyleSpacing->mBorderPadding.top +
aStyleSpacing->mBorderPadding.bottom;
}
topInset = aStyleSpacing->mBorderPadding.top;
firstRowGroup = PR_TRUE;
footerHeight = 0;
footerList = nsnull;
@ -483,37 +497,39 @@ NS_METHOD nsTableFrame::ResizeReflow(nsIPresContext* aPresContext,
aStatus = frComplete;
PRIntervalTime startTime = PR_IntervalNow();
PRIntervalTime startTime;
if (gsTiming) {
startTime = PR_IntervalNow();
}
if (PR_TRUE==gsDebug)
printf ("*** tableframe reflow\t\t%p\n", this);
if (PR_TRUE==NeedsReflow(aMaxSize))
{
nsStyleMolecule* tableStyleMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
NS_ASSERTION(nsnull != tableStyleMol, "null style molecule");
if (nsnull==tableStyleMol)
return frComplete; // SEC: this is an error!
if (PR_FALSE==IsFirstPassValid())
{ // we treat the table as if we've never seen the layout data before
mPass = kPASS_FIRST;
aStatus = ResizeReflowPass1(aPresContext, aDesiredSize, aMaxSize, aMaxElementSize, tableStyleMol);
aStatus = ResizeReflowPass1(aPresContext, aDesiredSize,
aMaxSize, aMaxElementSize);
// check result
}
mPass = kPASS_SECOND;
// assign column widths, and assign aMaxElementSize->width
BalanceColumnWidths(aPresContext, tableStyleMol, aMaxSize, aMaxElementSize);
BalanceColumnWidths(aPresContext, aMaxSize, aMaxElementSize);
// assign table width
SetTableWidth(aPresContext, tableStyleMol);
SetTableWidth(aPresContext);
aStatus = ResizeReflowPass2(aPresContext, aDesiredSize, aMaxSize, aMaxElementSize, tableStyleMol, 0, 0);
aStatus = ResizeReflowPass2(aPresContext, aDesiredSize, aMaxSize,
aMaxElementSize, 0, 0);
PRIntervalTime endTime = PR_IntervalNow();
if (gsTiming) printf("Table reflow took %ld ticks for frame %d\n", endTime-startTime, this);
if (gsTiming) {
PRIntervalTime endTime = PR_IntervalNow();
printf("Table reflow took %ld ticks for frame %d\n",
endTime-startTime, this);/* XXX need to use LL_* macros! */
}
mPass = kPASS_UNDEFINED;
}
@ -540,11 +556,9 @@ NS_METHOD nsTableFrame::ResizeReflow(nsIPresContext* aPresContext,
nsIFrame::ReflowStatus nsTableFrame::ResizeReflowPass1(nsIPresContext* aPresContext,
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle)
nsSize* aMaxElementSize)
{
NS_ASSERTION(nsnull!=aPresContext, "bad pres context param");
NS_ASSERTION(nsnull!=aTableStyle, "bad style param");
NS_ASSERTION(nsnull==mPrevInFlow, "illegal call, cannot call pass 1 on a continuing frame.");
if (gsDebug==PR_TRUE) printf("nsTableFrame::ResizeReflow Pass1: maxSize=%d,%d\n",
@ -573,10 +587,12 @@ nsIFrame::ReflowStatus nsTableFrame::ResizeReflowPass1(nsIPresContext* aPresCont
nsIFrame* prevKidFrame = nsnull;/* XXX incremental reflow! */
// Compute the insets (sum of border and padding)
nscoord topInset = aTableStyle->borderPadding.top;
nscoord rightInset = aTableStyle->borderPadding.right;
nscoord bottomInset =aTableStyle->borderPadding.bottom;
nscoord leftInset = aTableStyle->borderPadding.left;
nsStyleSpacing* spacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
nscoord topInset = spacing->mBorderPadding.top;
nscoord rightInset = spacing->mBorderPadding.right;
nscoord bottomInset =spacing->mBorderPadding.bottom;
nscoord leftInset = spacing->mBorderPadding.left;
/* assumes that Table's children are in the following order:
* Captions
@ -601,9 +617,6 @@ nsIFrame::ReflowStatus nsTableFrame::ResizeReflowPass1(nsIPresContext* aPresCont
nsIStyleContextPtr kidStyleContext =
aPresContext->ResolveStyleContextFor(kid, this);
NS_ASSERTION(nsnull != kidStyleContext, "null style context for kid");
nsStyleMolecule* kidStyle =
(nsStyleMolecule*)kidStyleContext->GetData(kStyleMoleculeSID);
NS_ASSERTION(nsnull != kidStyle, "null style molecule for kid");
// SEC: TODO: when content is appended or deleted, be sure to clear out the frame hierarchy!!!!
@ -701,7 +714,6 @@ nsIFrame::ReflowStatus nsTableFrame::ResizeReflowPass2(nsIPresContext* aPresCont
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle,
PRInt32 aMinCaptionWidth,
PRInt32 mMaxCaptionWidth)
{
@ -737,9 +749,9 @@ nsIFrame::ReflowStatus nsTableFrame::ResizeReflowPass2(nsIPresContext* aPresCont
// Check for an overflow list
MoveOverflowToChildList();
nsStyleMolecule* myMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
InnerTableReflowState state(aPresContext, aMaxSize, myMol);
nsStyleSpacing* mySpacing = (nsStyleSpacing*)
mStyleContext->GetData(kStyleSpacingSID);
InnerTableReflowState state(aPresContext, aMaxSize, mySpacing);
// Reflow the existing frames
if (nsnull != mFirstChild) {
@ -795,13 +807,11 @@ nsIFrame::ReflowStatus nsTableFrame::ResizeReflowPass2(nsIPresContext* aPresCont
if (gsDebug==PR_TRUE)
{
if (nsnull!=aMaxElementSize)
printf("Reflow complete, returning %s with aDesiredSize = %d,%d and aMaxElementSize=%d,%d\n",
status==frComplete ? "Complete" : "Not Complete",
printf("Reflow complete, returning aDesiredSize = %d,%d and aMaxElementSize=%d,%d\n",
aDesiredSize.width, aDesiredSize.height,
aMaxElementSize->width, aMaxElementSize->height);
else
printf("Reflow complete, returning %s with aDesiredSize = %d,%d and NSNULL aMaxElementSize\n",
status==frComplete ? "Complete" : "Not Complete",
printf("Reflow complete, returning aDesiredSize = %d,%d and NSNULL aMaxElementSize\n",
aDesiredSize.width, aDesiredSize.height);
}
@ -820,12 +830,12 @@ nsIFrame::ReflowStatus nsTableFrame::ResizeReflowPass2(nsIPresContext* aPresCont
// Collapse child's top margin with previous bottom margin
nscoord nsTableFrame::GetTopMarginFor(nsIPresContext* aCX,
InnerTableReflowState& aState,
nsStyleMolecule* aKidMol)
nsStyleSpacing* aKidSpacing)
{
nscoord margin;
nscoord maxNegTopMargin = 0;
nscoord maxPosTopMargin = 0;
if ((margin = aKidMol->margin.top) < 0) {
if ((margin = aKidSpacing->mMargin.top) < 0) {
maxNegTopMargin = -margin;
} else {
maxPosTopMargin = margin;
@ -976,9 +986,10 @@ PRBool nsTableFrame::ReflowMappedChildren( nsIPresContext* aPresContext,
nsIStyleContextPtr kidSC;
kidFrame->GetStyleContext(aPresContext, kidSC.AssignRef());
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidMol);
nscoord bottomMargin = kidMol->margin.bottom;
nsStyleSpacing* kidSpacing = (nsStyleSpacing*)
kidSC->GetData(kStyleSpacingSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidSpacing);
nscoord bottomMargin = kidSpacing->mMargin.bottom;
// Figure out the amount of available size for the child (subtract
// off the top margin we are going to apply to it)
@ -987,7 +998,8 @@ PRBool nsTableFrame::ReflowMappedChildren( nsIPresContext* aPresContext,
}
// Subtract off for left and right margin
if (PR_FALSE == aState.unconstrainedWidth) {
kidAvailSize.width -= kidMol->margin.left + kidMol->margin.right;
kidAvailSize.width -= kidSpacing->mMargin.left +
kidSpacing->mMargin.right;
}
// Reflow the child into the available space
@ -1013,9 +1025,10 @@ PRBool nsTableFrame::ReflowMappedChildren( nsIPresContext* aPresContext,
// Place the child after taking into account it's margin
aState.y += topMargin;
nsRect kidRect (0, 0, desiredSize.width, desiredSize.height);
kidRect.x += kidMol->margin.left;
kidRect.y += aState.y;
PlaceChild(aPresContext, aState, kidFrame, kidRect, aMaxElementSize, kidMaxElementSize);
kidRect.x += aState.leftInset + kidSpacing->mMargin.left;
kidRect.y += aState.topInset + aState.y ;
PlaceChild(aPresContext, aState, kidFrame, kidRect,
aMaxElementSize, kidMaxElementSize);
if (bottomMargin < 0) {
aState.prevMaxNegBottomMargin = -bottomMargin;
} else {
@ -1389,8 +1402,6 @@ nsTableFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
// Figure out how we should treat the child
nsIFrame* kidFrame;
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidStyleContext->GetData(kStyleMoleculeSID);
// Create a child frame
if (nsnull == kidPrevInFlow) {
@ -1427,7 +1438,6 @@ nsTableFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
// finish).
//aState.y += topMargin;
nsRect kidRect (0, 0, kidSize.width, kidSize.height);
//kidRect.x += kidMol->margin.left;
kidRect.y += aState.y;
PlaceChild(aPresContext, aState, kidFrame, kidRect, aMaxElementSize, *pKidMaxElementSize);
@ -1474,7 +1484,6 @@ nsTableFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
*/
// use the cell map to determine which cell is in which column.
void nsTableFrame::BalanceColumnWidths(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyle,
const nsSize& aMaxSize,
nsSize* aMaxElementSize)
{
@ -1498,21 +1507,34 @@ void nsTableFrame::BalanceColumnWidths(nsIPresContext* aPresContext,
PRInt32 maxTableWidth = 0;
PRInt32 totalFixedWidth = 0;
nsStyleSpacing* spacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
// need to figure out the overall table width constraint
PRInt32 maxWidth = aMaxSize.width; // default case, get 100% of available space
if (-1!=aTableStyle->fixedWidth) // if there is a fixed width attribute, use it
{
maxWidth = aTableStyle->fixedWidth;
// default case, get 100% of available space
PRInt32 maxWidth;
nsStylePosition* position =
(nsStylePosition*)mStyleContext->GetData(kStylePositionSID);
switch (position->mWidthFlags) {
case NS_STYLE_POSITION_VALUE_LENGTH:
maxWidth = position->mWidth;
break;
case NS_STYLE_POSITION_VALUE_PCT:
case NS_STYLE_POSITION_VALUE_PROPORTIONAL:
// XXX for now these fall through
default:
case NS_STYLE_POSITION_VALUE_AUTO:
case NS_STYLE_POSITION_VALUE_INHERIT:
maxWidth = aMaxSize.width;
break;
}
else if ((NS_UNCONSTRAINEDSIZE!=maxWidth) &&
(-1!=aTableStyle->proportionalWidth && 0!=aTableStyle->proportionalWidth))
{
maxWidth = (maxWidth*aTableStyle->proportionalWidth)/100;
}
// now, if maxWidth is not NS_UNCONSTRAINED, subtract out my border and padding
// now, if maxWidth is not NS_UNCONSTRAINED, subtract out my border
// and padding
if (NS_UNCONSTRAINEDSIZE!=maxWidth)
{
maxWidth -= aTableStyle->borderPadding.left + aTableStyle->borderPadding.right;
maxWidth -= spacing->mBorderPadding.left + spacing->mBorderPadding.right;
if (0>maxWidth) // nonsense style specification
maxWidth = 0;
}
@ -1520,7 +1542,7 @@ void nsTableFrame::BalanceColumnWidths(nsIPresContext* aPresContext,
if (gsDebug) printf (" maxWidth=%d from aMaxSize=%d,%d\n", maxWidth, aMaxSize.width, aMaxSize.height);
// Step 1 - assign the width of all fixed-width columns
AssignFixedColumnWidths(aPresContext, maxWidth, numCols, aTableStyle,
AssignFixedColumnWidths(aPresContext, maxWidth, numCols,
totalFixedWidth, minTableWidth, maxTableWidth);
if (nsnull!=aMaxElementSize)
@ -1539,14 +1561,14 @@ void nsTableFrame::BalanceColumnWidths(nsIPresContext* aPresContext,
if (TableIsAutoWidth())
{
if (gsDebug==PR_TRUE) printf (" calling BalanceProportionalColumnsForAutoWidthTable\n");
BalanceProportionalColumnsForAutoWidthTable(aPresContext, aTableStyle,
BalanceProportionalColumnsForAutoWidthTable(aPresContext,
availWidth, maxWidth,
minTableWidth, maxTableWidth);
}
else
{
if (gsDebug==PR_TRUE) printf (" calling BalanceProportionalColumnsForSpecifiedWidthTable\n");
BalanceProportionalColumnsForSpecifiedWidthTable(aPresContext, aTableStyle,
BalanceProportionalColumnsForSpecifiedWidthTable(aPresContext,
availWidth, maxWidth,
minTableWidth, maxTableWidth);
}
@ -1590,11 +1612,13 @@ if there is space left over
}
// Step 1 - assign the width of all fixed-width columns,
// and calculate min/max table width
PRBool nsTableFrame::AssignFixedColumnWidths(nsIPresContext* aPresContext, PRInt32 maxWidth,
PRInt32 aNumCols, nsStyleMolecule* aTableStyleMol,
// and calculate min/max table width
PRBool nsTableFrame::AssignFixedColumnWidths(nsIPresContext* aPresContext,
PRInt32 maxWidth,
PRInt32 aNumCols,
PRInt32 &aTotalFixedWidth,
PRInt32 &aMinTableWidth, PRInt32 &aMaxTableWidth)
PRInt32 &aMinTableWidth,
PRInt32 &aMaxTableWidth)
{
NS_ASSERTION(nsnull==mPrevInFlow, "never ever call me on a continuing frame!");
@ -1606,15 +1630,44 @@ PRBool nsTableFrame::AssignFixedColumnWidths(nsIPresContext* aPresContext, PRInt
NS_ASSERTION(nsnull != colData, "bad column data");
nsTableColPtr col = colData->GetCol(); // col: ADDREF++
NS_ASSERTION(nsnull != col, "bad col");
nsStyleMolecule* colStyle =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
NS_ASSERTION(nsnull != colStyle, "bad style for col.");
// need to track min/max column width for setting min/max table widths
PRInt32 minColWidth = 0;
PRInt32 maxColWidth = 0;
nsVoidArray *cells = colData->GetCells();
PRInt32 numCells = cells->Count();
if (gsDebug==PR_TRUE) printf (" for column %d numCells = %d\n", colIndex, numCells);
#if XXX_need_access_to_column_frame_help
// Get the columns's style
nsIStyleContextPtr colSC;
colFrame->GetStyleContext(aPresContext, colSC.AssignRef());
nsStylePosition* colPosition = (nsStylePosition*)
colSC->GetData(kStylePositionSID);
// Get column width if it has one
PRBool haveColWidth = PR_FALSE;
nscoord colWidth;
switch (colPosition->mWidthFlags) {
default:
case NS_STYLE_POSITION_VALUE_AUTO:
case NS_STYLE_POSITION_VALUE_INHERIT:
break;
case NS_STYLE_POSITION_VALUE_LENGTH:
haveColWidth = PR_TRUE;
colWidth = colPosition->mWidth;
break;
case NS_STYLE_POSITION_VALUE_PCT:
case NS_STYLE_POSITION_VALUE_PROPORTIONAL:
//XXX haveColWidth = PR_TRUE;
//XXX colWidth = colPosition->mWidthPCT * something;
break;
}
#endif
// Scan the column
for (PRInt32 cellIndex = 0; cellIndex<numCells; cellIndex++)
{
nsCellLayoutData * data = (nsCellLayoutData *)(cells->ElementAt(cellIndex));
@ -1625,62 +1678,112 @@ PRBool nsTableFrame::AssignFixedColumnWidths(nsIPresContext* aPresContext, PRInt
if (gsDebug==PR_TRUE)
printf (" for cell %d min = %d,%d and des = %d,%d\n", cellIndex, cellMinSize->width, cellMinSize->height,
cellDesiredSize->width, cellDesiredSize->height);
/* the first cell in a column (in row 0) has special standing.
* if the first cell has a width specification, it overrides the COL width
PRBool haveCellWidth = PR_FALSE;
nscoord cellWidth;
/*
* The first cell in a column (in row 0) has special standing.
* if the first cell has a width specification, it overrides the
* COL width
*/
if (0==cellIndex)
{
// SEC: TODO -- when we have a style system, set the mol for the col
nsCellLayoutData * data = (nsCellLayoutData *)(cells->ElementAt(0));
nsTableCellFrame *cellFrame = data->GetCellFrame();
nsTableCellPtr cell;
cellFrame->GetContent((nsIContent*&)(cell.AssignRef())); // cell: REFCNT++
nsStyleMolecule* cellStyle = (nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
NS_ASSERTION(nsnull != cellStyle, "bad style for cell.");
// SEC: this is the code to replace
if (-1!=cellStyle->fixedWidth)
colStyle->proportionalWidth = cellStyle->proportionalWidth;
if (-1!=cellStyle->proportionalWidth)
colStyle->proportionalWidth = cellStyle->proportionalWidth;
// SEC: end code to replace
}
if (-1!=colStyle->fixedWidth)
{ // this col has fixed width, so set the cell's width
// to the larger of (specified width, largest max_element_size of the cells in the column)
PRInt32 widthForThisCell = max(cellMinSize->width, colStyle->fixedWidth);
if (mColumnWidths[colIndex] < widthForThisCell)
{
if (gsDebug) printf (" setting fixed width to %d\n",widthForThisCell);
mColumnWidths[colIndex] = widthForThisCell;
maxColWidth = widthForThisCell;
// Get the cell's style
nsIStyleContextPtr cellSC;
cellFrame->GetStyleContext(aPresContext, cellSC.AssignRef());
nsStylePosition* cellPosition = (nsStylePosition*)
cellSC->GetData(kStylePositionSID);
switch (cellPosition->mWidthFlags) {
case NS_STYLE_POSITION_VALUE_LENGTH:
haveCellWidth = PR_TRUE;
cellWidth = cellPosition->mWidth;
break;
case NS_STYLE_POSITION_VALUE_PCT:
case NS_STYLE_POSITION_VALUE_PROPORTIONAL:
// XXX write me when pct/proportional are supported
// XXX haveCellWidth = PR_TRUE;
// XXX cellWidth = cellPosition->mWidth;
break;
default:
case NS_STYLE_POSITION_VALUE_INHERIT:
case NS_STYLE_POSITION_VALUE_AUTO:
break;
}
}
// regardless of the width specification, keep track of the min/max column widths
/* TODO: must distribute COLSPAN'd cell widths between columns, either here
* or in the subsequent Balance***ColumnWidth routines
#if XXX_need_access_to_column_frame_help
switch (colPosition->mWidthFlags) {
default:
case NS_STYLE_POSITION_VALUE_AUTO:
case NS_STYLE_POSITION_VALUE_INHERIT:
break;
case NS_STYLE_POSITION_VALUE_LENGTH:
{
// This col has a fixed width, so set the cell's width to the
// larger of (specified width, largest max_element_size of the
// cells in the column)
PRInt32 widthForThisCell = max(cellMinSize->width, colPosition->mWidth);
if (mColumnWidths[colIndex] < widthForThisCell)
{
if (gsDebug) printf (" setting fixed width to %d\n",widthForThisCell);
mColumnWidths[colIndex] = widthForThisCell;
maxColWidth = widthForThisCell;
}
}
break;
case NS_STYLE_POSITION_VALUE_PCT:
case NS_STYLE_POSITION_VALUE_PROPORTIONAL:
// XXX write me when pct/proportional are supported
break;
}
#endif
// regardless of the width specification, keep track of the
// min/max column widths
/* TODO: must distribute COLSPAN'd cell widths between columns,
* either here or in the subsequent Balance***ColumnWidth
* routines
*/
if (minColWidth < cellMinSize->width)
minColWidth = cellMinSize->width;
if (maxColWidth < cellDesiredSize->width)
maxColWidth = cellDesiredSize->width;
if (gsDebug==PR_TRUE)
printf (" after cell %d, minColWidth = %d and maxColWidth = %d\n", cellIndex, minColWidth, maxColWidth);
if (gsDebug) {
printf (" after cell %d, minColWidth = %d and maxColWidth = %d\n",
cellIndex, minColWidth, maxColWidth);
}
/* take colspan into account? */
/*
PRInt32 colSpan = col->GetColSpan();
cellIndex += colSpan-1;
*/
}
if (-1!=colStyle->fixedWidth)
{
// if the col is fixed-width, expand the col to the specified fixed width if necessary
if (colStyle->fixedWidth > mColumnWidths[colIndex])
mColumnWidths[colIndex] = colStyle->fixedWidth;
// keep a running total of the amount of space taken up by all fixed-width columns
aTotalFixedWidth += mColumnWidths[colIndex];
if (gsDebug)
printf (" after col %d, aTotalFixedWidth = %d\n", colIndex, aTotalFixedWidth);
#if 0
// if the col is fixed-width, expand the col to the specified
// fixed width if necessary
if (colStyle->fixedWidth > mColumnWidths[colIndex])
mColumnWidths[colIndex] = colStyle->fixedWidth;
// keep a running total of the amount of space taken up by all
// fixed-width columns
aTotalFixedWidth += mColumnWidths[colIndex];
if (gsDebug) {
printf (" after col %d, aTotalFixedWidth = %d\n",
colIndex, aTotalFixedWidth);
}
#endif
// add col[i] metrics to the running totals for the table min/max width
if (NS_UNCONSTRAINEDSIZE!=aMinTableWidth)
aMinTableWidth += minColWidth; // SEC: insets!
@ -1698,7 +1801,6 @@ PRBool nsTableFrame::AssignFixedColumnWidths(nsIPresContext* aPresContext, PRInt
}
PRBool nsTableFrame::BalanceProportionalColumnsForSpecifiedWidthTable(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth,
PRInt32 aMaxWidth,
PRInt32 aMinTableWidth,
@ -1711,7 +1813,7 @@ PRBool nsTableFrame::BalanceProportionalColumnsForSpecifiedWidthTable(nsIPresCon
if (NS_UNCONSTRAINEDSIZE==aMaxWidth)
{ // the max width of the table fits comfortably in the available space
if (gsDebug) printf (" * table laying out in NS_UNCONSTRAINEDSIZE, calling BalanceColumnsTableFits\n");
result = BalanceColumnsTableFits(aPresContext, aTableStyleMol, aAvailWidth);
result = BalanceColumnsTableFits(aPresContext, aAvailWidth);
}
else if (aMinTableWidth > aMaxWidth)
{ // the table doesn't fit in the available space
@ -1721,19 +1823,18 @@ PRBool nsTableFrame::BalanceProportionalColumnsForSpecifiedWidthTable(nsIPresCon
else if (aMaxTableWidth <= aMaxWidth)
{ // the max width of the table fits comfortably in the available space
if (gsDebug) printf (" * table desired size fits, calling BalanceColumnsTableFits\n");
result = BalanceColumnsTableFits(aPresContext, aTableStyleMol, aAvailWidth);
result = BalanceColumnsTableFits(aPresContext, aAvailWidth);
}
else
{ // the table fits somewhere between its min and desired size
if (gsDebug) printf (" * table desired size does not fit, calling BalanceColumnsHTML4Constrained\n");
result = BalanceColumnsHTML4Constrained(aPresContext, aTableStyleMol, aAvailWidth,
result = BalanceColumnsHTML4Constrained(aPresContext, aAvailWidth,
aMaxWidth, aMinTableWidth, aMaxTableWidth);
}
return result;
}
PRBool nsTableFrame::BalanceProportionalColumnsForAutoWidthTable( nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth,
PRInt32 aMaxWidth,
PRInt32 aMinTableWidth,
@ -1744,7 +1845,7 @@ PRBool nsTableFrame::BalanceProportionalColumnsForAutoWidthTable( nsIPresContext
if (NS_UNCONSTRAINEDSIZE==aMaxWidth)
{ // the max width of the table fits comfortably in the available space
if (gsDebug) printf (" * table laying out in NS_UNCONSTRAINEDSIZE, calling BalanceColumnsTableFits\n");
result = BalanceColumnsTableFits(aPresContext, aTableStyleMol, aAvailWidth);
result = BalanceColumnsTableFits(aPresContext, aAvailWidth);
}
else if (aMinTableWidth > aMaxWidth)
{ // the table doesn't fit in the available space
@ -1754,12 +1855,12 @@ PRBool nsTableFrame::BalanceProportionalColumnsForAutoWidthTable( nsIPresContext
else if (aMaxTableWidth <= aMaxWidth)
{ // the max width of the table fits comfortably in the available space
if (gsDebug) printf (" * table desired size fits, calling BalanceColumnsTableFits\n");
result = BalanceColumnsTableFits(aPresContext, aTableStyleMol, aAvailWidth);
result = BalanceColumnsTableFits(aPresContext, aAvailWidth);
}
else
{ // the table fits somewhere between its min and desired size
if (gsDebug) printf (" * table desired size does not fit, calling BalanceColumnsHTML4Constrained\n");
result = BalanceColumnsHTML4Constrained(aPresContext, aTableStyleMol, aAvailWidth,
result = BalanceColumnsHTML4Constrained(aPresContext, aAvailWidth,
aMaxWidth, aMinTableWidth, aMaxTableWidth);
}
return result;
@ -1774,14 +1875,16 @@ PRBool nsTableFrame::SetColumnsToMinWidth(nsIPresContext* aPresContext)
{
nsColLayoutData * colData = (nsColLayoutData *)(columnLayoutData->ElementAt(colIndex));
nsTableColPtr col = colData->GetCol(); // col: ADDREF++
nsStyleMolecule* colStyle =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsVoidArray *cells = colData->GetCells();
PRInt32 minColWidth = 0;
PRInt32 maxColWidth = 0;
PRInt32 numCells = cells->Count();
if (gsDebug==PR_TRUE) printf (" for col %d\n", colIndex);
if (PR_TRUE==IsProportionalWidth(colStyle))
// XXX need column frame to ask this question
nsStylePosition* colPosition = nsnull;
if (PR_TRUE==IsProportionalWidth(colPosition))
{
for (PRInt32 cellIndex = 0; cellIndex<numCells; cellIndex++)
{ // this col has proportional width, so determine its width requirements
@ -1804,10 +1907,13 @@ PRBool nsTableFrame::SetColumnsToMinWidth(nsIPresContext* aPresContext)
if (gsDebug==PR_TRUE)
{
printf (" for determining width of col %d %s:\n",colIndex, IsProportionalWidth(colStyle)? "(P)":"(A)");
printf (" for determining width of col %d %s:\n",colIndex, IsProportionalWidth(colPosition)? "(P)":"(A)");
printf (" minColWidth = %d and maxColWidth = %d\n", minColWidth, maxColWidth);
}
if (PR_TRUE==IsProportionalWidth(colStyle))
// XXX BUG: why are we asking this again? this if is already in a
// IsProportionalWidth == PR_TRUE case!
if (PR_TRUE==IsProportionalWidth(colPosition))
{ // this col has proportional width, so set its width based on the table width
mColumnWidths[colIndex] = minColWidth;
if (gsDebug==PR_TRUE)
@ -1819,7 +1925,6 @@ PRBool nsTableFrame::SetColumnsToMinWidth(nsIPresContext* aPresContext)
}
PRBool nsTableFrame::BalanceColumnsTableFits(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth)
{
NS_ASSERTION(nsnull==mPrevInFlow, "never ever call me on a continuing frame!");
@ -1831,8 +1936,6 @@ PRBool nsTableFrame::BalanceColumnsTableFits(nsIPresContext* aPresContext,
{
nsColLayoutData * colData = (nsColLayoutData *)(columnLayoutData->ElementAt(colIndex));
nsTableColPtr col = colData->GetCol(); // col: ADDREF++
nsStyleMolecule* colStyle =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
nsVoidArray *cells = colData->GetCells();
PRInt32 minColWidth = 0;
PRInt32 maxColWidth = 0;
@ -1841,7 +1944,11 @@ PRBool nsTableFrame::BalanceColumnsTableFits(nsIPresContext* aPresContext,
/* TODO: must distribute COLSPAN'd cell widths between columns, either here
* or in the prior Balance***ColumnWidth routines
*/
if (PR_TRUE==IsProportionalWidth(colStyle))
// XXX Need columnFrame to ask the style question
nsStylePosition* colPosition = nsnull;
if (PR_TRUE==IsProportionalWidth(colPosition))
{
for (PRInt32 cellIndex = 0; cellIndex<numCells; cellIndex++)
{ // this col has proportional width, so determine its width requirements
@ -1862,12 +1969,16 @@ PRBool nsTableFrame::BalanceColumnsTableFits(nsIPresContext* aPresContext,
if (gsDebug==PR_TRUE)
{
printf (" for determining width of col %d %s:\n",colIndex, IsProportionalWidth(colStyle)? "(P)":"(A)");
printf (" for determining width of col %d %s:\n",colIndex, IsProportionalWidth(colPosition)? "(P)":"(A)");
printf (" minColWidth = %d and maxColWidth = %d\n", minColWidth, maxColWidth);
printf (" aAvailWidth = %d\n", aAvailWidth);
}
if (PR_TRUE==IsProportionalWidth(colStyle))
// XXX BUG: why are we asking this again? this if is already in a
// IsProportionalWidth == PR_TRUE case!
if (PR_TRUE==IsProportionalWidth(colPosition))
{ // this col has proportional width, so set its width based on the table width
#if XXX_bug_kipp_about_this
if (0==colStyle->proportionalWidth)
{ // col width is specified to be the minimum
mColumnWidths[colIndex] = minColWidth;
@ -1875,7 +1986,9 @@ PRBool nsTableFrame::BalanceColumnsTableFits(nsIPresContext* aPresContext,
printf (" 3 (0): col %d set to min width = %d because style set proportionalWidth=0\n",
colIndex, mColumnWidths[colIndex]);
}
if (PR_TRUE==AutoColumnWidths(aTableStyleMol))
else // BUG? else? other code below has the else
#endif
if (PR_TRUE==AutoColumnWidths())
{ // give each remaining column it's desired width
// if there is width left over, we'll factor that in after this loop is complete
mColumnWidths[colIndex] = maxColWidth;
@ -1892,8 +2005,10 @@ PRBool nsTableFrame::BalanceColumnsTableFits(nsIPresContext* aPresContext,
}
else
{
#if XXX_bug_kipp_about_this
percentage = colStyle->proportionalWidth;
if (-1==percentage)
#endif
percentage = 100/numCols;
mColumnWidths[colIndex] = (percentage*aAvailWidth)/100;
// if the column was computed to be too small, enlarge the column
@ -1911,7 +2026,6 @@ PRBool nsTableFrame::BalanceColumnsTableFits(nsIPresContext* aPresContext,
}
PRBool nsTableFrame::BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth,
PRInt32 aMaxWidth,
PRInt32 aMinTableWidth,
@ -1927,14 +2041,22 @@ PRBool nsTableFrame::BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext
{
nsColLayoutData * colData = (nsColLayoutData *)(columnLayoutData->ElementAt(colIndex));
nsTableColPtr col = colData->GetCol(); // col: ADDREF++
#if XXX_bug_kipp_about_this
// XXX BUG: mStyleContext is for the table frame not for the column.
nsStyleMolecule* colStyle =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
#else
nsStylePosition* colPosition = nsnull;
#endif
nsVoidArray *cells = colData->GetCells();
PRInt32 minColWidth = 0;
PRInt32 maxColWidth = 0;
PRInt32 numCells = cells->Count();
if (gsDebug==PR_TRUE) printf (" for col %d\n", colIndex);
if (PR_TRUE==IsProportionalWidth(colStyle))
if (PR_TRUE==IsProportionalWidth(colPosition))
{
for (PRInt32 cellIndex = 0; cellIndex<numCells; cellIndex++)
{ // this col has proportional width, so determine its width requirements
@ -1957,15 +2079,19 @@ PRBool nsTableFrame::BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext
if (gsDebug==PR_TRUE)
{
printf (" for determining width of col %d %s:\n",colIndex, IsProportionalWidth(colStyle)? "(P)":"(A)");
printf (" for determining width of col %d %s:\n",colIndex, IsProportionalWidth(colPosition)? "(P)":"(A)");
printf (" minTableWidth = %d and maxTableWidth = %d\n", aMinTableWidth, aMaxTableWidth);
printf (" minColWidth = %d and maxColWidth = %d\n", minColWidth, maxColWidth);
printf (" aAvailWidth = %d\n", aAvailWidth);
}
if (PR_TRUE==IsProportionalWidth(colStyle))
// XXX BUG: why are we asking this again? this if is already in a
// IsProportionalWidth == PR_TRUE case!
if (PR_TRUE==IsProportionalWidth(colPosition))
{ // this col has proportional width, so set its width based on the table width
// the table fits in the space somewhere between its min and max size
// so dole out the available space appropriately
#if XXX_bug_kipp_about_this
if (0==colStyle->proportionalWidth)
{ // col width is specified to be the minimum
mColumnWidths[colIndex] = minColWidth;
@ -1973,7 +2099,9 @@ PRBool nsTableFrame::BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext
printf (" 4 (0): col %d set to min width = %d because style set proportionalWidth=0\n",
colIndex, mColumnWidths[colIndex]);
}
else if (AutoColumnWidths(aTableStyleMol))
else
#endif
if (AutoColumnWidths())
{
PRInt32 W = aMaxWidth - aMinTableWidth;
PRInt32 D = aMaxTableWidth - aMinTableWidth;
@ -1985,9 +2113,11 @@ PRBool nsTableFrame::BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext
}
else
{ // give each remaining column an equal percentage of the remaining space
#if XXX_bug_kipp_about_this
PRInt32 percentage = colStyle->proportionalWidth;
if (-1==percentage)
percentage = 100/numCols;
#endif
PRInt32 percentage = 100/numCols;
mColumnWidths[colIndex] = (percentage*aAvailWidth)/100;
// if the column was computed to be too small, enlarge the column
if (mColumnWidths[colIndex] <= minColWidth)
@ -2012,7 +2142,7 @@ PRBool nsTableFrame::BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext
// if columns have equal width, and some column's content couldn't squeeze into the computed size,
// then expand every column to the min size of the column with the largest min size
if (!AutoColumnWidths(aTableStyleMol) && 0!=maxOfAllMinColWidths)
if (!AutoColumnWidths() && 0!=maxOfAllMinColWidths)
{
if (gsDebug==PR_TRUE) printf(" EqualColWidths specified, so setting all col widths to %d\n", maxOfAllMinColWidths);
for (PRInt32 colIndex = 0; colIndex<numCols; colIndex++)
@ -2028,8 +2158,7 @@ PRBool nsTableFrame::BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext
add in table insets
set rect
*/
void nsTableFrame::SetTableWidth(nsIPresContext* aPresContext,
nsStyleMolecule *aTableStyle)
void nsTableFrame::SetTableWidth(nsIPresContext* aPresContext)
{
NS_ASSERTION(nsnull==mPrevInFlow, "never ever call me on a continuing frame!");
@ -2044,8 +2173,10 @@ void nsTableFrame::SetTableWidth(nsIPresContext* aPresContext,
}
// Compute the insets (sum of border and padding)
nscoord rightInset = aTableStyle->borderPadding.right;
nscoord leftInset = aTableStyle->borderPadding.left;
nsStyleSpacing* spacing =
(nsStyleSpacing*)mStyleContext->GetData(kStyleSpacingSID);
nscoord rightInset = spacing->mBorderPadding.right;
nscoord leftInset = spacing->mBorderPadding.left;
tableWidth += (leftInset + rightInset);
nsRect tableSize = mRect;
tableSize.width = tableWidth;
@ -2069,7 +2200,14 @@ void nsTableFrame::ShrinkWrapChildren(nsIPresContext* aPresContext,
#endif
// iterate children, tell all row groups to ShrinkWrap
PRBool atLeastOneRowSpanningCell = PR_FALSE;
PRInt32 tableHeight = 0;
nsStyleSpacing* spacing = (nsStyleSpacing*)
mStyleContext->GetData(kStyleSpacingSID);
tableHeight +=
spacing->mBorderPadding.top + spacing->mBorderPadding.bottom;
PRInt32 childCount = mChildCount;
nsIFrame * kidFrame;
for (PRInt32 i = 0; i < childCount; i++)
@ -2277,12 +2415,31 @@ void nsTableFrame::ShrinkWrapChildren(nsIPresContext* aPresContext,
#endif
}
PRBool nsTableFrame::IsProportionalWidth(nsStyleMolecule* aMol)
// XXX Kipp wonders: what does this really mean? Are you really asking
// "Is it fixed width"? If so, then VALUE_PCT may be wrong and the
// name of the method should be changed.
PRBool nsTableFrame::IsProportionalWidth(nsStylePosition* aStylePosition)
{
PRBool result = PR_FALSE;
if ((-1!=aMol->proportionalWidth) ||
((-1==aMol->proportionalWidth) && (-1==aMol->fixedWidth)))
if (nsnull == aStylePosition) {
// Assume NS_STYLE_POSITION_VALUE_AUTO when no style is available
result = PR_TRUE;
}
else {
switch (aStylePosition->mWidthFlags) {
case NS_STYLE_POSITION_VALUE_LENGTH:
case NS_STYLE_POSITION_VALUE_PCT:
break;
default:
case NS_STYLE_POSITION_VALUE_AUTO:
case NS_STYLE_POSITION_VALUE_INHERIT:
case NS_STYLE_POSITION_VALUE_PROPORTIONAL:
result = PR_TRUE;
break;
}
}
return result;
}
@ -2487,7 +2644,7 @@ PRBool nsTableFrame::TableIsAutoWidth()
return isTableAutoWidth;
}
PRBool nsTableFrame::AutoColumnWidths(nsStyleMolecule* aTableStyleMol)
PRBool nsTableFrame::AutoColumnWidths()
{ // ZZZ: TOTAL HACK
return isAutoColumnWidths;
}
@ -2525,8 +2682,6 @@ NS_METHOD nsTableFrame::CreateContinuingFrame(nsIPresContext* aPresContext,
// Resolve style for the child
nsIStyleContext* kidStyleContext =
aPresContext->ResolveStyleContextFor(content, cf); // kidStyleContext: REFCNT++
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidStyleContext->GetData(kStyleMoleculeSID);
nsIContentDelegate* kidDel = nsnull;
kidDel = content->GetDelegate(aPresContext); // kidDel: REFCNT++
nsIFrame * duplicateFrame = kidDel->CreateFrame(aPresContext, content, index, cf);
@ -2577,6 +2732,12 @@ PRInt32 nsTableFrame::GetColumnWidth(PRInt32 aColIndex)
//printf("GET_COL_WIDTH: %p, FIF=%p getting col %d and returning %d\n", this, firstInFlow, aColIndex, result);
// XXX hack
#if 0
if (result <= 0) {
result = 100;
}
#endif
return result;
}

View File

@ -26,8 +26,9 @@ class nsTableCell;
class nsVoidArray;
class nsTableCellFrame;
class CellData;
struct nsStyleMolecule;
struct InnerTableReflowState;
struct nsStylePosition;
struct nsStyleSpacing;
/** nsTableFrame maps the inner portion of a table (everything except captions.)
* Used as a pseudo-frame within nsTableOuterFrame,
@ -133,7 +134,7 @@ public:
/** returns PR_TRUE if this table has proportional width
*/
PRBool IsProportionalWidth(nsStyleMolecule* aMol);
PRBool IsProportionalWidth(nsStylePosition* aStylePosition);
@ -193,11 +194,10 @@ protected:
*
* @see ResizeReflow
*/
virtual nsIFrame::ReflowStatus ResizeReflowPass1(nsIPresContext* aPresContext,
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle);
virtual ReflowStatus ResizeReflowPass1(nsIPresContext* aPresContext,
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize);
/** second pass of ResizeReflow.
* lays out all table content with aMaxSize(computed_table_width, given_table_height)
@ -210,17 +210,16 @@ protected:
* @see ResizeReflow
* @see NeedsReflow
*/
virtual nsIFrame::ReflowStatus ResizeReflowPass2(nsIPresContext* aPresContext,
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle,
PRInt32 aMinCaptionWidth,
PRInt32 mMaxCaptionWidth);
virtual ReflowStatus ResizeReflowPass2(nsIPresContext* aPresContext,
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
PRInt32 aMinCaptionWidth,
PRInt32 mMaxCaptionWidth);
nscoord GetTopMarginFor(nsIPresContext* aCX,
InnerTableReflowState& aState,
nsStyleMolecule* aKidMol);
nsStyleSpacing* aKidSpacing);
void PlaceChild(nsIPresContext* aPresContext,
InnerTableReflowState& aState,
@ -273,7 +272,6 @@ protected:
* @param aMaxElementSize the min size of the largest indivisible object
*/
virtual void BalanceColumnWidths(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyle,
const nsSize& aMaxSize,
nsSize* aMaxElementSize);
@ -296,7 +294,6 @@ protected:
virtual PRBool AssignFixedColumnWidths(nsIPresContext* aPresContext,
PRInt32 aMaxWidth,
PRInt32 aNumCols,
nsStyleMolecule* aTableStyleMol,
PRInt32 & aTotalFixedWidth,
PRInt32 & aMinTableWidth,
PRInt32 & aMaxTableWidth);
@ -317,7 +314,6 @@ protected:
* TODO: rename this method to reflect that it is a Nav4 compatibility method
*/
virtual PRBool BalanceProportionalColumnsForSpecifiedWidthTable(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth,
PRInt32 aMaxWidth,
PRInt32 aMinTableWidth,
@ -339,7 +335,6 @@ protected:
* TODO: rename this method to reflect that it is a Nav4 compatibility method
*/
virtual PRBool BalanceProportionalColumnsForAutoWidthTable(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth,
PRInt32 aMaxWidth,
PRInt32 aMinTableWidth,
@ -366,7 +361,6 @@ protected:
* @return PR_TRUE if all is well, PR_FALSE if there was an unrecoverable error
*/
virtual PRBool BalanceColumnsTableFits(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth);
/** assign widths for each column that has proportional width inside a table that
@ -386,15 +380,13 @@ protected:
* TODO: rename this method to reflect that it is a Nav4 compatibility method
*/
virtual PRBool BalanceColumnsHTML4Constrained(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyleMol,
PRInt32 aAvailWidth,
PRInt32 aMaxWidth,
PRInt32 aMinTableWidth,
PRInt32 aMaxTableWidth);
/** sets the width of the table according to the computed widths of each column. */
virtual void SetTableWidth(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyle);
virtual void SetTableWidth(nsIPresContext* aPresContext);
/**
*/
@ -413,7 +405,7 @@ protected:
* according to its content.
* In NAV4, this is when there is a COLS attribute on the table.
*/
virtual PRBool AutoColumnWidths(nsStyleMolecule* aTableStyleMol);
virtual PRBool AutoColumnWidths();
/** given the new parent size, do I really need to do a reflow? */
virtual PRBool NeedsReflow(const nsSize& aMaxSize);

View File

@ -43,7 +43,8 @@ static PRBool gsDebug = PR_FALSE;
static const PRBool gsDebug = PR_FALSE;
#endif
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleTextSID, NS_STYLETEXT_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
static NS_DEFINE_IID(kITableContentIID, NS_ITABLECONTENT_IID);
NS_DEF_PTR(nsIStyleContext);
@ -54,9 +55,6 @@ struct OuterTableReflowState {
// The presentation context
nsIPresContext *pc;
// The body's style molecule
nsStyleMolecule* mol;
// The total available size (computed from the parent)
nsSize availSize;
// The available size for the inner table frame
@ -78,11 +76,9 @@ struct OuterTableReflowState {
PRBool processingCaption;
OuterTableReflowState(nsIPresContext* aPresContext,
const nsSize& aMaxSize,
nsStyleMolecule* aMol)
const nsSize& aMaxSize)
{
pc = aPresContext;
mol = aMol;
availSize.width = aMaxSize.width;
availSize.height = aMaxSize.height;
prevMaxPosBottomMargin = 0;
@ -213,17 +209,14 @@ NS_METHOD nsTableOuterFrame::ResizeReflow(nsIPresContext* aPresContext,
aStatus = frComplete;
return NS_OK;
}
nsStyleMolecule* tableStyleMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
OuterTableReflowState state(aPresContext, aMaxSize, tableStyleMol);
OuterTableReflowState state(aPresContext, aMaxSize);
// lay out captions pass 1, if necessary
if (PR_FALSE==IsFirstPassValid())
{
mFirstPassValid = PR_TRUE;
aStatus = ResizeReflowCaptionsPass1(aPresContext, tableStyleMol);
aStatus = ResizeReflowCaptionsPass1(aPresContext);
}
@ -232,7 +225,7 @@ NS_METHOD nsTableOuterFrame::ResizeReflow(nsIPresContext* aPresContext,
{ // we treat the table as if we've never seen the layout data before
mInnerTableFrame->SetReflowPass(nsTableFrame::kPASS_FIRST);
aStatus = mInnerTableFrame->ResizeReflowPass1(aPresContext, aDesiredSize, aMaxSize,
&innerTableMaxElementSize, tableStyleMol);
&innerTableMaxElementSize);
#ifdef NOISY_MARGINS
nsIContentPtr content = mInnerTableFrame->GetContent();
@ -252,9 +245,9 @@ NS_METHOD nsTableOuterFrame::ResizeReflow(nsIPresContext* aPresContext,
if (nsnull==prevInFlow)
{
// assign column widths, and assign aMaxElementSize->width
mInnerTableFrame->BalanceColumnWidths(aPresContext, tableStyleMol, aMaxSize, aMaxElementSize);
mInnerTableFrame->BalanceColumnWidths(aPresContext, aMaxSize, aMaxElementSize);
// assign table width
mInnerTableFrame->SetTableWidth(aPresContext, tableStyleMol);
mInnerTableFrame->SetTableWidth(aPresContext);
}
// inner table max is now the computed width and assigned height
nsSize innerTableSize;
@ -350,12 +343,12 @@ NS_METHOD nsTableOuterFrame::ResizeReflow(nsIPresContext* aPresContext,
// Collapse child's top margin with previous bottom margin
nscoord nsTableOuterFrame::GetTopMarginFor(nsIPresContext* aCX,
OuterTableReflowState& aState,
nsStyleMolecule* aKidMol)
nsStyleSpacing* aKidSpacing)
{
nscoord margin;
nscoord maxNegTopMargin = 0;
nscoord maxPosTopMargin = 0;
if ((margin = aKidMol->margin.top) < 0) {
if ((margin = aKidSpacing->mMargin.top) < 0) {
maxNegTopMargin = -margin;
} else {
maxPosTopMargin = margin;
@ -468,9 +461,10 @@ PRBool nsTableOuterFrame::ReflowMappedChildren( nsIPresContext* aPresContex
nsIStyleContextPtr kidSC;
kidFrame->GetStyleContext(aPresContext, kidSC.AssignRef());
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidMol);
nscoord bottomMargin = kidMol->margin.bottom;
nsStyleSpacing* kidSpacing =
(nsStyleSpacing*)kidSC->GetData(kStyleSpacingSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidSpacing);
nscoord bottomMargin = kidSpacing->mMargin.bottom;
// Figure out the amount of available size for the child (subtract
// off the top margin we are going to apply to it)
@ -479,7 +473,7 @@ PRBool nsTableOuterFrame::ReflowMappedChildren( nsIPresContext* aPresContex
}
// Subtract off for left and right margin
if (PR_FALSE == aState.unconstrainedWidth) {
aState.availSize.width -= kidMol->margin.left + kidMol->margin.right;
aState.availSize.width -= kidSpacing->mMargin.left + kidSpacing->mMargin.right;
}
// Only skip the reflow if this is not our first child and we are
@ -509,7 +503,7 @@ PRBool nsTableOuterFrame::ReflowMappedChildren( nsIPresContext* aPresContex
// Place the child after taking into account it's margin
aState.y += topMargin;
nsRect kidRect (0, 0, kidSize.width, kidSize.height);
kidRect.x += kidMol->margin.left;
kidRect.x += kidSpacing->mMargin.left;
kidRect.y += aState.y;
PlaceChild(aState, kidFrame, kidRect, aMaxElementSize, kidMaxElementSize);
if (bottomMargin < 0) {
@ -894,29 +888,28 @@ nsTableOuterFrame::ReflowChild( nsIFrame* aKidFrame,
aKidFrame->GetStyleContext(aPresContext, captionStyleContext.AssignRef());
NS_ASSERTION(nsnull != captionStyleContext, "null style context for caption");
nsStyleMolecule* captionStyle =
(nsStyleMolecule*)captionStyleContext->GetData(kStyleMoleculeSID);
nsStyleText* captionStyle =
(nsStyleText*)captionStyleContext->GetData(kStyleTextSID);
NS_ASSERTION(nsnull != captionStyle, "null style molecule for caption");
if (NS_STYLE_VERTICAL_ALIGN_BOTTOM==captionStyle->verticalAlign)
if (NS_STYLE_VERTICAL_ALIGN_BOTTOM==captionStyle->mVerticalAlign)
{
if (PR_TRUE==gsDebug) printf("reflowChild called with a bottom caption\n");
status = ResizeReflowBottomCaptionsPass2(aPresContext, aDesiredSize,
aMaxSize, aMaxElementSize,
aState.mol, aState.y);
aState.y);
}
else
{
if (PR_TRUE==gsDebug) printf("reflowChild called with a top caption\n");
status = ResizeReflowTopCaptionsPass2(aPresContext, aDesiredSize,
aMaxSize, aMaxElementSize,
aState.mol);
aMaxSize, aMaxElementSize);
}
}
else
{
if (PR_TRUE==gsDebug) printf("reflowChild called with a table body\n");
status = ((nsTableFrame*)aKidFrame)->ResizeReflowPass2(aPresContext, aDesiredSize, aState.availSize,
aMaxElementSize, aState.mol,
status = ((nsTableFrame*)aKidFrame)->ResizeReflowPass2(aPresContext, aDesiredSize, aState.innerTableMaxSize,
aMaxElementSize,
mMinCaptionWidth, mMaxCaptionWidth);
}
if (PR_TRUE==gsDebug)
@ -977,12 +970,12 @@ void nsTableOuterFrame::CreateChildFrames(nsIPresContext* aPresContext)
nsIStyleContextPtr captionStyleContext =
aPresContext->ResolveStyleContextFor(caption, this);
NS_ASSERTION(nsnull!=captionStyleContext, "bad style context for caption.");
nsStyleMolecule* captionStyle =
(nsStyleMolecule*)captionStyleContext->GetData(kStyleMoleculeSID);
nsStyleText* captionStyle =
(nsStyleText*)captionStyleContext->GetData(kStyleTextSID);
captionFrame->SetStyleContext(captionStyleContext);
mChildCount++;
// Link child frame into the list of children
if (NS_STYLE_VERTICAL_ALIGN_BOTTOM==captionStyle->verticalAlign)
if (NS_STYLE_VERTICAL_ALIGN_BOTTOM==captionStyle->mVerticalAlign)
{ // bottom captions get added to the end of the outer frame child list
prevKidFrame->SetNextSibling(captionFrame);
prevKidFrame = captionFrame;
@ -1018,7 +1011,7 @@ void nsTableOuterFrame::CreateChildFrames(nsIPresContext* aPresContext)
nsIFrame::ReflowStatus
nsTableOuterFrame::ResizeReflowCaptionsPass1(nsIPresContext* aPresContext, nsStyleMolecule* aTableStyle)
nsTableOuterFrame::ResizeReflowCaptionsPass1(nsIPresContext* aPresContext)
{
if (nsnull!=mCaptionFrames)
{
@ -1046,8 +1039,7 @@ nsIFrame::ReflowStatus
nsTableOuterFrame::ResizeReflowTopCaptionsPass2(nsIPresContext* aPresContext,
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle)
nsSize* aMaxElementSize)
{
ReflowStatus result = frComplete;
nscoord topCaptionY = 0;
@ -1064,11 +1056,11 @@ nsTableOuterFrame::ResizeReflowTopCaptionsPass2(nsIPresContext* aPresContext,
captionFrame->GetStyleContext(aPresContext, captionStyleContext.AssignRef());
NS_ASSERTION(nsnull != captionStyleContext, "null style context for caption");
nsStyleMolecule* captionStyle =
(nsStyleMolecule*)captionStyleContext->GetData(kStyleMoleculeSID);
nsStyleText* captionStyle =
(nsStyleText*)captionStyleContext->GetData(kStyleTextSID);
NS_ASSERTION(nsnull != captionStyle, "null style molecule for caption");
if (NS_STYLE_VERTICAL_ALIGN_BOTTOM==captionStyle->verticalAlign)
if (NS_STYLE_VERTICAL_ALIGN_BOTTOM==captionStyle->mVerticalAlign)
{
}
else
@ -1113,7 +1105,6 @@ nsTableOuterFrame::ResizeReflowBottomCaptionsPass2(nsIPresContext* aPresContext
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle,
nscoord aYOffset)
{
ReflowStatus result = frComplete;

View File

@ -23,9 +23,9 @@
class nsTableFrame;
class nsVoidArray;
struct nsStyleMolecule;
class nsTableCaptionFrame;
struct OuterTableReflowState;
struct nsStyleSpacing;
/**
* main frame for an nsTable content object,
@ -137,8 +137,7 @@ protected:
/** reflow the captions in an infinite space, caching the min/max sizes for each
*/
virtual ReflowStatus ResizeReflowCaptionsPass1(nsIPresContext* aPresContext,
nsStyleMolecule* aTableStyle);
virtual ReflowStatus ResizeReflowCaptionsPass1(nsIPresContext* aPresContext);
/** reflow the top captions in a space constrained by the computed table width
* and the heigth given to us by our parent. Top captions are laid down
@ -147,8 +146,7 @@ protected:
virtual ReflowStatus ResizeReflowTopCaptionsPass2(nsIPresContext* aPresContext,
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle);
nsSize* aMaxElementSize);
/** reflow the bottom captions in a space constrained by the computed table width
* and the heigth given to us by our parent. Bottom captions are laid down
@ -158,12 +156,11 @@ protected:
nsReflowMetrics& aDesiredSize,
const nsSize& aMaxSize,
nsSize* aMaxElementSize,
nsStyleMolecule* aTableStyle,
nscoord aYOffset);
nscoord GetTopMarginFor(nsIPresContext* aCX,
OuterTableReflowState& aState,
nsStyleMolecule* aKidMol);
nsStyleSpacing* aKidSpacing);
void PlaceChild( OuterTableReflowState& aState,
nsIFrame* aKidFrame,

View File

@ -38,15 +38,11 @@ static const PRBool gsDebug1 = PR_FALSE;
static const PRBool gsDebug2 = PR_FALSE;
#endif
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
/* ----------- RowReflowState ---------- */
struct RowReflowState {
// The body's style molecule
nsStyleMolecule* mol;
// The body's available size (computed from the body's parent)
nsSize availSize;
@ -68,10 +64,8 @@ struct RowReflowState {
RowReflowState( nsIPresContext* aPresContext,
const nsSize& aMaxSize,
nsStyleMolecule* aMol)
const nsSize& aMaxSize)
{
mol = aMol;
availSize.width = aMaxSize.width;
availSize.height = aMaxSize.height;
prevMaxPosBottomMargin = 0;
@ -175,12 +169,12 @@ PRInt32 nsTableRowFrame::GetTallestChild() const
// Collapse child's top margin with previous bottom margin
nscoord nsTableRowFrame::GetTopMarginFor( nsIPresContext* aCX,
RowReflowState& aState,
nsStyleMolecule* aKidMol)
nsStyleSpacing* aKidSpacing)
{
nscoord margin;
nscoord maxNegTopMargin = 0;
nscoord maxPosTopMargin = 0;
if ((margin = aKidMol->margin.top) < 0) {
if ((margin = aKidSpacing->mMargin.top) < 0) {
maxNegTopMargin = -margin;
} else {
maxPosTopMargin = margin;
@ -284,9 +278,10 @@ PRBool nsTableRowFrame::ReflowMappedChildren(nsIPresContext* aPresContext,
// Get top margin for this kid
nsIStyleContext* kidSC;
kidFrame->GetStyleContext(aPresContext, kidSC);
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidMol);
nscoord bottomMargin = kidMol->margin.bottom;
nsStyleSpacing* kidSpacing = (nsStyleSpacing*)
kidSC->GetData(kStyleSpacingSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidSpacing);
nscoord bottomMargin = kidSpacing->mMargin.bottom;
NS_RELEASE(kidSC);
// Figure out the amount of available size for the child (subtract
@ -296,7 +291,7 @@ PRBool nsTableRowFrame::ReflowMappedChildren(nsIPresContext* aPresContext,
}
// Subtract off for left and right margin
if (PR_FALSE == aState.unconstrainedWidth) {
kidAvailSize.width -= kidMol->margin.left + kidMol->margin.right;
kidAvailSize.width -= kidSpacing->mMargin.left + kidSpacing->mMargin.right;
}
if (NS_UNCONSTRAINEDSIZE == aState.availSize.width)
@ -315,7 +310,7 @@ PRBool nsTableRowFrame::ReflowMappedChildren(nsIPresContext* aPresContext,
nscoord availWidth = 0;
for (PRInt32 numColSpan=0; numColSpan<cellColSpan; numColSpan++)
availWidth += aState.tableFrame->GetColumnWidth(cellStartingCol+numColSpan);
NS_ASSERTION(0<availWidth, "illegal width for this column");
// NS_ASSERTION(0<availWidth, "illegal width for this column");
kidAvailSize.width = availWidth;
status = ReflowChild(kidFrame, aPresContext, desiredSize,
kidAvailSize, pKidMaxElementSize);
@ -427,7 +422,7 @@ PRBool nsTableRowFrame::ReflowMappedChildren(nsIPresContext* aPresContext,
// Add back in the left and right margins, because one row does not
// impact another row's width
if (PR_FALSE == aState.unconstrainedWidth) {
kidAvailSize.width += kidMol->margin.left + kidMol->margin.right;
kidAvailSize.width += kidSpacing->mMargin.left + kidSpacing->mMargin.right;
}
// Get the next child
@ -801,10 +796,10 @@ nsTableRowFrame::ReflowUnmappedChildren( nsIPresContext* aPresContext,
// Resolve style
nsIStyleContext* kidStyleContext =
aPresContext->ResolveStyleContextFor(cell, this);
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidStyleContext->GetData(kStyleMoleculeSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidMol);
nscoord bottomMargin = kidMol->margin.bottom;
nsStyleSpacing* kidSpacing = (nsStyleSpacing*)
kidStyleContext->GetData(kStyleSpacingSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidSpacing);
nscoord bottomMargin = kidSpacing->mMargin.bottom;
nsIFrame* kidFrame;
@ -956,9 +951,7 @@ nsTableRowFrame::ResizeReflow(nsIPresContext* aPresContext,
// Check for an overflow list
MoveOverflowToChildList();
nsStyleMolecule* myMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
RowReflowState state(aPresContext, aMaxSize, myMol);
RowReflowState state(aPresContext, aMaxSize);
mContentParent->GetContentParent((nsIFrame*&)(state.tableFrame));
// Reflow the existing frames

View File

@ -22,7 +22,7 @@
#include "nsContainerFrame.h"
struct RowReflowState;
struct nsStyleSpacing;
/**
* nsTableRowFrame is the frame that maps table rows
@ -121,7 +121,7 @@ protected:
nscoord GetTopMarginFor(nsIPresContext* aCX,
RowReflowState& aState,
nsStyleMolecule* aKidMol);
nsStyleSpacing* aKidSpacing);
void PlaceChild( nsIPresContext* aPresContext,
RowReflowState& aState,

View File

@ -37,7 +37,7 @@ static const PRBool gsDebug1 = PR_FALSE;
static const PRBool gsDebug2 = PR_FALSE;
#endif
static NS_DEFINE_IID(kStyleMoleculeSID, NS_STYLEMOLECULE_SID);
static NS_DEFINE_IID(kStyleSpacingSID, NS_STYLESPACING_SID);
NS_DEF_PTR(nsIStyleContext);
NS_DEF_PTR(nsIContent);
@ -45,10 +45,6 @@ NS_DEF_PTR(nsIContent);
/* ----------- RowGroupReflowState ---------- */
struct RowGroupReflowState {
// The body's style molecule
nsStyleMolecule* mol;
// The body's available size (computed from the body's parent)
nsSize availSize;
@ -70,10 +66,8 @@ struct RowGroupReflowState {
nscoord firstRowHeight;
RowGroupReflowState(nsIPresContext* aPresContext,
const nsSize& aMaxSize,
nsStyleMolecule* aMol)
const nsSize& aMaxSize)
{
mol = aMol;
availSize.width = aMaxSize.width;
availSize.height = aMaxSize.height;
prevMaxPosBottomMargin = 0;
@ -170,12 +164,12 @@ void nsTableRowGroupFrame::PaintChildren(nsIPresContext& aPresContext,
// Collapse child's top margin with previous bottom margin
nscoord nsTableRowGroupFrame::GetTopMarginFor(nsIPresContext* aCX,
RowGroupReflowState& aState,
nsStyleMolecule* aKidMol)
nsStyleSpacing* aKidSpacing)
{
nscoord margin;
nscoord maxNegTopMargin = 0;
nscoord maxPosTopMargin = 0;
if ((margin = aKidMol->margin.top) < 0) {
if ((margin = aKidSpacing->mMargin.top) < 0) {
maxNegTopMargin = -margin;
} else {
maxPosTopMargin = margin;
@ -286,9 +280,10 @@ PRBool nsTableRowGroupFrame::ReflowMappedChildren( nsIPresContext* aPresCon
nsIStyleContextPtr kidSC;
kidFrame->GetStyleContext(aPresContext, kidSC.AssignRef());
nsStyleMolecule* kidMol = (nsStyleMolecule*)kidSC->GetData(kStyleMoleculeSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidMol);
nscoord bottomMargin = kidMol->margin.bottom;
nsStyleSpacing* kidSpacing = (nsStyleSpacing*)
kidSC->GetData(kStyleSpacingSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidSpacing);
nscoord bottomMargin = kidSpacing->mMargin.bottom;
// Figure out the amount of available size for the child (subtract
// off the top margin we are going to apply to it)
@ -297,7 +292,7 @@ PRBool nsTableRowGroupFrame::ReflowMappedChildren( nsIPresContext* aPresCon
}
// Subtract off for left and right margin
if (PR_FALSE == aState.unconstrainedWidth) {
kidAvailSize.width -= kidMol->margin.left + kidMol->margin.right;
kidAvailSize.width -= kidSpacing->mMargin.left + kidSpacing->mMargin.right;
}
// Reflow the child into the available space
@ -330,7 +325,7 @@ PRBool nsTableRowGroupFrame::ReflowMappedChildren( nsIPresContext* aPresCon
// Place the child after taking into account it's margin
aState.y += topMargin;
nsRect kidRect (0, 0, desiredSize.width, desiredSize.height);
kidRect.x += kidMol->margin.left;
kidRect.x += kidSpacing->mMargin.left;
kidRect.y += aState.y;
PlaceChild(aPresContext, aState, kidFrame, kidRect, aMaxElementSize,
kidMaxElementSize);
@ -396,7 +391,7 @@ PRBool nsTableRowGroupFrame::ReflowMappedChildren( nsIPresContext* aPresCon
// Add back in the left and right margins, because one row does not
// impact another row's width
if (PR_FALSE == aState.unconstrainedWidth) {
kidAvailSize.width += kidMol->margin.left + kidMol->margin.right;
kidAvailSize.width += kidSpacing->mMargin.left + kidSpacing->mMargin.right;
}
// Get the next child
@ -731,12 +726,12 @@ nsTableRowGroupFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
}
// Resolve style
nsIStyleContextPtr kidStyleContext =
nsIStyleContextPtr kidSC =
aPresContext->ResolveStyleContextFor(kid, this);
nsStyleMolecule* kidMol =
(nsStyleMolecule*)kidStyleContext->GetData(kStyleMoleculeSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidMol);
nscoord bottomMargin = kidMol->margin.bottom;
nsStyleSpacing* kidSpacing = (nsStyleSpacing*)
kidSC->GetData(kStyleSpacingSID);
nscoord topMargin = GetTopMarginFor(aPresContext, aState, kidSpacing);
nscoord bottomMargin = kidSpacing->mMargin.bottom;
nsIFrame* kidFrame;
@ -746,7 +741,7 @@ nsTableRowGroupFrame::ReflowUnmappedChildren(nsIPresContext* aPresContext,
kidDel = kid->GetDelegate(aPresContext);
kidFrame = kidDel->CreateFrame(aPresContext, kid, kidIndex, this);
NS_RELEASE(kidDel);
kidFrame->SetStyleContext(kidStyleContext);
kidFrame->SetStyleContext(kidSC);
} else {
kidPrevInFlow->CreateContinuingFrame(aPresContext, this, kidFrame);
}
@ -840,9 +835,7 @@ nsTableRowGroupFrame::ResizeReflow( nsIPresContext* aPresContext,
// Check for an overflow list
MoveOverflowToChildList();
nsStyleMolecule* myMol =
(nsStyleMolecule*)mStyleContext->GetData(kStyleMoleculeSID);
RowGroupReflowState state(aPresContext, aMaxSize, myMol);
RowGroupReflowState state(aPresContext, aMaxSize);
// Reflow the existing frames
if (nsnull != mFirstChild) {

View File

@ -23,7 +23,7 @@
#include "nsIAtom.h"
struct RowGroupReflowState;
struct nsStyleMolecule;
struct nsStyleSpacing;
/**
* nsTableRowGroupFrame is the frame that maps row groups
@ -114,7 +114,7 @@ protected:
nscoord GetTopMarginFor(nsIPresContext* aCX,
RowGroupReflowState& aState,
nsStyleMolecule* aKidMol);
nsStyleSpacing* aKidSpacing);
void PlaceChild( nsIPresContext* aPresContext,
RowGroupReflowState& aState,