gecko-dev/layout/tables/nsTableOuterFrame.h

198 строки
7.7 KiB
C
Исходник Обычный вид История

1998-04-14 00:24:54 +04:00
/* -*- 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 "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#ifndef nsTableOuterFrame_h__
#define nsTableOuterFrame_h__
#include "nscore.h"
#include "nsContainerFrame.h"
struct OuterTableReflowState;
/**
1998-04-15 01:45:28 +04:00
* main frame for an nsTable content object,
1998-07-08 08:49:01 +04:00
* the nsTableOuterFrame contains 0 or one caption frame, and a nsTableFrame
* psuedo-frame (referred to as the "inner frame').
1998-04-15 01:45:28 +04:00
* <P> Unlike other frames that handle continuing across breaks, nsTableOuterFrame
1998-07-08 08:49:01 +04:00
* has no notion of "unmapped" children. All children (caption and inner table)
1998-04-15 01:45:28 +04:00
* have frames created in Pass 1, so from the layout process' point of view, they
* are always mapped
1998-04-14 00:24:54 +04:00
*
*/
class nsTableOuterFrame : public nsContainerFrame
{
public:
1998-04-15 01:45:28 +04:00
/** instantiate a new instance of nsTableOuterFrame.
* @param aResult the new object is returned in this out-param
* @param aContent the table object to map
* @param aParent the parent of the new frame
1998-04-15 01:45:28 +04:00
*
* @return NS_OK if the frame was properly allocated, otherwise an error code
*/
friend nsresult
NS_NewTableOuterFrame(nsIContent* aContent,
nsIFrame* aParentFrame,
nsIFrame*& aResult);
1998-04-14 00:24:54 +04:00
1998-09-16 21:19:20 +04:00
NS_IMETHOD Init(nsIPresContext& aPresContext, nsIFrame* aChildList);
1998-04-15 01:45:28 +04:00
/** @see nsIFrame::Paint */
NS_IMETHOD Paint(nsIPresContext& aPresContext,
nsIRenderingContext& aRenderingContext,
const nsRect& aDirtyRect);
1998-04-14 00:24:54 +04:00
NS_IMETHOD Reflow(nsIPresContext& aPresContext,
nsHTMLReflowMetrics& aDesiredSize,
const nsHTMLReflowState& aReflowState,
nsReflowStatus& aStatus);
1998-04-14 00:24:54 +04:00
1998-04-15 01:45:28 +04:00
/** @see nsContainerFrame */
NS_IMETHOD CreateContinuingFrame(nsIPresContext& aPresContext,
nsIFrame* aParent,
nsIStyleContext* aStyleContext,
nsIFrame*& aContinuingFrame);
1998-04-14 00:24:54 +04:00
/** return the min width of the caption. Return 0 if there is no caption. */
nscoord GetMinCaptionWidth();
NS_IMETHOD List(FILE* out = stdout, PRInt32 aIndent = 0, nsIListFilter *aFilter = nsnull) const;
1998-04-14 00:24:54 +04:00
protected:
1998-04-15 01:45:28 +04:00
/** protected constructor
* @see NewFrame
*/
nsTableOuterFrame(nsIContent* aContent, nsIFrame* aParentFrame);
1998-04-14 00:24:54 +04:00
/** return PR_TRUE if the table needs to be reflowed.
* the outer table needs to be reflowed if the table content has changed,
1998-04-15 01:45:28 +04:00
* or if the table style attributes or parent max height/width have
1998-04-14 00:24:54 +04:00
* changed.
*/
1998-07-09 00:21:17 +04:00
PRBool NeedsReflow(const nsSize& aMaxSize);
1998-04-14 00:24:54 +04:00
void PlaceChild(OuterTableReflowState& aReflowState,
nsIFrame* aKidFrame,
const nsRect& aKidRect,
nsSize* aMaxElementSize,
nsSize& aKidMaxElementSize);
1998-04-14 00:24:54 +04:00
nscoord GetTableWidth(const nsHTMLReflowState& aReflowState);
1998-04-14 00:24:54 +04:00
1998-04-15 01:45:28 +04:00
/** overridden here to handle special caption-table relationship
* @see nsContainerFrame::VerifyTree
1998-04-14 00:24:54 +04:00
*/
NS_IMETHOD VerifyTree() const;
1998-04-14 00:24:54 +04:00
1998-04-15 01:45:28 +04:00
/** overridden here to handle special caption-table relationship
* @see nsContainerFrame::PrepareContinuingFrame
1998-04-14 00:24:54 +04:00
*/
void PrepareContinuingFrame(nsIPresContext& aPresContext,
nsIFrame* aParent,
nsIStyleContext* aStyleContext,
nsTableOuterFrame* aContFrame);
1998-04-14 00:24:54 +04:00
/**
* Remove and delete aChild's next-in-flow(s). Updates the sibling and flow
* pointers.
*
* Updates the child count and content offsets of all containers that are
* affected
*
* Overloaded here because nsContainerFrame makes assumptions about pseudo-frames
* that are not true for tables.
*
* @param aChild child this child's next-in-flow
* @return PR_TRUE if successful and PR_FALSE otherwise
*/
PRBool DeleteChildsNextInFlow(nsIPresContext& aPresContext, nsIFrame* aChild);
// begin Incremental Reflow methods
nsresult RecoverState(OuterTableReflowState& aReflowState, nsIFrame* aKidFrame);
nsresult IncrementalReflow(nsIPresContext& aPresContext,
nsHTMLReflowMetrics& aDesiredSize,
OuterTableReflowState& aReflowState,
nsReflowStatus& aStatus);
nsresult IR_TargetIsChild(nsIPresContext& aPresContext,
nsHTMLReflowMetrics& aDesiredSize,
OuterTableReflowState& aReflowState,
nsReflowStatus& aStatus,
nsIFrame * aNextFrame);
nsresult IR_TargetIsInnerTableFrame(nsIPresContext& aPresContext,
nsHTMLReflowMetrics& aDesiredSize,
OuterTableReflowState& aReflowState,
nsReflowStatus& aStatus);
nsresult IR_TargetIsCaptionFrame(nsIPresContext& aPresContext,
nsHTMLReflowMetrics& aDesiredSize,
OuterTableReflowState& aReflowState,
nsReflowStatus& aStatus);
nsresult IR_TargetIsMe(nsIPresContext& aPresContext,
nsHTMLReflowMetrics& aDesiredSize,
OuterTableReflowState& aReflowState,
nsReflowStatus& aStatus);
nsresult IR_InnerTableReflow(nsIPresContext& aPresContext,
nsHTMLReflowMetrics& aDesiredSize,
OuterTableReflowState& aReflowState,
nsReflowStatus& aStatus);
nsresult IR_CaptionInserted(nsIPresContext& aPresContext,
nsHTMLReflowMetrics& aDesiredSize,
OuterTableReflowState& aReflowState,
nsReflowStatus& aStatus,
nsIFrame * aCaptionFrame,
PRBool aReplace);
nsresult IR_CaptionDeleted(nsIPresContext& aPresContext,
nsHTMLReflowMetrics& aDesiredSize,
OuterTableReflowState& aReflowState,
nsReflowStatus& aStatus);
nsresult AdjustSiblingsAfterReflow(nsIPresContext& aPresContext,
OuterTableReflowState& aReflowState,
nsIFrame* aKidFrame,
nscoord aDeltaY);
1998-04-14 00:24:54 +04:00
// end Incremental Reflow methods
1998-04-14 00:24:54 +04:00
private:
/** used to keep track of this frame's children */
nsIFrame *mInnerTableFrame;
nsIFrame *mCaptionFrame;
1998-04-14 00:24:54 +04:00
1998-07-09 00:21:17 +04:00
/** used to track caption max element size */
1998-04-14 00:24:54 +04:00
PRInt32 mMinCaptionWidth;
/** used to cache reflow results so we can optimize out reflow in some circumstances */
nsHTMLReflowMetrics mDesiredSize;
1998-04-14 00:24:54 +04:00
nsSize mMaxElementSize;
};
inline nscoord nsTableOuterFrame::GetMinCaptionWidth()
{ return mMinCaptionWidth; }
1998-04-14 00:24:54 +04:00
#endif