2001-09-29 00:14:13 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 15:12:37 +04: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-10-08 08:38:41 +04:00
|
|
|
|
2014-01-16 06:20:20 +04:00
|
|
|
#include "nsFieldSetFrame.h"
|
|
|
|
|
2014-10-20 13:55:48 +04:00
|
|
|
#include "mozilla/gfx/2D.h"
|
2013-04-18 00:16:14 +04:00
|
|
|
#include "nsCSSAnonBoxes.h"
|
2014-10-20 13:55:48 +04:00
|
|
|
#include "nsLayoutUtils.h"
|
1998-10-08 08:38:41 +04:00
|
|
|
#include "nsLegendFrame.h"
|
|
|
|
#include "nsCSSRendering.h"
|
2013-01-15 16:22:03 +04:00
|
|
|
#include <algorithm>
|
1998-10-08 08:38:41 +04:00
|
|
|
#include "nsIFrame.h"
|
2004-08-01 03:15:21 +04:00
|
|
|
#include "nsPresContext.h"
|
2013-07-20 23:14:25 +04:00
|
|
|
#include "RestyleManager.h"
|
2007-01-30 03:06:41 +03:00
|
|
|
#include "nsGkAtoms.h"
|
1998-10-08 08:38:41 +04:00
|
|
|
#include "nsStyleConsts.h"
|
2006-01-26 05:29:17 +03:00
|
|
|
#include "nsDisplayList.h"
|
2011-04-08 05:04:40 +04:00
|
|
|
#include "nsRenderingContext.h"
|
2013-10-23 02:46:40 +04:00
|
|
|
#include "nsIScrollableFrame.h"
|
2012-10-26 17:32:10 +04:00
|
|
|
#include "mozilla/Likely.h"
|
2013-11-23 13:48:26 +04:00
|
|
|
#include "mozilla/Maybe.h"
|
1998-10-08 08:38:41 +04:00
|
|
|
|
2012-01-25 05:21:29 +04:00
|
|
|
using namespace mozilla;
|
2014-10-20 13:55:48 +04:00
|
|
|
using namespace mozilla::gfx;
|
2015-02-10 10:27:40 +03:00
|
|
|
using namespace mozilla::image;
|
2012-01-25 05:21:29 +04:00
|
|
|
using namespace mozilla::layout;
|
|
|
|
|
2014-05-25 02:20:40 +04:00
|
|
|
nsContainerFrame*
|
2006-03-27 01:30:36 +04:00
|
|
|
NS_NewFieldSetFrame(nsIPresShell* aPresShell, nsStyleContext* aContext)
|
1998-10-08 08:38:41 +04:00
|
|
|
{
|
2006-03-27 01:30:36 +04:00
|
|
|
return new (aPresShell) nsFieldSetFrame(aContext);
|
1998-10-08 08:38:41 +04:00
|
|
|
}
|
|
|
|
|
2009-09-12 20:49:24 +04:00
|
|
|
NS_IMPL_FRAMEARENA_HELPERS(nsFieldSetFrame)
|
|
|
|
|
2006-03-27 01:30:36 +04:00
|
|
|
nsFieldSetFrame::nsFieldSetFrame(nsStyleContext* aContext)
|
2011-12-28 00:18:48 +04:00
|
|
|
: nsContainerFrame(aContext)
|
2015-01-19 14:43:58 +03:00
|
|
|
, mLegendRect(GetWritingMode())
|
1998-10-08 08:38:41 +04:00
|
|
|
{
|
2005-01-25 03:06:38 +03:00
|
|
|
mLegendSpace = 0;
|
1998-10-08 08:38:41 +04:00
|
|
|
}
|
|
|
|
|
2003-10-31 23:19:18 +03:00
|
|
|
nsIAtom*
|
|
|
|
nsFieldSetFrame::GetType() const
|
2002-12-03 19:02:42 +03:00
|
|
|
{
|
2006-12-26 20:47:52 +03:00
|
|
|
return nsGkAtoms::fieldSetFrame;
|
2002-12-03 19:02:42 +03:00
|
|
|
}
|
|
|
|
|
2014-01-16 06:20:20 +04:00
|
|
|
nsRect
|
|
|
|
nsFieldSetFrame::VisualBorderRectRelativeToSelf() const
|
|
|
|
{
|
2015-01-19 14:43:58 +03:00
|
|
|
WritingMode wm = GetWritingMode();
|
|
|
|
css::Side legendSide = wm.PhysicalSide(eLogicalSideBStart);
|
|
|
|
nscoord legendBorder = StyleBorder()->GetComputedBorderWidth(legendSide);
|
|
|
|
LogicalRect r(wm, LogicalPoint(wm, 0, 0), GetLogicalSize(wm));
|
2015-07-16 12:07:57 +03:00
|
|
|
nsSize containerSize = r.Size(wm).GetPhysicalSize(wm);
|
2015-01-19 14:43:58 +03:00
|
|
|
if (legendBorder < mLegendRect.BSize(wm)) {
|
|
|
|
nscoord off = (mLegendRect.BSize(wm) - legendBorder) / 2;
|
|
|
|
r.BStart(wm) += off;
|
|
|
|
r.BSize(wm) -= off;
|
2014-01-16 06:20:20 +04:00
|
|
|
}
|
2015-07-16 12:07:57 +03:00
|
|
|
return r.GetPhysicalRect(wm, containerSize);
|
2014-01-16 06:20:20 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
nsIFrame*
|
|
|
|
nsFieldSetFrame::GetInner() const
|
|
|
|
{
|
|
|
|
nsIFrame* last = mFrames.LastChild();
|
|
|
|
if (last &&
|
|
|
|
last->StyleContext()->GetPseudo() == nsCSSAnonBoxes::fieldsetContent) {
|
|
|
|
return last;
|
|
|
|
}
|
|
|
|
MOZ_ASSERT(mFrames.LastChild() == mFrames.FirstChild());
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIFrame*
|
|
|
|
nsFieldSetFrame::GetLegend() const
|
|
|
|
{
|
|
|
|
if (mFrames.FirstChild() == GetInner()) {
|
|
|
|
MOZ_ASSERT(mFrames.LastChild() == mFrames.FirstChild());
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
MOZ_ASSERT(mFrames.FirstChild() &&
|
|
|
|
mFrames.FirstChild()->GetContentInsertionFrame()->GetType() ==
|
|
|
|
nsGkAtoms::legendFrame);
|
|
|
|
return mFrames.FirstChild();
|
|
|
|
}
|
|
|
|
|
2006-01-26 05:29:17 +03:00
|
|
|
class nsDisplayFieldSetBorderBackground : public nsDisplayItem {
|
|
|
|
public:
|
2010-08-13 14:01:13 +04:00
|
|
|
nsDisplayFieldSetBorderBackground(nsDisplayListBuilder* aBuilder,
|
|
|
|
nsFieldSetFrame* aFrame)
|
|
|
|
: nsDisplayItem(aBuilder, aFrame) {
|
2006-01-29 21:48:58 +03:00
|
|
|
MOZ_COUNT_CTOR(nsDisplayFieldSetBorderBackground);
|
|
|
|
}
|
|
|
|
#ifdef NS_BUILD_REFCNT_LOGGING
|
|
|
|
virtual ~nsDisplayFieldSetBorderBackground() {
|
|
|
|
MOZ_COUNT_DTOR(nsDisplayFieldSetBorderBackground);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2010-04-08 04:31:26 +04:00
|
|
|
virtual void HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
|
2014-02-24 18:41:56 +04:00
|
|
|
HitTestState* aState,
|
2015-03-21 19:28:04 +03:00
|
|
|
nsTArray<nsIFrame*> *aOutFrames) override;
|
2009-09-07 04:35:14 +04:00
|
|
|
virtual void Paint(nsDisplayListBuilder* aBuilder,
|
2015-03-21 19:28:04 +03:00
|
|
|
nsRenderingContext* aCtx) override;
|
|
|
|
virtual nsDisplayItemGeometry* AllocateGeometry(nsDisplayListBuilder* aBuilder) override;
|
2013-06-26 20:43:26 +04:00
|
|
|
virtual void ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,
|
|
|
|
const nsDisplayItemGeometry* aGeometry,
|
2015-03-21 19:28:04 +03:00
|
|
|
nsRegion *aInvalidRegion) override;
|
2010-07-16 01:07:49 +04:00
|
|
|
NS_DISPLAY_DECL_NAME("FieldSetBorderBackground", TYPE_FIELDSET_BORDER_BACKGROUND)
|
2006-01-26 05:29:17 +03:00
|
|
|
};
|
1999-06-02 01:52:11 +04:00
|
|
|
|
2010-04-08 04:31:26 +04:00
|
|
|
void nsDisplayFieldSetBorderBackground::HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect,
|
|
|
|
HitTestState* aState, nsTArray<nsIFrame*> *aOutFrames)
|
2006-01-26 05:29:17 +03:00
|
|
|
{
|
|
|
|
// aPt is guaranteed to be in this item's bounds. We do the hit test based on the
|
|
|
|
// frame bounds even though our background doesn't cover the whole frame.
|
|
|
|
// It's not clear whether this is correct.
|
2010-04-08 04:31:26 +04:00
|
|
|
aOutFrames->AppendElement(mFrame);
|
2006-01-26 05:29:17 +03:00
|
|
|
}
|
1999-06-02 01:52:11 +04:00
|
|
|
|
2006-01-26 05:29:17 +03:00
|
|
|
void
|
|
|
|
nsDisplayFieldSetBorderBackground::Paint(nsDisplayListBuilder* aBuilder,
|
2011-04-08 05:04:40 +04:00
|
|
|
nsRenderingContext* aCtx)
|
2006-01-26 05:29:17 +03:00
|
|
|
{
|
2015-02-10 10:27:40 +03:00
|
|
|
DrawResult result = static_cast<nsFieldSetFrame*>(mFrame)->
|
2010-08-13 14:01:58 +04:00
|
|
|
PaintBorderBackground(*aCtx, ToReferenceFrame(),
|
2009-09-07 04:35:14 +04:00
|
|
|
mVisibleRect, aBuilder->GetBackgroundPaintFlags());
|
2015-02-10 10:27:40 +03:00
|
|
|
|
|
|
|
nsDisplayItemGenericImageGeometry::UpdateDrawResult(this, result);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsDisplayItemGeometry*
|
|
|
|
nsDisplayFieldSetBorderBackground::AllocateGeometry(nsDisplayListBuilder* aBuilder)
|
|
|
|
{
|
|
|
|
return new nsDisplayItemGenericImageGeometry(this, aBuilder);
|
2006-01-26 05:29:17 +03:00
|
|
|
}
|
2005-01-25 03:06:38 +03:00
|
|
|
|
2013-06-26 20:43:26 +04:00
|
|
|
void
|
|
|
|
nsDisplayFieldSetBorderBackground::ComputeInvalidationRegion(nsDisplayListBuilder* aBuilder,
|
|
|
|
const nsDisplayItemGeometry* aGeometry,
|
|
|
|
nsRegion *aInvalidRegion)
|
|
|
|
{
|
2015-02-10 10:27:40 +03:00
|
|
|
auto geometry =
|
|
|
|
static_cast<const nsDisplayItemGenericImageGeometry*>(aGeometry);
|
|
|
|
|
|
|
|
if (aBuilder->ShouldSyncDecodeImages() &&
|
|
|
|
geometry->ShouldInvalidateToSyncDecodeImages()) {
|
|
|
|
bool snap;
|
|
|
|
aInvalidRegion->Or(*aInvalidRegion, GetBounds(aBuilder, &snap));
|
|
|
|
}
|
2013-06-26 20:43:26 +04:00
|
|
|
|
|
|
|
nsDisplayItem::ComputeInvalidationRegion(aBuilder, aGeometry, aInvalidRegion);
|
|
|
|
}
|
|
|
|
|
2013-02-14 15:12:27 +04:00
|
|
|
void
|
2006-01-26 05:29:17 +03:00
|
|
|
nsFieldSetFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder,
|
|
|
|
const nsRect& aDirtyRect,
|
|
|
|
const nsDisplayListSet& aLists) {
|
|
|
|
// Paint our background and border in a special way.
|
|
|
|
// REVIEW: We don't really need to check frame emptiness here; if it's empty,
|
|
|
|
// the background/border display item won't do anything, and if it isn't empty,
|
|
|
|
// we need to paint the outline
|
2013-04-18 00:16:14 +04:00
|
|
|
if (!(GetStateBits() & NS_FRAME_IS_OVERFLOW_CONTAINER) &&
|
|
|
|
IsVisibleForPainting(aBuilder)) {
|
2013-02-17 01:51:02 +04:00
|
|
|
if (StyleBorder()->mBoxShadow) {
|
2013-02-14 15:08:08 +04:00
|
|
|
aLists.BorderBackground()->AppendNewToTop(new (aBuilder)
|
|
|
|
nsDisplayBoxShadowOuter(aBuilder, this));
|
2009-02-10 11:45:13 +03:00
|
|
|
}
|
2009-02-05 11:22:02 +03:00
|
|
|
|
2006-01-26 05:29:17 +03:00
|
|
|
// don't bother checking to see if we really have a border or background.
|
|
|
|
// we usually will have a border.
|
2013-02-14 15:08:08 +04:00
|
|
|
aLists.BorderBackground()->AppendNewToTop(new (aBuilder)
|
|
|
|
nsDisplayFieldSetBorderBackground(aBuilder, this));
|
1999-06-02 01:52:11 +04:00
|
|
|
|
2013-02-14 15:08:08 +04:00
|
|
|
DisplayOutlineUnconditional(aBuilder, aLists);
|
2006-09-19 08:26:20 +04:00
|
|
|
|
|
|
|
DO_GLOBAL_REFLOW_COUNT_DSP("nsFieldSetFrame");
|
1998-10-08 08:38:41 +04:00
|
|
|
}
|
|
|
|
|
2013-04-18 00:16:14 +04:00
|
|
|
if (GetPrevInFlow()) {
|
|
|
|
DisplayOverflowContainers(aBuilder, aDirtyRect, aLists);
|
|
|
|
}
|
|
|
|
|
2006-12-11 00:53:53 +03:00
|
|
|
nsDisplayListCollection contentDisplayItems;
|
2013-04-18 00:16:14 +04:00
|
|
|
if (nsIFrame* inner = GetInner()) {
|
|
|
|
// Collect the inner frame's display items into their own collection.
|
|
|
|
// We need to be calling BuildDisplayList on it before the legend in
|
|
|
|
// case it contains out-of-flow frames whose placeholders are in the
|
|
|
|
// legend. However, we want the inner frame's display items to be
|
|
|
|
// after the legend's display items in z-order, so we need to save them
|
2006-12-11 00:53:53 +03:00
|
|
|
// and append them later.
|
2013-04-18 00:16:14 +04:00
|
|
|
BuildDisplayListForChild(aBuilder, inner, aDirtyRect, contentDisplayItems);
|
2006-12-11 00:53:53 +03:00
|
|
|
}
|
2013-04-18 00:16:14 +04:00
|
|
|
if (nsIFrame* legend = GetLegend()) {
|
2007-12-01 11:32:51 +03:00
|
|
|
// The legend's background goes on our BlockBorderBackgrounds list because
|
|
|
|
// it's a block child.
|
|
|
|
nsDisplayListSet set(aLists, aLists.BlockBorderBackgrounds());
|
2013-04-18 00:16:14 +04:00
|
|
|
BuildDisplayListForChild(aBuilder, legend, aDirtyRect, set);
|
1998-10-08 08:38:41 +04:00
|
|
|
}
|
2013-04-18 00:16:14 +04:00
|
|
|
// Put the inner frame's display items on the master list. Note that this
|
|
|
|
// moves its border/background display items to our BorderBackground() list,
|
|
|
|
// which isn't really correct, but it's OK because the inner frame is
|
|
|
|
// anonymous and can't have its own border and background.
|
2006-12-11 00:53:53 +03:00
|
|
|
contentDisplayItems.MoveTo(aLists);
|
1998-10-08 08:38:41 +04:00
|
|
|
}
|
|
|
|
|
2015-02-10 10:27:40 +03:00
|
|
|
DrawResult
|
2011-04-08 05:04:40 +04:00
|
|
|
nsFieldSetFrame::PaintBorderBackground(nsRenderingContext& aRenderingContext,
|
2012-08-22 19:56:38 +04:00
|
|
|
nsPoint aPt, const nsRect& aDirtyRect, uint32_t aBGFlags)
|
2005-02-02 03:32:11 +03:00
|
|
|
{
|
2006-01-26 05:29:17 +03:00
|
|
|
// if the border is smaller than the legend. Move the border down
|
2015-01-19 14:43:58 +03:00
|
|
|
// to be centered on the legend.
|
2010-09-08 02:20:35 +04:00
|
|
|
// FIXME: This means border-radius clamping is incorrect; we should
|
|
|
|
// override nsIFrame::GetBorderRadii.
|
2015-01-19 14:43:58 +03:00
|
|
|
WritingMode wm = GetWritingMode();
|
2013-04-18 00:16:14 +04:00
|
|
|
nsRect rect = VisualBorderRectRelativeToSelf();
|
2015-01-19 14:43:58 +03:00
|
|
|
nscoord off = wm.IsVertical() ? rect.x : rect.y;
|
2013-04-18 00:16:14 +04:00
|
|
|
rect += aPt;
|
|
|
|
nsPresContext* presContext = PresContext();
|
2006-01-26 05:29:17 +03:00
|
|
|
|
2015-02-10 10:27:40 +03:00
|
|
|
DrawResult result =
|
|
|
|
nsCSSRendering::PaintBackground(presContext, aRenderingContext, this,
|
|
|
|
aDirtyRect, rect, aBGFlags);
|
2006-01-26 05:29:17 +03:00
|
|
|
|
2009-02-10 11:45:13 +03:00
|
|
|
nsCSSRendering::PaintBoxShadowInner(presContext, aRenderingContext,
|
|
|
|
this, rect, aDirtyRect);
|
|
|
|
|
2015-01-19 14:43:58 +03:00
|
|
|
if (nsIFrame* legend = GetLegend()) {
|
|
|
|
css::Side legendSide = wm.PhysicalSide(eLogicalSideBStart);
|
|
|
|
nscoord legendBorderWidth =
|
|
|
|
StyleBorder()->GetComputedBorderWidth(legendSide);
|
2006-01-26 05:29:17 +03:00
|
|
|
|
|
|
|
// Use the rect of the legend frame, not mLegendRect, so we draw our
|
2015-01-19 14:43:58 +03:00
|
|
|
// border under the legend's inline-start and -end margins.
|
2015-07-16 12:07:57 +03:00
|
|
|
LogicalRect legendRect(wm, legend->GetRect() + aPt, rect.Size());
|
2006-01-26 05:29:17 +03:00
|
|
|
|
2015-01-19 14:43:58 +03:00
|
|
|
// Compute clipRect using logical coordinates, so that the legend space
|
|
|
|
// will be clipped out of the appropriate physical side depending on mode.
|
2015-07-16 12:07:57 +03:00
|
|
|
LogicalRect clipRect = LogicalRect(wm, rect, rect.Size());
|
2014-10-20 13:55:48 +04:00
|
|
|
DrawTarget* drawTarget = aRenderingContext.GetDrawTarget();
|
|
|
|
gfxContext* gfx = aRenderingContext.ThebesContext();
|
|
|
|
int32_t appUnitsPerDevPixel = presContext->AppUnitsPerDevPixel();
|
|
|
|
|
2015-01-19 14:43:58 +03:00
|
|
|
// draw inline-start portion of the block-start side of the border
|
|
|
|
clipRect.ISize(wm) = legendRect.IStart(wm) - clipRect.IStart(wm);
|
|
|
|
clipRect.BSize(wm) = legendBorderWidth;
|
|
|
|
|
2014-10-20 13:55:48 +04:00
|
|
|
gfx->Save();
|
2015-07-16 12:07:57 +03:00
|
|
|
gfx->Clip(NSRectToSnappedRect(clipRect.GetPhysicalRect(wm, rect.Size()),
|
2015-01-19 14:43:58 +03:00
|
|
|
appUnitsPerDevPixel, *drawTarget));
|
2006-01-26 05:29:17 +03:00
|
|
|
nsCSSRendering::PaintBorder(presContext, aRenderingContext, this,
|
2013-02-04 20:17:20 +04:00
|
|
|
aDirtyRect, rect, mStyleContext);
|
2014-10-20 13:55:48 +04:00
|
|
|
gfx->Restore();
|
2006-01-26 05:29:17 +03:00
|
|
|
|
2015-01-19 14:43:58 +03:00
|
|
|
// draw inline-end portion of the block-start side of the border
|
2015-07-16 12:07:57 +03:00
|
|
|
clipRect = LogicalRect(wm, rect, rect.Size());
|
2015-01-19 14:43:58 +03:00
|
|
|
clipRect.ISize(wm) = clipRect.IEnd(wm) - legendRect.IEnd(wm);
|
|
|
|
clipRect.IStart(wm) = legendRect.IEnd(wm);
|
|
|
|
clipRect.BSize(wm) = legendBorderWidth;
|
2006-01-26 05:29:17 +03:00
|
|
|
|
2014-10-20 13:55:48 +04:00
|
|
|
gfx->Save();
|
2015-07-16 12:07:57 +03:00
|
|
|
gfx->Clip(NSRectToSnappedRect(clipRect.GetPhysicalRect(wm, rect.Size()),
|
2015-01-19 14:43:58 +03:00
|
|
|
appUnitsPerDevPixel, *drawTarget));
|
2006-01-26 05:29:17 +03:00
|
|
|
nsCSSRendering::PaintBorder(presContext, aRenderingContext, this,
|
2013-02-04 20:17:20 +04:00
|
|
|
aDirtyRect, rect, mStyleContext);
|
2014-10-20 13:55:48 +04:00
|
|
|
gfx->Restore();
|
2006-01-26 05:29:17 +03:00
|
|
|
|
2015-01-19 14:43:58 +03:00
|
|
|
// draw remainder of the border (omitting the block-start side)
|
2015-07-16 12:07:57 +03:00
|
|
|
clipRect = LogicalRect(wm, rect, rect.Size());
|
2015-01-19 14:43:58 +03:00
|
|
|
clipRect.BStart(wm) += legendBorderWidth;
|
2015-07-16 12:07:57 +03:00
|
|
|
clipRect.BSize(wm) = BSize(wm) - (off + legendBorderWidth);
|
2015-01-19 14:43:58 +03:00
|
|
|
|
2014-10-20 13:55:48 +04:00
|
|
|
gfx->Save();
|
2015-07-16 12:07:57 +03:00
|
|
|
gfx->Clip(NSRectToSnappedRect(clipRect.GetPhysicalRect(wm, rect.Size()),
|
2015-01-19 14:43:58 +03:00
|
|
|
appUnitsPerDevPixel, *drawTarget));
|
2006-01-26 05:29:17 +03:00
|
|
|
nsCSSRendering::PaintBorder(presContext, aRenderingContext, this,
|
2013-02-04 20:17:20 +04:00
|
|
|
aDirtyRect, rect, mStyleContext);
|
2014-10-20 13:55:48 +04:00
|
|
|
gfx->Restore();
|
2006-01-26 05:29:17 +03:00
|
|
|
} else {
|
|
|
|
nsCSSRendering::PaintBorder(presContext, aRenderingContext, this,
|
|
|
|
aDirtyRect,
|
|
|
|
nsRect(aPt, mRect.Size()),
|
2013-02-04 20:17:20 +04:00
|
|
|
mStyleContext);
|
2006-01-26 05:29:17 +03:00
|
|
|
}
|
2015-02-10 10:27:40 +03:00
|
|
|
|
|
|
|
return result;
|
2005-02-02 03:32:11 +03:00
|
|
|
}
|
1999-02-23 06:48:01 +03: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 08:38:33 +03:00
|
|
|
nscoord
|
2014-07-24 21:03:26 +04:00
|
|
|
nsFieldSetFrame::GetIntrinsicISize(nsRenderingContext* aRenderingContext,
|
|
|
|
nsLayoutUtils::IntrinsicISizeType aType)
|
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 08:38:33 +03:00
|
|
|
{
|
2008-03-14 23:48:23 +03:00
|
|
|
nscoord legendWidth = 0;
|
|
|
|
nscoord contentWidth = 0;
|
2013-04-18 00:16:14 +04:00
|
|
|
if (nsIFrame* legend = GetLegend()) {
|
2008-03-14 23:48:23 +03:00
|
|
|
legendWidth =
|
2013-04-18 00:16:14 +04:00
|
|
|
nsLayoutUtils::IntrinsicForContainer(aRenderingContext, legend, aType);
|
2008-03-14 23:48:23 +03: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 08:38:33 +03:00
|
|
|
|
2013-04-18 00:16:14 +04:00
|
|
|
if (nsIFrame* inner = GetInner()) {
|
2013-10-23 02:46:40 +04:00
|
|
|
// Ignore padding on the inner, since the padding will be applied to the
|
|
|
|
// outer instead, and the padding computed for the inner is wrong
|
|
|
|
// for percentage padding.
|
2008-03-14 23:48:23 +03:00
|
|
|
contentWidth =
|
2013-10-23 02:46:40 +04:00
|
|
|
nsLayoutUtils::IntrinsicForContainer(aRenderingContext, inner, aType,
|
|
|
|
nsLayoutUtils::IGNORE_PADDING);
|
2008-03-14 23:48:23 +03:00
|
|
|
}
|
2013-10-23 02:46:40 +04:00
|
|
|
|
2013-01-15 16:22:03 +04:00
|
|
|
return std::max(legendWidth, contentWidth);
|
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 08:38:33 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
nscoord
|
2014-07-24 21:03:25 +04:00
|
|
|
nsFieldSetFrame::GetMinISize(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 08:38:33 +03:00
|
|
|
{
|
|
|
|
nscoord result = 0;
|
|
|
|
DISPLAY_MIN_WIDTH(this, result);
|
|
|
|
|
2014-07-24 21:03:26 +04:00
|
|
|
result = GetIntrinsicISize(aRenderingContext, nsLayoutUtils::MIN_ISIZE);
|
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 08:38:33 +03:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
nscoord
|
2014-07-24 21:03:25 +04:00
|
|
|
nsFieldSetFrame::GetPrefISize(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 08:38:33 +03:00
|
|
|
{
|
|
|
|
nscoord result = 0;
|
|
|
|
DISPLAY_PREF_WIDTH(this, result);
|
|
|
|
|
2014-07-24 21:03:26 +04:00
|
|
|
result = GetIntrinsicISize(aRenderingContext, nsLayoutUtils::PREF_ISIZE);
|
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 08:38:33 +03:00
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2014-08-24 18:34:44 +04:00
|
|
|
/* virtual */
|
|
|
|
LogicalSize
|
2011-04-08 05:04:40 +04:00
|
|
|
nsFieldSetFrame::ComputeSize(nsRenderingContext *aRenderingContext,
|
2014-08-24 18:34:44 +04:00
|
|
|
WritingMode aWM,
|
|
|
|
const LogicalSize& aCBSize,
|
|
|
|
nscoord aAvailableISize,
|
|
|
|
const LogicalSize& aMargin,
|
|
|
|
const LogicalSize& aBorder,
|
|
|
|
const LogicalSize& aPadding,
|
2014-11-11 14:02:41 +03:00
|
|
|
ComputeSizeFlags aFlags)
|
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 08:38:33 +03:00
|
|
|
{
|
2014-08-24 18:34:44 +04:00
|
|
|
LogicalSize result =
|
|
|
|
nsContainerFrame::ComputeSize(aRenderingContext, aWM,
|
|
|
|
aCBSize, aAvailableISize,
|
2012-03-16 22:01:05 +04:00
|
|
|
aMargin, aBorder, aPadding, aFlags);
|
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 08:38:33 +03:00
|
|
|
|
2014-08-24 18:34:44 +04:00
|
|
|
// XXX The code below doesn't make sense if the caller's writing mode
|
|
|
|
// is orthogonal to this frame's. Not sure yet what should happen then;
|
|
|
|
// for now, just bail out.
|
|
|
|
if (aWM.IsVertical() != GetWritingMode().IsVertical()) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
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 08:38:33 +03:00
|
|
|
// Fieldsets never shrink below their min width.
|
2012-01-25 05:21:29 +04:00
|
|
|
|
|
|
|
// If we're a container for font size inflation, then shrink
|
|
|
|
// wrapping inside of us should not apply font size inflation.
|
2012-05-21 09:18:27 +04:00
|
|
|
AutoMaybeDisableFontInflation an(this);
|
2012-01-25 05:21:29 +04:00
|
|
|
|
2014-08-24 18:34:44 +04:00
|
|
|
nscoord minISize = GetMinISize(aRenderingContext);
|
|
|
|
if (minISize > result.ISize(aWM)) {
|
|
|
|
result.ISize(aWM) = minISize;
|
|
|
|
}
|
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 08:38:33 +03:00
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2014-05-13 04:47:52 +04:00
|
|
|
void
|
2005-01-25 03:06:38 +03:00
|
|
|
nsFieldSetFrame::Reflow(nsPresContext* aPresContext,
|
1999-02-23 06:48:01 +03:00
|
|
|
nsHTMLReflowMetrics& aDesiredSize,
|
1998-10-08 08:38:41 +04:00
|
|
|
const nsHTMLReflowState& aReflowState,
|
1999-02-23 06:48:01 +03:00
|
|
|
nsReflowStatus& aStatus)
|
1998-10-08 08:38:41 +04:00
|
|
|
{
|
2015-03-30 01:38:40 +03:00
|
|
|
MarkInReflow();
|
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 08:38:33 +03:00
|
|
|
DO_GLOBAL_REFLOW_COUNT("nsFieldSetFrame");
|
2001-11-14 16:40:03 +03:00
|
|
|
DISPLAY_REFLOW(aPresContext, this, aReflowState, aDesiredSize, aStatus);
|
2002-01-31 08:09:13 +03:00
|
|
|
|
2015-01-15 14:56:51 +03:00
|
|
|
NS_PRECONDITION(aReflowState.ComputedISize() != NS_INTRINSICSIZE,
|
|
|
|
"Should have a precomputed inline-size!");
|
|
|
|
|
2000-01-09 05:05:25 +03:00
|
|
|
// Initialize OUT parameter
|
2003-05-23 00:56:35 +04:00
|
|
|
aStatus = NS_FRAME_COMPLETE;
|
|
|
|
|
2013-04-18 00:16:14 +04:00
|
|
|
nsOverflowAreas ocBounds;
|
|
|
|
nsReflowStatus ocStatus = NS_FRAME_COMPLETE;
|
|
|
|
if (GetPrevInFlow()) {
|
|
|
|
ReflowOverflowContainerChildren(aPresContext, aReflowState, ocBounds, 0,
|
|
|
|
ocStatus);
|
|
|
|
}
|
|
|
|
|
2005-01-25 03:06:38 +03:00
|
|
|
//------------ Handle Incremental Reflow -----------------
|
2013-04-18 00:16:14 +04:00
|
|
|
bool reflowInner;
|
2011-09-29 10:19:26 +04:00
|
|
|
bool reflowLegend;
|
2013-04-18 00:16:14 +04:00
|
|
|
nsIFrame* legend = GetLegend();
|
|
|
|
nsIFrame* inner = GetInner();
|
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 08:38:33 +03:00
|
|
|
if (aReflowState.ShouldReflowAllKids()) {
|
2013-04-18 00:16:14 +04:00
|
|
|
reflowInner = inner != nullptr;
|
|
|
|
reflowLegend = legend != nullptr;
|
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 08:38:33 +03:00
|
|
|
} else {
|
2013-04-18 00:16:14 +04:00
|
|
|
reflowInner = inner && NS_SUBTREE_DIRTY(inner);
|
|
|
|
reflowLegend = legend && NS_SUBTREE_DIRTY(legend);
|
2005-01-25 03:06:38 +03:00
|
|
|
}
|
2000-01-09 05:05:25 +03:00
|
|
|
|
2009-05-08 05:55:22 +04:00
|
|
|
// We don't allow fieldsets to break vertically. If we did, we'd
|
|
|
|
// need logic here to push and pull overflow frames.
|
2013-10-23 02:46:40 +04:00
|
|
|
// Since we're not applying our padding in this frame, we need to add it here
|
|
|
|
// to compute the available width for our children.
|
2015-01-19 14:43:58 +03:00
|
|
|
WritingMode wm = GetWritingMode();
|
|
|
|
WritingMode innerWM = inner ? inner->GetWritingMode() : wm;
|
|
|
|
WritingMode legendWM = legend ? legend->GetWritingMode() : wm;
|
2014-07-24 12:28:46 +04:00
|
|
|
LogicalSize innerAvailSize = aReflowState.ComputedSizeWithPadding(innerWM);
|
|
|
|
LogicalSize legendAvailSize = aReflowState.ComputedSizeWithPadding(legendWM);
|
|
|
|
innerAvailSize.BSize(innerWM) = legendAvailSize.BSize(legendWM) =
|
|
|
|
NS_UNCONSTRAINEDSIZE;
|
2013-04-18 00:16:14 +04:00
|
|
|
NS_ASSERTION(!inner ||
|
2008-03-14 23:48:23 +03:00
|
|
|
nsLayoutUtils::IntrinsicForContainer(aReflowState.rendContext,
|
2013-04-18 00:16:14 +04:00
|
|
|
inner,
|
2014-07-24 21:03:26 +04:00
|
|
|
nsLayoutUtils::MIN_ISIZE) <=
|
2014-07-24 12:28:46 +04:00
|
|
|
innerAvailSize.ISize(innerWM),
|
|
|
|
"Bogus availSize.ISize; should be bigger");
|
2013-04-18 00:16:14 +04:00
|
|
|
NS_ASSERTION(!legend ||
|
2008-03-14 23:48:23 +03:00
|
|
|
nsLayoutUtils::IntrinsicForContainer(aReflowState.rendContext,
|
2013-04-18 00:16:14 +04:00
|
|
|
legend,
|
2014-07-24 21:03:26 +04:00
|
|
|
nsLayoutUtils::MIN_ISIZE) <=
|
2014-07-24 12:28:46 +04:00
|
|
|
legendAvailSize.ISize(legendWM),
|
|
|
|
"Bogus availSize.ISize; should be bigger");
|
2002-01-31 08:09:13 +03:00
|
|
|
|
2005-01-25 03:06:38 +03:00
|
|
|
// get our border and padding
|
2015-02-11 12:43:03 +03:00
|
|
|
LogicalMargin border = aReflowState.ComputedLogicalBorderPadding() -
|
|
|
|
aReflowState.ComputedLogicalPadding();
|
2000-01-09 05:05:25 +03:00
|
|
|
|
2015-01-19 14:43:58 +03:00
|
|
|
// Figure out how big the legend is if there is one.
|
2005-01-25 03:06:38 +03:00
|
|
|
// get the legend's margin
|
2015-01-19 14:43:58 +03:00
|
|
|
LogicalMargin legendMargin(wm);
|
2005-01-25 03:06:38 +03:00
|
|
|
// reflow the legend only if needed
|
2013-11-23 13:48:26 +04:00
|
|
|
Maybe<nsHTMLReflowState> legendReflowState;
|
|
|
|
if (legend) {
|
2014-08-14 02:42:15 +04:00
|
|
|
legendReflowState.emplace(aPresContext, aReflowState, legend,
|
2014-07-24 12:28:46 +04:00
|
|
|
legendAvailSize);
|
2013-11-23 13:48:26 +04: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 08:38:33 +03:00
|
|
|
if (reflowLegend) {
|
2013-12-31 17:50:31 +04:00
|
|
|
nsHTMLReflowMetrics legendDesiredSize(aReflowState);
|
2000-02-11 00:36:28 +03:00
|
|
|
|
2015-07-16 12:07:57 +03:00
|
|
|
// We'll move the legend to its proper place later, so the position
|
|
|
|
// and containerSize passed here are unimportant.
|
|
|
|
const nsSize dummyContainerSize;
|
2014-08-14 02:42:15 +04:00
|
|
|
ReflowChild(legend, aPresContext, legendDesiredSize, *legendReflowState,
|
2015-07-16 12:07:57 +03:00
|
|
|
wm, LogicalPoint(wm), dummyContainerSize,
|
|
|
|
NS_FRAME_NO_MOVE_FRAME, aStatus);
|
2000-05-16 02:51:42 +04:00
|
|
|
#ifdef NOISY_REFLOW
|
2014-07-24 12:30:07 +04:00
|
|
|
printf(" returned (%d, %d)\n",
|
|
|
|
legendDesiredSize.Width(), legendDesiredSize.Height());
|
2000-05-16 02:51:42 +04:00
|
|
|
#endif
|
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 08:38:33 +03:00
|
|
|
// figure out the legend's rectangle
|
2015-01-19 14:43:58 +03:00
|
|
|
legendMargin = legend->GetLogicalUsedMargin(wm);
|
|
|
|
mLegendRect =
|
|
|
|
LogicalRect(wm, 0, 0,
|
|
|
|
legendDesiredSize.ISize(wm) + legendMargin.IStartEnd(wm),
|
|
|
|
legendDesiredSize.BSize(wm) + legendMargin.BStartEnd(wm));
|
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 08:38:33 +03:00
|
|
|
nscoord oldSpace = mLegendSpace;
|
|
|
|
mLegendSpace = 0;
|
2015-02-11 12:43:03 +03:00
|
|
|
if (mLegendRect.BSize(wm) > border.BStart(wm)) {
|
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 08:38:33 +03:00
|
|
|
// center the border on the legend
|
2015-02-11 12:43:03 +03:00
|
|
|
mLegendSpace = mLegendRect.BSize(wm) - border.BStart(wm);
|
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 08:38:33 +03:00
|
|
|
} else {
|
2015-01-19 14:43:58 +03:00
|
|
|
mLegendRect.BStart(wm) =
|
2015-02-11 12:43:03 +03:00
|
|
|
(border.BStart(wm) - mLegendRect.BSize(wm)) / 2;
|
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 08:38:33 +03:00
|
|
|
}
|
2000-01-09 05:05:25 +03:00
|
|
|
|
2015-01-19 14:43:58 +03:00
|
|
|
// if the legend space changes then we need to reflow the
|
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 08:38:33 +03:00
|
|
|
// content area as well.
|
2013-04-18 00:16:14 +04:00
|
|
|
if (mLegendSpace != oldSpace && inner) {
|
|
|
|
reflowInner = true;
|
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 08:38:33 +03:00
|
|
|
}
|
2000-05-16 02:51:42 +04:00
|
|
|
|
2014-01-17 05:34:44 +04:00
|
|
|
FinishReflowChild(legend, aPresContext, legendDesiredSize,
|
2015-07-16 12:07:57 +03:00
|
|
|
legendReflowState.ptr(), wm, LogicalPoint(wm),
|
|
|
|
dummyContainerSize, NS_FRAME_NO_MOVE_FRAME);
|
2013-04-18 00:16:14 +04:00
|
|
|
} else if (!legend) {
|
2011-04-19 07:07:23 +04:00
|
|
|
mLegendRect.SetEmpty();
|
2005-01-25 03:06:38 +03:00
|
|
|
mLegendSpace = 0;
|
2008-07-09 19:42:44 +04:00
|
|
|
} else {
|
|
|
|
// mLegendSpace and mLegendRect haven't changed, but we need
|
|
|
|
// the used margin when placing the legend.
|
2015-01-19 14:43:58 +03:00
|
|
|
legendMargin = legend->GetLogicalUsedMargin(wm);
|
2008-07-09 19:42:44 +04:00
|
|
|
}
|
2000-01-09 05:05:25 +03:00
|
|
|
|
2015-07-16 12:07:57 +03:00
|
|
|
// This containerSize is incomplete as yet: it does not include the size
|
|
|
|
// of the |inner| frame itself.
|
|
|
|
nsSize containerSize = (LogicalSize(wm, 0, mLegendSpace) +
|
|
|
|
border.Size(wm)).GetPhysicalSize(wm);
|
2005-01-25 03:06:38 +03:00
|
|
|
// reflow the content frame only if needed
|
2013-04-18 00:16:14 +04:00
|
|
|
if (reflowInner) {
|
|
|
|
nsHTMLReflowState kidReflowState(aPresContext, aReflowState, inner,
|
2015-06-04 13:43:02 +03:00
|
|
|
innerAvailSize, nullptr,
|
2014-07-24 12:28:46 +04:00
|
|
|
nsHTMLReflowState::CALLER_WILL_INIT);
|
2013-10-23 02:46:40 +04:00
|
|
|
// Override computed padding, in case it's percentage padding
|
2015-06-04 13:43:02 +03:00
|
|
|
kidReflowState.Init(aPresContext, nullptr, nullptr,
|
2013-12-27 21:59:21 +04:00
|
|
|
&aReflowState.ComputedPhysicalPadding());
|
2007-11-08 07:04:32 +03:00
|
|
|
// Our child is "height:100%" but we actually want its height to be reduced
|
|
|
|
// by the amount of content-height the legend is eating up, unless our
|
|
|
|
// height is unconstrained (in which case the child's will be too).
|
2015-01-25 12:56:36 +03:00
|
|
|
if (aReflowState.ComputedBSize() != NS_UNCONSTRAINEDSIZE) {
|
|
|
|
kidReflowState.SetComputedBSize(
|
|
|
|
std::max(0, aReflowState.ComputedBSize() - mLegendSpace));
|
2007-11-08 07:04:32 +03: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 08:38:33 +03:00
|
|
|
|
2015-01-25 12:56:36 +03:00
|
|
|
if (aReflowState.ComputedMinBSize() > 0) {
|
|
|
|
kidReflowState.ComputedMinBSize() =
|
|
|
|
std::max(0, aReflowState.ComputedMinBSize() - mLegendSpace);
|
2013-10-23 02:46:40 +04:00
|
|
|
}
|
2008-08-08 09:18:00 +04:00
|
|
|
|
2015-01-25 12:56:36 +03:00
|
|
|
if (aReflowState.ComputedMaxBSize() != NS_UNCONSTRAINEDSIZE) {
|
|
|
|
kidReflowState.ComputedMaxBSize() =
|
|
|
|
std::max(0, aReflowState.ComputedMaxBSize() - mLegendSpace);
|
2008-08-08 09:18:00 +04:00
|
|
|
}
|
|
|
|
|
2013-12-31 17:50:31 +04:00
|
|
|
nsHTMLReflowMetrics kidDesiredSize(kidReflowState,
|
2013-12-27 21:59:52 +04:00
|
|
|
aDesiredSize.mFlags);
|
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 08:38:33 +03:00
|
|
|
// Reflow the frame
|
2013-12-27 21:59:21 +04:00
|
|
|
NS_ASSERTION(kidReflowState.ComputedPhysicalMargin() == nsMargin(0,0,0,0),
|
2007-11-08 07:04:32 +03:00
|
|
|
"Margins on anonymous fieldset child not supported!");
|
2015-02-11 12:43:03 +03:00
|
|
|
LogicalPoint pt(wm, border.IStart(wm), border.BStart(wm) + mLegendSpace);
|
|
|
|
|
2015-07-16 12:07:57 +03:00
|
|
|
// We don't know the correct containerSize until we have reflowed |inner|,
|
|
|
|
// so we use a dummy value for now; FinishReflowChild will fix the position
|
|
|
|
// if necessary.
|
|
|
|
const nsSize dummyContainerSize;
|
2013-04-18 00:16:14 +04:00
|
|
|
ReflowChild(inner, aPresContext, kidDesiredSize, kidReflowState,
|
2015-07-16 12:07:57 +03:00
|
|
|
wm, pt, dummyContainerSize, 0, aStatus);
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-10 01:02:40 +03:00
|
|
|
|
2015-07-16 12:07:57 +03:00
|
|
|
// Update containerSize to account for size of the inner frame, so that
|
|
|
|
// FinishReflowChild can position it correctly.
|
|
|
|
containerSize += kidDesiredSize.PhysicalSize();
|
2014-01-17 05:34:44 +04:00
|
|
|
FinishReflowChild(inner, aPresContext, kidDesiredSize,
|
2015-07-16 12:07:57 +03:00
|
|
|
&kidReflowState, wm, pt, containerSize, 0);
|
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 08:38:33 +03:00
|
|
|
NS_FRAME_TRACE_REFLOW_OUT("FieldSet::Reflow", aStatus);
|
2015-07-16 12:07:57 +03:00
|
|
|
} else if (inner) {
|
|
|
|
// |inner| didn't need to be reflowed but we do need to include its size
|
|
|
|
// in containerSize.
|
|
|
|
containerSize += inner->GetSize();
|
2015-02-11 12:43:03 +03:00
|
|
|
}
|
2015-01-19 14:43:58 +03:00
|
|
|
|
|
|
|
LogicalRect contentRect(wm);
|
2013-04-18 00:16:14 +04:00
|
|
|
if (inner) {
|
2013-10-23 02:46:40 +04:00
|
|
|
// We don't support margins on inner, so our content rect is just the
|
2015-07-16 12:07:57 +03:00
|
|
|
// inner's border-box. (We don't really care about container size at this
|
|
|
|
// point, as we'll figure out the actual positioning later.)
|
|
|
|
contentRect = inner->GetLogicalRect(wm, containerSize);
|
2005-01-25 03:06:38 +03:00
|
|
|
}
|
1) implememted box reflow coelescing.
2) implemented gfx scrollbars for list boxes
3) fixed progess meter to be an animated gif
4) fixed bugs 23521, 24721, 19114, 20546, 24385, 24457, 23156, 20226, 22543
-r hyatt, troy, rod
2000-02-10 01:02:40 +03:00
|
|
|
|
2013-10-23 02:46:40 +04:00
|
|
|
// Our content rect must fill up the available width
|
2015-01-19 14:43:58 +03:00
|
|
|
LogicalSize availSize = aReflowState.ComputedSizeWithPadding(wm);
|
|
|
|
if (availSize.ISize(wm) > contentRect.ISize(wm)) {
|
|
|
|
contentRect.ISize(wm) = innerAvailSize.ISize(wm);
|
2005-01-25 03:06:38 +03:00
|
|
|
}
|
|
|
|
|
2013-04-18 00:16:14 +04:00
|
|
|
if (legend) {
|
2015-01-19 14:43:58 +03:00
|
|
|
// The legend is positioned inline-wards within the inner's content rect
|
2013-10-23 02:46:40 +04:00
|
|
|
// (so that padding on the fieldset affects the legend position).
|
2015-01-19 14:43:58 +03:00
|
|
|
LogicalRect innerContentRect = contentRect;
|
|
|
|
innerContentRect.Deflate(wm, aReflowState.ComputedLogicalPadding());
|
|
|
|
// If the inner content rect is larger than the legend, we can align the
|
|
|
|
// legend.
|
|
|
|
if (innerContentRect.ISize(wm) > mLegendRect.ISize(wm)) {
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t align = static_cast<nsLegendFrame*>
|
2013-04-18 00:16:14 +04:00
|
|
|
(legend->GetContentInsertionFrame())->GetAlign();
|
2015-01-19 14:43:58 +03:00
|
|
|
if (!wm.IsBidiLTR()) {
|
|
|
|
if (align == NS_STYLE_TEXT_ALIGN_LEFT ||
|
|
|
|
align == NS_STYLE_TEXT_ALIGN_MOZ_LEFT) {
|
|
|
|
align = NS_STYLE_TEXT_ALIGN_END;
|
|
|
|
} else if (align == NS_STYLE_TEXT_ALIGN_RIGHT ||
|
|
|
|
align == NS_STYLE_TEXT_ALIGN_MOZ_RIGHT) {
|
|
|
|
align = NS_STYLE_TEXT_ALIGN_DEFAULT;
|
|
|
|
}
|
|
|
|
}
|
2013-10-23 02:46:40 +04:00
|
|
|
switch (align) {
|
2015-01-19 14:43:58 +03:00
|
|
|
case NS_STYLE_TEXT_ALIGN_END:
|
|
|
|
mLegendRect.IStart(wm) =
|
|
|
|
innerContentRect.IEnd(wm) - mLegendRect.ISize(wm);
|
2005-01-25 03:06:38 +03:00
|
|
|
break;
|
|
|
|
case NS_STYLE_TEXT_ALIGN_CENTER:
|
2015-01-19 14:43:58 +03:00
|
|
|
case NS_STYLE_TEXT_ALIGN_MOZ_CENTER:
|
2007-02-07 10:46:44 +03:00
|
|
|
// Note: rounding removed; there doesn't seem to be any need
|
2015-01-19 14:43:58 +03:00
|
|
|
mLegendRect.IStart(wm) = innerContentRect.IStart(wm) +
|
|
|
|
(innerContentRect.ISize(wm) - mLegendRect.ISize(wm)) / 2;
|
2013-10-23 02:46:40 +04:00
|
|
|
break;
|
|
|
|
default:
|
2015-01-19 14:43:58 +03:00
|
|
|
mLegendRect.IStart(wm) = innerContentRect.IStart(wm);
|
2005-01-25 03:06:38 +03:00
|
|
|
break;
|
|
|
|
}
|
2000-01-09 05:05:25 +03:00
|
|
|
} else {
|
2008-07-09 19:42:44 +04:00
|
|
|
// otherwise make place for the legend
|
2015-01-19 14:43:58 +03:00
|
|
|
mLegendRect.IStart(wm) = innerContentRect.IStart(wm);
|
|
|
|
innerContentRect.ISize(wm) = mLegendRect.ISize(wm);
|
|
|
|
contentRect.ISize(wm) = mLegendRect.ISize(wm) +
|
|
|
|
aReflowState.ComputedLogicalPadding().IStartEnd(wm);
|
2000-01-09 05:05:25 +03:00
|
|
|
}
|
2013-11-23 13:48:26 +04:00
|
|
|
|
2005-01-25 03:06:38 +03:00
|
|
|
// place the legend
|
2015-01-19 14:43:58 +03:00
|
|
|
LogicalRect actualLegendRect = mLegendRect;
|
|
|
|
actualLegendRect.Deflate(wm, legendMargin);
|
|
|
|
LogicalPoint actualLegendPos(actualLegendRect.Origin(wm));
|
2015-02-23 00:48:28 +03:00
|
|
|
|
|
|
|
// Note that legend's writing mode may be different from the fieldset's,
|
|
|
|
// so we need to convert offsets before applying them to it (bug 1134534).
|
|
|
|
LogicalMargin offsets =
|
|
|
|
legendReflowState->ComputedLogicalOffsets().
|
|
|
|
ConvertTo(wm, legendReflowState->GetWritingMode());
|
|
|
|
nsHTMLReflowState::ApplyRelativePositioning(legend, wm, offsets,
|
|
|
|
&actualLegendPos,
|
2015-07-16 12:07:57 +03:00
|
|
|
containerSize);
|
2015-02-23 00:48:28 +03:00
|
|
|
|
2015-07-16 12:07:57 +03:00
|
|
|
legend->SetPosition(wm, actualLegendPos, containerSize);
|
2013-11-23 13:48:26 +04:00
|
|
|
nsContainerFrame::PositionFrameView(legend);
|
|
|
|
nsContainerFrame::PositionChildViews(legend);
|
2005-01-25 03:06:38 +03:00
|
|
|
}
|
|
|
|
|
2014-02-15 06:00:09 +04:00
|
|
|
// Return our size and our result.
|
2015-02-11 12:43:03 +03:00
|
|
|
LogicalSize finalSize(wm, contentRect.ISize(wm) + border.IStartEnd(wm),
|
|
|
|
mLegendSpace + border.BStartEnd(wm) +
|
|
|
|
(inner ? inner->BSize(wm) : 0));
|
2015-01-19 14:43:58 +03:00
|
|
|
aDesiredSize.SetSize(wm, finalSize);
|
2010-10-07 08:25:46 +04:00
|
|
|
aDesiredSize.SetOverflowAreasToDesiredBounds();
|
2015-01-19 14:43:58 +03:00
|
|
|
|
|
|
|
if (legend) {
|
2013-04-18 00:16:14 +04:00
|
|
|
ConsiderChildOverflow(aDesiredSize.mOverflowAreas, legend);
|
2015-01-19 14:43:58 +03:00
|
|
|
}
|
|
|
|
if (inner) {
|
2013-04-18 00:16:14 +04:00
|
|
|
ConsiderChildOverflow(aDesiredSize.mOverflowAreas, inner);
|
2015-01-19 14:43:58 +03:00
|
|
|
}
|
2013-04-18 00:16:14 +04:00
|
|
|
|
|
|
|
// Merge overflow container bounds and status.
|
|
|
|
aDesiredSize.mOverflowAreas.UnionWith(ocBounds);
|
|
|
|
NS_MergeReflowStatusInto(&aStatus, ocStatus);
|
|
|
|
|
2011-05-12 03:53:34 +04:00
|
|
|
FinishReflowWithAbsoluteFrames(aPresContext, aDesiredSize, aReflowState, aStatus);
|
2005-01-25 03:06:38 +03:00
|
|
|
|
2012-08-29 09:39:31 +04:00
|
|
|
InvalidateFrame();
|
2005-01-25 03:06:38 +03:00
|
|
|
|
2002-05-29 02:50:43 +04:00
|
|
|
NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize);
|
1998-10-08 08:38:41 +04:00
|
|
|
}
|
|
|
|
|
2014-05-28 23:36:59 +04:00
|
|
|
#ifdef DEBUG
|
|
|
|
void
|
|
|
|
nsFieldSetFrame::SetInitialChildList(ChildListID aListID,
|
|
|
|
nsFrameList& aChildList)
|
|
|
|
{
|
|
|
|
nsContainerFrame::SetInitialChildList(kPrincipalList, aChildList);
|
|
|
|
MOZ_ASSERT(GetInner());
|
|
|
|
}
|
2014-05-28 23:36:58 +04:00
|
|
|
void
|
2011-08-25 00:54:30 +04:00
|
|
|
nsFieldSetFrame::AppendFrames(ChildListID aListID,
|
2009-07-30 21:23:32 +04:00
|
|
|
nsFrameList& aFrameList)
|
2000-05-15 08:12:31 +04:00
|
|
|
{
|
2013-11-06 11:06:18 +04:00
|
|
|
MOZ_CRASH("nsFieldSetFrame::AppendFrames not supported");
|
2000-05-15 08:12:31 +04:00
|
|
|
}
|
|
|
|
|
2014-05-28 23:36:58 +04:00
|
|
|
void
|
2011-08-25 00:54:30 +04:00
|
|
|
nsFieldSetFrame::InsertFrames(ChildListID aListID,
|
2005-01-25 03:06:38 +03:00
|
|
|
nsIFrame* aPrevFrame,
|
2009-07-30 21:23:32 +04:00
|
|
|
nsFrameList& aFrameList)
|
2000-05-15 08:12:31 +04:00
|
|
|
{
|
2013-11-06 11:06:18 +04:00
|
|
|
MOZ_CRASH("nsFieldSetFrame::InsertFrames not supported");
|
2000-05-15 08:12:31 +04:00
|
|
|
}
|
|
|
|
|
2014-05-28 23:36:58 +04:00
|
|
|
void
|
2011-08-25 00:54:30 +04:00
|
|
|
nsFieldSetFrame::RemoveFrame(ChildListID aListID,
|
2005-01-25 03:06:38 +03:00
|
|
|
nsIFrame* aOldFrame)
|
2000-05-15 08:12:31 +04:00
|
|
|
{
|
2013-11-06 11:06:18 +04:00
|
|
|
MOZ_CRASH("nsFieldSetFrame::RemoveFrame not supported");
|
2000-05-15 08:12:31 +04:00
|
|
|
}
|
2014-05-28 23:36:59 +04:00
|
|
|
#endif
|
2000-05-15 08:12:31 +04:00
|
|
|
|
2002-02-16 04:34:42 +03:00
|
|
|
#ifdef ACCESSIBILITY
|
2012-09-29 01:53:44 +04:00
|
|
|
a11y::AccType
|
|
|
|
nsFieldSetFrame::AccessibleType()
|
2002-02-16 04:34:42 +03:00
|
|
|
{
|
2012-12-18 05:25:52 +04:00
|
|
|
return a11y::eHTMLGroupboxType;
|
2002-02-16 04:34:42 +03:00
|
|
|
}
|
|
|
|
#endif
|
2005-01-25 03:06:38 +03:00
|
|
|
|
2009-08-03 18:42:59 +04:00
|
|
|
nscoord
|
2014-06-17 16:19:38 +04:00
|
|
|
nsFieldSetFrame::GetLogicalBaseline(WritingMode aWritingMode) const
|
2009-08-03 18:42:59 +04:00
|
|
|
{
|
2013-04-18 00:16:14 +04:00
|
|
|
nsIFrame* inner = GetInner();
|
2015-07-16 12:07:57 +03:00
|
|
|
return inner->BStart(aWritingMode, GetParent()->GetSize()) +
|
2014-06-17 16:19:38 +04:00
|
|
|
inner->GetLogicalBaseline(aWritingMode);
|
2009-08-03 18:42:59 +04:00
|
|
|
}
|