зеркало из https://github.com/mozilla/pjs.git
394 строки
14 KiB
C++
394 строки
14 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (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/
|
|
*
|
|
* 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.
|
|
*
|
|
* The Original Code is Mozilla Communicator client code.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape Communications
|
|
* Corporation. Portions created by Netscape are Copyright (C) 1998
|
|
* Netscape Communications Corporation. All Rights Reserved.
|
|
*/
|
|
#ifndef nsBlockFrame_h___
|
|
#define nsBlockFrame_h___
|
|
|
|
#include "nsHTMLContainerFrame.h"
|
|
|
|
class nsBlockReflowState;
|
|
class nsBulletFrame;
|
|
class nsLineBox;
|
|
class nsTextRun;
|
|
|
|
/**
|
|
* Child list name indices
|
|
* @see #GetAdditionalChildListName()
|
|
*/
|
|
#define NS_BLOCK_FRAME_FLOATER_LIST_INDEX 0
|
|
#define NS_BLOCK_FRAME_BULLET_LIST_INDEX 1
|
|
#define NS_BLOCK_FRAME_LAST_LIST_INDEX NS_BLOCK_FRAME_BULLET_LIST_INDEX
|
|
|
|
#define nsBaseIBFrameSuper nsHTMLContainerFrame
|
|
|
|
// Additional nsBaseIBFrame.mFlags bit:
|
|
// This is really an inline frame, not a block frame
|
|
#define BLOCK_IS_INLINE 0x100
|
|
|
|
// Base class for block and inline frames
|
|
class nsBaseIBFrame : public nsBaseIBFrameSuper
|
|
{
|
|
public:
|
|
// nsISupports
|
|
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
|
|
|
// nsIFrame
|
|
NS_IMETHOD SetInitialChildList(nsIPresContext& aPresContext,
|
|
nsIAtom* aListName,
|
|
nsIFrame* aChildList);
|
|
NS_IMETHOD FirstChild(nsIAtom* aListName, nsIFrame*& aFirstChild) const;
|
|
NS_IMETHOD DeleteFrame(nsIPresContext& aPresContext);
|
|
NS_IMETHOD IsSplittable(nsSplittableType& aIsSplittable) const;
|
|
NS_IMETHOD ReResolveStyleContext(nsIPresContext* aPresContext,
|
|
nsIStyleContext* aParentContext);
|
|
NS_IMETHOD CreateContinuingFrame(nsIPresContext& aPresContext,
|
|
nsIFrame* aParent,
|
|
nsIStyleContext* aStyleContext,
|
|
nsIFrame*& aContinuingFrame) = 0;
|
|
NS_IMETHOD Paint(nsIPresContext& aPresContext,
|
|
nsIRenderingContext& aRenderingContext,
|
|
const nsRect& aDirtyRect,
|
|
nsFramePaintLayer aWhichLayer);
|
|
NS_IMETHOD List(FILE* out, PRInt32 aIndent) const;
|
|
NS_IMETHOD GetFrameName(nsString& aResult) const = 0;
|
|
NS_IMETHOD VerifyTree() const;
|
|
NS_IMETHOD GetFrameForPoint(const nsPoint& aPoint, nsIFrame** aFrame);
|
|
|
|
// nsIHTMLReflow
|
|
NS_IMETHOD Reflow(nsIPresContext& aPresContext,
|
|
nsHTMLReflowMetrics& aDesiredSize,
|
|
const nsHTMLReflowState& aReflowState,
|
|
nsReflowStatus& aStatus);
|
|
NS_IMETHOD MoveInSpaceManager(nsIPresContext& aPresContext,
|
|
nsISpaceManager* aSpaceManager,
|
|
nscoord aDeltaX, nscoord aDeltaY);
|
|
|
|
#ifdef DO_SELECTION
|
|
NS_IMETHOD HandleEvent(nsIPresContext& aPresContext,
|
|
nsGUIEvent* aEvent,
|
|
nsEventStatus& aEventStatus);
|
|
|
|
NS_IMETHOD HandleDrag(nsIPresContext& aPresContext,
|
|
nsGUIEvent* aEvent,
|
|
nsEventStatus& aEventStatus);
|
|
|
|
nsIFrame * FindHitFrame(nsBaseIBFrame * aBlockFrame,
|
|
const nscoord aX, const nscoord aY,
|
|
const nsPoint & aPoint);
|
|
|
|
#endif
|
|
|
|
virtual void DeleteChildsNextInFlow(nsIPresContext& aPresContext,
|
|
nsIFrame* aNextInFlow);
|
|
|
|
protected:
|
|
nsBaseIBFrame();
|
|
virtual ~nsBaseIBFrame();
|
|
|
|
void SetFlags(PRUint32 aFlags) {
|
|
mFlags = aFlags;
|
|
}
|
|
|
|
void SlideFrames(nsIPresContext& aPresContext,
|
|
nsISpaceManager* aSpaceManager,
|
|
nsLineBox* aLine, nscoord aDY);
|
|
|
|
void SlideFloaters(nsIPresContext& aPresContext,
|
|
nsISpaceManager* aSpaceManager,
|
|
nsLineBox* aLine, nscoord aDY,
|
|
PRBool aUpdateSpaceManager);
|
|
|
|
PRBool DrainOverflowLines();
|
|
|
|
PRBool RemoveChild(nsLineBox* aLines, nsIFrame* aChild);
|
|
|
|
virtual PRIntn GetSkipSides() const;
|
|
|
|
virtual void ComputeFinalSize(nsBlockReflowState& aState,
|
|
nsHTMLReflowMetrics& aMetrics);
|
|
|
|
void MarkEmptyLines(nsIPresContext& aPresContext);
|
|
|
|
nsresult AppendNewFrames(nsIPresContext& aPresContext, nsIFrame*);
|
|
|
|
nsresult InsertNewFrame(nsIPresContext& aPresContext,
|
|
nsIFrame* aNewFrame,
|
|
nsIFrame* aPrevSibling);
|
|
|
|
nsresult DoRemoveFrame(nsBlockReflowState& aState,
|
|
nsIFrame* aDeletedFrame);
|
|
|
|
virtual nsresult PrepareInitialReflow(nsBlockReflowState& aState);
|
|
|
|
virtual nsresult PrepareFrameAppendedReflow(nsBlockReflowState& aState);
|
|
|
|
virtual nsresult PrepareFrameInsertedReflow(nsBlockReflowState& aState);
|
|
|
|
virtual nsresult PrepareFrameRemovedReflow(nsBlockReflowState& aState);
|
|
|
|
virtual nsresult PrepareStyleChangedReflow(nsBlockReflowState& aState);
|
|
|
|
virtual nsresult PrepareChildIncrementalReflow(nsBlockReflowState& aState);
|
|
|
|
virtual nsresult PrepareResizeReflow(nsBlockReflowState& aState);
|
|
|
|
virtual nsresult ReflowDirtyLines(nsBlockReflowState& aState);
|
|
|
|
nsresult RecoverStateFrom(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
nscoord aDeltaY);
|
|
|
|
//----------------------------------------
|
|
// Methods for line reflow
|
|
|
|
virtual void WillReflowLine(nsBlockReflowState& aState,
|
|
nsLineBox* aLine);
|
|
|
|
virtual nsresult ReflowLine(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
PRBool& aKeepGoing);
|
|
|
|
virtual void DidReflowLine(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
PRBool aKeepGoing);
|
|
|
|
nsresult PlaceLine(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
PRBool& aKeepGoing);
|
|
|
|
// XXX blech
|
|
void PostPlaceLine(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
const nsSize& aMaxElementSize);
|
|
|
|
void ComputeLineMaxElementSize(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
nsSize* aMaxElementSize);
|
|
|
|
virtual void DidPlaceLine(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
nscoord aTopMargin, nscoord aBottomMargin,
|
|
PRBool aKeepGoing);
|
|
|
|
// XXX where to go
|
|
PRBool ShouldJustifyLine(nsBlockReflowState& aState, nsLineBox* aLine);
|
|
|
|
void FindFloaters(nsLineBox* aLine);
|
|
|
|
void DeleteLine(nsBlockReflowState& aState, nsLineBox* aLine);
|
|
|
|
//----------------------------------------
|
|
// Methods for individual frame reflow
|
|
|
|
virtual void WillReflowFrame(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
nsIFrame* aFrame);
|
|
|
|
nsresult ReflowBlockFrame(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
PRBool& aKeepGoing);
|
|
|
|
nsresult ReflowInlineFrame(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
nsIFrame* aFrame,
|
|
PRBool& aKeepLineGoing,
|
|
PRBool& aKeepReflowGoing);
|
|
|
|
virtual void DidReflowFrame(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
nsIFrame* aFrame,
|
|
nsReflowStatus aStatus);
|
|
|
|
void ReflowFloater(nsIPresContext& aPresContext,
|
|
nsBlockReflowState& aState,
|
|
nsIFrame* aFloaterFrame,
|
|
nsHTMLReflowState& aFloaterReflowState);
|
|
|
|
//----------------------------------------
|
|
// Methods for pushing/pulling lines/frames
|
|
|
|
virtual nsresult CreateContinuationFor(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
nsIFrame* aFrame,
|
|
PRBool& aMadeNewFrame);
|
|
|
|
nsresult SplitLine(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
nsIFrame* aFrame);
|
|
|
|
nsBaseIBFrame* FindFollowingBlockFrame(nsIFrame* aFrame);
|
|
|
|
nsresult PullFrame(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
nsIFrame*& aFrameResult);
|
|
|
|
nsresult PullFrame(nsBlockReflowState& aState,
|
|
nsLineBox* aToLine,
|
|
nsLineBox** aFromList,
|
|
PRBool aUpdateGeometricParent,
|
|
nsIFrame*& aFrameResult,
|
|
PRBool& aStopPulling);
|
|
|
|
void PushLines(nsBlockReflowState& aState);
|
|
|
|
//----------------------------------------
|
|
//XXX
|
|
virtual void PaintChildren(nsIPresContext& aPresContext,
|
|
nsIRenderingContext& aRenderingContext,
|
|
const nsRect& aDirtyRect,
|
|
nsFramePaintLayer aWhichLayer);
|
|
|
|
void PaintFloaters(nsIPresContext& aPresContext,
|
|
nsIRenderingContext& aRenderingContext,
|
|
const nsRect& aDirtyRect,
|
|
nsFramePaintLayer aWhichLayer);
|
|
|
|
nsLineBox* FindLineFor(nsIFrame* aFrame, PRBool& aIsFloaterResult);
|
|
|
|
void PropogateReflowDamage(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
nscoord aDeltaY);
|
|
|
|
nsresult IsComplete();
|
|
|
|
#ifdef NS_DEBUG
|
|
PRBool IsChild(nsIFrame* aFrame);
|
|
#endif
|
|
|
|
nsLineBox* mLines;
|
|
|
|
nsLineBox* mOverflowLines;
|
|
|
|
// XXX subclass!
|
|
PRUint32 mFlags;
|
|
|
|
static nsIAtom* gFloaterAtom;
|
|
static nsIAtom* gBulletAtom;
|
|
|
|
friend class nsBlockReflowState;
|
|
};
|
|
|
|
//----------------------------------------------------------------------
|
|
|
|
#define nsBlockFrameSuper nsBaseIBFrame
|
|
|
|
/**
|
|
* The block frame has two additional named child lists:
|
|
* - "Floater-list" which contains the floated frames
|
|
* - "Bullet-list" which contains the bullet frame
|
|
*
|
|
* @see nsLayoutAtoms::bulletList
|
|
* @see nsLayoutAtoms::floaterList
|
|
*/
|
|
class nsBlockFrame : public nsBlockFrameSuper
|
|
{
|
|
public:
|
|
friend nsresult NS_NewBlockFrame(nsIFrame*& aNewFrame, PRUint32 aFlags);
|
|
|
|
// nsISupports overrides
|
|
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
|
|
|
// nsIFrame overrides
|
|
NS_IMETHOD SetInitialChildList(nsIPresContext& aPresContext,
|
|
nsIAtom* aListName,
|
|
nsIFrame* aChildList);
|
|
NS_IMETHOD FirstChild(nsIAtom* aListName, nsIFrame*& aFirstChild) const;
|
|
NS_IMETHOD GetAdditionalChildListName(PRInt32 aIndex,
|
|
nsIAtom*& aListName) const;
|
|
NS_IMETHOD DeleteFrame(nsIPresContext& aPresContext);
|
|
NS_IMETHOD ReResolveStyleContext(nsIPresContext* aPresContext,
|
|
nsIStyleContext* aParentContext);
|
|
NS_IMETHOD CreateContinuingFrame(nsIPresContext& aCX,
|
|
nsIFrame* aParent,
|
|
nsIStyleContext* aStyleContext,
|
|
nsIFrame*& aContinuingFrame);
|
|
NS_IMETHOD IsPercentageBase(PRBool& aBase) const;
|
|
NS_IMETHOD GetFrameForPoint(const nsPoint& aPoint, nsIFrame** aFrame);
|
|
NS_IMETHOD GetFrameName(nsString& aResult) const;
|
|
NS_IMETHOD List(FILE* out, PRInt32 aIndent) const;
|
|
|
|
// nsIHTMLReflow overrides
|
|
NS_IMETHOD Reflow(nsIPresContext& aPresContext,
|
|
nsHTMLReflowMetrics& aDesiredSize,
|
|
const nsHTMLReflowState& aReflowState,
|
|
nsReflowStatus& aStatus);
|
|
|
|
protected:
|
|
nsBlockFrame();
|
|
virtual ~nsBlockFrame();
|
|
|
|
// nsContainerFrame overrides
|
|
virtual void PaintChildren(nsIPresContext& aPresContext,
|
|
nsIRenderingContext& aRenderingContext,
|
|
const nsRect& aDirtyRect,
|
|
nsFramePaintLayer aWhichLayer);
|
|
|
|
// nsBaseIBFrame overrides
|
|
virtual void ComputeFinalSize(nsBlockReflowState& aState,
|
|
nsHTMLReflowMetrics& aMetrics);
|
|
virtual nsresult PrepareInitialReflow(nsBlockReflowState& aState);
|
|
virtual nsresult PrepareFrameAppendedReflow(nsBlockReflowState& aState);
|
|
virtual nsresult PrepareFrameInsertedReflow(nsBlockReflowState& aState);
|
|
virtual nsresult PrepareFrameRemovedReflow(nsBlockReflowState& aState);
|
|
virtual nsresult ReflowDirtyLines(nsBlockReflowState& aState);
|
|
virtual void WillReflowLine(nsBlockReflowState& aState,
|
|
nsLineBox* aLine);
|
|
virtual void DidPlaceLine(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
nscoord aTopMargin, nscoord aBottomMargin,
|
|
PRBool aLineReflowStatus);
|
|
virtual void WillReflowFrame(nsBlockReflowState& aState,
|
|
nsLineBox* aLine,
|
|
nsIFrame* aFrame);
|
|
|
|
void TakeRunInFrames(nsBlockFrame* aRunInFrame);
|
|
|
|
nsresult ComputeTextRuns(nsBlockReflowState& aState);
|
|
|
|
void BuildFloaterList();
|
|
|
|
void RenumberLists(nsBlockReflowState& aState);
|
|
|
|
PRBool ShouldPlaceBullet(nsLineBox* aLine);
|
|
|
|
void PlaceBullet(nsBlockReflowState& aState,
|
|
nscoord aMaxAscent,
|
|
nscoord aTopMargin);
|
|
|
|
void RestoreStyleFor(nsIPresContext& aPresContext, nsIFrame* aFrame);
|
|
|
|
nsIStyleContext* mFirstLineStyle;
|
|
|
|
nsIStyleContext* mFirstLetterStyle;
|
|
|
|
// Text run information
|
|
nsTextRun* mTextRuns;
|
|
|
|
// List of all floaters in this block
|
|
nsFrameList mFloaters;
|
|
|
|
// XXX_fix_me: subclass one more time!
|
|
// For list-item frames, this is the bullet frame.
|
|
nsBulletFrame* mBullet;
|
|
|
|
//friend class nsBaseIBFrame;
|
|
};
|
|
|
|
#endif /* nsBlockFrame_h___ */
|
|
|