2001-09-28 20:14:13 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 11:12:37 +00:00
|
|
|
/* 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/. */
|
1998-04-13 20:24:54 +00:00
|
|
|
#ifndef nsTableFrame_h__
|
|
|
|
#define nsTableFrame_h__
|
|
|
|
|
2013-05-14 16:33:23 +00:00
|
|
|
#include "mozilla/Attributes.h"
|
2012-08-08 13:05:17 +00:00
|
|
|
#include "celldata.h"
|
1998-04-13 20:24:54 +00:00
|
|
|
#include "nscore.h"
|
2011-12-27 20:18:48 +00:00
|
|
|
#include "nsContainerFrame.h"
|
1998-06-05 06:09:09 +00:00
|
|
|
#include "nsStyleCoord.h"
|
1998-10-11 09:18:27 +00:00
|
|
|
#include "nsStyleConsts.h"
|
1999-12-14 00:24:33 +00:00
|
|
|
#include "nsTableColFrame.h"
|
|
|
|
#include "nsTableColGroupFrame.h"
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
#include "nsCellMap.h"
|
2007-01-30 00:06:41 +00:00
|
|
|
#include "nsGkAtoms.h"
|
2008-04-06 11:34:14 +00:00
|
|
|
#include "nsDisplayList.h"
|
1998-04-13 20:24:54 +00:00
|
|
|
|
|
|
|
class nsTableCellFrame;
|
2012-08-08 13:05:17 +00:00
|
|
|
class nsTableCellMap;
|
1998-06-05 02:36:25 +00:00
|
|
|
class nsTableColFrame;
|
2012-08-08 13:05:17 +00:00
|
|
|
class nsColGroupFrame;
|
1998-07-01 22:22:28 +00:00
|
|
|
class nsTableRowGroupFrame;
|
1998-06-17 16:38:24 +00:00
|
|
|
class nsTableRowFrame;
|
1998-10-14 22:51:50 +00:00
|
|
|
class nsTableColGroupFrame;
|
1998-04-30 17:57:09 +00:00
|
|
|
class nsITableLayoutStrategy;
|
2003-02-22 00:32:13 +00:00
|
|
|
class nsStyleContext;
|
1999-10-28 04:09:39 +00:00
|
|
|
|
2001-03-13 06:38:59 +00:00
|
|
|
struct nsTableReflowState;
|
1998-04-25 18:48:48 +00:00
|
|
|
struct nsStylePosition;
|
2011-10-27 13:58:44 +00:00
|
|
|
struct BCPropertyData;
|
1998-04-13 20:24:54 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
static inline bool IS_TABLE_CELL(nsIAtom* frameType) {
|
2007-01-30 00:06:41 +00:00
|
|
|
return nsGkAtoms::tableCellFrame == frameType ||
|
|
|
|
nsGkAtoms::bcTableCellFrame == frameType;
|
|
|
|
}
|
|
|
|
|
2012-08-29 05:39:31 +00:00
|
|
|
static inline bool FrameHasBorderOrBackground(nsIFrame* f) {
|
2013-02-16 21:51:02 +00:00
|
|
|
return (f->StyleVisibility()->IsVisible() &&
|
|
|
|
(!f->StyleBackground()->IsTransparent() ||
|
|
|
|
f->StyleDisplay()->mAppearance ||
|
|
|
|
f->StyleBorder()->HasBorder()));
|
2012-08-29 05:39:31 +00:00
|
|
|
}
|
|
|
|
|
2008-04-06 11:34:14 +00:00
|
|
|
class nsDisplayTableItem : public nsDisplayItem
|
|
|
|
{
|
|
|
|
public:
|
2010-08-13 10:01:13 +00:00
|
|
|
nsDisplayTableItem(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame) :
|
|
|
|
nsDisplayItem(aBuilder, aFrame),
|
2011-10-17 14:59:28 +00:00
|
|
|
mPartHasFixedBackground(false) {}
|
2008-04-06 11:34:14 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
virtual bool IsVaryingRelativeToMovingFrame(nsDisplayListBuilder* aBuilder,
|
2013-05-14 16:33:23 +00:00
|
|
|
nsIFrame* aFrame) MOZ_OVERRIDE;
|
2008-04-06 11:34:14 +00:00
|
|
|
// With collapsed borders, parts of the collapsed border can extend outside
|
|
|
|
// the table part frames, so allow this display element to blow out to our
|
|
|
|
// overflow rect. This is also useful for row frames that have spanning
|
|
|
|
// cells extending outside them.
|
2013-05-14 16:33:23 +00:00
|
|
|
virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder, bool* aSnap) MOZ_OVERRIDE;
|
2008-04-06 11:34:14 +00:00
|
|
|
|
|
|
|
void UpdateForFrameBackground(nsIFrame* aFrame);
|
|
|
|
|
|
|
|
private:
|
2011-09-29 06:19:26 +00:00
|
|
|
bool mPartHasFixedBackground;
|
2008-04-06 11:34:14 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class nsAutoPushCurrentTableItem
|
|
|
|
{
|
|
|
|
public:
|
2012-07-30 14:20:58 +00:00
|
|
|
nsAutoPushCurrentTableItem() : mBuilder(nullptr) {}
|
2008-04-06 11:34:14 +00:00
|
|
|
|
|
|
|
void Push(nsDisplayListBuilder* aBuilder, nsDisplayTableItem* aPushItem)
|
|
|
|
{
|
|
|
|
mBuilder = aBuilder;
|
|
|
|
mOldCurrentItem = aBuilder->GetCurrentTableItem();
|
|
|
|
aBuilder->SetCurrentTableItem(aPushItem);
|
|
|
|
#ifdef DEBUG
|
|
|
|
mPushedItem = aPushItem;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
~nsAutoPushCurrentTableItem() {
|
|
|
|
if (!mBuilder)
|
|
|
|
return;
|
|
|
|
#ifdef DEBUG
|
|
|
|
NS_ASSERTION(mBuilder->GetCurrentTableItem() == mPushedItem,
|
|
|
|
"Someone messed with the current table item behind our back!");
|
|
|
|
#endif
|
|
|
|
mBuilder->SetCurrentTableItem(mOldCurrentItem);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
nsDisplayListBuilder* mBuilder;
|
|
|
|
nsDisplayTableItem* mOldCurrentItem;
|
|
|
|
#ifdef DEBUG
|
|
|
|
nsDisplayTableItem* mPushedItem;
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
1998-07-06 21:00:11 +00:00
|
|
|
/* ============================================================================ */
|
|
|
|
|
2011-08-24 20:54:30 +00:00
|
|
|
/**
|
|
|
|
* nsTableFrame maps the inner portion of a table (everything except captions.)
|
1998-12-04 03:14:28 +00:00
|
|
|
* Used as a pseudo-frame within nsTableOuterFrame, it may also be used
|
|
|
|
* stand-alone as the top-level frame.
|
|
|
|
*
|
2011-08-24 20:54:30 +00:00
|
|
|
* The principal child list contains row group frames. There is also an
|
|
|
|
* additional child list, kColGroupList, which contains the col group frames.
|
1998-04-13 20:24:54 +00:00
|
|
|
*/
|
2012-08-08 13:05:17 +00:00
|
|
|
class nsTableFrame : public nsContainerFrame
|
1998-04-13 20:24:54 +00:00
|
|
|
{
|
|
|
|
public:
|
2009-09-12 16:49:24 +00:00
|
|
|
NS_DECL_FRAMEARENA_HELPERS
|
1999-07-31 22:11:50 +00:00
|
|
|
|
2014-03-10 22:41:17 +00:00
|
|
|
static void DestroyPositionedTablePartArray(void* aPropertyValue);
|
|
|
|
NS_DECLARE_FRAME_PROPERTY(PositionedTablePartArray, DestroyPositionedTablePartArray)
|
|
|
|
|
1998-04-14 21:45:28 +00:00
|
|
|
/** nsTableOuterFrame has intimate knowledge of the inner table frame */
|
1998-04-13 20:24:54 +00:00
|
|
|
friend class nsTableOuterFrame;
|
|
|
|
|
2005-11-04 02:38:33 +00:00
|
|
|
/** instantiate a new instance of nsTableRowFrame.
|
|
|
|
* @param aPresShell the pres shell for this frame
|
1998-04-14 21:45:28 +00:00
|
|
|
*
|
2005-11-04 02:38:33 +00:00
|
|
|
* @return the frame that was created
|
1998-04-14 21:45:28 +00:00
|
|
|
*/
|
2014-05-24 22:20:40 +00:00
|
|
|
friend nsTableFrame* NS_NewTableFrame(nsIPresShell* aPresShell,
|
|
|
|
nsStyleContext* aContext);
|
1998-04-13 20:24:54 +00:00
|
|
|
|
1999-01-27 19:29:24 +00:00
|
|
|
/** sets defaults for table-specific style.
|
|
|
|
* @see nsIFrame::Init
|
|
|
|
*/
|
2014-05-24 22:20:40 +00:00
|
|
|
virtual void Init(nsIContent* aContent,
|
|
|
|
nsContainerFrame* aParent,
|
|
|
|
nsIFrame* aPrevInFlow) MOZ_OVERRIDE;
|
1998-12-05 05:27:21 +00:00
|
|
|
|
2004-07-31 23:15:21 +00:00
|
|
|
static float GetTwipsToPixels(nsPresContext* aPresContext);
|
2002-02-19 15:48:28 +00:00
|
|
|
|
2007-06-25 20:34:35 +00:00
|
|
|
// Return true if aParentReflowState.frame or any of its ancestors within
|
|
|
|
// the containing table have non-auto height. (e.g. pct or fixed height)
|
2011-09-29 06:19:26 +00:00
|
|
|
static bool AncestorsHaveStyleHeight(const nsHTMLReflowState& aParentReflowState);
|
2007-06-25 20:34:35 +00:00
|
|
|
|
2002-04-01 06:46:17 +00:00
|
|
|
// See if a special height reflow will occur due to having a pct height when
|
|
|
|
// the pct height basis may not yet be valid.
|
|
|
|
static void CheckRequestSpecialHeightReflow(const nsHTMLReflowState& aReflowState);
|
|
|
|
|
|
|
|
// Notify the frame and its ancestors (up to the containing table) that a special
|
|
|
|
// height reflow will occur.
|
|
|
|
static void RequestSpecialHeightReflow(const nsHTMLReflowState& aReflowState);
|
|
|
|
|
2004-12-27 15:05:18 +00:00
|
|
|
static void RePositionViews(nsIFrame* aFrame);
|
2001-03-13 06:38:59 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
static bool PageBreakAfter(nsIFrame* aSourceFrame,
|
2002-03-17 21:35:08 +00:00
|
|
|
nsIFrame* aNextFrame);
|
2014-03-10 22:41:17 +00:00
|
|
|
|
|
|
|
// Register a positioned table part with its nsTableFrame. These objects will
|
|
|
|
// be visited by FixupPositionedTableParts after reflow is complete. (See that
|
|
|
|
// function for more explanation.) Should be called during frame construction.
|
|
|
|
static void RegisterPositionedTablePart(nsIFrame* aFrame);
|
|
|
|
|
|
|
|
// Unregister a positioned table part with its nsTableFrame.
|
|
|
|
static void UnregisterPositionedTablePart(nsIFrame* aFrame,
|
|
|
|
nsIFrame* aDestructRoot);
|
2002-03-17 21:35:08 +00:00
|
|
|
|
2001-03-13 06:38:59 +00:00
|
|
|
nsPoint GetFirstSectionOrigin(const nsHTMLReflowState& aReflowState) const;
|
2000-01-04 05:31:56 +00:00
|
|
|
/*
|
|
|
|
* Notification that aAttribute has changed for content inside a table (cell, row, etc)
|
|
|
|
*/
|
2005-02-07 01:58:25 +00:00
|
|
|
void AttributeChangedFor(nsIFrame* aFrame,
|
2000-01-04 05:31:56 +00:00
|
|
|
nsIContent* aContent,
|
|
|
|
nsIAtom* aAttribute);
|
|
|
|
|
2009-12-24 05:21:15 +00:00
|
|
|
/** @see nsIFrame::DestroyFrom */
|
2013-05-14 16:33:23 +00:00
|
|
|
virtual void DestroyFrom(nsIFrame* aDestructRoot) MOZ_OVERRIDE;
|
2008-10-18 17:25:26 +00:00
|
|
|
|
|
|
|
/** @see nsIFrame::DidSetStyleContext */
|
2013-05-14 16:33:23 +00:00
|
|
|
virtual void DidSetStyleContext(nsStyleContext* aOldStyleContext) MOZ_OVERRIDE;
|
1998-12-04 03:14:28 +00:00
|
|
|
|
2014-05-28 19:36:58 +00:00
|
|
|
virtual void SetInitialChildList(ChildListID aListID,
|
|
|
|
nsFrameList& aChildList) MOZ_OVERRIDE;
|
2014-05-28 19:36:58 +00:00
|
|
|
virtual void AppendFrames(ChildListID aListID,
|
2014-05-28 19:36:58 +00:00
|
|
|
nsFrameList& aFrameList) MOZ_OVERRIDE;
|
2014-05-28 19:36:58 +00:00
|
|
|
virtual void InsertFrames(ChildListID aListID,
|
2014-05-28 19:36:58 +00:00
|
|
|
nsIFrame* aPrevFrame,
|
|
|
|
nsFrameList& aFrameList) MOZ_OVERRIDE;
|
2014-05-28 19:36:58 +00:00
|
|
|
virtual void RemoveFrame(ChildListID aListID,
|
2014-05-28 19:36:58 +00:00
|
|
|
nsIFrame* aOldFrame) MOZ_OVERRIDE;
|
1999-08-19 03:51:25 +00:00
|
|
|
|
2013-05-14 16:33:23 +00:00
|
|
|
virtual nsMargin GetUsedBorder() const MOZ_OVERRIDE;
|
|
|
|
virtual nsMargin GetUsedPadding() const MOZ_OVERRIDE;
|
|
|
|
virtual nsMargin GetUsedMargin() const MOZ_OVERRIDE;
|
2006-12-13 23:04:57 +00:00
|
|
|
|
2002-02-19 15:48:28 +00:00
|
|
|
// Get the offset from the border box to the area where the row groups fit
|
2003-12-28 17:02:40 +00:00
|
|
|
nsMargin GetChildAreaOffset(const nsHTMLReflowState* aReflowState) const;
|
2002-02-19 15:48:28 +00:00
|
|
|
|
1998-09-24 16:37:22 +00:00
|
|
|
/** helper method to find the table parent of any table frame object */
|
2006-03-04 05:26:57 +00:00
|
|
|
static nsTableFrame* GetTableFrame(nsIFrame* aSourceFrame);
|
2006-01-26 02:29:17 +00:00
|
|
|
|
2014-03-10 22:41:17 +00:00
|
|
|
/* Like GetTableFrame, but will return nullptr if we don't pass through
|
|
|
|
* aMustPassThrough on the way to the table.
|
|
|
|
*/
|
|
|
|
static nsTableFrame* GetTableFramePassingThrough(nsIFrame* aMustPassThrough,
|
|
|
|
nsIFrame* aSourceFrame);
|
|
|
|
|
2013-02-14 11:12:27 +00:00
|
|
|
typedef void (* DisplayGenericTablePartTraversal)
|
2006-09-22 01:56:04 +00:00
|
|
|
(nsDisplayListBuilder* aBuilder, nsFrame* aFrame,
|
|
|
|
const nsRect& aDirtyRect, const nsDisplayListSet& aLists);
|
2013-02-14 11:12:27 +00:00
|
|
|
static void GenericTraversal(nsDisplayListBuilder* aBuilder, nsFrame* aFrame,
|
|
|
|
const nsRect& aDirtyRect, const nsDisplayListSet& aLists);
|
2006-09-22 01:56:04 +00:00
|
|
|
|
2006-01-26 02:29:17 +00:00
|
|
|
/**
|
|
|
|
* Helper method to handle display common to table frames, rowgroup frames
|
|
|
|
* and row frames. It creates a background display item for handling events
|
|
|
|
* if necessary, an outline display item if necessary, and displays
|
|
|
|
* all the the frame's children.
|
2008-04-06 11:34:14 +00:00
|
|
|
* @param aDisplayItem the display item created for this part, or null
|
|
|
|
* if this part's border/background painting is delegated to an ancestor
|
2006-09-22 01:56:04 +00:00
|
|
|
* @param aTraversal a function that gets called to traverse the table
|
|
|
|
* part's child frames and add their display list items to a
|
|
|
|
* display list set.
|
2006-01-26 02:29:17 +00:00
|
|
|
*/
|
2013-02-14 11:12:27 +00:00
|
|
|
static void DisplayGenericTablePart(nsDisplayListBuilder* aBuilder,
|
|
|
|
nsFrame* aFrame,
|
|
|
|
const nsRect& aDirtyRect,
|
|
|
|
const nsDisplayListSet& aLists,
|
|
|
|
nsDisplayTableItem* aDisplayItem,
|
|
|
|
DisplayGenericTablePartTraversal aTraversal = GenericTraversal);
|
1999-12-13 22:56:31 +00:00
|
|
|
|
|
|
|
// Return the closest sibling of aPriorChildFrame (including aPriroChildFrame)
|
|
|
|
// of type aChildType.
|
2004-01-18 10:28:40 +00:00
|
|
|
static nsIFrame* GetFrameAtOrBefore(nsIFrame* aParentFrame,
|
2000-01-22 01:16:50 +00:00
|
|
|
nsIFrame* aPriorChildFrame,
|
|
|
|
nsIAtom* aChildType);
|
2011-09-29 06:19:26 +00:00
|
|
|
bool IsAutoHeight();
|
1998-10-11 09:18:27 +00:00
|
|
|
|
2011-10-17 14:59:28 +00:00
|
|
|
/** @return true if aDisplayType represents a rowgroup of any sort
|
1998-10-11 09:18:27 +00:00
|
|
|
* (header, footer, or body)
|
|
|
|
*/
|
2012-08-22 15:56:38 +00:00
|
|
|
bool IsRowGroup(int32_t aDisplayType) const;
|
1998-06-05 02:36:25 +00:00
|
|
|
|
2013-05-14 16:33:23 +00:00
|
|
|
virtual const nsFrameList& GetChildList(ChildListID aListID) const MOZ_OVERRIDE;
|
|
|
|
virtual void GetChildLists(nsTArray<ChildList>* aLists) const MOZ_OVERRIDE;
|
1998-12-03 18:01:35 +00:00
|
|
|
|
2013-02-14 11:12:27 +00:00
|
|
|
virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
|
|
|
const nsRect& aDirtyRect,
|
|
|
|
const nsDisplayListSet& aLists) MOZ_OVERRIDE;
|
1998-04-13 20:24:54 +00:00
|
|
|
|
2006-01-26 02:29:17 +00:00
|
|
|
/**
|
|
|
|
* Paint the background of the table and its parts (column groups,
|
|
|
|
* columns, row groups, rows, and cells), and the table border, and all
|
|
|
|
* internal borders if border-collapse is on.
|
|
|
|
*/
|
2011-04-08 01:04:40 +00:00
|
|
|
void PaintTableBorderBackground(nsRenderingContext& aRenderingContext,
|
2006-01-26 02:29:17 +00:00
|
|
|
const nsRect& aDirtyRect,
|
2012-08-22 15:56:38 +00:00
|
|
|
nsPoint aPt, uint32_t aBGPaintFlags);
|
2002-02-26 00:27:42 +00:00
|
|
|
|
2013-06-26 16:43:26 +00:00
|
|
|
/**
|
|
|
|
* Determines if any table part has a background image that is currently not
|
|
|
|
* decoded. Does not look into cell contents (ie only table parts).
|
|
|
|
*/
|
|
|
|
static bool AnyTablePartHasUndecodedBackgroundImage(nsIFrame* aStart,
|
|
|
|
nsIFrame* aEnd);
|
|
|
|
|
2009-02-08 16:46:42 +00:00
|
|
|
/** Get the outer half (i.e., the part outside the height and width of
|
|
|
|
* the table) of the largest segment (?) of border-collapsed border on
|
|
|
|
* the table on each side, or 0 for non border-collapsed tables.
|
|
|
|
*/
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
nsMargin GetOuterBCBorder() const;
|
|
|
|
|
2009-02-08 16:46:42 +00:00
|
|
|
/** Same as above, but only if it's included from the border-box width
|
|
|
|
* of the table.
|
|
|
|
*/
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
nsMargin GetIncludedOuterBCBorder() const;
|
2003-09-13 16:26:30 +00:00
|
|
|
|
2009-02-08 16:46:42 +00:00
|
|
|
/** Same as above, but only if it's excluded from the border-box width
|
|
|
|
* of the table. This is the area that leaks out into the margin
|
|
|
|
* (or potentially past it, if there is no margin).
|
|
|
|
*/
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
nsMargin GetExcludedOuterBCBorder() const;
|
2002-02-19 15:48:28 +00:00
|
|
|
|
2009-07-22 00:44:52 +00:00
|
|
|
/**
|
|
|
|
* In quirks mode, the size of the table background is reduced
|
|
|
|
* by the outer BC border. Compute the reduction needed.
|
|
|
|
*/
|
|
|
|
nsMargin GetDeflationForBackground(nsPresContext* aPresContext) const;
|
|
|
|
|
2004-03-09 06:48:35 +00:00
|
|
|
/** Get width of table + colgroup + col collapse: elements that
|
|
|
|
* continue along the length of the whole left side.
|
|
|
|
* see nsTablePainter about continuous borders
|
|
|
|
*/
|
2007-02-07 07:46:44 +00:00
|
|
|
nscoord GetContinuousLeftBCBorderWidth() const;
|
2009-06-21 16:31:40 +00:00
|
|
|
void SetContinuousLeftBCBorderWidth(nscoord aValue);
|
|
|
|
|
2008-10-26 10:11:34 +00:00
|
|
|
friend class nsDelayedCalcBCBorders;
|
|
|
|
|
2012-01-22 22:48:34 +00:00
|
|
|
void AddBCDamageArea(const nsIntRect& aValue);
|
2011-09-29 06:19:26 +00:00
|
|
|
bool BCRecalcNeeded(nsStyleContext* aOldStyleContext,
|
2008-10-26 10:11:34 +00:00
|
|
|
nsStyleContext* aNewStyleContext);
|
2011-04-08 01:04:40 +00:00
|
|
|
void PaintBCBorders(nsRenderingContext& aRenderingContext,
|
2002-02-19 15:48:28 +00:00
|
|
|
const nsRect& aDirtyRect);
|
|
|
|
|
2013-05-14 16:33:23 +00:00
|
|
|
virtual void MarkIntrinsicWidthsDirty() MOZ_OVERRIDE;
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
// For border-collapse tables, the caller must not add padding and
|
|
|
|
// border to the results of these functions.
|
2013-05-14 16:33:23 +00:00
|
|
|
virtual nscoord GetMinWidth(nsRenderingContext *aRenderingContext) MOZ_OVERRIDE;
|
|
|
|
virtual nscoord GetPrefWidth(nsRenderingContext *aRenderingContext) MOZ_OVERRIDE;
|
2006-12-17 14:06:42 +00:00
|
|
|
virtual IntrinsicWidthOffsetData
|
2013-05-14 16:33:23 +00:00
|
|
|
IntrinsicWidthOffsets(nsRenderingContext* aRenderingContext) MOZ_OVERRIDE;
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
|
2011-04-08 01:04:40 +00:00
|
|
|
virtual nsSize ComputeSize(nsRenderingContext *aRenderingContext,
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
nsSize aCBSize, nscoord aAvailableWidth,
|
|
|
|
nsSize aMargin, nsSize aBorder, nsSize aPadding,
|
2012-08-22 15:56:38 +00:00
|
|
|
uint32_t aFlags) MOZ_OVERRIDE;
|
2011-04-08 01:04:40 +00:00
|
|
|
virtual nsSize ComputeAutoSize(nsRenderingContext *aRenderingContext,
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
nsSize aCBSize, nscoord aAvailableWidth,
|
|
|
|
nsSize aMargin, nsSize aBorder,
|
2013-05-14 16:33:23 +00:00
|
|
|
nsSize aPadding, bool aShrinkWrap) MOZ_OVERRIDE;
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
/**
|
|
|
|
* A copy of nsFrame::ShrinkWidthToFit that calls a different
|
|
|
|
* GetPrefWidth, since tables have two different ones.
|
|
|
|
*/
|
2011-04-08 01:04:40 +00:00
|
|
|
nscoord TableShrinkWidthToFit(nsRenderingContext *aRenderingContext,
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
nscoord aWidthInCB);
|
|
|
|
|
|
|
|
// XXXldb REWRITE THIS COMMENT!
|
1998-04-14 21:45:28 +00:00
|
|
|
/** inner tables are reflowed in two steps.
|
|
|
|
* <pre>
|
|
|
|
* if mFirstPassValid is false, this is our first time through since content was last changed
|
|
|
|
* set pass to 1
|
|
|
|
* do pass 1
|
|
|
|
* get min/max info for all cells in an infinite space
|
|
|
|
* do column balancing
|
|
|
|
* set mFirstPassValid to true
|
|
|
|
* do pass 2
|
1998-05-25 17:31:49 +00:00
|
|
|
* use column widths to Reflow cells
|
1998-04-14 21:45:28 +00:00
|
|
|
* </pre>
|
|
|
|
*
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
* @see nsIFrame::Reflow
|
1998-04-14 21:45:28 +00:00
|
|
|
*/
|
2014-05-13 00:47:52 +00:00
|
|
|
virtual void Reflow(nsPresContext* aPresContext,
|
|
|
|
nsHTMLReflowMetrics& aDesiredSize,
|
|
|
|
const nsHTMLReflowState& aReflowState,
|
|
|
|
nsReflowStatus& aStatus) MOZ_OVERRIDE;
|
1998-04-13 20:24:54 +00:00
|
|
|
|
2014-05-13 00:47:53 +00:00
|
|
|
void ReflowTable(nsHTMLReflowMetrics& aDesiredSize,
|
|
|
|
const nsHTMLReflowState& aReflowState,
|
|
|
|
nscoord aAvailHeight,
|
|
|
|
nsIFrame*& aLastChildReflowed,
|
|
|
|
nsReflowStatus& aStatus);
|
2001-08-08 01:13:35 +00:00
|
|
|
|
1999-12-13 22:56:31 +00:00
|
|
|
nsFrameList& GetColGroups();
|
|
|
|
|
2013-05-14 16:33:23 +00:00
|
|
|
virtual nsIFrame* GetParentStyleContextFrame() const MOZ_OVERRIDE;
|
2002-03-27 02:38:13 +00:00
|
|
|
|
1999-02-24 05:54:31 +00:00
|
|
|
/**
|
|
|
|
* Get the "type" of the frame
|
|
|
|
*
|
2007-01-30 00:06:41 +00:00
|
|
|
* @see nsGkAtoms::tableFrame
|
1999-02-24 05:54:31 +00:00
|
|
|
*/
|
2013-05-14 16:33:23 +00:00
|
|
|
virtual nsIAtom* GetType() const MOZ_OVERRIDE;
|
1998-12-23 15:47:43 +00:00
|
|
|
|
2013-05-14 16:33:23 +00:00
|
|
|
virtual bool IsFrameOfType(uint32_t aFlags) const MOZ_OVERRIDE
|
2012-12-04 04:50:05 +00:00
|
|
|
{
|
|
|
|
if (aFlags & eSupportsCSSTransforms) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return nsContainerFrame::IsFrameOfType(aFlags);
|
|
|
|
}
|
|
|
|
|
2014-01-05 23:31:14 +00:00
|
|
|
#ifdef DEBUG_FRAME_DUMP
|
1999-01-27 19:29:24 +00:00
|
|
|
/** @see nsIFrame::GetFrameName */
|
2014-02-18 07:47:48 +00:00
|
|
|
virtual nsresult GetFrameName(nsAString& aResult) const MOZ_OVERRIDE;
|
1999-09-01 01:02:16 +00:00
|
|
|
#endif
|
1999-08-31 03:09:40 +00:00
|
|
|
|
1998-04-14 21:45:28 +00:00
|
|
|
/** return the width of the column at aColIndex */
|
2013-02-03 21:54:07 +00:00
|
|
|
int32_t GetColumnWidth(int32_t aColIndex);
|
1998-04-13 20:24:54 +00:00
|
|
|
|
2014-06-16 11:08:53 +00:00
|
|
|
/** helper to get the cell spacing X style value */
|
2014-06-14 22:53:00 +00:00
|
|
|
nscoord GetCellSpacingX();
|
|
|
|
|
2014-06-16 11:08:53 +00:00
|
|
|
/** helper to get the cell spacing Y style value */
|
|
|
|
nscoord GetCellSpacingY();
|
|
|
|
|
2013-02-12 01:52:55 +00:00
|
|
|
virtual nscoord GetBaseline() const MOZ_OVERRIDE;
|
1998-06-24 19:13:19 +00:00
|
|
|
/** return the row span of a cell, taking into account row span magic at the bottom
|
2000-02-01 03:23:29 +00:00
|
|
|
* of a table. The row span equals the number of rows spanned by aCell starting at
|
|
|
|
* aStartRowIndex, and can be smaller if aStartRowIndex is greater than the row
|
|
|
|
* index in which aCell originates.
|
1998-07-16 23:23:31 +00:00
|
|
|
*
|
2000-02-01 03:23:29 +00:00
|
|
|
* @param aStartRowIndex the cell
|
|
|
|
* @param aCell the cell
|
1998-07-16 23:23:31 +00:00
|
|
|
*
|
1998-06-24 19:13:19 +00:00
|
|
|
* @return the row span, correcting for row spans that extend beyond the bottom
|
|
|
|
* of the table.
|
|
|
|
*/
|
2013-02-03 21:54:07 +00:00
|
|
|
int32_t GetEffectiveRowSpan(int32_t aStartRowIndex,
|
|
|
|
const nsTableCellFrame& aCell) const;
|
|
|
|
int32_t GetEffectiveRowSpan(const nsTableCellFrame& aCell,
|
|
|
|
nsCellMap* aCellMap = nullptr);
|
1998-06-24 19:13:19 +00:00
|
|
|
|
1998-07-16 23:23:31 +00:00
|
|
|
/** return the col span of a cell, taking into account col span magic at the edge
|
|
|
|
* of a table.
|
|
|
|
*
|
|
|
|
* @param aCell the cell
|
|
|
|
*
|
|
|
|
* @return the col span, correcting for col spans that extend beyond the edge
|
|
|
|
* of the table.
|
|
|
|
*/
|
2013-02-03 21:54:07 +00:00
|
|
|
int32_t GetEffectiveColSpan(const nsTableCellFrame& aCell,
|
|
|
|
nsCellMap* aCellMap = nullptr) const;
|
1998-07-16 23:23:31 +00:00
|
|
|
|
2004-04-13 06:21:16 +00:00
|
|
|
/** indicate whether the row has more than one cell that either originates
|
|
|
|
* or is spanned from the rows above
|
|
|
|
*/
|
2012-08-22 15:56:38 +00:00
|
|
|
bool HasMoreThanOneCell(int32_t aRowIndex) const;
|
2004-04-13 06:21:16 +00:00
|
|
|
|
2004-05-03 18:31:34 +00:00
|
|
|
/** return the column frame associated with aColIndex
|
2012-07-30 14:20:58 +00:00
|
|
|
* returns nullptr if the col frame has not yet been allocated, or if
|
2004-05-03 18:31:34 +00:00
|
|
|
* aColIndex is out of range
|
|
|
|
*/
|
2012-08-22 15:56:38 +00:00
|
|
|
nsTableColFrame* GetColFrame(int32_t aColIndex) const;
|
1999-12-13 22:56:31 +00:00
|
|
|
|
2004-05-03 18:31:34 +00:00
|
|
|
/** Insert a col frame reference into the colframe cache and adapt the cellmap
|
|
|
|
* @param aColFrame - the column frame
|
|
|
|
* @param aColIndex - index where the column should be inserted into the
|
|
|
|
* colframe cache
|
|
|
|
*/
|
2005-02-07 01:58:25 +00:00
|
|
|
void InsertCol(nsTableColFrame& aColFrame,
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t aColIndex);
|
1999-12-13 22:56:31 +00:00
|
|
|
|
2005-02-07 01:58:25 +00:00
|
|
|
nsTableColGroupFrame* CreateAnonymousColGroupFrame(nsTableColGroupType aType);
|
1999-12-13 22:56:31 +00:00
|
|
|
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t DestroyAnonymousColFrames(int32_t aNumFrames);
|
1999-12-13 22:56:31 +00:00
|
|
|
|
2009-07-28 12:53:18 +00:00
|
|
|
// Append aNumColsToAdd anonymous col frames of type eColAnonymousCell to our
|
|
|
|
// last eColGroupAnonymousCell colgroup. If we have no such colgroup, then
|
|
|
|
// create one.
|
2012-08-22 15:56:38 +00:00
|
|
|
void AppendAnonymousColFrames(int32_t aNumColsToAdd);
|
1999-12-13 22:56:31 +00:00
|
|
|
|
2009-07-28 12:53:18 +00:00
|
|
|
// Append aNumColsToAdd anonymous col frames of type aColType to
|
|
|
|
// aColGroupFrame. If aAddToTable is true, also call AddColsToTable on the
|
|
|
|
// new cols.
|
|
|
|
void AppendAnonymousColFrames(nsTableColGroupFrame* aColGroupFrame,
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t aNumColsToAdd,
|
1999-12-13 22:56:31 +00:00
|
|
|
nsTableColType aColType,
|
2011-09-29 06:19:26 +00:00
|
|
|
bool aAddToTable);
|
1999-12-13 22:56:31 +00:00
|
|
|
|
2006-08-28 17:39:36 +00:00
|
|
|
void MatchCellMapToColCache(nsTableCellMap* aCellMap);
|
1999-12-13 22:56:31 +00:00
|
|
|
/** empty the column frame cache */
|
|
|
|
void ClearColCache();
|
|
|
|
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
void DidResizeColumns();
|
|
|
|
|
2013-02-03 21:54:07 +00:00
|
|
|
void AppendCell(nsTableCellFrame& aCellFrame,
|
|
|
|
int32_t aRowIndex);
|
1999-12-13 22:56:31 +00:00
|
|
|
|
2013-02-03 21:54:07 +00:00
|
|
|
void InsertCells(nsTArray<nsTableCellFrame*>& aCellFrames,
|
|
|
|
int32_t aRowIndex,
|
|
|
|
int32_t aColIndexBefore);
|
1999-12-13 22:56:31 +00:00
|
|
|
|
2013-02-03 21:54:07 +00:00
|
|
|
void RemoveCell(nsTableCellFrame* aCellFrame,
|
|
|
|
int32_t aRowIndex);
|
1999-12-13 22:56:31 +00:00
|
|
|
|
2010-01-16 16:05:46 +00:00
|
|
|
void AppendRows(nsTableRowGroupFrame* aRowGroupFrame,
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t aRowIndex,
|
2009-02-05 09:09:50 +00:00
|
|
|
nsTArray<nsTableRowFrame*>& aRowFrames);
|
1999-12-13 22:56:31 +00:00
|
|
|
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t InsertRows(nsTableRowGroupFrame* aRowGroupFrame,
|
2009-02-05 09:09:50 +00:00
|
|
|
nsTArray<nsTableRowFrame*>& aFrames,
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t aRowIndex,
|
2011-09-29 06:19:26 +00:00
|
|
|
bool aConsiderSpans);
|
1999-12-13 22:56:31 +00:00
|
|
|
|
2013-02-03 21:54:07 +00:00
|
|
|
void RemoveRows(nsTableRowFrame& aFirstRowFrame,
|
|
|
|
int32_t aNumRowsToRemove,
|
|
|
|
bool aConsiderSpans);
|
1999-12-13 22:56:31 +00:00
|
|
|
|
2006-08-04 19:15:50 +00:00
|
|
|
/** Insert multiple rowgroups into the table cellmap handling
|
2009-07-30 17:23:32 +00:00
|
|
|
* @param aRowGroups - iterator that iterates over the rowgroups to insert
|
2006-08-04 19:15:50 +00:00
|
|
|
*/
|
2009-07-30 17:23:32 +00:00
|
|
|
void InsertRowGroups(const nsFrameList::Slice& aRowGroups);
|
1999-12-13 22:56:31 +00:00
|
|
|
|
2012-08-22 15:56:38 +00:00
|
|
|
void InsertColGroups(int32_t aStartColIndex,
|
2009-07-30 17:23:32 +00:00
|
|
|
const nsFrameList::Slice& aColgroups);
|
1999-12-13 22:56:31 +00:00
|
|
|
|
2013-02-03 21:54:07 +00:00
|
|
|
void RemoveCol(nsTableColGroupFrame* aColGroupFrame,
|
|
|
|
int32_t aColIndex,
|
|
|
|
bool aRemoveFromCache,
|
|
|
|
bool aRemoveFromCellMap);
|
1998-08-31 21:23:28 +00:00
|
|
|
|
2012-08-22 15:56:38 +00:00
|
|
|
bool ColumnHasCellSpacingBefore(int32_t aColIndex) const;
|
1999-07-28 08:09:02 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool HasPctCol() const;
|
|
|
|
void SetHasPctCol(bool aValue);
|
2001-03-13 06:38:59 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool HasCellSpanningPctCol() const;
|
|
|
|
void SetHasCellSpanningPctCol(bool aValue);
|
2001-11-05 00:15:51 +00:00
|
|
|
|
2012-08-29 05:48:45 +00:00
|
|
|
/**
|
|
|
|
* To be called on a frame by its parent after setting its size/position and
|
|
|
|
* calling DidReflow (possibly via FinishReflowChild()). This can also be
|
|
|
|
* used for child frames which are not being reflowed but did have their size
|
|
|
|
* or position changed.
|
|
|
|
*
|
|
|
|
* @param aFrame The frame to invalidate
|
|
|
|
* @param aOrigRect The original rect of aFrame (before the change).
|
|
|
|
* @param aOrigVisualOverflow The original overflow rect of aFrame.
|
|
|
|
* @param aIsFirstReflow True if the size/position change is due to the
|
|
|
|
* first reflow of aFrame.
|
|
|
|
*/
|
|
|
|
static void InvalidateTableFrame(nsIFrame* aFrame,
|
|
|
|
const nsRect& aOrigRect,
|
|
|
|
const nsRect& aOrigVisualOverflow,
|
|
|
|
bool aIsFirstReflow);
|
|
|
|
|
2013-05-14 16:33:23 +00:00
|
|
|
virtual bool UpdateOverflow() MOZ_OVERRIDE;
|
2011-06-15 21:03:49 +00:00
|
|
|
|
1998-04-13 20:24:54 +00:00
|
|
|
protected:
|
|
|
|
|
2000-05-11 01:04:39 +00:00
|
|
|
/** protected constructor.
|
1998-04-14 21:45:28 +00:00
|
|
|
* @see NewFrame
|
|
|
|
*/
|
2006-03-26 21:30:36 +00:00
|
|
|
nsTableFrame(nsStyleContext* aContext);
|
1998-04-13 20:24:54 +00:00
|
|
|
|
2001-03-13 06:38:59 +00:00
|
|
|
/** destructor, responsible for mColumnLayoutData */
|
1998-04-13 20:24:54 +00:00
|
|
|
virtual ~nsTableFrame();
|
|
|
|
|
2005-02-07 01:58:25 +00:00
|
|
|
void InitChildReflowState(nsHTMLReflowState& aReflowState);
|
2002-02-19 15:48:28 +00:00
|
|
|
|
2014-03-13 07:39:33 +00:00
|
|
|
virtual int GetLogicalSkipSides(const nsHTMLReflowState* aReflowState = nullptr) const MOZ_OVERRIDE;
|
1998-10-20 17:45:07 +00:00
|
|
|
|
1999-06-15 01:19:18 +00:00
|
|
|
public:
|
2011-09-29 06:19:26 +00:00
|
|
|
bool IsRowInserted() const;
|
|
|
|
void SetRowInserted(bool aValue);
|
2001-08-06 14:48:09 +00:00
|
|
|
|
1999-06-15 01:19:18 +00:00
|
|
|
protected:
|
2007-12-05 02:32:56 +00:00
|
|
|
|
|
|
|
// A helper function to reflow a header or footer with unconstrained height
|
|
|
|
// to see if it should be made repeatable and also to determine its desired
|
|
|
|
// height.
|
|
|
|
nsresult SetupHeaderFooterChild(const nsTableReflowState& aReflowState,
|
|
|
|
nsTableRowGroupFrame* aFrame,
|
|
|
|
nscoord* aDesiredHeight);
|
1998-04-13 20:24:54 +00:00
|
|
|
|
2014-05-13 00:47:53 +00:00
|
|
|
void ReflowChildren(nsTableReflowState& aReflowState,
|
|
|
|
nsReflowStatus& aStatus,
|
|
|
|
nsIFrame*& aLastChildReflowed,
|
|
|
|
nsOverflowAreas& aOverflowAreas);
|
1998-10-11 09:18:27 +00:00
|
|
|
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
// This calls the col group and column reflow methods, which do two things:
|
|
|
|
// (1) set all the dimensions to 0
|
|
|
|
// (2) notify the table about colgroups or columns with hidden visibility
|
2011-04-08 01:04:40 +00:00
|
|
|
void ReflowColGroups(nsRenderingContext* aRenderingContext);
|
1999-02-11 06:22:33 +00:00
|
|
|
|
2006-03-04 05:26:57 +00:00
|
|
|
/** return the width of the table taking into account visibility collapse
|
|
|
|
* on columns and colgroups
|
|
|
|
* @param aBorderPadding the border and padding of the table
|
|
|
|
*/
|
|
|
|
nscoord GetCollapsedWidth(nsMargin aBorderPadding);
|
1999-06-14 08:01:00 +00:00
|
|
|
|
2006-03-04 05:26:57 +00:00
|
|
|
|
2011-09-07 00:20:35 +00:00
|
|
|
/** Adjust the table for visibility.collapse set on rowgroups, rows,
|
|
|
|
* colgroups and cols
|
2006-03-04 05:26:57 +00:00
|
|
|
* @param aDesiredSize the metrics of the table
|
|
|
|
* @param aBorderPadding the border and padding of the table
|
|
|
|
*/
|
|
|
|
void AdjustForCollapsingRowsCols(nsHTMLReflowMetrics& aDesiredSize,
|
|
|
|
nsMargin aBorderPadding);
|
1999-02-11 06:22:33 +00:00
|
|
|
|
2014-03-10 22:41:17 +00:00
|
|
|
/** FixupPositionedTableParts is called at the end of table reflow to reflow
|
|
|
|
* the absolutely positioned descendants of positioned table parts. This is
|
|
|
|
* necessary because the dimensions of table parts may change after they've
|
|
|
|
* been reflowed (e.g. in AdjustForCollapsingRowsCols).
|
|
|
|
*/
|
2014-03-19 03:04:23 +00:00
|
|
|
void FixupPositionedTableParts(nsPresContext* aPresContext,
|
|
|
|
nsHTMLReflowMetrics& aDesiredSize,
|
2014-03-10 22:41:17 +00:00
|
|
|
const nsHTMLReflowState& aReflowState);
|
|
|
|
|
|
|
|
// Clears the list of positioned table parts.
|
|
|
|
void ClearAllPositionedTableParts();
|
|
|
|
|
2008-09-24 17:14:35 +00:00
|
|
|
nsITableLayoutStrategy* LayoutStrategy() const {
|
2013-09-25 11:42:34 +00:00
|
|
|
return static_cast<nsTableFrame*>(FirstInFlow())->
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
mTableLayoutStrategy;
|
|
|
|
}
|
1998-08-31 21:23:28 +00:00
|
|
|
|
2012-06-01 19:56:33 +00:00
|
|
|
// Helper for InsertFrames.
|
|
|
|
void HomogenousInsertFrames(ChildListID aListID,
|
|
|
|
nsIFrame* aPrevFrame,
|
|
|
|
nsFrameList& aFrameList);
|
2008-02-06 22:01:41 +00:00
|
|
|
private:
|
|
|
|
/* Handle a row that got inserted during reflow. aNewHeight is the
|
|
|
|
new height of the table after reflow. */
|
|
|
|
void ProcessRowInserted(nscoord aNewHeight);
|
|
|
|
|
2001-03-13 06:38:59 +00:00
|
|
|
// WIDTH AND HEIGHT CALCULATION
|
1998-11-20 01:01:25 +00:00
|
|
|
|
2001-03-13 06:38:59 +00:00
|
|
|
public:
|
|
|
|
|
|
|
|
// calculate the computed height of aFrame including its border and padding given
|
|
|
|
// its reflow state.
|
2003-12-28 17:02:40 +00:00
|
|
|
nscoord CalcBorderBoxHeight(const nsHTMLReflowState& aReflowState);
|
2001-03-13 06:38:59 +00:00
|
|
|
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
protected:
|
2001-03-13 06:38:59 +00:00
|
|
|
|
2004-09-13 18:21:03 +00:00
|
|
|
// update the desired height of this table taking into account the current
|
|
|
|
// reflow state, the table attributes and the content driven rowgroup heights
|
|
|
|
// this function can change the overflow area
|
|
|
|
void CalcDesiredHeight(const nsHTMLReflowState& aReflowState, nsHTMLReflowMetrics& aDesiredSize);
|
2001-11-05 00:15:51 +00:00
|
|
|
|
|
|
|
// The following is a helper for CalcDesiredHeight
|
2001-03-13 06:38:59 +00:00
|
|
|
|
2003-12-28 17:02:40 +00:00
|
|
|
void DistributeHeightToRows(const nsHTMLReflowState& aReflowState,
|
2001-11-05 00:15:51 +00:00
|
|
|
nscoord aAmount);
|
1998-11-20 01:01:25 +00:00
|
|
|
|
2005-02-07 01:58:25 +00:00
|
|
|
void PlaceChild(nsTableReflowState& aReflowState,
|
2001-03-13 06:38:59 +00:00
|
|
|
nsIFrame* aKidFrame,
|
2008-02-08 09:36:32 +00:00
|
|
|
nsHTMLReflowMetrics& aKidDesiredSize,
|
2008-03-16 20:32:48 +00:00
|
|
|
const nsRect& aOriginalKidRect,
|
2010-10-07 04:25:46 +00:00
|
|
|
const nsRect& aOriginalKidVisualOverflow);
|
2010-05-13 14:15:49 +00:00
|
|
|
void PlaceRepeatedFooter(nsTableReflowState& aReflowState,
|
|
|
|
nsTableRowGroupFrame *aTfoot,
|
|
|
|
nscoord aFooterHeight);
|
1998-04-13 20:24:54 +00:00
|
|
|
|
1999-03-09 05:29:37 +00:00
|
|
|
nsIFrame* GetFirstBodyRowGroupFrame();
|
2010-01-16 16:05:46 +00:00
|
|
|
public:
|
2011-08-10 05:36:00 +00:00
|
|
|
typedef nsAutoTArray<nsTableRowGroupFrame*, 8> RowGroupArray;
|
2005-02-16 20:02:14 +00:00
|
|
|
/**
|
2010-01-16 16:05:46 +00:00
|
|
|
* Push all our child frames from the aRowGroups array, in order, starting
|
|
|
|
* from the frame at aPushFrom to the end of the array. The frames are put on
|
|
|
|
* our overflow list or moved directly to our next-in-flow if one exists.
|
2005-02-16 20:02:14 +00:00
|
|
|
*/
|
2010-01-16 16:05:46 +00:00
|
|
|
protected:
|
2012-08-22 15:56:38 +00:00
|
|
|
void PushChildren(const RowGroupArray& aRowGroups, int32_t aPushFrom);
|
1999-03-09 05:29:37 +00:00
|
|
|
|
1998-10-14 16:32:45 +00:00
|
|
|
public:
|
2007-06-05 18:55:26 +00:00
|
|
|
// put the children frames in the display order (e.g. thead before tbodies
|
|
|
|
// before tfoot). This will handle calling GetRowGroupFrame() on the
|
|
|
|
// children, and not append nulls, so the array is guaranteed to contain
|
|
|
|
// nsTableRowGroupFrames. If there are multiple theads or tfoots, all but
|
|
|
|
// the first one are treated as tbodies instead.
|
2010-01-16 16:05:46 +00:00
|
|
|
|
|
|
|
void OrderRowGroups(RowGroupArray& aChildren,
|
2012-07-30 14:20:58 +00:00
|
|
|
nsTableRowGroupFrame** aHead = nullptr,
|
|
|
|
nsTableRowGroupFrame** aFoot = nullptr) const;
|
2000-09-14 06:49:47 +00:00
|
|
|
|
2007-06-05 18:55:26 +00:00
|
|
|
// Return the thead, if any
|
|
|
|
nsTableRowGroupFrame* GetTHead() const;
|
|
|
|
|
|
|
|
// Return the tfoot, if any
|
|
|
|
nsTableRowGroupFrame* GetTFoot() const;
|
|
|
|
|
2011-10-17 14:59:28 +00:00
|
|
|
// Returns true if there are any cells above the row at
|
2005-11-04 18:41:32 +00:00
|
|
|
// aRowIndex and spanning into the row at aRowIndex, the number of
|
|
|
|
// effective columns limits the search up to that column
|
2012-08-22 15:56:38 +00:00
|
|
|
bool RowIsSpannedInto(int32_t aRowIndex, int32_t aNumEffCols);
|
1999-08-19 19:52:37 +00:00
|
|
|
|
2011-10-17 14:59:28 +00:00
|
|
|
// Returns true if there is a cell originating in aRowIndex
|
2005-11-04 18:41:32 +00:00
|
|
|
// which spans into the next row, the number of effective
|
|
|
|
// columns limits the search up to that column
|
2012-08-22 15:56:38 +00:00
|
|
|
bool RowHasSpanningCells(int32_t aRowIndex, int32_t aNumEffCols);
|
1999-08-19 19:52:37 +00:00
|
|
|
|
2001-03-13 06:38:59 +00:00
|
|
|
protected:
|
1998-10-15 21:07:37 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool HaveReflowedColGroups() const;
|
|
|
|
void SetHaveReflowedColGroups(bool aValue);
|
2000-01-11 15:55:31 +00:00
|
|
|
|
1998-10-14 16:32:45 +00:00
|
|
|
public:
|
2011-09-29 06:19:26 +00:00
|
|
|
bool IsBorderCollapse() const;
|
2002-02-19 15:48:28 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool NeedToCalcBCBorders() const;
|
|
|
|
void SetNeedToCalcBCBorders(bool aValue);
|
2006-03-04 05:26:57 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool NeedToCollapse() const;
|
|
|
|
void SetNeedToCollapse(bool aValue);
|
2002-02-19 15:48:28 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool HasZeroColSpans() const;
|
|
|
|
void SetHasZeroColSpans(bool aValue);
|
2006-10-20 07:37:24 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool NeedColSpanExpansion() const;
|
|
|
|
void SetNeedColSpanExpansion(bool aValue);
|
2006-10-20 07:37:24 +00:00
|
|
|
|
2007-05-18 06:04:43 +00:00
|
|
|
/** The GeometryDirty bit is similar to the NS_FRAME_IS_DIRTY frame
|
|
|
|
* state bit, which implies that all descendants are dirty. The
|
|
|
|
* GeometryDirty still implies that all the parts of the table are
|
|
|
|
* dirty, but resizing optimizations should still apply to the
|
|
|
|
* contents of the individual cells.
|
|
|
|
*/
|
2011-10-17 14:59:28 +00:00
|
|
|
void SetGeometryDirty() { mBits.mGeometryDirty = true; }
|
|
|
|
void ClearGeometryDirty() { mBits.mGeometryDirty = false; }
|
2011-09-29 06:19:26 +00:00
|
|
|
bool IsGeometryDirty() const { return mBits.mGeometryDirty; }
|
2006-12-13 03:45:28 +00:00
|
|
|
|
1999-07-28 08:09:02 +00:00
|
|
|
/** Get the cell map for this table frame. It is not always mCellMap.
|
|
|
|
* Only the firstInFlow has a legit cell map
|
|
|
|
*/
|
2013-02-03 21:54:07 +00:00
|
|
|
nsTableCellMap* GetCellMap() const;
|
2006-08-04 19:15:50 +00:00
|
|
|
|
|
|
|
/** Iterate over the row groups and adjust the row indices of all rows
|
|
|
|
* whose index is >= aRowIndex.
|
|
|
|
* @param aRowIndex - start adjusting with this index
|
|
|
|
* @param aAdjustment - shift the row index by this amount
|
|
|
|
*/
|
2012-08-22 15:56:38 +00:00
|
|
|
void AdjustRowIndices(int32_t aRowIndex,
|
|
|
|
int32_t aAdjustment);
|
1999-08-30 00:01:09 +00:00
|
|
|
|
2006-08-04 19:15:50 +00:00
|
|
|
/** Reset the rowindices of all rows as they might have changed due to
|
|
|
|
* rowgroup reordering, exclude new row group frames that show in the
|
|
|
|
* reordering but are not yet inserted into the cellmap
|
2009-07-30 17:23:32 +00:00
|
|
|
* @param aRowGroupsToExclude - an iterator that will produce the row groups
|
|
|
|
* to exclude.
|
2006-06-28 19:00:01 +00:00
|
|
|
*/
|
2009-07-30 17:23:32 +00:00
|
|
|
void ResetRowIndices(const nsFrameList::Slice& aRowGroupsToExclude);
|
1999-09-02 00:07:14 +00:00
|
|
|
|
2009-02-05 09:09:50 +00:00
|
|
|
nsTArray<nsTableColFrame*>& GetColCache();
|
1999-12-13 22:56:31 +00:00
|
|
|
|
2011-10-27 13:58:44 +00:00
|
|
|
|
1998-10-14 16:32:45 +00:00
|
|
|
protected:
|
1998-06-17 16:38:24 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
void SetBorderCollapse(bool aValue);
|
2002-02-19 15:48:28 +00:00
|
|
|
|
2011-10-27 13:58:44 +00:00
|
|
|
BCPropertyData* GetBCProperty(bool aCreateIfNecessary = false) const;
|
|
|
|
void SetFullBCDamageArea();
|
2005-02-07 01:58:25 +00:00
|
|
|
void CalcBCBorders();
|
2002-02-19 15:48:28 +00:00
|
|
|
|
2012-01-22 22:48:34 +00:00
|
|
|
void ExpandBCDamageArea(nsIntRect& aRect) const;
|
2002-02-19 15:48:28 +00:00
|
|
|
|
2004-01-18 10:28:40 +00:00
|
|
|
void SetColumnDimensions(nscoord aHeight,
|
2000-02-12 01:55:40 +00:00
|
|
|
const nsMargin& aReflowState);
|
1999-06-07 21:10:25 +00:00
|
|
|
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t CollectRows(nsIFrame* aFrame,
|
2009-02-05 09:09:50 +00:00
|
|
|
nsTArray<nsTableRowFrame*>& aCollection);
|
1999-01-17 23:35:56 +00:00
|
|
|
|
1998-07-11 00:00:31 +00:00
|
|
|
public: /* ----- Cell Map public methods ----- */
|
|
|
|
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t GetStartRowIndex(nsTableRowGroupFrame* aRowGroupFrame);
|
2000-09-14 06:49:47 +00:00
|
|
|
|
1998-06-17 16:38:24 +00:00
|
|
|
/** returns the number of rows in this table.
|
|
|
|
*/
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t GetRowCount () const
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
{
|
|
|
|
return GetCellMap()->GetRowCount();
|
|
|
|
}
|
1998-06-17 16:38:24 +00:00
|
|
|
|
1999-07-28 08:09:02 +00:00
|
|
|
/** returns the number of columns in this table after redundant columns have been removed
|
1998-07-24 16:51:16 +00:00
|
|
|
*/
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t GetEffectiveColCount() const;
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
|
|
|
|
/* return the col count including dead cols */
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t GetColCount () const
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
{
|
|
|
|
return GetCellMap()->GetColCount();
|
|
|
|
}
|
1998-07-24 16:51:16 +00:00
|
|
|
|
2001-05-17 12:40:27 +00:00
|
|
|
// return the last col index which isn't of type eColAnonymousCell
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t GetIndexOfLastRealCol();
|
1998-06-17 16:38:24 +00:00
|
|
|
|
2011-10-17 14:59:28 +00:00
|
|
|
/** returns true if table-layout:auto */
|
2013-02-03 21:54:07 +00:00
|
|
|
bool IsAutoLayout();
|
1998-10-20 20:05:44 +00:00
|
|
|
|
1998-12-03 18:01:35 +00:00
|
|
|
public:
|
2005-03-05 16:43:07 +00:00
|
|
|
|
2002-03-06 15:56:32 +00:00
|
|
|
#ifdef DEBUG
|
2011-09-29 06:19:26 +00:00
|
|
|
void Dump(bool aDumpRows,
|
|
|
|
bool aDumpCols,
|
|
|
|
bool aDumpCellMap);
|
2001-09-24 14:48:38 +00:00
|
|
|
#endif
|
|
|
|
|
1999-02-03 22:35:03 +00:00
|
|
|
protected:
|
2012-12-01 00:10:40 +00:00
|
|
|
/**
|
|
|
|
* Helper method for RemoveFrame.
|
|
|
|
*/
|
|
|
|
void DoRemoveFrame(ChildListID aListID, nsIFrame* aOldFrame);
|
2002-03-06 15:56:32 +00:00
|
|
|
#ifdef DEBUG
|
2004-01-18 10:28:40 +00:00
|
|
|
void DumpRowGroup(nsIFrame* aChildFrame);
|
2002-03-06 15:56:32 +00:00
|
|
|
#endif
|
2001-03-13 06:38:59 +00:00
|
|
|
// DATA MEMBERS
|
2011-08-10 05:36:00 +00:00
|
|
|
nsAutoTArray<nsTableColFrame*, 8> mColFrames;
|
1999-10-04 23:48:05 +00:00
|
|
|
|
|
|
|
struct TableBits {
|
2012-08-22 15:56:38 +00:00
|
|
|
uint32_t mHaveReflowedColGroups:1; // have the col groups gotten their initial reflow
|
|
|
|
uint32_t mHasPctCol:1; // does any cell or col have a pct width
|
|
|
|
uint32_t mCellSpansPctCol:1; // does any cell span a col with a pct width (or containing a cell with a pct width)
|
|
|
|
uint32_t mIsBorderCollapse:1; // border collapsing model vs. separate model
|
|
|
|
uint32_t mRowInserted:1;
|
|
|
|
uint32_t mNeedToCalcBCBorders:1;
|
|
|
|
uint32_t mGeometryDirty:1;
|
|
|
|
uint32_t mLeftContBCBorder:8;
|
|
|
|
uint32_t mNeedToCollapse:1; // rows, cols that have visibility:collapse need to be collapsed
|
|
|
|
uint32_t mHasZeroColSpans:1;
|
|
|
|
uint32_t mNeedColSpanExpansion:1;
|
|
|
|
uint32_t mResizedColumns:1; // have we resized columns since last reflow?
|
1999-10-04 23:48:05 +00:00
|
|
|
} mBits;
|
|
|
|
|
2000-07-06 13:37:28 +00:00
|
|
|
nsTableCellMap* mCellMap; // maintains the relationships between rows, cols, and cells
|
|
|
|
nsITableLayoutStrategy* mTableLayoutStrategy;// the layout strategy for this frame
|
|
|
|
nsFrameList mColGroups; // the list of colgroup frames
|
1998-04-13 20:24:54 +00:00
|
|
|
};
|
|
|
|
|
1998-09-29 23:15:01 +00:00
|
|
|
|
2012-08-22 15:56:38 +00:00
|
|
|
inline bool nsTableFrame::IsRowGroup(int32_t aDisplayType) const
|
1998-10-11 09:18:27 +00:00
|
|
|
{
|
2011-09-29 06:19:26 +00:00
|
|
|
return bool((NS_STYLE_DISPLAY_TABLE_HEADER_GROUP == aDisplayType) ||
|
1998-10-11 09:18:27 +00:00
|
|
|
(NS_STYLE_DISPLAY_TABLE_FOOTER_GROUP == aDisplayType) ||
|
|
|
|
(NS_STYLE_DISPLAY_TABLE_ROW_GROUP == aDisplayType));
|
|
|
|
}
|
1998-10-14 22:12:06 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline void nsTableFrame::SetHaveReflowedColGroups(bool aValue)
|
2001-03-13 06:38:59 +00:00
|
|
|
{
|
|
|
|
mBits.mHaveReflowedColGroups = aValue;
|
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline bool nsTableFrame::HaveReflowedColGroups() const
|
2001-03-13 06:38:59 +00:00
|
|
|
{
|
2011-09-29 06:19:26 +00:00
|
|
|
return (bool)mBits.mHaveReflowedColGroups;
|
2001-03-13 06:38:59 +00:00
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline bool nsTableFrame::HasPctCol() const
|
2001-03-13 06:38:59 +00:00
|
|
|
{
|
2011-09-29 06:19:26 +00:00
|
|
|
return (bool)mBits.mHasPctCol;
|
2001-03-13 06:38:59 +00:00
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline void nsTableFrame::SetHasPctCol(bool aValue)
|
2001-03-13 06:38:59 +00:00
|
|
|
{
|
|
|
|
mBits.mHasPctCol = (unsigned)aValue;
|
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline bool nsTableFrame::HasCellSpanningPctCol() const
|
1999-10-04 05:19:32 +00:00
|
|
|
{
|
2011-09-29 06:19:26 +00:00
|
|
|
return (bool)mBits.mCellSpansPctCol;
|
1999-10-04 05:19:32 +00:00
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline void nsTableFrame::SetHasCellSpanningPctCol(bool aValue)
|
1999-10-04 05:19:32 +00:00
|
|
|
{
|
2000-09-09 01:46:44 +00:00
|
|
|
mBits.mCellSpansPctCol = (unsigned)aValue;
|
1999-10-04 05:19:32 +00:00
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline bool nsTableFrame::IsRowInserted() const
|
2001-08-06 14:48:09 +00:00
|
|
|
{
|
2011-09-29 06:19:26 +00:00
|
|
|
return (bool)mBits.mRowInserted;
|
2001-08-06 14:48:09 +00:00
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline void nsTableFrame::SetRowInserted(bool aValue)
|
2001-08-06 14:48:09 +00:00
|
|
|
{
|
|
|
|
mBits.mRowInserted = (unsigned)aValue;
|
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline void nsTableFrame::SetNeedToCollapse(bool aValue)
|
2004-04-28 16:42:59 +00:00
|
|
|
{
|
2013-09-25 11:42:34 +00:00
|
|
|
static_cast<nsTableFrame*>(FirstInFlow())->mBits.mNeedToCollapse = (unsigned)aValue;
|
2004-04-28 16:42:59 +00:00
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline bool nsTableFrame::NeedToCollapse() const
|
2004-04-28 16:42:59 +00:00
|
|
|
{
|
2013-09-25 11:42:34 +00:00
|
|
|
return (bool) static_cast<nsTableFrame*>(FirstInFlow())->mBits.mNeedToCollapse;
|
2004-04-28 16:42:59 +00:00
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline void nsTableFrame::SetHasZeroColSpans(bool aValue)
|
2006-10-20 07:37:24 +00:00
|
|
|
{
|
|
|
|
mBits.mHasZeroColSpans = (unsigned)aValue;
|
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline bool nsTableFrame::HasZeroColSpans() const
|
2006-10-20 07:37:24 +00:00
|
|
|
{
|
2011-09-29 06:19:26 +00:00
|
|
|
return (bool)mBits.mHasZeroColSpans;
|
2006-10-20 07:37:24 +00:00
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline void nsTableFrame::SetNeedColSpanExpansion(bool aValue)
|
2006-10-20 07:37:24 +00:00
|
|
|
{
|
|
|
|
mBits.mNeedColSpanExpansion = (unsigned)aValue;
|
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline bool nsTableFrame::NeedColSpanExpansion() const
|
2006-10-20 07:37:24 +00:00
|
|
|
{
|
2011-09-29 06:19:26 +00:00
|
|
|
return (bool)mBits.mNeedColSpanExpansion;
|
2006-10-20 07:37:24 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
1999-12-13 22:56:31 +00:00
|
|
|
inline nsFrameList& nsTableFrame::GetColGroups()
|
|
|
|
{
|
2013-09-25 11:42:34 +00:00
|
|
|
return static_cast<nsTableFrame*>(FirstInFlow())->mColGroups;
|
1999-12-13 22:56:31 +00:00
|
|
|
}
|
|
|
|
|
2009-02-05 09:09:50 +00:00
|
|
|
inline nsTArray<nsTableColFrame*>& nsTableFrame::GetColCache()
|
1999-12-13 22:56:31 +00:00
|
|
|
{
|
|
|
|
return mColFrames;
|
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline bool nsTableFrame::IsBorderCollapse() const
|
2002-02-19 15:48:28 +00:00
|
|
|
{
|
2011-09-29 06:19:26 +00:00
|
|
|
return (bool)mBits.mIsBorderCollapse;
|
2002-02-19 15:48:28 +00:00
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline void nsTableFrame::SetBorderCollapse(bool aValue)
|
2002-02-19 15:48:28 +00:00
|
|
|
{
|
|
|
|
mBits.mIsBorderCollapse = aValue;
|
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline bool nsTableFrame::NeedToCalcBCBorders() const
|
2002-02-19 15:48:28 +00:00
|
|
|
{
|
2011-09-29 06:19:26 +00:00
|
|
|
return (bool)mBits.mNeedToCalcBCBorders;
|
2002-02-19 15:48:28 +00:00
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
inline void nsTableFrame::SetNeedToCalcBCBorders(bool aValue)
|
2002-02-19 15:48:28 +00:00
|
|
|
{
|
|
|
|
mBits.mNeedToCalcBCBorders = (unsigned)aValue;
|
|
|
|
}
|
2001-03-13 06:38:59 +00:00
|
|
|
|
2004-03-09 06:48:35 +00:00
|
|
|
inline nscoord
|
2007-02-07 07:46:44 +00:00
|
|
|
nsTableFrame::GetContinuousLeftBCBorderWidth() const
|
2004-03-09 06:48:35 +00:00
|
|
|
{
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t aPixelsToTwips = nsPresContext::AppUnitsPerCSSPixel();
|
2004-03-09 06:48:35 +00:00
|
|
|
return BC_BORDER_RIGHT_HALF_COORD(aPixelsToTwips, mBits.mLeftContBCBorder);
|
|
|
|
}
|
|
|
|
|
2009-06-21 16:31:40 +00:00
|
|
|
inline void nsTableFrame::SetContinuousLeftBCBorderWidth(nscoord aValue)
|
|
|
|
{
|
|
|
|
mBits.mLeftContBCBorder = (unsigned) aValue;
|
|
|
|
}
|
|
|
|
|
1999-04-22 03:51:58 +00:00
|
|
|
class nsTableIterator
|
|
|
|
{
|
|
|
|
public:
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
nsTableIterator(nsIFrame& aSource);
|
|
|
|
nsTableIterator(nsFrameList& aSource);
|
1999-04-22 03:51:58 +00:00
|
|
|
nsIFrame* First();
|
|
|
|
nsIFrame* Next();
|
2011-09-29 06:19:26 +00:00
|
|
|
bool IsLeftToRight();
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t Count();
|
1999-04-22 03:51:58 +00:00
|
|
|
|
|
|
|
protected:
|
Bug 300030: Move intrinsic width computation out of nsIFrame::Reflow and into its own methods on nsIFrame. Replace reflow reasons, types, and commands with dirty bits/notifications. Thanks to bzbarsky for almost all of the HTML form controls (mozilla/layout/forms) changes, and many others for help testing and patching. For detailed commit logs, see REFLOW_YYYYMMDD_BRANCH, where YYYYMMDD is one of 20061031, 20060830, 20060603, 20060302, 20060119, 20051011, 20050804, 20050429, 20050315, 20050111, and 20041213.
2006-12-08 05:38:33 +00:00
|
|
|
void Init(nsIFrame* aFirstChild);
|
2011-09-29 06:19:26 +00:00
|
|
|
bool mLeftToRight;
|
1999-04-22 03:51:58 +00:00
|
|
|
nsIFrame* mFirstListChild;
|
|
|
|
nsIFrame* mFirstChild;
|
|
|
|
nsIFrame* mCurrentChild;
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t mCount;
|
1999-04-22 03:51:58 +00:00
|
|
|
};
|
|
|
|
|
2002-02-19 15:48:28 +00:00
|
|
|
#define ABORT0() \
|
2011-10-17 14:59:28 +00:00
|
|
|
{NS_ASSERTION(false, "CellIterator program error"); \
|
2002-02-19 15:48:28 +00:00
|
|
|
return;}
|
|
|
|
|
|
|
|
#define ABORT1(aReturn) \
|
2011-10-17 14:59:28 +00:00
|
|
|
{NS_ASSERTION(false, "CellIterator program error"); \
|
2002-02-19 15:48:28 +00:00
|
|
|
return aReturn;}
|
|
|
|
|
1998-10-14 22:12:06 +00:00
|
|
|
#endif
|