|
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 /** |
|
7 |
|
8 Eric D Vaughan |
|
9 nsBoxFrame is a frame that can lay its children out either vertically or horizontally. |
|
10 It lays them out according to a min max or preferred size. |
|
11 |
|
12 **/ |
|
13 |
|
14 #ifndef nsBoxFrame_h___ |
|
15 #define nsBoxFrame_h___ |
|
16 |
|
17 #include "mozilla/Attributes.h" |
|
18 #include "nsCOMPtr.h" |
|
19 #include "nsContainerFrame.h" |
|
20 #include "nsBoxLayout.h" |
|
21 |
|
22 class nsBoxLayoutState; |
|
23 |
|
24 nsIFrame* NS_NewBoxFrame(nsIPresShell* aPresShell, |
|
25 nsStyleContext* aContext, |
|
26 bool aIsRoot, |
|
27 nsBoxLayout* aLayoutManager); |
|
28 nsIFrame* NS_NewBoxFrame(nsIPresShell* aPresShell, |
|
29 nsStyleContext* aContext); |
|
30 |
|
31 class nsBoxFrame : public nsContainerFrame |
|
32 { |
|
33 public: |
|
34 NS_DECL_FRAMEARENA_HELPERS |
|
35 #ifdef DEBUG |
|
36 NS_DECL_QUERYFRAME_TARGET(nsBoxFrame) |
|
37 NS_DECL_QUERYFRAME |
|
38 #endif |
|
39 |
|
40 friend nsIFrame* NS_NewBoxFrame(nsIPresShell* aPresShell, |
|
41 nsStyleContext* aContext, |
|
42 bool aIsRoot, |
|
43 nsBoxLayout* aLayoutManager); |
|
44 friend nsIFrame* NS_NewBoxFrame(nsIPresShell* aPresShell, |
|
45 nsStyleContext* aContext); |
|
46 |
|
47 // gets the rect inside our border and debug border. If you wish to paint inside a box |
|
48 // call this method to get the rect so you don't draw on the debug border or outer border. |
|
49 |
|
50 virtual void SetLayoutManager(nsBoxLayout* aLayout) MOZ_OVERRIDE { mLayoutManager = aLayout; } |
|
51 virtual nsBoxLayout* GetLayoutManager() MOZ_OVERRIDE { return mLayoutManager; } |
|
52 |
|
53 virtual nsresult RelayoutChildAtOrdinal(nsBoxLayoutState& aState, nsIFrame* aChild) MOZ_OVERRIDE; |
|
54 |
|
55 virtual nsSize GetPrefSize(nsBoxLayoutState& aBoxLayoutState) MOZ_OVERRIDE; |
|
56 virtual nsSize GetMinSize(nsBoxLayoutState& aBoxLayoutState) MOZ_OVERRIDE; |
|
57 virtual nsSize GetMaxSize(nsBoxLayoutState& aBoxLayoutState) MOZ_OVERRIDE; |
|
58 virtual nscoord GetFlex(nsBoxLayoutState& aBoxLayoutState) MOZ_OVERRIDE; |
|
59 virtual nscoord GetBoxAscent(nsBoxLayoutState& aBoxLayoutState) MOZ_OVERRIDE; |
|
60 #ifdef DEBUG_LAYOUT |
|
61 virtual nsresult SetDebug(nsBoxLayoutState& aBoxLayoutState, bool aDebug) MOZ_OVERRIDE; |
|
62 virtual nsresult GetDebug(bool& aDebug) MOZ_OVERRIDE; |
|
63 #endif |
|
64 virtual Valignment GetVAlign() const MOZ_OVERRIDE { return mValign; } |
|
65 virtual Halignment GetHAlign() const MOZ_OVERRIDE { return mHalign; } |
|
66 NS_IMETHOD DoLayout(nsBoxLayoutState& aBoxLayoutState) MOZ_OVERRIDE; |
|
67 |
|
68 virtual bool ComputesOwnOverflowArea() MOZ_OVERRIDE { return false; } |
|
69 |
|
70 // ----- child and sibling operations --- |
|
71 |
|
72 // ----- public methods ------- |
|
73 |
|
74 virtual void Init(nsIContent* aContent, |
|
75 nsIFrame* aParent, |
|
76 nsIFrame* asPrevInFlow) MOZ_OVERRIDE; |
|
77 |
|
78 |
|
79 virtual nsresult AttributeChanged(int32_t aNameSpaceID, |
|
80 nsIAtom* aAttribute, |
|
81 int32_t aModType) MOZ_OVERRIDE; |
|
82 |
|
83 virtual void MarkIntrinsicWidthsDirty() MOZ_OVERRIDE; |
|
84 virtual nscoord GetMinWidth(nsRenderingContext *aRenderingContext) MOZ_OVERRIDE; |
|
85 virtual nscoord GetPrefWidth(nsRenderingContext *aRenderingContext) MOZ_OVERRIDE; |
|
86 |
|
87 virtual nsresult Reflow(nsPresContext* aPresContext, |
|
88 nsHTMLReflowMetrics& aDesiredSize, |
|
89 const nsHTMLReflowState& aReflowState, |
|
90 nsReflowStatus& aStatus) MOZ_OVERRIDE; |
|
91 |
|
92 virtual nsresult AppendFrames(ChildListID aListID, |
|
93 nsFrameList& aFrameList) MOZ_OVERRIDE; |
|
94 |
|
95 virtual nsresult InsertFrames(ChildListID aListID, |
|
96 nsIFrame* aPrevFrame, |
|
97 nsFrameList& aFrameList) MOZ_OVERRIDE; |
|
98 |
|
99 virtual nsresult RemoveFrame(ChildListID aListID, |
|
100 nsIFrame* aOldFrame) MOZ_OVERRIDE; |
|
101 |
|
102 virtual nsIFrame* GetContentInsertionFrame() MOZ_OVERRIDE; |
|
103 |
|
104 virtual nsresult SetInitialChildList(ChildListID aListID, |
|
105 nsFrameList& aChildList) MOZ_OVERRIDE; |
|
106 |
|
107 virtual void DidSetStyleContext(nsStyleContext* aOldStyleContext) MOZ_OVERRIDE; |
|
108 |
|
109 virtual nsIAtom* GetType() const MOZ_OVERRIDE; |
|
110 |
|
111 virtual bool IsFrameOfType(uint32_t aFlags) const MOZ_OVERRIDE |
|
112 { |
|
113 // record that children that are ignorable whitespace should be excluded |
|
114 // (When content was loaded via the XUL content sink, it's already |
|
115 // been excluded, but we need this for when the XUL namespace is used |
|
116 // in other MIME types or when the XUL CSS display types are used with |
|
117 // non-XUL elements.) |
|
118 |
|
119 // This is bogus, but it's what we've always done. |
|
120 // (Given that we're replaced, we need to say we're a replaced element |
|
121 // that contains a block so nsHTMLReflowState doesn't tell us to be |
|
122 // NS_INTRINSICSIZE wide.) |
|
123 return nsContainerFrame::IsFrameOfType(aFlags & |
|
124 ~(nsIFrame::eReplaced | nsIFrame::eReplacedContainsBlock | eXULBox | |
|
125 nsIFrame::eExcludesIgnorableWhitespace)); |
|
126 } |
|
127 |
|
128 #ifdef DEBUG_FRAME_DUMP |
|
129 virtual nsresult GetFrameName(nsAString& aResult) const MOZ_OVERRIDE; |
|
130 #endif |
|
131 |
|
132 virtual nsresult DidReflow(nsPresContext* aPresContext, |
|
133 const nsHTMLReflowState* aReflowState, |
|
134 nsDidReflowStatus aStatus) MOZ_OVERRIDE; |
|
135 |
|
136 virtual bool HonorPrintBackgroundSettings() MOZ_OVERRIDE; |
|
137 |
|
138 virtual ~nsBoxFrame(); |
|
139 |
|
140 nsBoxFrame(nsIPresShell* aPresShell, nsStyleContext* aContext, bool aIsRoot = false, nsBoxLayout* aLayoutManager = nullptr); |
|
141 |
|
142 // virtual so nsStackFrame, nsButtonBoxFrame, nsSliderFrame and nsMenuFrame |
|
143 // can override it |
|
144 virtual void BuildDisplayListForChildren(nsDisplayListBuilder* aBuilder, |
|
145 const nsRect& aDirtyRect, |
|
146 const nsDisplayListSet& aLists); |
|
147 |
|
148 virtual void BuildDisplayList(nsDisplayListBuilder* aBuilder, |
|
149 const nsRect& aDirtyRect, |
|
150 const nsDisplayListSet& aLists) MOZ_OVERRIDE; |
|
151 |
|
152 #ifdef DEBUG_LAYOUT |
|
153 virtual void SetDebugOnChildList(nsBoxLayoutState& aState, nsIFrame* aChild, bool aDebug); |
|
154 nsresult DisplayDebugInfoFor(nsIFrame* aBox, |
|
155 nsPoint& aPoint); |
|
156 #endif |
|
157 |
|
158 static nsresult LayoutChildAt(nsBoxLayoutState& aState, nsIFrame* aBox, const nsRect& aRect); |
|
159 |
|
160 /** |
|
161 * Utility method to redirect events on descendants to this frame. |
|
162 * Supports 'allowevents' attribute on descendant elements to allow those |
|
163 * elements and their descendants to receive events. |
|
164 */ |
|
165 void WrapListsInRedirector(nsDisplayListBuilder* aBuilder, |
|
166 const nsDisplayListSet& aIn, |
|
167 const nsDisplayListSet& aOut); |
|
168 |
|
169 /** |
|
170 * This defaults to true, but some box frames (nsListBoxBodyFrame for |
|
171 * example) don't support ordinals in their children. |
|
172 */ |
|
173 virtual bool SupportsOrdinalsInChildren(); |
|
174 |
|
175 protected: |
|
176 #ifdef DEBUG_LAYOUT |
|
177 virtual void GetBoxName(nsAutoString& aName) MOZ_OVERRIDE; |
|
178 void PaintXULDebugBackground(nsRenderingContext& aRenderingContext, |
|
179 nsPoint aPt); |
|
180 void PaintXULDebugOverlay(nsRenderingContext& aRenderingContext, |
|
181 nsPoint aPt); |
|
182 #endif |
|
183 |
|
184 virtual bool GetInitialEqualSize(bool& aEqualSize); |
|
185 virtual void GetInitialOrientation(bool& aIsHorizontal); |
|
186 virtual void GetInitialDirection(bool& aIsNormal); |
|
187 virtual bool GetInitialHAlignment(Halignment& aHalign); |
|
188 virtual bool GetInitialVAlignment(Valignment& aValign); |
|
189 virtual bool GetInitialAutoStretch(bool& aStretch); |
|
190 |
|
191 virtual void DestroyFrom(nsIFrame* aDestructRoot) MOZ_OVERRIDE; |
|
192 |
|
193 nsSize mPrefSize; |
|
194 nsSize mMinSize; |
|
195 nsSize mMaxSize; |
|
196 nscoord mFlex; |
|
197 nscoord mAscent; |
|
198 |
|
199 nsCOMPtr<nsBoxLayout> mLayoutManager; |
|
200 |
|
201 // Get the point associated with this event. Returns true if a single valid |
|
202 // point was found. Otherwise false. |
|
203 bool GetEventPoint(mozilla::WidgetGUIEvent* aEvent, nsPoint& aPoint); |
|
204 // Gets the event coordinates relative to the widget offset associated with |
|
205 // this frame. Return true if a single valid point was found. |
|
206 bool GetEventPoint(mozilla::WidgetGUIEvent* aEvent, nsIntPoint& aPoint); |
|
207 |
|
208 protected: |
|
209 void RegUnregAccessKey(bool aDoReg); |
|
210 |
|
211 NS_HIDDEN_(void) CheckBoxOrder(); |
|
212 |
|
213 private: |
|
214 |
|
215 #ifdef DEBUG_LAYOUT |
|
216 nsresult SetDebug(nsPresContext* aPresContext, bool aDebug); |
|
217 bool GetInitialDebug(bool& aDebug); |
|
218 void GetDebugPref(nsPresContext* aPresContext); |
|
219 |
|
220 void GetDebugBorder(nsMargin& aInset); |
|
221 void GetDebugPadding(nsMargin& aInset); |
|
222 void GetDebugMargin(nsMargin& aInset); |
|
223 |
|
224 nsresult GetFrameSizeWithMargin(nsIFrame* aBox, nsSize& aSize); |
|
225 |
|
226 void PixelMarginToTwips(nsPresContext* aPresContext, nsMargin& aMarginPixels); |
|
227 |
|
228 void GetValue(nsPresContext* aPresContext, const nsSize& a, const nsSize& b, char* value); |
|
229 void GetValue(nsPresContext* aPresContext, int32_t a, int32_t b, char* value); |
|
230 void DrawSpacer(nsPresContext* aPresContext, nsRenderingContext& aRenderingContext, bool aHorizontal, int32_t flex, nscoord x, nscoord y, nscoord size, nscoord spacerSize); |
|
231 void DrawLine(nsRenderingContext& aRenderingContext, bool aHorizontal, nscoord x1, nscoord y1, nscoord x2, nscoord y2); |
|
232 void FillRect(nsRenderingContext& aRenderingContext, bool aHorizontal, nscoord x, nscoord y, nscoord width, nscoord height); |
|
233 #endif |
|
234 virtual void UpdateMouseThrough(); |
|
235 |
|
236 void CacheAttributes(); |
|
237 |
|
238 // instance variables. |
|
239 Halignment mHalign; |
|
240 Valignment mValign; |
|
241 |
|
242 #ifdef DEBUG_LAYOUT |
|
243 static bool gDebug; |
|
244 static nsIFrame* mDebugChild; |
|
245 #endif |
|
246 |
|
247 }; // class nsBoxFrame |
|
248 |
|
249 #endif |
|
250 |