2001-09-28 20:14:13 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
2004-04-18 14:30:37 +00:00
|
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
1998-04-13 20:24:54 +00:00
|
|
|
*
|
2004-04-18 14:30:37 +00:00
|
|
|
* The contents of this file are subject to the Mozilla 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/MPL/
|
1998-04-13 20:24:54 +00:00
|
|
|
*
|
2001-09-28 20:14:13 +00: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-04-13 20:24:54 +00:00
|
|
|
*
|
1999-11-06 03:40:37 +00:00
|
|
|
* The Original Code is mozilla.org code.
|
|
|
|
*
|
2004-04-18 14:30:37 +00:00
|
|
|
* The Initial Developer of the Original Code is
|
2001-09-28 20:14:13 +00:00
|
|
|
* Netscape Communications Corporation.
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
1999-11-06 03:40:37 +00:00
|
|
|
*
|
2001-09-28 20:14:13 +00:00
|
|
|
* Contributor(s):
|
2000-02-02 22:24:56 +00:00
|
|
|
* Pierre Phaneuf <pp@ludusdesign.com>
|
2001-09-28 20:14:13 +00:00
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
2004-04-18 14:30:37 +00:00
|
|
|
* either of 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"),
|
2001-09-28 20:14:13 +00:00
|
|
|
* 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
|
2004-04-18 14:30:37 +00:00
|
|
|
* use your version of this file under the terms of the MPL, indicate your
|
2001-09-28 20:14:13 +00:00
|
|
|
* 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
|
2004-04-18 14:30:37 +00:00
|
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
2001-09-28 20:14:13 +00:00
|
|
|
*
|
|
|
|
* ***** END LICENSE BLOCK ***** */
|
1998-04-13 20:24:54 +00:00
|
|
|
#ifndef nsFrame_h___
|
|
|
|
#define nsFrame_h___
|
|
|
|
|
|
|
|
#include "nsIFrame.h"
|
|
|
|
#include "nsRect.h"
|
1998-11-19 17:22:29 +00:00
|
|
|
#include "nsString.h"
|
1998-05-20 16:24:36 +00:00
|
|
|
#include "prlog.h"
|
1999-11-01 22:12:45 +00:00
|
|
|
#ifdef NS_DEBUG
|
|
|
|
#include "nsIFrameDebug.h"
|
|
|
|
#endif
|
1998-04-13 20:24:54 +00:00
|
|
|
|
1999-12-04 23:49:50 +00:00
|
|
|
#include "nsIPresShell.h"
|
2001-12-17 22:39:59 +00:00
|
|
|
#include "nsHTMLReflowCommand.h"
|
2000-05-31 00:07:58 +00:00
|
|
|
#include "nsIFrameSelection.h"
|
2001-07-16 02:40:48 +00:00
|
|
|
#include "nsHTMLReflowState.h"
|
2001-08-01 01:27:50 +00:00
|
|
|
#include "nsHTMLReflowMetrics.h"
|
1999-12-04 23:49:50 +00:00
|
|
|
|
1998-05-20 16:24:36 +00:00
|
|
|
/**
|
|
|
|
* nsFrame logging constants. We redefine the nspr
|
|
|
|
* PRLogModuleInfo.level field to be a bitfield. Each bit controls a
|
|
|
|
* specific type of logging. Each logging operation has associated
|
|
|
|
* inline methods defined below.
|
|
|
|
*/
|
|
|
|
#define NS_FRAME_TRACE_CALLS 0x1
|
|
|
|
#define NS_FRAME_TRACE_PUSH_PULL 0x2
|
|
|
|
#define NS_FRAME_TRACE_CHILD_REFLOW 0x4
|
1998-06-25 16:33:10 +00:00
|
|
|
#define NS_FRAME_TRACE_NEW_FRAMES 0x8
|
1998-05-20 16:24:36 +00:00
|
|
|
|
|
|
|
#define NS_FRAME_LOG_TEST(_lm,_bit) (PRIntn((_lm)->level) & (_bit))
|
|
|
|
|
|
|
|
#ifdef NS_DEBUG
|
|
|
|
#define NS_FRAME_LOG(_bit,_args) \
|
|
|
|
PR_BEGIN_MACRO \
|
1999-11-01 22:12:45 +00:00
|
|
|
if (NS_FRAME_LOG_TEST(nsIFrameDebug::GetLogModuleInfo(),_bit)) { \
|
1998-05-20 16:24:36 +00:00
|
|
|
PR_LogPrint _args; \
|
|
|
|
} \
|
|
|
|
PR_END_MACRO
|
|
|
|
#else
|
|
|
|
#define NS_FRAME_LOG(_bit,_args)
|
|
|
|
#endif
|
|
|
|
|
1998-06-25 16:33:10 +00:00
|
|
|
// XXX Need to rework this so that logging is free when it's off
|
1998-05-20 16:24:36 +00:00
|
|
|
#ifdef NS_DEBUG
|
|
|
|
#define NS_FRAME_TRACE_IN(_method) Trace(_method, PR_TRUE)
|
1998-06-25 16:33:10 +00:00
|
|
|
|
1998-05-20 16:24:36 +00:00
|
|
|
#define NS_FRAME_TRACE_OUT(_method) Trace(_method, PR_FALSE)
|
1998-06-25 16:33:10 +00:00
|
|
|
|
|
|
|
// XXX remove me
|
|
|
|
#define NS_FRAME_TRACE_MSG(_bit,_args) \
|
|
|
|
PR_BEGIN_MACRO \
|
1999-11-01 22:12:45 +00:00
|
|
|
if (NS_FRAME_LOG_TEST(nsIFrameDebug::GetLogModuleInfo(),_bit)) { \
|
1998-06-25 16:33:10 +00:00
|
|
|
TraceMsg _args; \
|
|
|
|
} \
|
|
|
|
PR_END_MACRO
|
|
|
|
|
|
|
|
#define NS_FRAME_TRACE(_bit,_args) \
|
|
|
|
PR_BEGIN_MACRO \
|
1999-11-01 22:12:45 +00:00
|
|
|
if (NS_FRAME_LOG_TEST(nsIFrameDebug::GetLogModuleInfo(),_bit)) { \
|
1998-06-25 16:33:10 +00:00
|
|
|
TraceMsg _args; \
|
|
|
|
} \
|
|
|
|
PR_END_MACRO
|
|
|
|
|
1998-05-20 16:24:36 +00:00
|
|
|
#define NS_FRAME_TRACE_REFLOW_IN(_method) Trace(_method, PR_TRUE)
|
1998-06-25 16:33:10 +00:00
|
|
|
|
1998-05-20 16:24:36 +00:00
|
|
|
#define NS_FRAME_TRACE_REFLOW_OUT(_method, _status) \
|
|
|
|
Trace(_method, PR_FALSE, _status)
|
1998-06-25 16:33:10 +00:00
|
|
|
|
1998-05-20 16:24:36 +00:00
|
|
|
#else
|
1998-07-07 22:07:35 +00:00
|
|
|
#define NS_FRAME_TRACE(_bits,_args)
|
1998-05-20 16:24:36 +00:00
|
|
|
#define NS_FRAME_TRACE_IN(_method)
|
|
|
|
#define NS_FRAME_TRACE_OUT(_method)
|
1998-06-25 16:33:10 +00:00
|
|
|
#define NS_FRAME_TRACE_MSG(_bits,_args)
|
1998-05-20 16:24:36 +00:00
|
|
|
#define NS_FRAME_TRACE_REFLOW_IN(_method)
|
|
|
|
#define NS_FRAME_TRACE_REFLOW_OUT(_method, _status)
|
|
|
|
#endif
|
|
|
|
|
2002-05-24 20:11:14 +00:00
|
|
|
// handy utilities
|
2003-03-05 15:08:41 +00:00
|
|
|
void SetFontFromStyle(nsIRenderingContext* aRC, nsStyleContext* aSC);
|
1999-06-10 21:08:17 +00:00
|
|
|
|
1998-05-20 16:24:36 +00:00
|
|
|
//----------------------------------------------------------------------
|
1998-04-13 20:24:54 +00:00
|
|
|
|
1998-10-16 20:09:32 +00:00
|
|
|
/**
|
|
|
|
* Implementation of a simple frame that's not splittable and has no
|
|
|
|
* child frames.
|
|
|
|
*
|
|
|
|
* Sets the NS_FRAME_SYNCHRONIZE_FRAME_AND_VIEW bit, so the default
|
|
|
|
* behavior is to keep the frame and view position and size in sync.
|
|
|
|
*/
|
1999-10-30 02:52:11 +00:00
|
|
|
class nsFrame : public nsIFrame
|
1999-11-01 22:12:45 +00:00
|
|
|
#ifdef NS_DEBUG
|
|
|
|
, public nsIFrameDebug
|
|
|
|
#endif
|
1998-04-13 20:24:54 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* Create a new "empty" frame that maps a given piece of content into a
|
|
|
|
* 0,0 area.
|
|
|
|
*/
|
1999-12-04 23:49:50 +00:00
|
|
|
friend nsresult NS_NewEmptyFrame(nsIPresShell* aShell, nsIFrame** aInstancePtrResult);
|
|
|
|
|
|
|
|
// Overloaded new operator. Initializes the memory to 0 and relies on an arena
|
|
|
|
// (which comes from the presShell) to perform the allocation.
|
2002-07-03 17:14:41 +00:00
|
|
|
void* operator new(size_t sz, nsIPresShell* aPresShell) CPP_THROW_NEW;
|
1999-12-04 23:49:50 +00:00
|
|
|
|
|
|
|
// Overridden to prevent the global delete from being called, since the memory
|
2003-06-23 20:31:43 +00:00
|
|
|
// came out of an arena instead of the global delete operator's heap.
|
1999-12-05 02:24:02 +00:00
|
|
|
// XXX Would like to make this private some day, but our UNIX compilers can't
|
|
|
|
// deal with it.
|
1999-12-04 23:49:50 +00:00
|
|
|
void operator delete(void* aPtr, size_t sz);
|
1998-04-13 20:24:54 +00:00
|
|
|
|
1999-12-05 02:24:02 +00:00
|
|
|
private:
|
1999-12-04 23:49:50 +00:00
|
|
|
// The normal operator new is disallowed on nsFrames.
|
2002-07-02 20:25:30 +00:00
|
|
|
void* operator new(size_t sz) CPP_THROW_NEW { return nsnull; };
|
1999-12-04 23:49:50 +00:00
|
|
|
|
|
|
|
public:
|
1999-02-26 17:05:20 +00:00
|
|
|
|
1998-06-05 21:06:24 +00:00
|
|
|
// nsISupports
|
|
|
|
NS_IMETHOD QueryInterface(const nsIID& aIID, void** aInstancePtr);
|
1998-04-13 20:24:54 +00:00
|
|
|
|
1998-06-02 05:28:11 +00:00
|
|
|
// nsIFrame
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD Init(nsIPresContext* aPresContext,
|
1998-12-03 06:31:43 +00:00
|
|
|
nsIContent* aContent,
|
1999-01-14 05:16:23 +00:00
|
|
|
nsIFrame* aParent,
|
2003-02-22 00:32:13 +00:00
|
|
|
nsStyleContext* aContext,
|
1999-02-25 03:27:57 +00:00
|
|
|
nsIFrame* asPrevInFlow);
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD SetInitialChildList(nsIPresContext* aPresContext,
|
1998-11-10 06:05:32 +00:00
|
|
|
nsIAtom* aListName,
|
|
|
|
nsIFrame* aChildList);
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD AppendFrames(nsIPresContext* aPresContext,
|
1999-01-15 01:29:15 +00:00
|
|
|
nsIPresShell& aPresShell,
|
|
|
|
nsIAtom* aListName,
|
|
|
|
nsIFrame* aFrameList);
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD InsertFrames(nsIPresContext* aPresContext,
|
1999-01-15 01:29:15 +00:00
|
|
|
nsIPresShell& aPresShell,
|
|
|
|
nsIAtom* aListName,
|
|
|
|
nsIFrame* aPrevFrame,
|
|
|
|
nsIFrame* aFrameList);
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD RemoveFrame(nsIPresContext* aPresContext,
|
1999-01-15 01:29:15 +00:00
|
|
|
nsIPresShell& aPresShell,
|
|
|
|
nsIAtom* aListName,
|
|
|
|
nsIFrame* aOldFrame);
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD ReplaceFrame(nsIPresContext* aPresContext,
|
1999-07-22 04:32:31 +00:00
|
|
|
nsIPresShell& aPresShell,
|
|
|
|
nsIAtom* aListName,
|
|
|
|
nsIFrame* aOldFrame,
|
|
|
|
nsIFrame* aNewFrame);
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD Destroy(nsIPresContext* aPresContext);
|
2001-02-07 09:57:26 +00:00
|
|
|
NS_IMETHOD CalcBorderPadding(nsMargin& aBorderPadding) const;
|
2003-02-22 00:32:13 +00:00
|
|
|
virtual nsStyleContext* GetAdditionalStyleContext(PRInt32 aIndex) const;
|
|
|
|
virtual void SetAdditionalStyleContext(PRInt32 aIndex,
|
|
|
|
nsStyleContext* aStyleContext);
|
2004-01-09 14:20:53 +00:00
|
|
|
virtual nsIAtom* GetAdditionalChildListName(PRInt32 aIndex) const;
|
|
|
|
virtual nsIFrame* GetFirstChild(nsIAtom* aListName) const;
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD Paint(nsIPresContext* aPresContext,
|
1998-04-17 01:41:24 +00:00
|
|
|
nsIRenderingContext& aRenderingContext,
|
1998-12-18 15:54:23 +00:00
|
|
|
const nsRect& aDirtyRect,
|
2001-09-19 12:35:19 +00:00
|
|
|
nsFramePaintLayer aWhichLayer,
|
|
|
|
PRUint32 aFlags = 0);
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD HandleEvent(nsIPresContext* aPresContext,
|
1998-04-17 01:41:24 +00:00
|
|
|
nsGUIEvent* aEvent,
|
1999-11-24 06:03:41 +00:00
|
|
|
nsEventStatus* aEventStatus);
|
2000-02-11 01:24:59 +00:00
|
|
|
NS_IMETHOD GetContentForEvent(nsIPresContext* aPresContext,
|
|
|
|
nsEvent* aEvent,
|
|
|
|
nsIContent** aContent);
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD GetCursor(nsIPresContext* aPresContext,
|
1998-11-18 05:25:26 +00:00
|
|
|
nsPoint& aPoint,
|
|
|
|
PRInt32& aCursor);
|
1999-10-26 04:44:41 +00:00
|
|
|
NS_IMETHOD GetFrameForPoint(nsIPresContext* aPresContext,
|
|
|
|
const nsPoint& aPoint,
|
2000-03-22 02:43:08 +00:00
|
|
|
nsFramePaintLayer aWhichLayer,
|
1999-10-26 04:44:41 +00:00
|
|
|
nsIFrame** aFrame);
|
1999-02-12 00:02:31 +00:00
|
|
|
|
|
|
|
NS_IMETHOD GetPointFromOffset(nsIPresContext* inPresContext,
|
|
|
|
nsIRenderingContext* inRendContext,
|
|
|
|
PRInt32 inOffset,
|
|
|
|
nsPoint* outPoint);
|
|
|
|
|
|
|
|
NS_IMETHOD GetChildFrameContainingOffset(PRInt32 inContentOffset,
|
1999-09-11 00:18:02 +00:00
|
|
|
PRBool inHint,
|
1999-02-12 00:02:31 +00:00
|
|
|
PRInt32* outFrameContentOffset,
|
|
|
|
nsIFrame* *outChildFrame);
|
|
|
|
|
1999-10-26 04:44:41 +00:00
|
|
|
static nsresult GetNextPrevLineFromeBlockFrame(nsIPresContext* aPresContext,
|
|
|
|
nsPeekOffsetStruct *aPos,
|
1999-07-15 18:19:03 +00:00
|
|
|
nsIFrame *aBlockFrame,
|
|
|
|
PRInt32 aLineStart,
|
1999-10-13 01:15:26 +00:00
|
|
|
PRInt8 aOutSideLimit
|
1999-07-15 18:19:03 +00:00
|
|
|
);
|
2004-02-20 21:38:31 +00:00
|
|
|
NS_IMETHOD CharacterDataChanged(nsIPresContext* aPresContext,
|
|
|
|
nsIContent* aChild,
|
|
|
|
PRBool aAppend);
|
1998-09-29 23:44:25 +00:00
|
|
|
NS_IMETHOD AttributeChanged(nsIPresContext* aPresContext,
|
1998-09-18 19:53:27 +00:00
|
|
|
nsIContent* aChild,
|
1999-10-15 23:16:45 +00:00
|
|
|
PRInt32 aNameSpaceID,
|
1998-09-29 23:44:25 +00:00
|
|
|
nsIAtom* aAttribute,
|
2003-07-11 21:16:12 +00:00
|
|
|
PRInt32 aModType);
|
1998-05-22 04:54:11 +00:00
|
|
|
NS_IMETHOD IsSplittable(nsSplittableType& aIsSplittable) const;
|
1999-02-24 04:48:08 +00:00
|
|
|
NS_IMETHOD GetPrevInFlow(nsIFrame** aPrevInFlow) const;
|
1998-04-17 01:41:24 +00:00
|
|
|
NS_IMETHOD SetPrevInFlow(nsIFrame*);
|
1999-02-24 04:48:08 +00:00
|
|
|
NS_IMETHOD GetNextInFlow(nsIFrame** aNextInFlow) const;
|
1998-04-17 01:41:24 +00:00
|
|
|
NS_IMETHOD SetNextInFlow(nsIFrame*);
|
1999-10-26 04:44:41 +00:00
|
|
|
NS_IMETHOD GetOffsetFromView(nsIPresContext* aPresContext, nsPoint& aOffset, nsIView** aView) const;
|
2002-02-07 22:39:15 +00:00
|
|
|
NS_IMETHOD GetOriginToViewOffset(nsIPresContext *aPresContext, nsPoint& aOffset, nsIView **aView) const;
|
2003-10-31 20:19:18 +00:00
|
|
|
virtual nsIAtom* GetType() const;
|
2004-03-12 04:40:17 +00:00
|
|
|
virtual PRBool IsContainingBlock() const;
|
1999-11-01 22:12:45 +00:00
|
|
|
#ifdef NS_DEBUG
|
1999-10-26 04:44:41 +00:00
|
|
|
NS_IMETHOD List(nsIPresContext* aPresContext, FILE* out, PRInt32 aIndent) const;
|
2001-11-14 01:33:42 +00:00
|
|
|
NS_IMETHOD GetFrameName(nsAString& aResult) const;
|
2004-04-04 01:48:16 +00:00
|
|
|
NS_IMETHOD_(nsFrameState) GetDebugStateBits() const;
|
2000-12-07 15:31:40 +00:00
|
|
|
NS_IMETHOD DumpRegressionData(nsIPresContext* aPresContext, FILE* out, PRInt32 aIndent, PRBool aIncludeStyleData);
|
1998-06-05 21:06:24 +00:00
|
|
|
NS_IMETHOD VerifyTree() const;
|
1999-11-01 22:12:45 +00:00
|
|
|
#endif
|
2000-08-08 23:38:00 +00:00
|
|
|
|
1999-10-26 04:44:41 +00:00
|
|
|
NS_IMETHOD SetSelected(nsIPresContext* aPresContext, nsIDOMRange *aRange,PRBool aSelected, nsSpread aSpread);
|
1999-04-26 04:02:04 +00:00
|
|
|
NS_IMETHOD GetSelected(PRBool *aSelected) const;
|
2000-08-08 23:38:00 +00:00
|
|
|
NS_IMETHOD IsSelectable(PRBool* aIsSelectable, PRUint8* aSelectStyle) const;
|
|
|
|
|
2000-05-31 03:20:02 +00:00
|
|
|
NS_IMETHOD GetSelectionController(nsIPresContext *aPresContext, nsISelectionController **aSelCon);
|
1999-10-26 04:44:41 +00:00
|
|
|
NS_IMETHOD PeekOffset(nsIPresContext* aPresContext, nsPeekOffsetStruct *aPos) ;
|
2000-07-26 11:31:12 +00:00
|
|
|
NS_IMETHOD CheckVisibility(nsIPresContext* aContext, PRInt32 aStartIndex, PRInt32 aEndIndex, PRBool aRecurse, PRBool *aFinished, PRBool *_retval);
|
|
|
|
|
2000-05-16 22:48:28 +00:00
|
|
|
NS_IMETHOD PeekOffsetParagraph(nsIPresContext* aPresContext,
|
|
|
|
nsPeekOffsetStruct *aPos);
|
1999-01-22 18:58:14 +00:00
|
|
|
NS_IMETHOD GetOffsets(PRInt32 &aStart, PRInt32 &aEnd) const;
|
2000-01-12 08:28:24 +00:00
|
|
|
NS_IMETHOD ReflowDirtyChild(nsIPresShell* aPresShell, nsIFrame* aChild);
|
1999-02-18 03:25:23 +00:00
|
|
|
|
2001-08-17 03:13:07 +00:00
|
|
|
#ifdef ACCESSIBILITY
|
2001-05-17 23:52:32 +00:00
|
|
|
NS_IMETHOD GetAccessible(nsIAccessible** aAccessible);
|
2001-08-17 03:13:07 +00:00
|
|
|
#endif
|
2001-05-17 23:52:32 +00:00
|
|
|
|
2002-03-27 02:38:13 +00:00
|
|
|
NS_IMETHOD GetParentStyleContextFrame(nsIPresContext* aPresContext,
|
|
|
|
nsIFrame** aProviderFrame,
|
|
|
|
PRBool* aIsChild);
|
2000-09-12 22:47:09 +00:00
|
|
|
|
2001-01-27 14:09:34 +00:00
|
|
|
// Check Style Visibility and mState for Selection (when printing)
|
|
|
|
NS_IMETHOD IsVisibleForPainting(nsIPresContext * aPresContext,
|
|
|
|
nsIRenderingContext& aRenderingContext,
|
|
|
|
PRBool aCheckVis,
|
|
|
|
PRBool* aIsVisible);
|
|
|
|
|
2003-11-10 23:36:06 +00:00
|
|
|
virtual PRBool IsEmpty();
|
2001-10-25 01:08:40 +00:00
|
|
|
|
1998-10-01 04:46:11 +00:00
|
|
|
// nsIHTMLReflow
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD WillReflow(nsIPresContext* aPresContext);
|
|
|
|
NS_IMETHOD Reflow(nsIPresContext* aPresContext,
|
1998-10-02 04:10:00 +00:00
|
|
|
nsHTMLReflowMetrics& aDesiredSize,
|
|
|
|
const nsHTMLReflowState& aReflowState,
|
|
|
|
nsReflowStatus& aStatus);
|
2001-12-07 14:51:12 +00:00
|
|
|
NS_IMETHOD DidReflow(nsIPresContext* aPresContext,
|
|
|
|
const nsHTMLReflowState* aReflowState,
|
|
|
|
nsDidReflowStatus aStatus);
|
2000-07-28 22:29:28 +00:00
|
|
|
NS_IMETHOD CanContinueTextRun(PRBool& aContinueTextRun) const;
|
1998-10-27 16:51:21 +00:00
|
|
|
NS_IMETHOD AdjustFrameSize(nscoord aExtraSpace, nscoord& aUsedSpace);
|
1999-04-20 00:26:32 +00:00
|
|
|
NS_IMETHOD TrimTrailingWhiteSpace(nsIPresContext* aPresContext,
|
1998-10-27 16:51:21 +00:00
|
|
|
nsIRenderingContext& aRC,
|
|
|
|
nscoord& aDeltaWidth);
|
1998-10-01 04:46:11 +00:00
|
|
|
|
1998-10-08 18:21:32 +00:00
|
|
|
// Selection Methods
|
1999-02-18 03:25:23 +00:00
|
|
|
// XXX Doc me... (in nsIFrame.h puhleeze)
|
1998-10-08 18:21:32 +00:00
|
|
|
// XXX If these are selection specific, then the name should imply selection
|
|
|
|
// rather than generic event processing, e.g., SelectionHandlePress...
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD HandlePress(nsIPresContext* aPresContext,
|
1998-10-08 18:21:32 +00:00
|
|
|
nsGUIEvent * aEvent,
|
1999-11-24 06:03:41 +00:00
|
|
|
nsEventStatus* aEventStatus);
|
1998-08-28 15:58:37 +00:00
|
|
|
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD HandleMultiplePress(nsIPresContext* aPresContext,
|
1999-05-17 00:21:18 +00:00
|
|
|
nsGUIEvent * aEvent,
|
1999-11-24 06:03:41 +00:00
|
|
|
nsEventStatus* aEventStatus);
|
1999-05-17 00:21:18 +00:00
|
|
|
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD HandleDrag(nsIPresContext* aPresContext,
|
1998-10-08 18:21:32 +00:00
|
|
|
nsGUIEvent * aEvent,
|
1999-11-24 06:03:41 +00:00
|
|
|
nsEventStatus* aEventStatus);
|
1998-08-28 15:58:37 +00:00
|
|
|
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD HandleRelease(nsIPresContext* aPresContext,
|
1998-10-08 18:21:32 +00:00
|
|
|
nsGUIEvent * aEvent,
|
1999-11-24 06:03:41 +00:00
|
|
|
nsEventStatus* aEventStatus);
|
1998-08-28 15:58:37 +00:00
|
|
|
|
1999-11-24 06:03:41 +00:00
|
|
|
NS_IMETHOD GetContentAndOffsetsFromPoint(nsIPresContext* aCX,
|
1999-09-29 20:04:05 +00:00
|
|
|
const nsPoint& aPoint,
|
|
|
|
nsIContent ** aNewContent,
|
|
|
|
PRInt32& aContentOffset,
|
1999-10-13 01:15:26 +00:00
|
|
|
PRInt32& aContentOffsetEnd,
|
|
|
|
PRBool& aBeginFrameContent);
|
2000-05-16 22:48:28 +00:00
|
|
|
NS_IMETHOD PeekBackwardAndForward(nsSelectionAmount aAmountBack,
|
|
|
|
nsSelectionAmount aAmountForward,
|
|
|
|
PRInt32 aStartPos,
|
|
|
|
nsIPresContext* aPresContext,
|
|
|
|
PRBool aJumpLines);
|
1999-09-29 20:04:05 +00:00
|
|
|
|
|
|
|
|
1998-06-05 21:06:24 +00:00
|
|
|
//--------------------------------------------------
|
|
|
|
// Additional methods
|
1998-06-03 22:49:45 +00:00
|
|
|
|
2004-01-10 05:36:32 +00:00
|
|
|
/**
|
|
|
|
* Helper method to invalidate portions of a standard container frame if the
|
|
|
|
* reflow state indicates that the size has changed (specifically border,
|
|
|
|
* background and outline).
|
|
|
|
* We assume that the difference between the old frame area and the new
|
|
|
|
* frame area is invalidated by some other means.
|
|
|
|
* @param aPresContext the presentation context
|
|
|
|
* @param aDesiredSize the new size of the frame
|
|
|
|
* @param aReflowState the reflow that was just done on this frame
|
|
|
|
*/
|
|
|
|
void CheckInvalidateSizeChange(nsIPresContext* aPresContext,
|
|
|
|
nsHTMLReflowMetrics& aDesiredSize,
|
|
|
|
const nsHTMLReflowState& aReflowState);
|
|
|
|
|
1999-08-27 21:48:06 +00:00
|
|
|
// Helper function that tests if the frame tree is too deep; if it
|
|
|
|
// is it marks the frame as "unflowable" and zeros out the metrics
|
|
|
|
// and returns PR_TRUE. Otherwise, the frame is unmarked
|
|
|
|
// "unflowable" and the metrics are not touched and PR_FALSE is
|
|
|
|
// returned.
|
|
|
|
PRBool IsFrameTreeTooDeep(const nsHTMLReflowState& aReflowState,
|
|
|
|
nsHTMLReflowMetrics& aMetrics);
|
|
|
|
|
2001-12-17 22:39:59 +00:00
|
|
|
static nsresult CreateAndPostReflowCommand(nsIPresShell* aPresShell,
|
|
|
|
nsIFrame* aTargetFrame,
|
|
|
|
nsReflowType aReflowType,
|
|
|
|
nsIFrame* aChildFrame,
|
|
|
|
nsIAtom* aAttribute,
|
|
|
|
nsIAtom* aListName);
|
2000-01-12 08:28:24 +00:00
|
|
|
|
2002-03-27 02:38:13 +00:00
|
|
|
// Do the work for getting the parent style context frame so that
|
|
|
|
// other frame's |GetParentStyleContextFrame| methods can call this
|
|
|
|
// method on *another* frame. (This function handles out-of-flow
|
2003-06-15 00:55:00 +00:00
|
|
|
// frames by using the frame manager's placeholder map and it also
|
|
|
|
// handles block-within-inline and generated content wrappers.)
|
2002-03-27 02:38:13 +00:00
|
|
|
nsresult DoGetParentStyleContextFrame(nsIPresContext* aPresContext,
|
|
|
|
nsIFrame** aProviderFrame,
|
|
|
|
PRBool* aIsChild);
|
|
|
|
|
2003-05-31 10:32:19 +00:00
|
|
|
// Return the previously stored overflow area, if the frame does not
|
|
|
|
// overflow and a creation is not requested it will return nsnull
|
|
|
|
virtual nsRect* GetOverflowAreaProperty(nsIPresContext* aPresContext,
|
|
|
|
PRBool aCreateIfNecessary = PR_FALSE);
|
|
|
|
|
|
|
|
// Set/unset the NS_FRAME_OUTSIDE_CHILDREN flag and store the overflow area
|
|
|
|
// as a frame property in the frame manager so that it can be retrieved
|
|
|
|
// later without reflowing the frame.
|
|
|
|
void StoreOverflow(nsIPresContext* aPresContext,
|
|
|
|
nsHTMLReflowMetrics& aMetrics);
|
|
|
|
|
2003-09-13 16:21:41 +00:00
|
|
|
// incorporate the child overflow area into the parent overflow area
|
|
|
|
// if the child does not have a overflow use the child area
|
|
|
|
void ConsiderChildOverflow(nsIPresContext* aPresContext,
|
|
|
|
nsRect& aOverflowArea,
|
|
|
|
nsIFrame* aChildFrame);
|
|
|
|
|
2000-04-12 03:04:11 +00:00
|
|
|
//Mouse Capturing code used by the frames to tell the view to capture all the following events
|
2000-08-14 22:28:41 +00:00
|
|
|
NS_IMETHOD CaptureMouse(nsIPresContext* aPresContext, PRBool aGrabMouseEvents);
|
2000-04-12 03:04:11 +00:00
|
|
|
PRBool IsMouseCaptured(nsIPresContext* aPresContext);
|
2002-12-04 00:58:52 +00:00
|
|
|
|
|
|
|
virtual void* GetProperty(nsIPresContext* aPresContext,
|
|
|
|
nsIAtom* aPropertyName,
|
|
|
|
PRBool aRemoveProperty) const;
|
|
|
|
|
|
|
|
virtual nsresult SetProperty(nsIPresContext* aPresContext,
|
|
|
|
nsIAtom* aPropertyName,
|
|
|
|
void* aPropertyValue,
|
|
|
|
NSFramePropertyDtorFunc aPropDtorFunc);
|
|
|
|
|
2003-05-15 03:42:21 +00:00
|
|
|
virtual const nsStyleStruct* GetStyleDataExternal(nsStyleStructID aSID) const;
|
2003-01-09 06:49:07 +00:00
|
|
|
|
2001-03-09 03:29:00 +00:00
|
|
|
#ifdef IBMBIDI
|
|
|
|
NS_IMETHOD GetBidiProperty(nsIPresContext* aPresContext,
|
|
|
|
nsIAtom* aPropertyName,
|
|
|
|
void** aPropertyValue,
|
2001-06-21 12:35:48 +00:00
|
|
|
size_t aSize ) const;
|
2001-03-09 03:29:00 +00:00
|
|
|
NS_IMETHOD SetBidiProperty(nsIPresContext* aPresContext,
|
|
|
|
nsIAtom* aPropertyName,
|
2001-06-21 12:35:48 +00:00
|
|
|
void* aPropertyValue) ;
|
2001-03-09 03:29:00 +00:00
|
|
|
#endif // IBMBIDI
|
2000-04-12 03:04:11 +00:00
|
|
|
|
1998-05-20 16:24:36 +00:00
|
|
|
#ifdef NS_DEBUG
|
|
|
|
/**
|
|
|
|
* Tracing method that writes a method enter/exit routine to the
|
|
|
|
* nspr log using the nsIFrame log module. The tracing is only
|
|
|
|
* done when the NS_FRAME_TRACE_CALLS bit is set in the log module's
|
|
|
|
* level field.
|
|
|
|
*/
|
|
|
|
void Trace(const char* aMethod, PRBool aEnter);
|
|
|
|
void Trace(const char* aMethod, PRBool aEnter, nsReflowStatus aStatus);
|
|
|
|
void TraceMsg(const char* fmt, ...);
|
1999-07-24 02:37:06 +00:00
|
|
|
|
|
|
|
// Helper function that verifies that each frame in the list has the
|
|
|
|
// NS_FRAME_IS_DIRTY bit set
|
|
|
|
static void VerifyDirtyBitSet(nsIFrame* aFrameList);
|
1998-05-20 16:24:36 +00:00
|
|
|
|
2003-11-19 01:20:56 +00:00
|
|
|
// Helper function to return the index in parent of the frame's content
|
|
|
|
// object. Returns -1 on error or if the frame doesn't have a content object
|
|
|
|
static PRInt32 ContentIndexInContainer(const nsIFrame* aFrame);
|
|
|
|
|
1998-11-19 17:22:29 +00:00
|
|
|
void ListTag(FILE* out) const {
|
1999-11-01 22:12:45 +00:00
|
|
|
ListTag(out, (nsIFrame*)this);
|
1998-12-12 19:20:10 +00:00
|
|
|
}
|
|
|
|
|
1999-11-01 22:12:45 +00:00
|
|
|
static void ListTag(FILE* out, nsIFrame* aFrame) {
|
1998-11-19 17:22:29 +00:00
|
|
|
nsAutoString tmp;
|
1999-11-01 22:12:45 +00:00
|
|
|
nsIFrameDebug* frameDebug;
|
|
|
|
|
2000-02-02 22:24:56 +00:00
|
|
|
if (NS_SUCCEEDED(aFrame->QueryInterface(NS_GET_IID(nsIFrameDebug), (void**)&frameDebug))) {
|
1999-11-01 22:12:45 +00:00
|
|
|
frameDebug->GetFrameName(tmp);
|
|
|
|
}
|
2001-10-16 03:53:44 +00:00
|
|
|
fputs(NS_LossyConvertUCS2toASCII(tmp).get(), out);
|
2001-10-25 01:08:40 +00:00
|
|
|
fprintf(out, "@%p", NS_STATIC_CAST(void*, aFrame));
|
1998-11-19 17:22:29 +00:00
|
|
|
}
|
|
|
|
|
1998-12-05 16:03:07 +00:00
|
|
|
static void IndentBy(FILE* out, PRInt32 aIndent) {
|
|
|
|
while (--aIndent >= 0) fputs(" ", out);
|
|
|
|
}
|
1999-11-01 22:12:45 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Dump out the "base classes" regression data. This should dump
|
|
|
|
* out the interior data, not the "frame" XML container. And it
|
|
|
|
* should call the base classes same named method before doing
|
|
|
|
* anything specific in a derived class. This means that derived
|
|
|
|
* classes need not override DumpRegressionData unless they need
|
|
|
|
* some custom behavior that requires changing how the outer "frame"
|
|
|
|
* XML container is dumped.
|
|
|
|
*/
|
2000-12-07 15:31:40 +00:00
|
|
|
virtual void DumpBaseRegressionData(nsIPresContext* aPresContext, FILE* out, PRInt32 aIndent, PRBool aIncludeStyleData);
|
1999-11-01 22:12:45 +00:00
|
|
|
|
2001-11-14 01:33:42 +00:00
|
|
|
nsresult MakeFrameName(const nsAString& aKind, nsAString& aResult) const;
|
2001-10-29 01:43:59 +00:00
|
|
|
|
|
|
|
// Display Reflow Debugging
|
2001-11-14 13:40:03 +00:00
|
|
|
static void* DisplayReflowEnter(nsIPresContext* aPresContext,
|
|
|
|
nsIFrame* aFrame,
|
2001-10-29 01:43:59 +00:00
|
|
|
const nsHTMLReflowState& aReflowState);
|
2001-11-14 13:40:03 +00:00
|
|
|
static void DisplayReflowExit(nsIPresContext* aPresContext,
|
|
|
|
nsIFrame* aFrame,
|
2001-10-29 01:43:59 +00:00
|
|
|
nsHTMLReflowMetrics& aMetrics,
|
|
|
|
PRUint32 aStatus,
|
|
|
|
void* aFrameTreeNode);
|
2003-03-22 15:09:17 +00:00
|
|
|
|
|
|
|
static void DisplayReflowStartup();
|
|
|
|
static void DisplayReflowShutdown();
|
1999-11-01 22:12:45 +00:00
|
|
|
#endif
|
1998-12-05 16:03:07 +00:00
|
|
|
|
1998-04-13 20:24:54 +00:00
|
|
|
protected:
|
1998-12-05 16:03:07 +00:00
|
|
|
// Protected constructor and destructor
|
|
|
|
nsFrame();
|
|
|
|
virtual ~nsFrame();
|
|
|
|
|
2002-12-23 22:05:47 +00:00
|
|
|
/**
|
|
|
|
* To be called by |Paint| of this class or derived classes to paint
|
|
|
|
* the background, border, and outline, when in the correct layer to
|
|
|
|
* do so.
|
|
|
|
*/
|
|
|
|
void PaintSelf(nsIPresContext* aPresContext,
|
|
|
|
nsIRenderingContext& aRenderingContext,
|
|
|
|
const nsRect& aDirtyRect,
|
2003-02-23 02:49:22 +00:00
|
|
|
PRIntn aSkipSides = 0,
|
|
|
|
PRBool aUsePrintBackgroundSettings = PR_TRUE);
|
2002-12-23 22:05:47 +00:00
|
|
|
|
2000-04-30 18:56:26 +00:00
|
|
|
PRInt16 DisplaySelection(nsIPresContext* aPresContext, PRBool isOkToTurnOn = PR_FALSE);
|
2000-08-08 23:38:00 +00:00
|
|
|
|
1999-10-22 00:19:18 +00:00
|
|
|
//this will modify aPos and return the next frame ect.
|
2000-01-22 01:16:50 +00:00
|
|
|
NS_IMETHOD GetFrameFromDirection(nsIPresContext* aPresContext, nsPeekOffsetStruct *aPos);
|
1999-10-22 00:19:18 +00:00
|
|
|
|
1998-05-08 18:33:42 +00:00
|
|
|
// Style post processing hook
|
1998-05-26 23:13:26 +00:00
|
|
|
NS_IMETHOD DidSetStyleContext(nsIPresContext* aPresContext);
|
1998-05-08 18:33:42 +00:00
|
|
|
|
2001-03-08 02:46:44 +00:00
|
|
|
// Helper routine for determining whether to print selection
|
|
|
|
nsresult GetSelectionForVisCheck(nsIPresContext * aPresContext, nsISelection** aSelection);
|
|
|
|
|
1999-10-22 00:19:18 +00:00
|
|
|
//return the line number of the aFrame
|
|
|
|
static PRInt32 GetLineNumber(nsIFrame *aFrame);
|
|
|
|
//given a frame five me the first/last leaf available
|
2000-01-22 01:16:50 +00:00
|
|
|
static void GetLastLeaf(nsIPresContext* aPresContext, nsIFrame **aFrame);
|
|
|
|
static void GetFirstLeaf(nsIPresContext* aPresContext, nsIFrame **aFrame);
|
2000-03-16 23:45:39 +00:00
|
|
|
|
|
|
|
// Test if we are selecting a table object:
|
2000-05-31 00:07:58 +00:00
|
|
|
// Most table/cell selection requires that Ctrl (Cmd on Mac) key is down
|
|
|
|
// during a mouse click or drag. Exception is using Shift+click when
|
|
|
|
// already in "table/cell selection mode" to extend a block selection
|
|
|
|
// Get the parent content node and offset of the frame
|
2000-03-16 23:45:39 +00:00
|
|
|
// of the enclosing cell or table (if not inside a cell)
|
|
|
|
// aTarget tells us what table element to select (currently only cell and table supported)
|
|
|
|
// (enums for this are defined in nsIFrame.h)
|
2002-03-22 15:25:08 +00:00
|
|
|
NS_IMETHOD GetDataForTableSelection(nsIFrameSelection *aFrameSelection,
|
|
|
|
nsIPresShell *aPresShell, nsMouseEvent *aMouseEvent,
|
|
|
|
nsIContent **aParentContent, PRInt32 *aContentOffset,
|
|
|
|
PRInt32 *aTarget);
|
2000-03-16 23:45:39 +00:00
|
|
|
|
1998-11-19 17:55:22 +00:00
|
|
|
static void XMLQuote(nsString& aString);
|
|
|
|
|
1999-06-01 23:04:13 +00:00
|
|
|
virtual PRBool ParentDisablesSelection() const;
|
|
|
|
|
2000-04-25 04:43:11 +00:00
|
|
|
// Set the overflow clip rect into the rendering-context. Used for block-level
|
|
|
|
// elements and replaced elements that have 'overflow' set to 'hidden'. This
|
|
|
|
// member function assumes that the caller has checked that the clip property
|
|
|
|
// applies to its situation.
|
|
|
|
void SetOverflowClipRect(nsIRenderingContext& aRenderingContext);
|
1999-04-10 17:32:22 +00:00
|
|
|
|
1998-12-07 03:43:02 +00:00
|
|
|
protected:
|
1998-04-13 20:24:54 +00:00
|
|
|
NS_IMETHOD_(nsrefcnt) AddRef(void);
|
|
|
|
NS_IMETHOD_(nsrefcnt) Release(void);
|
|
|
|
};
|
|
|
|
|
2001-11-14 13:40:03 +00:00
|
|
|
// Start Display Reflow Debugging
|
2001-10-29 01:43:59 +00:00
|
|
|
#ifdef DEBUG
|
|
|
|
|
|
|
|
struct DR_cookie {
|
2001-11-14 13:40:03 +00:00
|
|
|
DR_cookie(nsIPresContext* aPresContext,
|
|
|
|
nsIFrame* aFrame,
|
|
|
|
const nsHTMLReflowState& aReflowState,
|
2001-10-29 01:43:59 +00:00
|
|
|
nsHTMLReflowMetrics& aMetrics,
|
|
|
|
nsReflowStatus& aStatus);
|
|
|
|
~DR_cookie();
|
2001-11-27 01:45:46 +00:00
|
|
|
void Change() const;
|
2001-10-29 01:43:59 +00:00
|
|
|
|
2001-11-14 13:40:03 +00:00
|
|
|
nsIPresContext* mPresContext;
|
2001-10-29 01:43:59 +00:00
|
|
|
nsIFrame* mFrame;
|
|
|
|
const nsHTMLReflowState& mReflowState;
|
|
|
|
nsHTMLReflowMetrics& mMetrics;
|
|
|
|
nsReflowStatus& mStatus;
|
|
|
|
void* mValue;
|
|
|
|
};
|
|
|
|
|
2001-11-14 13:40:03 +00:00
|
|
|
#define DISPLAY_REFLOW(dr_pres_context, dr_frame, dr_rf_state, dr_rf_metrics, dr_rf_status) \
|
|
|
|
DR_cookie dr_cookie(dr_pres_context, dr_frame, dr_rf_state, dr_rf_metrics, dr_rf_status);
|
2001-11-27 01:45:46 +00:00
|
|
|
#define DISPLAY_REFLOW_CHANGE() \
|
|
|
|
dr_cookie.Change();
|
2001-10-29 01:43:59 +00:00
|
|
|
|
|
|
|
#else
|
|
|
|
|
2001-11-14 13:40:03 +00:00
|
|
|
#define DISPLAY_REFLOW(dr_pres_context, dr_frame, dr_rf_state, dr_rf_metrics, dr_rf_status)
|
2001-11-27 01:45:46 +00:00
|
|
|
#define DISPLAY_REFLOW_CHANGE()
|
2001-10-29 01:43:59 +00:00
|
|
|
|
|
|
|
#endif
|
|
|
|
// End Display Reflow Debugging
|
|
|
|
|
2002-03-12 15:21:35 +00:00
|
|
|
// similar to NS_ENSURE_TRUE but with no return value
|
|
|
|
#define ENSURE_TRUE(x) \
|
|
|
|
PR_BEGIN_MACRO \
|
|
|
|
if (!(x)) { \
|
|
|
|
NS_WARNING("ENSURE_TRUE(" #x ") failed"); \
|
|
|
|
return; \
|
|
|
|
} \
|
|
|
|
PR_END_MACRO
|
1998-04-13 20:24:54 +00:00
|
|
|
#endif /* nsFrame_h___ */
|