1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef nsBox_h___ 7 #define nsBox_h___ 8 9 #include "mozilla/Attributes.h" 10 #include "nsIFrame.h" 11 12 class nsITheme; 13 14 class nsBox : public nsIFrame { 15 16 public: 17 18 friend class nsIFrame; 19 20 static void Shutdown(); 21 22 virtual nsSize GetXULPrefSize(nsBoxLayoutState& aBoxLayoutState) override; 23 virtual nsSize GetXULMinSize(nsBoxLayoutState& aBoxLayoutState) override; 24 virtual nsSize GetXULMaxSize(nsBoxLayoutState& aBoxLayoutState) override; 25 virtual nscoord GetXULFlex() override; 26 virtual nscoord GetXULBoxAscent(nsBoxLayoutState& aBoxLayoutState) override; 27 28 virtual nsSize GetXULMinSizeForScrollArea(nsBoxLayoutState& aBoxLayoutState) override; 29 30 virtual bool IsXULCollapsed() override; 31 32 virtual void SetXULBounds(nsBoxLayoutState& aBoxLayoutState, const nsRect& aRect, 33 bool aRemoveOverflowAreas = false) override; 34 35 virtual nsresult GetXULBorder(nsMargin& aBorderAndPadding) override; 36 virtual nsresult GetXULPadding(nsMargin& aBorderAndPadding) override; 37 virtual nsresult GetXULMargin(nsMargin& aMargin) override; 38 GetXULVAlign()39 virtual Valignment GetXULVAlign() const override { return vAlign_Top; } GetXULHAlign()40 virtual Halignment GetXULHAlign() const override { return hAlign_Left; } 41 42 virtual nsresult XULRelayoutChildAtOrdinal(nsIFrame* aChild) override; 43 44 #ifdef DEBUG_LAYOUT 45 NS_IMETHOD GetDebugBoxAt(const nsPoint& aPoint, nsIFrame** aBox); 46 virtual nsresult GetXULDebug(bool& aDebug) override; 47 virtual nsresult SetXULDebug(nsBoxLayoutState& aState, bool aDebug) override; 48 49 virtual nsresult XULDumpBox(FILE* out) override; 50 void PropagateDebug(nsBoxLayoutState& aState); 51 #endif 52 53 nsBox(); 54 virtual ~nsBox(); 55 56 /** 57 * Returns true if this box clips its children, e.g., if this box is an sc 58 rollbox. 59 */ 60 virtual bool DoesClipChildren(); 61 virtual bool ComputesOwnOverflowArea() = 0; 62 63 nsresult SyncLayout(nsBoxLayoutState& aBoxLayoutState); 64 65 bool DoesNeedRecalc(const nsSize& aSize); 66 bool DoesNeedRecalc(nscoord aCoord); 67 void SizeNeedsRecalc(nsSize& aSize); 68 void CoordNeedsRecalc(nscoord& aCoord); 69 70 void AddBorderAndPadding(nsSize& aSize); 71 72 static void AddBorderAndPadding(nsIFrame* aBox, nsSize& aSize); 73 static void AddMargin(nsIFrame* aChild, nsSize& aSize); 74 static void AddMargin(nsSize& aSize, const nsMargin& aMargin); 75 76 static nsSize BoundsCheckMinMax(const nsSize& aMinSize, const nsSize& aMaxSize); 77 static nsSize BoundsCheck(const nsSize& aMinSize, const nsSize& aPrefSize, const nsSize& aMaxSize); 78 static nscoord BoundsCheck(nscoord aMinSize, nscoord aPrefSize, nscoord aMaxSize); 79 80 static nsIFrame* GetChildXULBox(const nsIFrame* aFrame); 81 static nsIFrame* GetNextXULBox(const nsIFrame* aFrame); 82 static nsIFrame* GetParentXULBox(const nsIFrame* aFrame); 83 84 protected: 85 86 #ifdef DEBUG_LAYOUT 87 virtual void AppendAttribute(const nsAutoString& aAttribute, const nsAutoString& aValue, nsAutoString& aResult); 88 89 virtual void ListBox(nsAutoString& aResult); 90 #endif 91 92 nsresult BeginXULLayout(nsBoxLayoutState& aState); 93 NS_IMETHOD DoXULLayout(nsBoxLayoutState& aBoxLayoutState); 94 nsresult EndXULLayout(nsBoxLayoutState& aState); 95 96 #ifdef DEBUG_LAYOUT 97 virtual void GetBoxName(nsAutoString& aName); 98 void PropagateDebug(nsBoxLayoutState& aState); 99 #endif 100 101 static bool gGotTheme; 102 static nsITheme* gTheme; 103 104 enum eMouseThrough { 105 unset, 106 never, 107 always 108 }; 109 110 private: 111 112 //nscoord mX; 113 //nscoord mY; 114 }; 115 116 #ifdef DEBUG_LAYOUT 117 #define NS_BOX_ASSERTION(box,expr,str) \ 118 if (!(expr)) { \ 119 box->XULDumpBox(stdout); \ 120 NS_DebugBreak(NSDebugAssertion, str, #expr, __FILE__, __LINE__); \ 121 } 122 #else 123 #define NS_BOX_ASSERTION(box,expr,str) {} 124 #endif 125 126 #endif 127 128