mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-25 22:01:30 +00:00
54d585f2af
(Append/Insert/Remove/ReplaceFrames) and for some methods in table land. Patch by Vidar Braut Haarr <bugmail@q1n.org>, r+sr=bzbarsky
319 lines
12 KiB
C++
319 lines
12 KiB
C++
/* -*- 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 nsTableColGroupFrame_h__
|
|
#define nsTableColGroupFrame_h__
|
|
|
|
#include "nscore.h"
|
|
#include "nsHTMLContainerFrame.h"
|
|
#include "nsTableColFrame.h"
|
|
#include "nsTablePainter.h"
|
|
|
|
class nsTableColFrame;
|
|
|
|
enum nsTableColGroupType {
|
|
eColGroupContent = 0, // there is real col group content associated
|
|
eColGroupAnonymousCol = 1, // the result of a col
|
|
eColGroupAnonymousCell = 2 // the result of a cell alone
|
|
};
|
|
|
|
/**
|
|
* nsTableColGroupFrame
|
|
* data structure to maintain information about a single table cell's frame
|
|
*
|
|
* @author sclark
|
|
*/
|
|
class nsTableColGroupFrame : public nsHTMLContainerFrame
|
|
{
|
|
public:
|
|
|
|
// default constructor supplied by the compiler
|
|
|
|
/** instantiate a new instance of nsTableColGroupFrame.
|
|
* @param aResult the new object is returned in this out-param
|
|
*
|
|
* @return NS_OK if the frame was properly allocated, otherwise an error code
|
|
*/
|
|
friend nsresult
|
|
NS_NewTableColGroupFrame(nsIPresShell* aPresShell, nsIFrame** aResult);
|
|
|
|
/** sets defaults for the colgroup.
|
|
* @see nsIFrame::Init
|
|
*/
|
|
NS_IMETHOD Init(nsPresContext* aPresContext,
|
|
nsIContent* aContent,
|
|
nsIFrame* aParent,
|
|
nsStyleContext* aContext,
|
|
nsIFrame* aPrevInFlow);
|
|
|
|
/** Initialize the colgroup frame with a set of children.
|
|
* @see nsIFrame::SetInitialChildList
|
|
*/
|
|
NS_IMETHOD SetInitialChildList(nsPresContext* aPresContext,
|
|
nsIAtom* aListName,
|
|
nsIFrame* aChildList);
|
|
|
|
/** 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
|
|
* @param aLastColgroup - the last real colgroup
|
|
* @return is false if there is a non real colgroup at the end
|
|
*/
|
|
static PRBool GetLastRealColGroup(nsTableFrame* aTableFrame,
|
|
nsIFrame** aLastColGroup);
|
|
|
|
/** @see nsIFrame::AppendFrames, InsertFrames, RemoveFrame
|
|
*/
|
|
NS_IMETHOD AppendFrames(nsIAtom* aListName,
|
|
nsIFrame* aFrameList);
|
|
NS_IMETHOD InsertFrames(nsIAtom* aListName,
|
|
nsIFrame* aPrevFrame,
|
|
nsIFrame* aFrameList);
|
|
NS_IMETHOD RemoveFrame(nsIAtom* aListName,
|
|
nsIFrame* aOldFrame);
|
|
|
|
/** 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,
|
|
PRBool aResetSubsequentColIndices);
|
|
|
|
/** @see nsIFrame::Paint
|
|
* all the table painting is done in nsTablePainter.cpp
|
|
*/
|
|
NS_IMETHOD Paint(nsPresContext* aPresContext,
|
|
nsIRenderingContext& aRenderingContext,
|
|
const nsRect& aDirtyRect,
|
|
nsFramePaintLayer aWhichLayer,
|
|
PRUint32 aFlags = 0);
|
|
|
|
// column groups don't paint their own background -- the cells do
|
|
virtual PRBool CanPaintBackground() { return PR_FALSE; }
|
|
|
|
/** @see nsIFrame::GetFrameForPoint
|
|
*/
|
|
NS_IMETHOD GetFrameForPoint(const nsPoint& aPoint,
|
|
nsFramePaintLayer aWhichLayer,
|
|
nsIFrame** aFrame);
|
|
|
|
/** 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.
|
|
*/
|
|
NS_IMETHOD Reflow(nsPresContext* aPresContext,
|
|
nsHTMLReflowMetrics& aDesiredSize,
|
|
const nsHTMLReflowState& aReflowState,
|
|
nsReflowStatus& aStatus);
|
|
|
|
/**
|
|
* Get the "type" of the frame
|
|
*
|
|
* @see nsLayoutAtoms::tableColGroupFrame
|
|
*/
|
|
virtual nsIAtom* GetType() const;
|
|
|
|
/** 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 aFirstFrame - first frame that needs to be added to the table,
|
|
* the frame should have a correctly set sibling
|
|
* @param aLastFrame - last frame that needs to be added. It can be either
|
|
* null or should be in the sibling chain of
|
|
* aFirstFrame
|
|
* @result - if there is no table frame or the table frame is not
|
|
* the first in flow it will return an error
|
|
*/
|
|
nsresult AddColsToTable(PRInt32 aFirstColIndex,
|
|
PRBool aResetSubsequentColIndices,
|
|
nsIFrame* aFirstFrame,
|
|
nsIFrame* aLastFrame = nsnull);
|
|
|
|
#ifdef DEBUG
|
|
NS_IMETHOD GetFrameName(nsAString& aResult) const;
|
|
void Dump(PRInt32 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 PRInt32 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.
|
|
*/
|
|
PRInt32 GetStartColumnIndex();
|
|
|
|
/** set the position of the first column in this colgroup in the table
|
|
* colframe cache.
|
|
*/
|
|
void SetStartColumnIndex(PRInt32 aIndex);
|
|
|
|
/** helper method to get the span attribute for this colgroup */
|
|
PRInt32 GetSpan();
|
|
|
|
/** provide access to the mFrames list
|
|
*/
|
|
nsFrameList& GetChildList();
|
|
|
|
/** 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,
|
|
PRInt32 aFirstColIndex,
|
|
nsIFrame* aStartColFrame = nsnull);
|
|
|
|
/**
|
|
* Gets inner border widths before collapsing with cell borders
|
|
* Caller must get left border from previous column
|
|
* GetContinuousBCBorderWidth will not overwrite aBorder.left
|
|
* see nsTablePainter about continuous borders
|
|
*/
|
|
void GetContinuousBCBorderWidth(float aPixelsToTwips,
|
|
nsMargin& aBorder);
|
|
/**
|
|
* Set full border widths before collapsing with cell borders
|
|
* @param aForSide - side to set; only accepts top and bottom
|
|
*/
|
|
void SetContinuousBCBorderWidth(PRUint8 aForSide,
|
|
BCPixelSize aPixelValue);
|
|
protected:
|
|
nsTableColGroupFrame();
|
|
|
|
void InsertColsReflow(PRInt32 aColIndex,
|
|
nsIFrame* aFirstFrame,
|
|
nsIFrame* aLastFrame = nsnull);
|
|
|
|
/** implement abstract method on nsHTMLContainerFrame */
|
|
virtual PRIntn GetSkipSides() const;
|
|
|
|
NS_IMETHOD IncrementalReflow(nsHTMLReflowMetrics& aDesiredSize,
|
|
const nsHTMLReflowState& aReflowState,
|
|
nsReflowStatus& aStatus);
|
|
|
|
NS_IMETHOD IR_TargetIsMe(nsHTMLReflowMetrics& aDesiredSize,
|
|
const nsHTMLReflowState& aReflowState,
|
|
nsReflowStatus& aStatus);
|
|
|
|
NS_IMETHOD IR_StyleChanged(nsHTMLReflowMetrics& aDesiredSize,
|
|
const nsHTMLReflowState& aReflowState,
|
|
nsReflowStatus& aStatus);
|
|
|
|
|
|
NS_IMETHOD IR_TargetIsChild(nsHTMLReflowMetrics& aDesiredSize,
|
|
const nsHTMLReflowState& aReflowState,
|
|
nsReflowStatus& aStatus,
|
|
nsIFrame * aNextFrame);
|
|
|
|
// data members
|
|
PRInt32 mColCount;
|
|
// the starting column index this col group represents. Must be >= 0.
|
|
PRInt32 mStartColIndex;
|
|
|
|
// border width in pixels
|
|
BCPixelSize mTopContBorderWidth;
|
|
BCPixelSize mBottomContBorderWidth;
|
|
};
|
|
|
|
inline nsTableColGroupFrame::nsTableColGroupFrame()
|
|
: mColCount(0), mStartColIndex(0)
|
|
{
|
|
SetColType(eColGroupContent);
|
|
}
|
|
|
|
inline PRInt32 nsTableColGroupFrame::GetStartColumnIndex()
|
|
{
|
|
return mStartColIndex;
|
|
}
|
|
|
|
inline void nsTableColGroupFrame::SetStartColumnIndex (PRInt32 aIndex)
|
|
{
|
|
mStartColIndex = aIndex;
|
|
}
|
|
|
|
inline PRInt32 nsTableColGroupFrame::GetColCount() const
|
|
{
|
|
return mColCount;
|
|
}
|
|
|
|
inline nsFrameList& nsTableColGroupFrame::GetChildList()
|
|
{
|
|
return mFrames;
|
|
}
|
|
|
|
#endif
|
|
|