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:
parent
93894c3b99
commit
b87f9199b6
@ -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)
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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___ */
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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);
|
||||
};
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -22,8 +22,6 @@
|
||||
#include "nsContainerFrame.h"
|
||||
#include "nsTableCaption.h"
|
||||
|
||||
struct nsStyleMolecule;
|
||||
|
||||
/**
|
||||
* nsTableCaptionFrame
|
||||
* data structure to maintain information about a single table caption geometry
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user