/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef nsTableOuterFrame_h__ #define nsTableOuterFrame_h__ #include "mozilla/Attributes.h" #include "nscore.h" #include "nsContainerFrame.h" #include "nsBlockFrame.h" #include "nsITableLayout.h" #include "nsTableFrame.h" class nsTableCaptionFrame : public nsBlockFrame { public: NS_DECL_FRAMEARENA_HELPERS // nsISupports virtual nsIAtom* GetType() const; friend nsIFrame* NS_NewTableCaptionFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); virtual nsSize ComputeAutoSize(nsRenderingContext *aRenderingContext, nsSize aCBSize, nscoord aAvailableWidth, nsSize aMargin, nsSize aBorder, nsSize aPadding, bool aShrinkWrap); virtual nsIFrame* GetParentStyleContextFrame() const; #ifdef ACCESSIBILITY virtual mozilla::a11y::AccType AccessibleType() MOZ_OVERRIDE; #endif #ifdef DEBUG NS_IMETHOD GetFrameName(nsAString& aResult) const MOZ_OVERRIDE; #endif protected: nsTableCaptionFrame(nsStyleContext* aContext); virtual ~nsTableCaptionFrame(); }; /* TODO 1. decide if we'll allow subclassing. If so, decide which methods really need to be virtual. */ /** * main frame for an nsTable content object, * the nsTableOuterFrame contains 0 or one caption frame, and a nsTableFrame * pseudo-frame (referred to as the "inner frame'). */ class nsTableOuterFrame : public nsContainerFrame, public nsITableLayout { public: NS_DECL_QUERYFRAME NS_DECL_FRAMEARENA_HELPERS /** instantiate a new instance of nsTableRowFrame. * @param aPresShell the pres shell for this frame * * @return the frame that was created */ friend nsIFrame* NS_NewTableOuterFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); // nsIFrame overrides - see there for a description virtual void DestroyFrom(nsIFrame* aDestructRoot); NS_IMETHOD SetInitialChildList(ChildListID aListID, nsFrameList& aChildList) MOZ_OVERRIDE; virtual const nsFrameList& GetChildList(ChildListID aListID) const; virtual void GetChildLists(nsTArray* aLists) const MOZ_OVERRIDE; NS_IMETHOD AppendFrames(ChildListID aListID, nsFrameList& aFrameList) MOZ_OVERRIDE; NS_IMETHOD InsertFrames(ChildListID aListID, nsIFrame* aPrevFrame, nsFrameList& aFrameList) MOZ_OVERRIDE; NS_IMETHOD RemoveFrame(ChildListID aListID, nsIFrame* aOldFrame) MOZ_OVERRIDE; virtual nsIFrame* GetContentInsertionFrame() { return GetFirstPrincipalChild()->GetContentInsertionFrame(); } #ifdef ACCESSIBILITY virtual mozilla::a11y::AccType AccessibleType() MOZ_OVERRIDE; #endif NS_IMETHOD BuildDisplayList(nsDisplayListBuilder* aBuilder, const nsRect& aDirtyRect, const nsDisplayListSet& aLists) MOZ_OVERRIDE; nsresult BuildDisplayListForInnerTable(nsDisplayListBuilder* aBuilder, const nsRect& aDirtyRect, const nsDisplayListSet& aLists); virtual nscoord GetBaseline() const; virtual nscoord GetMinWidth(nsRenderingContext *aRenderingContext) MOZ_OVERRIDE; virtual nscoord GetPrefWidth(nsRenderingContext *aRenderingContext) MOZ_OVERRIDE; virtual nsSize ComputeAutoSize(nsRenderingContext *aRenderingContext, nsSize aCBSize, nscoord aAvailableWidth, nsSize aMargin, nsSize aBorder, nsSize aPadding, bool aShrinkWrap) MOZ_OVERRIDE; /** process a reflow command for the table. * This involves reflowing the caption and the inner table. * @see nsIFrame::Reflow */ NS_IMETHOD Reflow(nsPresContext* aPresContext, nsHTMLReflowMetrics& aDesiredSize, const nsHTMLReflowState& aReflowState, nsReflowStatus& aStatus) MOZ_OVERRIDE; /** * Get the "type" of the frame * * @see nsGkAtoms::tableOuterFrame */ virtual nsIAtom* GetType() const MOZ_OVERRIDE; #ifdef DEBUG NS_IMETHOD GetFrameName(nsAString& aResult) const MOZ_OVERRIDE; #endif virtual nsIFrame* GetParentStyleContextFrame() const MOZ_OVERRIDE; /*---------------- nsITableLayout methods ------------------------*/ /** @see nsITableFrame::GetCellDataAt */ NS_IMETHOD GetCellDataAt(int32_t aRowIndex, int32_t aColIndex, nsIDOMElement* &aCell, //out params int32_t& aStartRowIndex, int32_t& aStartColIndex, int32_t& aRowSpan, int32_t& aColSpan, int32_t& aActualRowSpan, int32_t& aActualColSpan, bool& aIsSelected); /** @see nsITableFrame::GetTableSize */ NS_IMETHOD GetTableSize(int32_t& aRowCount, int32_t& aColCount) MOZ_OVERRIDE; NS_IMETHOD GetIndexByRowAndColumn(int32_t aRow, int32_t aColumn, int32_t *aIndex) MOZ_OVERRIDE; NS_IMETHOD GetRowAndColumnByIndex(int32_t aIndex, int32_t *aRow, int32_t *aColumn) MOZ_OVERRIDE; protected: nsTableOuterFrame(nsStyleContext* aContext); virtual ~nsTableOuterFrame(); void InitChildReflowState(nsPresContext& aPresContext, nsHTMLReflowState& aReflowState); /** Always returns 0, since the outer table frame has no border of its own * The inner table frame can answer this question in a meaningful way. * @see nsContainerFrame::GetSkipSides */ virtual int GetSkipSides() const; uint8_t GetCaptionSide(); // NS_STYLE_CAPTION_SIDE_* or NO_SIDE bool HasSideCaption() { uint8_t captionSide = GetCaptionSide(); return captionSide == NS_STYLE_CAPTION_SIDE_LEFT || captionSide == NS_STYLE_CAPTION_SIDE_RIGHT; } uint8_t GetCaptionVerticalAlign(); void SetDesiredSize(uint8_t aCaptionSide, const nsMargin& aInnerMargin, const nsMargin& aCaptionMargin, nscoord& aWidth, nscoord& aHeight); nsresult GetCaptionOrigin(uint32_t aCaptionSide, const nsSize& aContainBlockSize, const nsSize& aInnerSize, const nsMargin& aInnerMargin, const nsSize& aCaptionSize, nsMargin& aCaptionMargin, nsPoint& aOrigin); nsresult GetInnerOrigin(uint32_t aCaptionSide, const nsSize& aContainBlockSize, const nsSize& aCaptionSize, const nsMargin& aCaptionMargin, const nsSize& aInnerSize, nsMargin& aInnerMargin, nsPoint& aOrigin); // reflow the child (caption or innertable frame) void OuterBeginReflowChild(nsPresContext* aPresContext, nsIFrame* aChildFrame, const nsHTMLReflowState& aOuterRS, void* aChildRSSpace, nscoord aAvailWidth); nsresult OuterDoReflowChild(nsPresContext* aPresContext, nsIFrame* aChildFrame, const nsHTMLReflowState& aChildRS, nsHTMLReflowMetrics& aMetrics, nsReflowStatus& aStatus); // Set the reflow metrics void UpdateReflowMetrics(uint8_t aCaptionSide, nsHTMLReflowMetrics& aMet, const nsMargin& aInnerMargin, const nsMargin& aCaptionMargin); // Get the margin. aMarginNoAuto is aMargin, but with auto // margins set to 0 void GetChildMargin(nsPresContext* aPresContext, const nsHTMLReflowState& aOuterRS, nsIFrame* aChildFrame, nscoord aAvailableWidth, nsMargin& aMargin); nsTableFrame* InnerTableFrame() const { return static_cast(mFrames.FirstChild()); } private: nsFrameList mCaptionFrames; }; inline int nsTableOuterFrame::GetSkipSides() const { return 0; } #endif