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/. */
|
2000-03-31 11:02:06 +04:00
|
|
|
|
|
|
|
#ifndef nsSprocketLayout_h___
|
|
|
|
#define nsSprocketLayout_h___
|
|
|
|
|
2012-09-14 20:10:08 +04:00
|
|
|
#include "mozilla/Attributes.h"
|
2000-03-31 11:02:06 +04:00
|
|
|
#include "nsBoxLayout.h"
|
2000-04-05 04:19:00 +04:00
|
|
|
#include "nsCOMPtr.h"
|
2012-08-06 07:00:57 +04:00
|
|
|
#include "nsIFrame.h"
|
2000-03-31 11:02:06 +04:00
|
|
|
|
|
|
|
class nsBoxSize
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
nsBoxSize();
|
|
|
|
|
|
|
|
nscoord pref;
|
|
|
|
nscoord min;
|
|
|
|
nscoord max;
|
|
|
|
nscoord flex;
|
|
|
|
nscoord left;
|
|
|
|
nscoord right;
|
2011-09-29 10:19:26 +04:00
|
|
|
bool collapsed;
|
|
|
|
bool bogus;
|
2000-03-31 11:02:06 +04:00
|
|
|
|
|
|
|
nsBoxSize* next;
|
|
|
|
|
2002-07-03 21:14:41 +04:00
|
|
|
void* operator new(size_t sz, nsBoxLayoutState& aState) CPP_THROW_NEW;
|
2000-04-06 03:46:48 +04:00
|
|
|
void operator delete(void* aPtr, size_t sz);
|
2000-03-31 11:02:06 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
class nsComputedBoxSize
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
nsComputedBoxSize();
|
|
|
|
|
|
|
|
nscoord size;
|
2011-09-29 10:19:26 +04:00
|
|
|
bool valid;
|
|
|
|
bool resized;
|
2000-03-31 11:02:06 +04:00
|
|
|
nsComputedBoxSize* next;
|
|
|
|
|
2002-07-03 21:14:41 +04:00
|
|
|
void* operator new(size_t sz, nsBoxLayoutState& aState) CPP_THROW_NEW;
|
2000-04-06 03:46:48 +04:00
|
|
|
void operator delete(void* aPtr, size_t sz);
|
|
|
|
};
|
2000-03-31 11:02:06 +04:00
|
|
|
|
|
|
|
#define GET_WIDTH(size, isHorizontal) (isHorizontal ? size.width : size.height)
|
|
|
|
#define GET_HEIGHT(size, isHorizontal) (isHorizontal ? size.height : size.width)
|
|
|
|
#define GET_X(size, isHorizontal) (isHorizontal ? size.x : size.y)
|
|
|
|
#define GET_Y(size, isHorizontal) (isHorizontal ? size.y : size.x)
|
|
|
|
#define GET_COORD(aX, aY, isHorizontal) (isHorizontal ? aX : aY)
|
|
|
|
|
|
|
|
#define SET_WIDTH(size, coord, isHorizontal) if (isHorizontal) { (size).width = (coord); } else { (size).height = (coord); }
|
|
|
|
#define SET_HEIGHT(size, coord, isHorizontal) if (isHorizontal) { (size).height = (coord); } else { (size).width = (coord); }
|
|
|
|
#define SET_X(size, coord, isHorizontal) if (isHorizontal) { (size).x = (coord); } else { (size).y = (coord); }
|
|
|
|
#define SET_Y(size, coord, isHorizontal) if (isHorizontal) { (size).y = (coord); } else { (size).x = (coord); }
|
|
|
|
|
|
|
|
#define SET_COORD(aX, aY, coord, isHorizontal) if (isHorizontal) { aX = (coord); } else { aY = (coord); }
|
|
|
|
|
2015-12-08 02:27:01 +03:00
|
|
|
nsresult NS_NewSprocketLayout(nsCOMPtr<nsBoxLayout>& aNewLayout);
|
2002-01-10 17:16:05 +03:00
|
|
|
|
2000-03-31 11:02:06 +04:00
|
|
|
class nsSprocketLayout : public nsBoxLayout {
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
2015-12-08 02:27:01 +03:00
|
|
|
friend nsresult NS_NewSprocketLayout(nsCOMPtr<nsBoxLayout>& aNewLayout);
|
2000-11-08 06:20:22 +03:00
|
|
|
static void Shutdown();
|
2000-03-31 11:02:06 +04:00
|
|
|
|
2016-04-21 07:28:32 +03:00
|
|
|
NS_IMETHOD XULLayout(nsIFrame* aBox, nsBoxLayoutState& aState) override;
|
2000-03-31 11:02:06 +04:00
|
|
|
|
2016-04-21 07:28:31 +03:00
|
|
|
virtual nsSize GetXULPrefSize(nsIFrame* aBox, nsBoxLayoutState& aBoxLayoutState) override;
|
2016-04-21 07:28:31 +03:00
|
|
|
virtual nsSize GetXULMinSize(nsIFrame* aBox, nsBoxLayoutState& aBoxLayoutState) override;
|
2016-04-21 07:28:31 +03:00
|
|
|
virtual nsSize GetXULMaxSize(nsIFrame* aBox, nsBoxLayoutState& aBoxLayoutState) override;
|
2015-03-21 19:28:04 +03:00
|
|
|
virtual nscoord GetAscent(nsIFrame* aBox, nsBoxLayoutState& aBoxLayoutState) override;
|
2000-03-31 11:02:06 +04:00
|
|
|
|
2000-04-05 04:19:00 +04:00
|
|
|
nsSprocketLayout();
|
2000-03-31 11:02:06 +04:00
|
|
|
|
2016-04-21 07:28:34 +03:00
|
|
|
static bool IsXULHorizontal(nsIFrame* aBox);
|
2001-10-10 01:02:29 +04:00
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
static void SetLargestSize(nsSize& aSize1, const nsSize& aSize2, bool aIsHorizontal);
|
|
|
|
static void SetSmallestSize(nsSize& aSize1, const nsSize& aSize2, bool aIsHorizontal);
|
2001-10-10 01:02:29 +04:00
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
static void AddLargestSize(nsSize& aSize, const nsSize& aSizeToAdd, bool aIsHorizontal);
|
|
|
|
static void AddSmallestSize(nsSize& aSize, const nsSize& aSizeToAdd, bool aIsHorizontal);
|
2001-10-10 01:02:29 +04:00
|
|
|
static void AddCoord(nscoord& aCoord, nscoord aCoordToAdd);
|
|
|
|
|
2000-03-31 11:02:06 +04:00
|
|
|
protected:
|
|
|
|
|
|
|
|
|
2012-08-06 07:00:57 +04:00
|
|
|
void ComputeChildsNextPosition(nsIFrame* aBox,
|
2009-10-22 04:11:25 +04:00
|
|
|
const nscoord& aCurX,
|
|
|
|
const nscoord& aCurY,
|
2009-10-22 04:05:25 +04:00
|
|
|
nscoord& aNextX,
|
|
|
|
nscoord& aNextY,
|
2009-10-22 04:11:25 +04:00
|
|
|
const nsRect& aChildSize);
|
2009-10-22 04:05:25 +04:00
|
|
|
|
2012-08-06 07:00:57 +04:00
|
|
|
void ChildResized(nsIFrame* aBox,
|
2009-10-22 04:05:25 +04:00
|
|
|
nsBoxLayoutState& aState,
|
2012-08-06 07:00:57 +04:00
|
|
|
nsIFrame* aChild,
|
2009-10-22 04:05:25 +04:00
|
|
|
nsBoxSize* aChildBoxSize,
|
|
|
|
nsComputedBoxSize* aChildComputedBoxSize,
|
|
|
|
nsBoxSize* aBoxSizes,
|
|
|
|
nsComputedBoxSize* aComputedBoxSizes,
|
|
|
|
const nsRect& aChildLayoutRect,
|
|
|
|
nsRect& aChildActualRect,
|
|
|
|
nsRect& aContainingRect,
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t aFlexes,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool& aFinished);
|
2000-03-31 11:02:06 +04:00
|
|
|
|
2012-08-06 07:00:57 +04:00
|
|
|
void AlignChildren(nsIFrame* aBox,
|
2012-10-17 01:30:37 +04:00
|
|
|
nsBoxLayoutState& aState);
|
2009-10-22 04:11:25 +04:00
|
|
|
|
2012-08-06 07:00:57 +04:00
|
|
|
virtual void ComputeChildSizes(nsIFrame* aBox,
|
2000-04-03 07:55:38 +04:00
|
|
|
nsBoxLayoutState& aState,
|
2000-03-31 11:02:06 +04:00
|
|
|
nscoord& aGivenSize,
|
|
|
|
nsBoxSize* aBoxSizes,
|
2000-04-05 10:41:27 +04:00
|
|
|
nsComputedBoxSize*& aComputedBoxSizes);
|
2000-03-31 11:02:06 +04:00
|
|
|
|
|
|
|
|
2012-08-06 07:00:57 +04:00
|
|
|
virtual void PopulateBoxSizes(nsIFrame* aBox, nsBoxLayoutState& aBoxLayoutState,
|
|
|
|
nsBoxSize*& aBoxSizes, nscoord& aMinSize,
|
2012-08-22 19:56:38 +04:00
|
|
|
nscoord& aMaxSize, int32_t& aFlexes);
|
2000-03-31 11:02:06 +04:00
|
|
|
|
|
|
|
virtual void InvalidateComputedSizes(nsComputedBoxSize* aComputedBoxSizes);
|
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
virtual bool GetDefaultFlex(int32_t& aFlex);
|
2000-03-31 11:02:06 +04:00
|
|
|
|
2012-08-06 07:00:57 +04:00
|
|
|
virtual void GetFrameState(nsIFrame* aBox, nsFrameState& aState);
|
2000-03-31 11:02:06 +04:00
|
|
|
|
2000-05-23 03:23:04 +04:00
|
|
|
private:
|
|
|
|
|
|
|
|
|
2000-04-05 04:19:00 +04:00
|
|
|
// because the sprocket layout manager has no instance variables. We
|
2011-07-11 18:05:10 +04:00
|
|
|
// can make a static one and reuse it everywhere.
|
|
|
|
static nsBoxLayout* gInstance;
|
2000-04-05 04:19:00 +04:00
|
|
|
|
2000-03-31 11:02:06 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|