/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * 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/ * * 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.org code. * * 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. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * 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"), * 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 MPL, 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 MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef nsTableRowFrame_h__ #define nsTableRowFrame_h__ #include "nscore.h" #include "nsContainerFrame.h" #include "nsTablePainter.h" class nsTableFrame; class nsTableCellFrame; struct nsTableCellReflowState; // This is also used on rows, from nsTableRowGroupFrame.h // #define NS_REPEATED_ROW_OR_ROWGROUP NS_FRAME_STATE_BIT(28) // Indicates whether this row has any cells that have // non-auto-height and rowspan=1 #define NS_ROW_HAS_CELL_WITH_STYLE_HEIGHT NS_FRAME_STATE_BIT(29) #define NS_TABLE_ROW_HAS_UNPAGINATED_HEIGHT NS_FRAME_STATE_BIT(30) /** * nsTableRowFrame is the frame that maps table rows * (HTML tag TR). This class cannot be reused * outside of an nsTableRowGroupFrame. It assumes that its parent is an nsTableRowGroupFrame, * and its children are nsTableCellFrames. * * @see nsTableFrame * @see nsTableRowGroupFrame * @see nsTableCellFrame */ class nsTableRowFrame : public nsContainerFrame { public: NS_DECL_QUERYFRAME_TARGET(nsTableRowFrame) NS_DECL_QUERYFRAME NS_DECL_FRAMEARENA_HELPERS virtual ~nsTableRowFrame(); NS_IMETHOD Init(nsIContent* aContent, nsIFrame* aParent, nsIFrame* aPrevInFlow); /** @see nsIFrame::DidSetStyleContext */ virtual void DidSetStyleContext(nsStyleContext* aOldStyleContext); NS_IMETHOD AppendFrames(ChildListID aListID, nsFrameList& aFrameList); NS_IMETHOD InsertFrames(ChildListID aListID, nsIFrame* aPrevFrame, nsFrameList& aFrameList); NS_IMETHOD RemoveFrame(ChildListID aListID, nsIFrame* aOldFrame); /** instantiate a new instance of nsTableRowFrame. * @param aPresShell the pres shell for this frame * * @return the frame that was created */ friend nsIFrame* NS_NewTableRowFrame(nsIPresShell* aPresShell, nsStyleContext* aContext); virtual nsMargin GetUsedMargin() const; virtual nsMargin GetUsedBorder() const; virtual nsMargin GetUsedPadding() const; NS_IMETHOD BuildDisplayList(nsDisplayListBuilder* aBuilder, const nsRect& aDirtyRect, const nsDisplayListSet& aLists); nsTableCellFrame* GetFirstCell() ; /** calls Reflow for all of its child cells. * Cells with rowspan=1 are all set to the same height and stacked horizontally. *
Cells are not split unless absolutely necessary. *
Cells are resized in nsTableFrame::BalanceColumnWidths
* and nsTableFrame::ShrinkWrapChildren
*
* @param aDesiredSize width set to width of the sum of the cells, height set to
* height of cells with rowspan=1.
*
* @see nsIFrame::Reflow
* @see nsTableFrame::BalanceColumnWidths
* @see nsTableFrame::ShrinkWrapChildren
*/
NS_IMETHOD Reflow(nsPresContext* aPresContext,
nsHTMLReflowMetrics& aDesiredSize,
const nsHTMLReflowState& aReflowState,
nsReflowStatus& aStatus);
void DidResize();
/**
* Get the "type" of the frame
*
* @see nsGkAtoms::tableRowFrame
*/
virtual nsIAtom* GetType() const;
#ifdef DEBUG
NS_IMETHOD GetFrameName(nsAString& aResult) const;
#endif
void UpdateHeight(nscoord aHeight,
nscoord aAscent,
nscoord aDescent,
nsTableFrame* aTableFrame = nsnull,
nsTableCellFrame* aCellFrame = nsnull);
void ResetHeight(nscoord aRowStyleHeight);
// calculate the height, considering content height of the
// cells and the style height of the row and cells, excluding pct heights
nscoord CalcHeight(const nsHTMLReflowState& aReflowState);
// Support for cells with 'vertical-align: baseline'.
/**
* returns the max-ascent amongst all the cells that have
* 'vertical-align: baseline', *including* cells with rowspans.
* returns 0 if we don't have any cell with 'vertical-align: baseline'
*/
nscoord GetMaxCellAscent() const;
/* return the row ascent
*/
nscoord GetRowBaseline();
/** returns the ordinal position of this row in its table */
virtual PRInt32 GetRowIndex() const;
/** set this row's starting row index */
void SetRowIndex (int aRowIndex);
/** used by row group frame code */
nscoord ReflowCellFrame(nsPresContext* aPresContext,
const nsHTMLReflowState& aReflowState,
bool aIsTopOfPage,
nsTableCellFrame* aCellFrame,
nscoord aAvailableHeight,
nsReflowStatus& aStatus);
/**
* Collapse the row if required, apply col and colgroup visibility: collapse
* info to the cells in the row.
* @return he amount to shift up all following rows
* @param aRowOffset - shift the row up by this amount
* @param aWidth - new width of the row
* @param aCollapseGroup - parent rowgroup is collapsed so this row needs
* to be collapsed
* @param aDidCollapse - the row has been collapsed
*/
nscoord CollapseRowIfNecessary(nscoord aRowOffset,
nscoord aWidth,
bool aCollapseGroup,
bool& aDidCollapse);
/**
* Insert a cell frame after the last cell frame that has a col index
* that is less than aColIndex. If no such cell frame is found the
* frame to insert is prepended to the child list.
* @param aFrame the cell frame to insert
* @param aColIndex the col index
*/
void InsertCellFrame(nsTableCellFrame* aFrame,
PRInt32 aColIndex);
nsresult CalculateCellActualHeight(nsTableCellFrame* aCellFrame,
nscoord& aDesiredHeight);
bool IsFirstInserted() const;
void SetFirstInserted(bool aValue);
nscoord GetContentHeight() const;
void SetContentHeight(nscoord aTwipValue);
bool HasStyleHeight() const;
bool HasFixedHeight() const;
void SetHasFixedHeight(bool aValue);
bool HasPctHeight() const;
void SetHasPctHeight(bool aValue);
nscoord GetFixedHeight() const;
void SetFixedHeight(nscoord aValue);
float GetPctHeight() const;
void SetPctHeight(float aPctValue,
bool aForce = false);
nscoord GetHeight(nscoord aBasis = 0) const;
nsTableRowFrame* GetNextRow() const;
bool HasUnpaginatedHeight();
void SetHasUnpaginatedHeight(bool aValue);
nscoord GetUnpaginatedHeight(nsPresContext* aPresContext);
void SetUnpaginatedHeight(nsPresContext* aPresContext, nscoord aValue);
nscoord GetTopBCBorderWidth();
void SetTopBCBorderWidth(BCPixelSize aWidth);
nscoord GetBottomBCBorderWidth();
void SetBottomBCBorderWidth(BCPixelSize aWidth);
nsMargin* GetBCBorderWidth(nsMargin& aBorder);
/**
* Gets inner border widths before collapsing with cell borders
* Caller must get bottom border from next row or from table
* GetContinuousBCBorderWidth will not overwrite aBorder.bottom
* see nsTablePainter about continuous borders
*/
void GetContinuousBCBorderWidth(nsMargin& aBorder);
/**
* @returns outer top bc border == prev row's bottom inner
*/
nscoord GetOuterTopContBCBorderWidth();
/**
* Sets full border widths before collapsing with cell borders
* @param aForSide - side to set; only accepts right, left, and top
*/
void SetContinuousBCBorderWidth(PRUint8 aForSide,
BCPixelSize aPixelValue);
#ifdef ACCESSIBILITY
virtual already_AddRefed