123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- /* -*- 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 nsTableColGroupFrame_h__
- #define nsTableColGroupFrame_h__
- #include "mozilla/Attributes.h"
- #include "nscore.h"
- #include "nsContainerFrame.h"
- #include "nsTableFrame.h"
- #include "mozilla/WritingModes.h"
- class nsTableColFrame;
- /**
- * nsTableColGroupFrame
- * data structure to maintain information about a single table cell's frame
- *
- * @author sclark
- */
- class nsTableColGroupFrame final : public nsContainerFrame
- {
- public:
- NS_DECL_FRAMEARENA_HELPERS
- // default constructor supplied by the compiler
- /** instantiate a new instance of nsTableRowFrame.
- * @param aPresShell the pres shell for this frame
- *
- * @return the frame that was created
- */
- friend nsTableColGroupFrame* NS_NewTableColGroupFrame(nsIPresShell* aPresShell,
- nsStyleContext* aContext);
- nsTableFrame* GetTableFrame() const
- {
- nsIFrame* parent = GetParent();
- MOZ_ASSERT(parent && parent->GetType() == nsGkAtoms::tableFrame);
- MOZ_ASSERT(!parent->GetPrevInFlow(),
- "Col group should always be in a first-in-flow table frame");
- return static_cast<nsTableFrame*>(parent);
- }
- virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder,
- const nsDisplayListSet& aLists) override;
- /** A colgroup can be caused by three things:
- * 1) An element with table-column-group display
- * 2) An element with a table-column display without a
- * table-column-group parent
- * 3) Cells that are not in a column (and hence get an anonymous
- * column and colgroup).
- * @return colgroup type
- */
- nsTableColGroupType GetColType() const;
- /** Set the colgroup type based on the creation cause
- * @param aType - the reason why this colgroup is needed
- */
- void SetColType(nsTableColGroupType aType);
-
- /** Real in this context are colgroups that come from an element
- * with table-column-group display or wrap around columns that
- * come from an element with table-column display. Colgroups
- * that are the result of wrapping cells in an anonymous
- * column and colgroup are not considered real here.
- * @param aTableFrame - the table parent of the colgroups
- * @return the last real colgroup
- */
- static nsTableColGroupFrame* GetLastRealColGroup(nsTableFrame* aTableFrame);
- /** @see nsIFrame::DidSetStyleContext */
- virtual void DidSetStyleContext(nsStyleContext* aOldStyleContext) override;
- virtual void SetInitialChildList(ChildListID aListID,
- nsFrameList& aChildList) override;
- virtual void AppendFrames(ChildListID aListID,
- nsFrameList& aFrameList) override;
- virtual void InsertFrames(ChildListID aListID,
- nsIFrame* aPrevFrame,
- nsFrameList& aFrameList) override;
- virtual void RemoveFrame(ChildListID aListID,
- nsIFrame* aOldFrame) override;
- /** remove the column aChild from the column group, if requested renumber
- * the subsequent columns in this column group and all following column
- * groups. see also ResetColIndices for this
- * @param aChild - the column frame that needs to be removed
- * @param aResetSubsequentColIndices - if true the columns that follow
- * after aChild will be reenumerated
- */
- void RemoveChild(nsTableColFrame& aChild,
- bool aResetSubsequentColIndices);
- /** reflow of a column group is a trivial matter of reflowing
- * the col group's children (columns), and setting this frame
- * to 0-size. Since tables are row-centric, column group frames
- * don't play directly in the rendering game. They do however
- * maintain important state that effects table and cell layout.
- */
- virtual void Reflow(nsPresContext* aPresContext,
- ReflowOutput& aDesiredSize,
- const ReflowInput& aReflowInput,
- nsReflowStatus& aStatus) override;
- /**
- * Get the "type" of the frame
- *
- * @see nsGkAtoms::tableColGroupFrame
- */
- virtual nsIAtom* GetType() const override;
- virtual mozilla::WritingMode GetWritingMode() const override
- { return GetTableFrame()->GetWritingMode(); }
- /** Add column frames to the table storages: colframe cache and cellmap
- * this doesn't change the mFrames of the colgroup frame.
- * @param aFirstColIndex - the index at which aFirstFrame should be inserted
- * into the colframe cache.
- * @param aResetSubsequentColIndices - the indices of the col frames
- * after the insertion might need
- * an update
- * @param aCols - an iterator that can be used to iterate over the col
- * frames to be added. Once this is done, the frames on the
- * sbling chain of its .get() at that point will still need
- * their col indices updated.
- * @result - if there is no table frame or the table frame is not
- * the first in flow it will return an error
- */
- nsresult AddColsToTable(int32_t aFirstColIndex,
- bool aResetSubsequentColIndices,
- const nsFrameList::Slice& aCols);
- #ifdef DEBUG_FRAME_DUMP
- virtual nsresult GetFrameName(nsAString& aResult) const override;
- void Dump(int32_t aIndent);
- #endif
- /** returns the number of columns represented by this group.
- * if there are col children, count them (taking into account the span of each)
- * else, check my own span attribute.
- */
- virtual int32_t GetColCount() const;
- /** first column on the child list */
- nsTableColFrame * GetFirstColumn();
- /** next sibling to aChildFrame that is a column frame, first column frame
- * in the column group if aChildFrame is null
- */
- nsTableColFrame * GetNextColumn(nsIFrame *aChildFrame);
- /** @return - the position of the first column in this colgroup in the table
- * colframe cache.
- */
- int32_t GetStartColumnIndex();
-
- /** set the position of the first column in this colgroup in the table
- * colframe cache.
- */
- void SetStartColumnIndex(int32_t aIndex);
- /** helper method to get the span attribute for this colgroup */
- int32_t GetSpan();
- /** provide access to the mFrames list
- */
- nsFrameList& GetWritableChildList();
- /** set the column index for all frames starting at aStartColFrame, it
- * will also reset the column indices in all subsequent colgroups
- * @param aFirstColGroup - start the reset operation inside this colgroup
- * @param aFirstColIndex - first column that is reset should get this index
- * @param aStartColFrame - if specified the reset starts with this column
- * inside the colgroup; if not specified, the reset
- * starts with the first column
- */
- static void ResetColIndices(nsIFrame* aFirstColGroup,
- int32_t aFirstColIndex,
- nsIFrame* aStartColFrame = nullptr);
- /**
- * Gets inner border widths before collapsing with cell borders
- * Caller must get istart border from previous column
- * GetContinuousBCBorderWidth will not overwrite aBorder.IStart
- * see nsTablePainter about continuous borders
- */
- void GetContinuousBCBorderWidth(mozilla::WritingMode aWM,
- mozilla::LogicalMargin& aBorder);
- /**
- * Set full border widths before collapsing with cell borders
- * @param aForSide - side to set; only accepts bstart and bend
- */
- void SetContinuousBCBorderWidth(mozilla::LogicalSide aForSide,
- BCPixelSize aPixelValue);
- virtual bool IsFrameOfType(uint32_t aFlags) const override
- {
- return nsContainerFrame::IsFrameOfType(aFlags & ~(nsIFrame::eTablePart));
- }
-
- virtual void InvalidateFrame(uint32_t aDisplayItemKey = 0) override;
- virtual void InvalidateFrameWithRect(const nsRect& aRect, uint32_t aDisplayItemKey = 0) override;
- virtual void InvalidateFrameForRemoval() override { InvalidateFrameSubtree(); }
- protected:
- explicit nsTableColGroupFrame(nsStyleContext* aContext);
- void InsertColsReflow(int32_t aColIndex,
- const nsFrameList::Slice& aCols);
- virtual LogicalSides GetLogicalSkipSides(const ReflowInput* aReflowInput = nullptr) const override;
- // data members
- int32_t mColCount;
- // the starting column index this col group represents. Must be >= 0.
- int32_t mStartColIndex;
- // border width in pixels
- BCPixelSize mBStartContBorderWidth;
- BCPixelSize mBEndContBorderWidth;
- };
- inline nsTableColGroupFrame::nsTableColGroupFrame(nsStyleContext *aContext)
- : nsContainerFrame(aContext), mColCount(0), mStartColIndex(0)
- {
- SetColType(eColGroupContent);
- }
-
- inline int32_t nsTableColGroupFrame::GetStartColumnIndex()
- {
- return mStartColIndex;
- }
- inline void nsTableColGroupFrame::SetStartColumnIndex (int32_t aIndex)
- {
- mStartColIndex = aIndex;
- }
- inline int32_t nsTableColGroupFrame::GetColCount() const
- {
- return mColCount;
- }
- inline nsFrameList& nsTableColGroupFrame::GetWritableChildList()
- {
- return mFrames;
- }
- #endif
|