More savory tree widget goodness.

This commit is contained in:
hyatt%netscape.com 1999-06-23 09:07:59 +00:00
Родитель c42b0d7fb6
Коммит e1000eaca3
8 изменённых файлов: 154 добавлений и 58 удалений

Просмотреть файл

@ -4205,8 +4205,8 @@ void nsTableFrame::DistributeSpaceToCells(nsIPresContext& aPresContext,
nsIFrame* aRowGroupFrame)
{
// now that all of the rows have been resized, resize the cells
nsTableIterator iter2(*aRowGroupFrame, eTableLTR);
nsIFrame* rowFrame = iter2.First();
nsTableRowGroupFrame* rowGroupFrame = (nsTableRowGroupFrame*)aRowGroupFrame;
nsIFrame * rowFrame = rowGroupFrame->GetFirstFrame();
while (nsnull!=rowFrame) {
const nsStyleDisplay *rowDisplay;
rowFrame->GetStyleData(eStyleStruct_Display, ((const nsStyleStruct *&)rowDisplay));
@ -4216,7 +4216,7 @@ void nsTableFrame::DistributeSpaceToCells(nsIPresContext& aPresContext,
// The calling function, DistributeSpaceToRows, takes care of the recursive row
// group descent, which is why there's no NS_STYLE_DISPLAY_TABLE_ROW_GROUP case
// here.
rowFrame = iter2.Next();
rowGroupFrame->GetNextFrame(rowFrame, &rowFrame);
}
}
@ -4229,9 +4229,8 @@ void nsTableFrame::DistributeSpaceToRows(nsIPresContext& aPresContext,
{
// the rows in rowGroupFrame need to be expanded by rowHeightDelta[i]
// and the rowgroup itself needs to be expanded by SUM(row height deltas)
nsIFrame * rowFrame=nsnull;
nsTableIterator iter(*aRowGroupFrame, eTableLTR);
rowFrame = iter.First();
nsTableRowGroupFrame* rowGroupFrame = (nsTableRowGroupFrame*)aRowGroupFrame;
nsIFrame * rowFrame = rowGroupFrame->GetFirstFrame();
nscoord y = 0;
while (nsnull!=rowFrame)
{
@ -4247,6 +4246,8 @@ void nsTableFrame::DistributeSpaceToRows(nsIPresContext& aPresContext,
rowFrame->GetRect(rowRect);
float percent = ((float)(rowRect.height)) / ((float)(aSumOfRowHeights));
nscoord excessForRow = NSToCoordRound((float)aExcess*percent);
if (rowGroupFrame->RowsDesireExcessSpace()) {
nsRect newRowRect(rowRect.x, y, rowRect.width, excessForRow+rowRect.height);
rowFrame->SetRect(newRowRect);
if (NS_STYLE_BORDER_COLLAPSE==aTableStyle->mBorderCollapse)
@ -4260,6 +4261,8 @@ void nsTableFrame::DistributeSpaceToRows(nsIPresContext& aPresContext,
}
// better if this were part of an overloaded row::SetRect
y += excessForRow+rowRect.height;
}
aExcessForRowGroup += excessForRow;
}
else
@ -4269,14 +4272,17 @@ void nsTableFrame::DistributeSpaceToRows(nsIPresContext& aPresContext,
y += rowRect.height;
}
rowFrame = iter.Next();
rowGroupFrame->GetNextFrame(rowFrame, &rowFrame);
}
nsRect rowGroupRect;
aRowGroupFrame->GetRect(rowGroupRect);
if (rowGroupFrame->RowGroupDesiresExcessSpace()) {
nsRect newRowGroupRect(rowGroupRect.x, aRowGroupYPos, rowGroupRect.width, aExcessForRowGroup+rowGroupRect.height);
aRowGroupFrame->SetRect(newRowGroupRect);
aRowGroupYPos += aExcessForRowGroup + rowGroupRect.height;
}
else aRowGroupYPos += rowGroupRect.height;
DistributeSpaceToCells(aPresContext, aReflowState, aRowGroupFrame);
}

Просмотреть файл

@ -298,10 +298,14 @@ protected:
virtual PRBool ExcludeFrameFromReflow(nsIFrame* aFrame) { return PR_FALSE; };
virtual nsIFrame* GetFirstFrameForReflow(nsIPresContext& aPresContext) { return mFrames.FirstChild(); };
virtual void GetNextFrameForReflow(nsIPresContext& aPresContext, nsIFrame* aFrame, nsIFrame** aResult) { aFrame->GetNextSibling(aResult); };
void GetNextRowSibling(nsIFrame** aRowFrame);
public:
virtual nsIFrame* GetFirstFrame() { return mFrames.FirstChild(); };
virtual nsIFrame* GetLastFrame() { return mFrames.LastChild(); };
virtual void GetNextFrame(nsIFrame* aFrame, nsIFrame** aResult) { aFrame->GetNextSibling(aResult); };
void GetNextRowSibling(nsIFrame** aRowFrame);
virtual PRBool RowsDesireExcessSpace() { return PR_TRUE; };
virtual PRBool RowGroupDesiresExcessSpace() { return PR_TRUE; };
private:
nsIAtom *mType;

Просмотреть файл

@ -4205,8 +4205,8 @@ void nsTableFrame::DistributeSpaceToCells(nsIPresContext& aPresContext,
nsIFrame* aRowGroupFrame)
{
// now that all of the rows have been resized, resize the cells
nsTableIterator iter2(*aRowGroupFrame, eTableLTR);
nsIFrame* rowFrame = iter2.First();
nsTableRowGroupFrame* rowGroupFrame = (nsTableRowGroupFrame*)aRowGroupFrame;
nsIFrame * rowFrame = rowGroupFrame->GetFirstFrame();
while (nsnull!=rowFrame) {
const nsStyleDisplay *rowDisplay;
rowFrame->GetStyleData(eStyleStruct_Display, ((const nsStyleStruct *&)rowDisplay));
@ -4216,7 +4216,7 @@ void nsTableFrame::DistributeSpaceToCells(nsIPresContext& aPresContext,
// The calling function, DistributeSpaceToRows, takes care of the recursive row
// group descent, which is why there's no NS_STYLE_DISPLAY_TABLE_ROW_GROUP case
// here.
rowFrame = iter2.Next();
rowGroupFrame->GetNextFrame(rowFrame, &rowFrame);
}
}
@ -4229,9 +4229,8 @@ void nsTableFrame::DistributeSpaceToRows(nsIPresContext& aPresContext,
{
// the rows in rowGroupFrame need to be expanded by rowHeightDelta[i]
// and the rowgroup itself needs to be expanded by SUM(row height deltas)
nsIFrame * rowFrame=nsnull;
nsTableIterator iter(*aRowGroupFrame, eTableLTR);
rowFrame = iter.First();
nsTableRowGroupFrame* rowGroupFrame = (nsTableRowGroupFrame*)aRowGroupFrame;
nsIFrame * rowFrame = rowGroupFrame->GetFirstFrame();
nscoord y = 0;
while (nsnull!=rowFrame)
{
@ -4247,6 +4246,8 @@ void nsTableFrame::DistributeSpaceToRows(nsIPresContext& aPresContext,
rowFrame->GetRect(rowRect);
float percent = ((float)(rowRect.height)) / ((float)(aSumOfRowHeights));
nscoord excessForRow = NSToCoordRound((float)aExcess*percent);
if (rowGroupFrame->RowsDesireExcessSpace()) {
nsRect newRowRect(rowRect.x, y, rowRect.width, excessForRow+rowRect.height);
rowFrame->SetRect(newRowRect);
if (NS_STYLE_BORDER_COLLAPSE==aTableStyle->mBorderCollapse)
@ -4260,6 +4261,8 @@ void nsTableFrame::DistributeSpaceToRows(nsIPresContext& aPresContext,
}
// better if this were part of an overloaded row::SetRect
y += excessForRow+rowRect.height;
}
aExcessForRowGroup += excessForRow;
}
else
@ -4269,14 +4272,17 @@ void nsTableFrame::DistributeSpaceToRows(nsIPresContext& aPresContext,
y += rowRect.height;
}
rowFrame = iter.Next();
rowGroupFrame->GetNextFrame(rowFrame, &rowFrame);
}
nsRect rowGroupRect;
aRowGroupFrame->GetRect(rowGroupRect);
if (rowGroupFrame->RowGroupDesiresExcessSpace()) {
nsRect newRowGroupRect(rowGroupRect.x, aRowGroupYPos, rowGroupRect.width, aExcessForRowGroup+rowGroupRect.height);
aRowGroupFrame->SetRect(newRowGroupRect);
aRowGroupYPos += aExcessForRowGroup + rowGroupRect.height;
}
else aRowGroupYPos += rowGroupRect.height;
DistributeSpaceToCells(aPresContext, aReflowState, aRowGroupFrame);
}

Просмотреть файл

@ -298,10 +298,14 @@ protected:
virtual PRBool ExcludeFrameFromReflow(nsIFrame* aFrame) { return PR_FALSE; };
virtual nsIFrame* GetFirstFrameForReflow(nsIPresContext& aPresContext) { return mFrames.FirstChild(); };
virtual void GetNextFrameForReflow(nsIPresContext& aPresContext, nsIFrame* aFrame, nsIFrame** aResult) { aFrame->GetNextSibling(aResult); };
void GetNextRowSibling(nsIFrame** aRowFrame);
public:
virtual nsIFrame* GetFirstFrame() { return mFrames.FirstChild(); };
virtual nsIFrame* GetLastFrame() { return mFrames.LastChild(); };
virtual void GetNextFrame(nsIFrame* aFrame, nsIFrame** aResult) { aFrame->GetNextSibling(aResult); };
void GetNextRowSibling(nsIFrame** aRowFrame);
virtual PRBool RowsDesireExcessSpace() { return PR_TRUE; };
virtual PRBool RowGroupDesiresExcessSpace() { return PR_TRUE; };
private:
nsIAtom *mType;

Просмотреть файл

@ -65,6 +65,74 @@ nsTreeRowGroupFrame::~nsTreeRowGroupFrame()
{
}
PRBool nsTreeRowGroupFrame::RowGroupDesiresExcessSpace()
{
nsIFrame* parentFrame;
GetParent(&parentFrame);
const nsStyleDisplay *display;
parentFrame->GetStyleData(eStyleStruct_Display, ((const nsStyleStruct *&)display));
if (display->mDisplay == NS_STYLE_DISPLAY_TABLE_ROW_GROUP)
return PR_FALSE; // Nested groups don't grow.
else return PR_TRUE; // The outermost group can grow.
}
PRBool nsTreeRowGroupFrame::RowGroupReceivesExcessSpace()
{
const nsStyleDisplay *display;
GetStyleData(eStyleStruct_Display, ((const nsStyleStruct *&)display));
if (NS_STYLE_DISPLAY_TABLE_ROW_GROUP == display->mDisplay)
return PR_TRUE;
else return PR_FALSE; // Headers and footers don't get excess space.
}
NS_IMETHODIMP
nsTreeRowGroupFrame::GetFrameForPoint(const nsPoint& aPoint, nsIFrame** aFrame)
{
nsPoint tmp;
nsRect kidRect;
if (mScrollbar) {
mScrollbar->GetRect(kidRect);
if (kidRect.Contains(aPoint)) {
tmp.MoveTo(aPoint.x - kidRect.x, aPoint.y - kidRect.y);
return mScrollbar->GetFrameForPoint(tmp, aFrame);
}
}
return nsTableRowGroupFrame::GetFrameForPoint(aPoint, aFrame);
}
void nsTreeRowGroupFrame::PaintChildren(nsIPresContext& aPresContext,
nsIRenderingContext& aRenderingContext,
const nsRect& aDirtyRect,
nsFramePaintLayer aWhichLayer)
{
nsTableRowGroupFrame::PaintChildren(aPresContext, aRenderingContext, aDirtyRect, aWhichLayer);
if (mScrollbar) {
nsIView *pView;
mScrollbar->GetView(&pView);
if (nsnull == pView) {
PRBool clipState;
nsRect kidRect;
mScrollbar->GetRect(kidRect);
nsRect damageArea(aDirtyRect);
// Translate damage area into kid's coordinate system
nsRect kidDamageArea(damageArea.x - kidRect.x, damageArea.y - kidRect.y,
damageArea.width, damageArea.height);
aRenderingContext.PushState();
aRenderingContext.Translate(kidRect.x, kidRect.y);
mScrollbar->Paint(aPresContext, aRenderingContext, kidDamageArea, aWhichLayer);
if ((NS_FRAME_PAINT_LAYER_DEBUG == aWhichLayer) &&
GetShowFrameBorders()) {
aRenderingContext.SetColor(NS_RGB(255,0,0));
aRenderingContext.DrawRect(0, 0, kidRect.width, kidRect.height);
}
aRenderingContext.PopState(clipState);
}
}
}
NS_IMETHODIMP
nsTreeRowGroupFrame::ReflowBeforeRowLayout(nsIPresContext& aPresContext,
nsHTMLReflowMetrics& aDesiredSize,

Просмотреть файл

@ -41,6 +41,12 @@ public:
NS_IMETHOD TreeInsertFrames(nsIFrame* aPrevFrame,
nsIFrame* aFrameList);
NS_IMETHOD GetFrameForPoint(const nsPoint& aPoint, nsIFrame** aFrame);
void PaintChildren(nsIPresContext& aPresContext,
nsIRenderingContext& aRenderingContext,
const nsRect& aDirtyRect,
nsFramePaintLayer aWhichLayer);
PRBool ContinueReflow(nscoord y, nscoord height);
PRBool IsFull() { return mIsFull; };
@ -48,11 +54,17 @@ public:
// Responses to changes
void OnContentAdded(nsIPresContext& aPresContext);
virtual nsIFrame* GetFirstFrame();
virtual nsIFrame* GetLastFrame();
virtual void GetNextFrame(nsIFrame* aFrame, nsIFrame** aResult);
virtual PRBool RowsDesireExcessSpace() { return PR_FALSE; };
virtual PRBool RowGroupDesiresExcessSpace();
protected:
nsTreeRowGroupFrame();
virtual ~nsTreeRowGroupFrame();
virtual PRBool RowGroupReceivesExcessSpace() { return PR_FALSE; };
virtual PRBool RowGroupReceivesExcessSpace();
NS_IMETHOD ReflowBeforeRowLayout(nsIPresContext& aPresContext,
nsHTMLReflowMetrics& aDesiredSize,
@ -63,10 +75,6 @@ protected:
virtual nsIFrame* GetFirstFrameForReflow(nsIPresContext& aPresContext);
virtual void GetNextFrameForReflow(nsIPresContext& aPresContext, nsIFrame* aFrame, nsIFrame** aResult);
virtual nsIFrame* GetFirstFrame();
virtual nsIFrame* GetLastFrame();
virtual void GetNextFrame(nsIFrame* aFrame, nsIFrame** aResult);
void LocateFrame(nsIFrame* aStartFrame, nsIFrame** aResult);
protected: // Data Members