summaryrefslogtreecommitdiffstats
path: root/layout/xul/nsSprocketLayout.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--layout/xul/nsSprocketLayout.h156
1 files changed, 156 insertions, 0 deletions
diff --git a/layout/xul/nsSprocketLayout.h b/layout/xul/nsSprocketLayout.h
new file mode 100644
index 0000000000..e1e7fe377e
--- /dev/null
+++ b/layout/xul/nsSprocketLayout.h
@@ -0,0 +1,156 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* 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 nsSprocketLayout_h___
+#define nsSprocketLayout_h___
+
+#include "mozilla/Attributes.h"
+#include "nsBoxLayout.h"
+#include "nsCOMPtr.h"
+#include "nsFrameState.h"
+
+class nsIFrame;
+struct nsRect;
+
+class nsBoxSize {
+ public:
+ nsBoxSize();
+
+ nscoord pref;
+ nscoord min;
+ nscoord max;
+ nscoord flex;
+ nscoord left;
+ nscoord right;
+ bool collapsed;
+ bool bogus;
+
+ nsBoxSize* next;
+
+ void* operator new(size_t sz, nsBoxLayoutState& aState) noexcept(true);
+ void operator delete(void* aPtr, size_t sz);
+};
+
+class nsComputedBoxSize {
+ public:
+ nsComputedBoxSize();
+
+ nscoord size;
+ bool valid;
+ bool resized;
+ nsComputedBoxSize* next;
+
+ void* operator new(size_t sz, nsBoxLayoutState& aState) noexcept(true);
+ void operator delete(void* aPtr, size_t sz);
+};
+
+#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); \
+ }
+
+nsresult NS_NewSprocketLayout(nsCOMPtr<nsBoxLayout>& aNewLayout);
+
+class nsSprocketLayout : public nsBoxLayout {
+ public:
+ friend nsresult NS_NewSprocketLayout(nsCOMPtr<nsBoxLayout>& aNewLayout);
+ static void Shutdown();
+
+ NS_IMETHOD XULLayout(nsIFrame* aBox, nsBoxLayoutState& aState) override;
+
+ virtual nsSize GetXULPrefSize(nsIFrame* aBox,
+ nsBoxLayoutState& aBoxLayoutState) override;
+ virtual nsSize GetXULMinSize(nsIFrame* aBox,
+ nsBoxLayoutState& aBoxLayoutState) override;
+ virtual nsSize GetXULMaxSize(nsIFrame* aBox,
+ nsBoxLayoutState& aBoxLayoutState) override;
+ virtual nscoord GetAscent(nsIFrame* aBox,
+ nsBoxLayoutState& aBoxLayoutState) override;
+
+ nsSprocketLayout();
+
+ static bool IsXULHorizontal(nsIFrame* aBox);
+
+ static void SetLargestSize(nsSize& aSize1, const nsSize& aSize2,
+ bool aIsHorizontal);
+ static void SetSmallestSize(nsSize& aSize1, const nsSize& aSize2,
+ bool aIsHorizontal);
+
+ static void AddLargestSize(nsSize& aSize, const nsSize& aSizeToAdd,
+ bool aIsHorizontal);
+ static void AddSmallestSize(nsSize& aSize, const nsSize& aSizeToAdd,
+ bool aIsHorizontal);
+ static void AddCoord(nscoord& aCoord, nscoord aCoordToAdd);
+
+ protected:
+ void ComputeChildsNextPosition(nsIFrame* aBox, const nscoord& aCurX,
+ const nscoord& aCurY, nscoord& aNextX,
+ nscoord& aNextY, const nsRect& aChildSize);
+
+ void ChildResized(nsIFrame* aBox, nsBoxLayoutState& aState, nsIFrame* aChild,
+ nsBoxSize* aChildBoxSize,
+ nsComputedBoxSize* aChildComputedBoxSize,
+ nsBoxSize* aBoxSizes, nsComputedBoxSize* aComputedBoxSizes,
+ const nsRect& aChildLayoutRect, nsRect& aChildActualRect,
+ nsRect& aContainingRect, int32_t aFlexes, bool& aFinished);
+
+ void AlignChildren(nsIFrame* aBox, nsBoxLayoutState& aState);
+
+ virtual void ComputeChildSizes(nsIFrame* aBox, nsBoxLayoutState& aState,
+ nscoord& aGivenSize, nsBoxSize* aBoxSizes,
+ nsComputedBoxSize*& aComputedBoxSizes);
+
+ virtual void PopulateBoxSizes(nsIFrame* aBox,
+ nsBoxLayoutState& aBoxLayoutState,
+ nsBoxSize*& aBoxSizes, nscoord& aMinSize,
+ nscoord& aMaxSize, int32_t& aFlexes);
+
+ virtual void InvalidateComputedSizes(nsComputedBoxSize* aComputedBoxSizes);
+
+ virtual bool GetDefaultFlex(int32_t& aFlex);
+
+ virtual void GetFrameState(nsIFrame* aBox, nsFrameState& aState);
+
+ private:
+ // because the sprocket layout manager has no instance variables. We
+ // can make a static one and reuse it everywhere.
+ static nsBoxLayout* gInstance;
+};
+
+#endif