2001-09-29 00:14:13 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2001-10-25 05:08:40 +04:00
|
|
|
// vim:cindent:ts=2:et:sw=2:
|
2001-09-29 00:14:13 +04:00
|
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
|
|
|
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
1998-11-16 20:11:12 +03:00
|
|
|
*
|
2001-09-29 00:14:13 +04:00
|
|
|
* The contents of this file are subject to the Netscape Public License
|
|
|
|
* Version 1.1 (the "License"); you may not use this file except in
|
|
|
|
* compliance with the License. You may obtain a copy of the License at
|
|
|
|
* http://www.mozilla.org/NPL/
|
1998-11-16 20:11:12 +03:00
|
|
|
*
|
2001-09-29 00:14:13 +04:00
|
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
* for the specific language governing rights and limitations under the
|
|
|
|
* License.
|
1998-11-16 20:11:12 +03:00
|
|
|
*
|
|
|
|
* The Original Code is Mozilla Communicator client code.
|
|
|
|
*
|
2001-09-29 00:14:13 +04:00
|
|
|
* The Initial Developer of the Original Code is
|
|
|
|
* Netscape Communications Corporation.
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
1999-11-06 06:40:37 +03:00
|
|
|
*
|
2001-09-29 00:14:13 +04:00
|
|
|
* Contributor(s):
|
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
|
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
|
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
|
|
* use your version of this file under the terms of the NPL, indicate your
|
|
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
* the provisions above, a recipient may use your version of this file under
|
|
|
|
* the terms of any one of the NPL, the GPL or the LGPL.
|
|
|
|
*
|
|
|
|
* ***** END LICENSE BLOCK ***** */
|
1998-11-16 20:11:12 +03:00
|
|
|
#ifndef nsBlockFrame_h___
|
|
|
|
#define nsBlockFrame_h___
|
|
|
|
|
|
|
|
#include "nsHTMLContainerFrame.h"
|
1999-11-03 03:42:12 +03:00
|
|
|
#include "nsHTMLParts.h"
|
2000-05-09 09:11:12 +04:00
|
|
|
#include "nsAbsoluteContainingBlock.h"
|
2001-10-25 05:08:40 +04:00
|
|
|
#include "nsLineBox.h"
|
2002-05-10 22:22:41 +04:00
|
|
|
#include "nsReflowPath.h"
|
1998-11-16 20:11:12 +03:00
|
|
|
|
1998-12-05 19:02:08 +03:00
|
|
|
class nsBlockReflowState;
|
|
|
|
class nsBulletFrame;
|
|
|
|
class nsLineBox;
|
1999-04-20 04:27:43 +04:00
|
|
|
class nsFirstLineFrame;
|
2001-05-11 12:04:29 +04:00
|
|
|
class nsILineIterator;
|
2001-10-25 05:08:40 +04:00
|
|
|
class nsIntervalSet;
|
1998-11-18 09:13:58 +03:00
|
|
|
/**
|
|
|
|
* Child list name indices
|
|
|
|
* @see #GetAdditionalChildListName()
|
|
|
|
*/
|
2000-05-09 09:11:12 +04:00
|
|
|
#define NS_BLOCK_FRAME_FLOATER_LIST_INDEX 0
|
|
|
|
#define NS_BLOCK_FRAME_BULLET_LIST_INDEX 1
|
|
|
|
#define NS_BLOCK_FRAME_ABSOLUTE_LIST_INDEX 2
|
|
|
|
#define NS_BLOCK_FRAME_LAST_LIST_INDEX NS_BLOCK_FRAME_ABSOLUTE_LIST_INDEX
|
1998-11-18 09:13:58 +03:00
|
|
|
|
1999-02-09 20:31:33 +03:00
|
|
|
#define nsBlockFrameSuper nsHTMLContainerFrame
|
1998-12-05 19:02:08 +03:00
|
|
|
|
1999-03-27 04:21:21 +03:00
|
|
|
#define NS_BLOCK_FRAME_CID \
|
|
|
|
{ 0xa6cf90df, 0x15b3, 0x11d2,{0x93, 0x2e, 0x00, 0x80, 0x5f, 0x8a, 0xdd, 0x32}}
|
|
|
|
|
|
|
|
extern const nsIID kBlockFrameCID;
|
|
|
|
|
2000-05-09 09:11:12 +04:00
|
|
|
/*
|
|
|
|
* Base class for block and inline frames.
|
|
|
|
* The block frame has an additional named child list:
|
|
|
|
* - "Absolute-list" which contains the absolutely positioned frames
|
|
|
|
*
|
|
|
|
* @see nsLayoutAtoms::absoluteList
|
|
|
|
*/
|
1999-02-09 20:31:33 +03:00
|
|
|
class nsBlockFrame : public nsBlockFrameSuper
|
1998-11-16 20:11:12 +03:00
|
|
|
{
|
2001-10-25 05:08:40 +04:00
|
|
|
public:
|
|
|
|
typedef nsLineList::iterator line_iterator;
|
|
|
|
typedef nsLineList::const_iterator const_line_iterator;
|
|
|
|
typedef nsLineList::reverse_iterator reverse_line_iterator;
|
|
|
|
typedef nsLineList::const_reverse_iterator const_reverse_line_iterator;
|
|
|
|
|
|
|
|
line_iterator begin_lines() { return mLines.begin(); }
|
|
|
|
line_iterator end_lines() { return mLines.end(); }
|
|
|
|
const_line_iterator begin_lines() const { return mLines.begin(); }
|
|
|
|
const_line_iterator end_lines() const { return mLines.end(); }
|
|
|
|
reverse_line_iterator rbegin_lines() { return mLines.rbegin(); }
|
|
|
|
reverse_line_iterator rend_lines() { return mLines.rend(); }
|
|
|
|
const_reverse_line_iterator rbegin_lines() const { return mLines.rbegin(); }
|
|
|
|
const_reverse_line_iterator rend_lines() const { return mLines.rend(); }
|
|
|
|
|
1999-12-05 02:49:50 +03:00
|
|
|
friend nsresult NS_NewBlockFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame, PRUint32 aFlags);
|
1999-02-09 20:31:33 +03:00
|
|
|
|
1998-11-16 20:11:12 +03:00
|
|
|
// nsISupports
|
|
|
|
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
|
|
|
|
|
|
|
// nsIFrame
|
1999-11-24 09:03:41 +03:00
|
|
|
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
1999-02-25 08:31:15 +03:00
|
|
|
nsIContent* aContent,
|
|
|
|
nsIFrame* aParent,
|
|
|
|
nsIStyleContext* aContext,
|
|
|
|
nsIFrame* aPrevInFlow);
|
1999-11-24 09:03:41 +03:00
|
|
|
NS_IMETHOD SetInitialChildList(nsIPresContext* aPresContext,
|
1998-11-16 20:11:12 +03:00
|
|
|
nsIAtom* aListName,
|
|
|
|
nsIFrame* aChildList);
|
1999-11-24 09:03:41 +03:00
|
|
|
NS_IMETHOD AppendFrames(nsIPresContext* aPresContext,
|
1999-02-02 20:31:09 +03:00
|
|
|
nsIPresShell& aPresShell,
|
|
|
|
nsIAtom* aListName,
|
|
|
|
nsIFrame* aFrameList);
|
1999-11-24 09:03:41 +03:00
|
|
|
NS_IMETHOD InsertFrames(nsIPresContext* aPresContext,
|
1999-02-02 20:31:09 +03:00
|
|
|
nsIPresShell& aPresShell,
|
|
|
|
nsIAtom* aListName,
|
|
|
|
nsIFrame* aPrevFrame,
|
|
|
|
nsIFrame* aFrameList);
|
1999-11-24 09:03:41 +03:00
|
|
|
NS_IMETHOD RemoveFrame(nsIPresContext* aPresContext,
|
1999-02-02 20:31:09 +03:00
|
|
|
nsIPresShell& aPresShell,
|
|
|
|
nsIAtom* aListName,
|
|
|
|
nsIFrame* aOldFrame);
|
2000-01-22 04:16:50 +03:00
|
|
|
NS_IMETHOD FirstChild(nsIPresContext* aPresContext,
|
|
|
|
nsIAtom* aListName,
|
|
|
|
nsIFrame** aFirstChild) const;
|
1999-02-09 20:31:33 +03:00
|
|
|
NS_IMETHOD GetAdditionalChildListName(PRInt32 aIndex,
|
1999-02-10 05:25:01 +03:00
|
|
|
nsIAtom** aListName) const;
|
1999-11-24 09:03:41 +03:00
|
|
|
NS_IMETHOD Destroy(nsIPresContext* aPresContext);
|
1998-11-16 20:11:12 +03:00
|
|
|
NS_IMETHOD IsSplittable(nsSplittableType& aIsSplittable) const;
|
1999-02-09 20:31:33 +03:00
|
|
|
NS_IMETHOD IsPercentageBase(PRBool& aBase) const;
|
1999-11-24 09:03:41 +03:00
|
|
|
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
1998-11-16 20:11:12 +03:00
|
|
|
nsIRenderingContext& aRenderingContext,
|
1998-12-18 18:54:23 +03:00
|
|
|
const nsRect& aDirtyRect,
|
2001-09-19 16:35:19 +04:00
|
|
|
nsFramePaintLayer aWhichLayer,
|
|
|
|
PRUint32 aFlags = 0);
|
1999-02-12 20:45:58 +03:00
|
|
|
NS_IMETHOD GetFrameType(nsIAtom** aType) const;
|
1999-09-01 05:02:16 +04:00
|
|
|
#ifdef DEBUG
|
1999-11-02 01:12:45 +03:00
|
|
|
NS_IMETHOD List(nsIPresContext* aPresContext, FILE* out, PRInt32 aIndent) const;
|
2001-11-14 04:33:42 +03:00
|
|
|
NS_IMETHOD GetFrameName(nsAString& aResult) const;
|
1999-08-31 07:09:40 +04:00
|
|
|
NS_IMETHOD SizeOf(nsISizeOfHandler* aHandler, PRUint32* aResult) const;
|
1998-11-16 20:11:12 +03:00
|
|
|
NS_IMETHOD VerifyTree() const;
|
1999-11-02 01:12:45 +03:00
|
|
|
#endif
|
2000-03-22 05:43:08 +03:00
|
|
|
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext, const nsPoint& aPoint, nsFramePaintLayer aWhichLayer, nsIFrame** aFrame);
|
1999-11-24 09:03:41 +03:00
|
|
|
NS_IMETHOD HandleEvent(nsIPresContext* aPresContext,
|
1999-04-14 01:29:08 +04:00
|
|
|
nsGUIEvent* aEvent,
|
1999-11-24 09:03:41 +03:00
|
|
|
nsEventStatus* aEventStatus);
|
2000-01-12 11:28:24 +03:00
|
|
|
NS_IMETHOD ReflowDirtyChild(nsIPresShell* aPresShell, nsIFrame* aChild);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
2001-03-08 05:46:44 +03:00
|
|
|
NS_IMETHOD IsVisibleForPainting(nsIPresContext * aPresContext,
|
|
|
|
nsIRenderingContext& aRenderingContext,
|
|
|
|
PRBool aCheckVis,
|
|
|
|
PRBool* aIsVisible);
|
|
|
|
|
2002-06-26 01:16:17 +04:00
|
|
|
NS_IMETHOD IsEmpty(nsCompatibility aCompatMode,
|
|
|
|
PRBool aIsPre,
|
|
|
|
PRBool* aResult);
|
2001-10-25 05:08:40 +04:00
|
|
|
|
1998-11-16 20:11:12 +03:00
|
|
|
// nsIHTMLReflow
|
1999-11-24 09:03:41 +03:00
|
|
|
NS_IMETHOD Reflow(nsIPresContext* aPresContext,
|
1998-11-16 20:11:12 +03:00
|
|
|
nsHTMLReflowMetrics& aDesiredSize,
|
|
|
|
const nsHTMLReflowState& aReflowState,
|
|
|
|
nsReflowStatus& aStatus);
|
|
|
|
|
1999-02-23 22:18:12 +03:00
|
|
|
NS_IMETHOD AttributeChanged(nsIPresContext* aPresContext,
|
|
|
|
nsIContent* aChild,
|
1999-10-16 03:16:45 +04:00
|
|
|
PRInt32 aNameSpaceID,
|
1999-02-23 22:18:12 +03:00
|
|
|
nsIAtom* aAttribute,
|
2001-08-25 06:01:08 +04:00
|
|
|
PRInt32 aModType,
|
1999-02-23 22:18:12 +03:00
|
|
|
PRInt32 aHint);
|
|
|
|
|
1998-11-16 20:11:12 +03:00
|
|
|
#ifdef DO_SELECTION
|
1999-11-24 09:03:41 +03:00
|
|
|
NS_IMETHOD HandleEvent(nsIPresContext* aPresContext,
|
1998-11-16 20:11:12 +03:00
|
|
|
nsGUIEvent* aEvent,
|
1999-11-24 09:03:41 +03:00
|
|
|
nsEventStatus* aEventStatus);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
1999-11-24 09:03:41 +03:00
|
|
|
NS_IMETHOD HandleDrag(nsIPresContext* aPresContext,
|
1998-11-16 20:11:12 +03:00
|
|
|
nsGUIEvent* aEvent,
|
1999-11-24 09:03:41 +03:00
|
|
|
nsEventStatus* aEventStatus);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
1999-02-09 20:31:33 +03:00
|
|
|
nsIFrame * FindHitFrame(nsBlockFrame * aBlockFrame,
|
1998-11-16 20:11:12 +03:00
|
|
|
const nscoord aX, const nscoord aY,
|
|
|
|
const nsPoint & aPoint);
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
2002-10-09 00:35:26 +04:00
|
|
|
virtual void DeleteNextInFlowChild(nsIPresContext* aPresContext,
|
|
|
|
nsIFrame* aNextInFlow);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
2000-03-23 02:19:10 +03:00
|
|
|
/** return the topmost block child based on y-index.
|
|
|
|
* almost always the first or second line, if there is one.
|
|
|
|
* accounts for lines that hold only compressed white space, etc.
|
|
|
|
*/
|
2002-11-28 22:29:28 +03:00
|
|
|
nsIFrame* GetTopBlockChild(nsIPresContext *aPresContext);
|
1999-03-27 04:21:21 +03:00
|
|
|
|
2002-04-26 23:19:39 +04:00
|
|
|
// Returns the line containing aFrame, or end_lines() if the frame
|
|
|
|
// isn't in the block.
|
|
|
|
line_iterator FindLineFor(nsIFrame* aFrame);
|
2000-04-14 08:05:58 +04:00
|
|
|
|
2000-08-24 08:26:43 +04:00
|
|
|
static nsresult GetCurrentLine(nsBlockReflowState *aState, nsLineBox **aOutCurrentLine);
|
|
|
|
|
2001-05-01 08:22:57 +04:00
|
|
|
static void CombineRects(const nsRect& r1, nsRect& r2);
|
|
|
|
|
2001-12-04 02:41:13 +03:00
|
|
|
inline nscoord GetAscent() { return mAscent; }
|
|
|
|
|
2002-09-25 02:13:20 +04:00
|
|
|
// Create a contination for aPlaceholder and its out of flow frame and
|
|
|
|
// add it to the list of overflow floaters
|
2002-12-04 03:58:52 +03:00
|
|
|
nsresult SplitPlaceholder(nsIPresContext& aPresContext, nsIFrame& aPlaceholder);
|
2002-09-25 02:13:20 +04:00
|
|
|
|
2002-12-04 03:58:52 +03:00
|
|
|
void UndoSplitPlaceholders(nsBlockReflowState& aState,
|
|
|
|
nsIFrame* aLastPlaceholder);
|
|
|
|
|
1998-12-05 19:02:08 +03:00
|
|
|
protected:
|
1999-02-09 20:31:33 +03:00
|
|
|
nsBlockFrame();
|
|
|
|
virtual ~nsBlockFrame();
|
1998-11-16 20:11:12 +03:00
|
|
|
|
1999-04-28 02:11:05 +04:00
|
|
|
nsIStyleContext* GetFirstLetterStyle(nsIPresContext* aPresContext);
|
|
|
|
|
2002-12-11 07:00:18 +03:00
|
|
|
/*
|
|
|
|
* Overides member function of nsHTMLContainerFrame. Needed to handle the
|
|
|
|
* lines in a nsBlockFrame properly.
|
|
|
|
*/
|
|
|
|
virtual void PaintTextDecorationLines(nsIRenderingContext& aRenderingContext,
|
|
|
|
nscolor aColor,
|
|
|
|
nscoord aOffset,
|
|
|
|
nscoord aAscent,
|
|
|
|
nscoord aSize);
|
|
|
|
|
2001-05-11 12:04:29 +04:00
|
|
|
/**
|
|
|
|
* GetClosestLine will return the line that VERTICALLY owns the point closest to aPoint.y
|
|
|
|
* aOrigin is the offset for this block frame to its frame.
|
|
|
|
* aPoint is the point to search for.
|
|
|
|
* aClosestLine is the result.
|
|
|
|
*/
|
|
|
|
nsresult GetClosestLine(nsILineIterator *aLI,
|
|
|
|
const nsPoint &aOrigin,
|
|
|
|
const nsPoint &aPoint,
|
|
|
|
PRInt32 &aClosestLine);
|
|
|
|
|
1998-11-16 20:11:12 +03:00
|
|
|
void SetFlags(PRUint32 aFlags) {
|
1999-11-03 03:42:12 +03:00
|
|
|
mState &= ~NS_BLOCK_FLAGS_MASK;
|
|
|
|
mState |= aFlags;
|
1998-11-16 20:11:12 +03:00
|
|
|
}
|
|
|
|
|
1999-02-19 01:22:55 +03:00
|
|
|
PRBool HaveOutsideBullet() const {
|
2002-06-20 01:51:13 +04:00
|
|
|
#if defined(DEBUG) && !defined(DEBUG_rods)
|
2001-03-14 09:45:41 +03:00
|
|
|
if(mState & NS_BLOCK_FRAME_HAS_OUTSIDE_BULLET) {
|
|
|
|
NS_ASSERTION(mBullet,"NS_BLOCK_FRAME_HAS_OUTSIDE_BULLET flag set and no mBullet");
|
|
|
|
}
|
|
|
|
#endif
|
1999-02-19 01:22:55 +03:00
|
|
|
return 0 != (mState & NS_BLOCK_FRAME_HAS_OUTSIDE_BULLET);
|
|
|
|
}
|
|
|
|
|
2000-03-23 02:19:10 +03:00
|
|
|
/** move the frames contained by aLine by aDY
|
|
|
|
* if aLine is a block, it's child floaters are added to the state manager
|
|
|
|
*/
|
1999-09-16 23:56:36 +04:00
|
|
|
void SlideLine(nsBlockReflowState& aState,
|
1999-04-03 22:59:01 +04:00
|
|
|
nsLineBox* aLine, nscoord aDY);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
2000-03-23 02:19:10 +03:00
|
|
|
/** grab overflow lines from this block's prevInFlow, and make them
|
|
|
|
* part of this block's mLines list.
|
|
|
|
* @return PR_TRUE if any lines were drained.
|
|
|
|
*/
|
1999-10-26 08:44:41 +04:00
|
|
|
PRBool DrainOverflowLines(nsIPresContext* aPresContext);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
1998-12-05 19:02:08 +03:00
|
|
|
virtual PRIntn GetSkipSides() const;
|
1998-11-16 20:11:12 +03:00
|
|
|
|
1999-03-05 07:21:32 +03:00
|
|
|
virtual void ComputeFinalSize(const nsHTMLReflowState& aReflowState,
|
2002-10-21 18:54:00 +04:00
|
|
|
nsBlockReflowState& aState,
|
|
|
|
nsHTMLReflowMetrics& aMetrics);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
2002-09-24 15:43:48 +04:00
|
|
|
void ComputeCombinedArea(const nsHTMLReflowState& aReflowState,
|
|
|
|
nsHTMLReflowMetrics& aMetrics);
|
|
|
|
|
2002-11-28 22:29:28 +03:00
|
|
|
// Calls |nsLineBox::IsEmpty| with the correct arguments.
|
|
|
|
PRBool IsLineEmpty(nsIPresContext* aPresContext,
|
|
|
|
const nsLineBox* aLine) const;
|
|
|
|
|
2000-03-23 02:19:10 +03:00
|
|
|
/** add the frames in aFrameList to this block after aPrevSibling
|
|
|
|
* this block thinks in terms of lines, but the frame construction code
|
|
|
|
* knows nothing about lines at all. So we need to find the line that
|
|
|
|
* contains aPrevSibling and add aFrameList after aPrevSibling on that line.
|
|
|
|
* new lines are created as necessary to handle block data in aFrameList.
|
|
|
|
*/
|
1999-04-20 04:27:43 +04:00
|
|
|
nsresult AddFrames(nsIPresContext* aPresContext,
|
|
|
|
nsIFrame* aFrameList,
|
|
|
|
nsIFrame* aPrevSibling);
|
|
|
|
|
2000-03-23 02:19:10 +03:00
|
|
|
/** does all the real work for removing aDeletedFrame from this
|
|
|
|
* finds the line containing aFrame.
|
|
|
|
* handled continued frames
|
|
|
|
* marks lines dirty as needed
|
|
|
|
*/
|
1999-08-31 07:09:40 +04:00
|
|
|
nsresult DoRemoveFrame(nsIPresContext* aPresContext,
|
|
|
|
nsIFrame* aDeletedFrame);
|
|
|
|
|
2002-05-29 02:50:43 +04:00
|
|
|
// Remove a floater, abs, rel positioned frame from the appropriate block's list
|
|
|
|
static void DoRemoveOutOfFlowFrame(nsIPresContext* aPresContext,
|
|
|
|
nsIFrame* aFrame);
|
1999-04-20 04:27:43 +04:00
|
|
|
|
2000-03-23 02:19:10 +03:00
|
|
|
/** set up the conditions necessary for an initial reflow */
|
1999-02-09 20:31:33 +03:00
|
|
|
nsresult PrepareInitialReflow(nsBlockReflowState& aState);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
2000-03-23 02:19:10 +03:00
|
|
|
/** set up the conditions necessary for an styleChanged reflow */
|
1999-02-09 20:31:33 +03:00
|
|
|
nsresult PrepareStyleChangedReflow(nsBlockReflowState& aState);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
2000-03-23 02:19:10 +03:00
|
|
|
/** set up the conditions necessary for an incremental reflow.
|
|
|
|
* the primary task is to mark the minimumly sufficient lines dirty.
|
|
|
|
*/
|
1999-02-09 20:31:33 +03:00
|
|
|
nsresult PrepareChildIncrementalReflow(nsBlockReflowState& aState);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
2002-01-05 04:42:36 +03:00
|
|
|
/**
|
|
|
|
* Retarget an inline incremental reflow from continuing frames that
|
|
|
|
* will be destroyed.
|
|
|
|
*
|
|
|
|
* @param aState |aState.mNextRCFrame| contains the next frame in
|
|
|
|
* the reflow path; this will be ``rewound'' to either the target
|
|
|
|
* frame's primary frame, or to the first continuation frame after a
|
|
|
|
* ``hard break''. In other words, it will be set to the closest
|
|
|
|
* continuation which will not be destroyed by the unconstrained
|
|
|
|
* reflow. The remaining frames in the reflow path for
|
|
|
|
* |aState.mReflowState.reflowCommand| will be altered similarly.
|
|
|
|
*
|
|
|
|
* @param aLine is initially the line box that contains the target
|
|
|
|
* frame. It will be ``rewound'' in lockstep with
|
|
|
|
* |aState.mNextRCFrame|.
|
|
|
|
*
|
|
|
|
* @param aPrevInFlow points to the target frame's prev-in-flow.
|
|
|
|
*/
|
2002-05-10 22:22:41 +04:00
|
|
|
void RetargetInlineIncrementalReflow(nsReflowPath::iterator &aFrame,
|
|
|
|
line_iterator &aLine,
|
|
|
|
nsIFrame *aPrevInFlow);
|
2002-01-05 04:42:36 +03:00
|
|
|
|
2000-03-23 02:19:10 +03:00
|
|
|
/** set up the conditions necessary for an resize reflow
|
|
|
|
* the primary task is to mark the minimumly sufficient lines dirty.
|
|
|
|
*/
|
1999-02-09 20:31:33 +03:00
|
|
|
nsresult PrepareResizeReflow(nsBlockReflowState& aState);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
2000-03-23 02:19:10 +03:00
|
|
|
/** reflow all lines that have been marked dirty */
|
1999-02-09 20:31:33 +03:00
|
|
|
nsresult ReflowDirtyLines(nsBlockReflowState& aState);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
1998-12-05 19:02:08 +03:00
|
|
|
//----------------------------------------
|
|
|
|
// Methods for line reflow
|
2000-03-23 02:19:10 +03:00
|
|
|
/**
|
|
|
|
* Reflow a line.
|
|
|
|
* @param aState the current reflow state
|
|
|
|
* @param aLine the line to reflow. can contain a single block frame
|
|
|
|
* or contain 1 or more inline frames.
|
|
|
|
* @param aKeepReflowGoing [OUT] indicates whether the caller should continue to reflow more lines
|
|
|
|
* @param aDamageDirtyArea if PR_TRUE, do extra work to mark the changed areas as damaged for painting
|
|
|
|
* this indicates that frames may have changed size, for example
|
|
|
|
*/
|
1999-02-09 20:31:33 +03:00
|
|
|
nsresult ReflowLine(nsBlockReflowState& aState,
|
2001-10-25 05:08:40 +04:00
|
|
|
line_iterator aLine,
|
1999-07-14 19:16:56 +04:00
|
|
|
PRBool* aKeepReflowGoing,
|
1999-08-01 20:50:52 +04:00
|
|
|
PRBool aDamageDirtyArea = PR_FALSE);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
2002-07-17 05:48:56 +04:00
|
|
|
// Return PR_TRUE if aLine gets pushed.
|
|
|
|
PRBool PlaceLine(nsBlockReflowState& aState,
|
|
|
|
nsLineLayout& aLineLayout,
|
|
|
|
line_iterator aLine,
|
|
|
|
PRBool* aKeepReflowGoing,
|
|
|
|
PRBool aUpdateMaximumWidth);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
2001-10-25 05:08:40 +04:00
|
|
|
/**
|
|
|
|
* Mark |aLine| dirty, and, if necessary because of possible
|
|
|
|
* pull-up, mark the previous line dirty as well.
|
|
|
|
*/
|
|
|
|
nsresult MarkLineDirty(line_iterator aLine);
|
2000-01-12 11:28:24 +03:00
|
|
|
|
1998-12-05 19:02:08 +03:00
|
|
|
// XXX blech
|
|
|
|
void PostPlaceLine(nsBlockReflowState& aState,
|
|
|
|
nsLineBox* aLine,
|
|
|
|
const nsSize& aMaxElementSize);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
1998-12-17 21:52:10 +03:00
|
|
|
void ComputeLineMaxElementSize(nsBlockReflowState& aState,
|
|
|
|
nsLineBox* aLine,
|
|
|
|
nsSize* aMaxElementSize);
|
|
|
|
|
1998-12-05 19:02:08 +03:00
|
|
|
// XXX where to go
|
2001-10-25 05:08:40 +04:00
|
|
|
PRBool ShouldJustifyLine(nsBlockReflowState& aState,
|
|
|
|
line_iterator aLine);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
2001-10-25 05:08:40 +04:00
|
|
|
void DeleteLine(nsBlockReflowState& aState,
|
|
|
|
nsLineList::iterator aLine,
|
|
|
|
nsLineList::iterator aLineEnd);
|
1998-12-08 01:28:23 +03:00
|
|
|
|
1998-12-05 19:02:08 +03:00
|
|
|
//----------------------------------------
|
|
|
|
// Methods for individual frame reflow
|
|
|
|
|
1999-03-27 04:21:21 +03:00
|
|
|
PRBool ShouldApplyTopMargin(nsBlockReflowState& aState,
|
|
|
|
nsLineBox* aLine);
|
1998-12-05 19:02:08 +03:00
|
|
|
|
|
|
|
nsresult ReflowBlockFrame(nsBlockReflowState& aState,
|
2001-10-25 05:08:40 +04:00
|
|
|
line_iterator aLine,
|
1999-02-12 20:45:58 +03:00
|
|
|
PRBool* aKeepGoing);
|
1998-12-05 19:02:08 +03:00
|
|
|
|
1999-03-21 04:15:12 +03:00
|
|
|
nsresult ReflowInlineFrames(nsBlockReflowState& aState,
|
2001-10-25 05:08:40 +04:00
|
|
|
line_iterator aLine,
|
2000-01-08 06:58:27 +03:00
|
|
|
PRBool* aKeepLineGoing,
|
2000-04-19 07:12:13 +04:00
|
|
|
PRBool aDamageDirtyArea,
|
2000-01-08 06:58:27 +03:00
|
|
|
PRBool aUpdateMaximumWidth = PR_FALSE);
|
1999-03-21 04:15:12 +03:00
|
|
|
|
1999-08-28 01:45:37 +04:00
|
|
|
nsresult DoReflowInlineFrames(nsBlockReflowState& aState,
|
|
|
|
nsLineLayout& aLineLayout,
|
2001-10-25 05:08:40 +04:00
|
|
|
line_iterator aLine,
|
1999-08-28 01:45:37 +04:00
|
|
|
PRBool* aKeepReflowGoing,
|
2000-01-08 06:58:27 +03:00
|
|
|
PRUint8* aLineReflowStatus,
|
2000-04-19 07:12:13 +04:00
|
|
|
PRBool aUpdateMaximumWidth,
|
|
|
|
PRBool aDamageDirtyArea);
|
1999-08-28 01:45:37 +04:00
|
|
|
|
|
|
|
nsresult DoReflowInlineFramesAuto(nsBlockReflowState& aState,
|
2001-10-25 05:08:40 +04:00
|
|
|
line_iterator aLine,
|
1999-08-28 01:45:37 +04:00
|
|
|
PRBool* aKeepReflowGoing,
|
2000-01-08 06:58:27 +03:00
|
|
|
PRUint8* aLineReflowStatus,
|
2000-04-19 07:12:13 +04:00
|
|
|
PRBool aUpdateMaximumWidth,
|
|
|
|
PRBool aDamageDirtyArea);
|
1999-08-28 01:45:37 +04:00
|
|
|
|
|
|
|
nsresult DoReflowInlineFramesMalloc(nsBlockReflowState& aState,
|
2001-10-25 05:08:40 +04:00
|
|
|
line_iterator aLine,
|
1999-08-28 01:45:37 +04:00
|
|
|
PRBool* aKeepReflowGoing,
|
2000-01-08 06:58:27 +03:00
|
|
|
PRUint8* aLineReflowStatus,
|
2000-04-19 07:12:13 +04:00
|
|
|
PRBool aUpdateMaximumWidth,
|
|
|
|
PRBool aDamageDirtyArea);
|
1999-08-28 01:45:37 +04:00
|
|
|
|
1998-12-05 19:02:08 +03:00
|
|
|
nsresult ReflowInlineFrame(nsBlockReflowState& aState,
|
1999-08-28 01:45:37 +04:00
|
|
|
nsLineLayout& aLineLayout,
|
2001-10-25 05:08:40 +04:00
|
|
|
line_iterator aLine,
|
1998-12-05 19:02:08 +03:00
|
|
|
nsIFrame* aFrame,
|
1999-03-21 04:15:12 +03:00
|
|
|
PRUint8* aLineReflowStatus);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
2002-06-14 18:30:33 +04:00
|
|
|
// An incomplete aReflowStatus indicates the floater should be split
|
|
|
|
// but only if the available height is constrained.
|
1999-04-01 05:37:36 +04:00
|
|
|
nsresult ReflowFloater(nsBlockReflowState& aState,
|
|
|
|
nsPlaceholderFrame* aPlaceholder,
|
2002-05-29 02:50:43 +04:00
|
|
|
nsRect& aCombinedRectResult,
|
|
|
|
nsMargin& aMarginResult,
|
|
|
|
nsMargin& aComputedOffsetsResult,
|
|
|
|
nsReflowStatus& aReflowStatus);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
1998-12-05 19:02:08 +03:00
|
|
|
//----------------------------------------
|
|
|
|
// Methods for pushing/pulling lines/frames
|
|
|
|
|
|
|
|
virtual nsresult CreateContinuationFor(nsBlockReflowState& aState,
|
2002-05-29 02:50:43 +04:00
|
|
|
nsLineBox* aLine,
|
|
|
|
nsIFrame* aFrame,
|
|
|
|
PRBool& aMadeNewFrame);
|
|
|
|
|
|
|
|
// Push aLine which contains a positioned element that was truncated. Clean up any
|
|
|
|
// placeholders on the same line that were continued. Set aKeepReflowGoing to false.
|
|
|
|
void PushTruncatedPlaceholderLine(nsBlockReflowState& aState,
|
|
|
|
line_iterator aLine,
|
|
|
|
nsIFrame* aLastPlaceholder,
|
|
|
|
PRBool& aKeepReflowGoing);
|
|
|
|
|
1998-12-05 19:02:08 +03:00
|
|
|
nsresult SplitLine(nsBlockReflowState& aState,
|
1999-08-28 01:45:37 +04:00
|
|
|
nsLineLayout& aLineLayout,
|
2001-10-25 05:08:40 +04:00
|
|
|
line_iterator aLine,
|
1998-12-05 19:02:08 +03:00
|
|
|
nsIFrame* aFrame);
|
|
|
|
|
|
|
|
nsresult PullFrame(nsBlockReflowState& aState,
|
2001-10-25 05:08:40 +04:00
|
|
|
line_iterator aLine,
|
2000-04-19 07:12:13 +04:00
|
|
|
PRBool aDamageDeletedLine,
|
1998-12-05 19:02:08 +03:00
|
|
|
nsIFrame*& aFrameResult);
|
|
|
|
|
2001-07-04 06:00:05 +04:00
|
|
|
nsresult PullFrameFrom(nsBlockReflowState& aState,
|
|
|
|
nsLineBox* aToLine,
|
2001-10-25 05:08:40 +04:00
|
|
|
nsLineList& aFromContainer,
|
|
|
|
nsLineList::iterator aFromLine,
|
2001-07-04 06:00:05 +04:00
|
|
|
PRBool aUpdateGeometricParent,
|
|
|
|
PRBool aDamageDeletedLines,
|
2002-01-03 01:10:13 +03:00
|
|
|
nsIFrame*& aFrameResult);
|
1998-12-05 19:02:08 +03:00
|
|
|
|
2001-10-25 05:08:40 +04:00
|
|
|
void PushLines(nsBlockReflowState& aState,
|
|
|
|
nsLineList::iterator aLineBefore);
|
1998-12-05 19:02:08 +03:00
|
|
|
|
|
|
|
//----------------------------------------
|
|
|
|
//XXX
|
2001-09-19 16:35:19 +04:00
|
|
|
virtual void PaintChildren(nsIPresContext* aPresContext,
|
1998-12-18 18:54:23 +03:00
|
|
|
nsIRenderingContext& aRenderingContext,
|
2001-09-19 16:35:19 +04:00
|
|
|
const nsRect& aDirtyRect,
|
|
|
|
nsFramePaintLayer aWhichLayer,
|
|
|
|
PRUint32 aFlags = 0);
|
1998-12-18 18:54:23 +03:00
|
|
|
|
1999-11-24 09:03:41 +03:00
|
|
|
void PaintFloaters(nsIPresContext* aPresContext,
|
1998-11-16 20:11:12 +03:00
|
|
|
nsIRenderingContext& aRenderingContext,
|
1999-03-26 03:39:04 +03:00
|
|
|
const nsRect& aDirtyRect);
|
1998-11-16 20:11:12 +03:00
|
|
|
|
2001-10-25 05:08:40 +04:00
|
|
|
void PropagateFloaterDamage(nsBlockReflowState& aState,
|
|
|
|
nsLineBox* aLine,
|
|
|
|
nscoord aDeltaY);
|
1998-12-05 19:02:08 +03:00
|
|
|
|
|
|
|
void BuildFloaterList();
|
|
|
|
|
1999-07-14 21:26:20 +04:00
|
|
|
//----------------------------------------
|
|
|
|
// List handling kludge
|
|
|
|
|
2000-01-22 04:16:50 +03:00
|
|
|
void RenumberLists(nsIPresContext* aPresContext);
|
1998-12-05 19:02:08 +03:00
|
|
|
|
2000-01-22 04:16:50 +03:00
|
|
|
PRBool RenumberListsInBlock(nsIPresContext* aPresContext,
|
|
|
|
nsBlockFrame* aContainerFrame,
|
2000-07-28 13:02:34 +04:00
|
|
|
PRInt32* aOrdinal,
|
|
|
|
PRInt32 aDepth);
|
1999-09-18 03:16:43 +04:00
|
|
|
|
2000-07-28 13:02:34 +04:00
|
|
|
PRBool RenumberListsFor(nsIPresContext* aPresContext, nsIFrame* aKid, PRInt32* aOrdinal, PRInt32 aDepth);
|
1999-07-14 21:26:20 +04:00
|
|
|
|
|
|
|
PRBool FrameStartsCounterScope(nsIFrame* aFrame);
|
|
|
|
|
1999-10-20 03:04:19 +04:00
|
|
|
nsresult UpdateBulletPosition(nsBlockReflowState& aState);
|
1999-03-05 07:21:32 +03:00
|
|
|
|
1999-02-19 01:22:55 +03:00
|
|
|
void ReflowBullet(nsBlockReflowState& aState,
|
|
|
|
nsHTMLReflowMetrics& aMetrics);
|
1998-12-05 19:02:08 +03:00
|
|
|
|
1999-07-14 21:26:20 +04:00
|
|
|
//----------------------------------------
|
|
|
|
|
2001-10-25 05:08:40 +04:00
|
|
|
nsLineList* GetOverflowLines(nsIPresContext* aPresContext,
|
|
|
|
PRBool aRemoveProperty) const;
|
1999-11-03 02:42:52 +03:00
|
|
|
|
|
|
|
nsresult SetOverflowLines(nsIPresContext* aPresContext,
|
2001-10-25 05:08:40 +04:00
|
|
|
nsLineList* aOverflowLines);
|
1999-11-03 02:42:52 +03:00
|
|
|
|
2002-12-04 03:58:52 +03:00
|
|
|
nsFrameList* GetOverflowPlaceholders(nsIPresContext* aPresContext,
|
|
|
|
PRBool aRemoveProperty) const;
|
|
|
|
|
|
|
|
nsresult SetOverflowPlaceholders(nsIPresContext* aPresContext,
|
|
|
|
nsFrameList* aOverflowPlaceholders);
|
|
|
|
|
1999-04-20 04:27:43 +04:00
|
|
|
nsIFrame* LastChild();
|
1998-12-05 19:02:08 +03:00
|
|
|
|
1999-02-09 20:31:33 +03:00
|
|
|
#ifdef NS_DEBUG
|
1999-11-03 02:42:52 +03:00
|
|
|
PRBool IsChild(nsIPresContext* aPresContext, nsIFrame* aFrame);
|
1999-04-20 04:27:43 +04:00
|
|
|
void VerifyLines(PRBool aFinalCheckOK);
|
1999-11-03 02:42:52 +03:00
|
|
|
void VerifyOverflowSituation(nsIPresContext* aPresContext);
|
1999-03-23 01:41:09 +03:00
|
|
|
PRInt32 GetDepth() const;
|
1999-02-09 20:31:33 +03:00
|
|
|
#endif
|
|
|
|
|
2000-06-05 12:24:18 +04:00
|
|
|
// Ascent of our first line to support 'vertical-align: baseline' in table-cells
|
|
|
|
nscoord mAscent;
|
|
|
|
|
2001-10-25 05:08:40 +04:00
|
|
|
nsLineList mLines;
|
1999-02-09 20:31:33 +03:00
|
|
|
|
1998-11-16 20:11:12 +03:00
|
|
|
// List of all floaters in this block
|
1999-01-16 01:53:39 +03:00
|
|
|
nsFrameList mFloaters;
|
1998-11-16 20:11:12 +03:00
|
|
|
|
1998-12-05 19:02:08 +03:00
|
|
|
// XXX_fix_me: subclass one more time!
|
|
|
|
// For list-item frames, this is the bullet frame.
|
|
|
|
nsBulletFrame* mBullet;
|
1998-11-16 20:11:12 +03:00
|
|
|
|
1999-02-09 20:31:33 +03:00
|
|
|
friend class nsBlockReflowState;
|
2000-05-09 09:11:12 +04:00
|
|
|
|
|
|
|
private:
|
|
|
|
nsAbsoluteContainingBlock mAbsoluteContainer;
|
|
|
|
|
2001-05-01 08:22:57 +04:00
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
public:
|
|
|
|
static PRBool gLamePaintMetrics;
|
|
|
|
static PRBool gLameReflowMetrics;
|
|
|
|
static PRBool gNoisy;
|
|
|
|
static PRBool gNoisyDamageRepair;
|
|
|
|
static PRBool gNoisyMaxElementSize;
|
|
|
|
static PRBool gNoisyReflow;
|
|
|
|
static PRBool gReallyNoisyReflow;
|
|
|
|
static PRBool gNoisySpaceManager;
|
|
|
|
static PRBool gVerifyLines;
|
|
|
|
static PRBool gDisableResizeOpt;
|
|
|
|
|
|
|
|
static PRInt32 gNoiseIndent;
|
|
|
|
|
2001-12-18 01:39:59 +03:00
|
|
|
static const char* kReflowCommandType[];
|
|
|
|
|
2001-05-01 08:22:57 +04:00
|
|
|
protected:
|
|
|
|
static void InitDebugFlags();
|
|
|
|
#endif
|
1998-11-16 20:11:12 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* nsBlockFrame_h___ */
|
|
|
|
|