19ecf9d1cSIngo Weinhold /*
24a8da960SIngo Weinhold * Copyright 2006-2013, Ingo Weinhold, ingo_weinhold@gmx.de.
3e439b003SJohn Scipione * Copyright 2014 Haiku, Inc. All rights reserved.
4e439b003SJohn Scipione *
539c1cc12SIngo Weinhold * Distributed under the terms of the MIT License.
6e439b003SJohn Scipione *
7e439b003SJohn Scipione * Authors:
8e439b003SJohn Scipione * John Scipione, jscipione@gmail.com
9e439b003SJohn Scipione * Ingo Weinhold, ingo_weinhold@gmx.de
109ecf9d1cSIngo Weinhold */
119ecf9d1cSIngo Weinhold
129ecf9d1cSIngo Weinhold #include <LayoutUtils.h>
139ecf9d1cSIngo Weinhold
146ecc270fSJohn Scipione #include <algorithm>
154a8da960SIngo Weinhold
16cfa65340SAdrien Destugues #include <ClassInfo.h>
174a8da960SIngo Weinhold #include <Layout.h>
18dd5ac13bSIngo Weinhold #include <View.h>
19dd5ac13bSIngo Weinhold
204a8da960SIngo Weinhold #include "ViewLayoutItem.h"
214a8da960SIngo Weinhold
229ecf9d1cSIngo Weinhold
239ecf9d1cSIngo Weinhold // // AddSizesFloat
249ecf9d1cSIngo Weinhold // float
259ecf9d1cSIngo Weinhold // BLayoutUtils::AddSizesFloat(float a, float b)
269ecf9d1cSIngo Weinhold // {
279ecf9d1cSIngo Weinhold // float sum = a + b + 1;
289ecf9d1cSIngo Weinhold // if (sum >= B_SIZE_UNLIMITED)
299ecf9d1cSIngo Weinhold // return B_SIZE_UNLIMITED;
309ecf9d1cSIngo Weinhold //
319ecf9d1cSIngo Weinhold // return sum;
329ecf9d1cSIngo Weinhold // }
339ecf9d1cSIngo Weinhold //
349ecf9d1cSIngo Weinhold // // AddSizesFloat
359ecf9d1cSIngo Weinhold // float
369ecf9d1cSIngo Weinhold // BLayoutUtils::AddSizesFloat(float a, float b, float c)
379ecf9d1cSIngo Weinhold // {
389ecf9d1cSIngo Weinhold // return AddSizesFloat(AddSizesFloat(a, b), c);
399ecf9d1cSIngo Weinhold // }
409ecf9d1cSIngo Weinhold
41dd5ac13bSIngo Weinhold
429ecf9d1cSIngo Weinhold // AddSizesInt32
439ecf9d1cSIngo Weinhold int32
AddSizesInt32(int32 a,int32 b)449ecf9d1cSIngo Weinhold BLayoutUtils::AddSizesInt32(int32 a, int32 b)
459ecf9d1cSIngo Weinhold {
46*71bba69fSAugustin Cavalier if (a >= (int32)B_SIZE_UNLIMITED - b)
47*71bba69fSAugustin Cavalier return (int32)B_SIZE_UNLIMITED;
489ecf9d1cSIngo Weinhold return a + b;
499ecf9d1cSIngo Weinhold }
509ecf9d1cSIngo Weinhold
51dd5ac13bSIngo Weinhold
529ecf9d1cSIngo Weinhold // AddSizesInt32
539ecf9d1cSIngo Weinhold int32
AddSizesInt32(int32 a,int32 b,int32 c)549ecf9d1cSIngo Weinhold BLayoutUtils::AddSizesInt32(int32 a, int32 b, int32 c)
559ecf9d1cSIngo Weinhold {
569ecf9d1cSIngo Weinhold return AddSizesInt32(AddSizesInt32(a, b), c);
579ecf9d1cSIngo Weinhold }
589ecf9d1cSIngo Weinhold
59dd5ac13bSIngo Weinhold
609ecf9d1cSIngo Weinhold // AddDistances
619ecf9d1cSIngo Weinhold float
AddDistances(float a,float b)629ecf9d1cSIngo Weinhold BLayoutUtils::AddDistances(float a, float b)
639ecf9d1cSIngo Weinhold {
649ecf9d1cSIngo Weinhold float sum = a + b + 1;
659ecf9d1cSIngo Weinhold if (sum >= B_SIZE_UNLIMITED)
669ecf9d1cSIngo Weinhold return B_SIZE_UNLIMITED;
679ecf9d1cSIngo Weinhold
689ecf9d1cSIngo Weinhold return sum;
699ecf9d1cSIngo Weinhold }
709ecf9d1cSIngo Weinhold
71dd5ac13bSIngo Weinhold
729ecf9d1cSIngo Weinhold // AddDistances
739ecf9d1cSIngo Weinhold float
AddDistances(float a,float b,float c)749ecf9d1cSIngo Weinhold BLayoutUtils::AddDistances(float a, float b, float c)
759ecf9d1cSIngo Weinhold {
769ecf9d1cSIngo Weinhold return AddDistances(AddDistances(a, b), c);
779ecf9d1cSIngo Weinhold }
789ecf9d1cSIngo Weinhold
79dd5ac13bSIngo Weinhold
809ecf9d1cSIngo Weinhold // // SubtractSizesFloat
819ecf9d1cSIngo Weinhold // float
829ecf9d1cSIngo Weinhold // BLayoutUtils::SubtractSizesFloat(float a, float b)
839ecf9d1cSIngo Weinhold // {
849ecf9d1cSIngo Weinhold // if (a < b)
859ecf9d1cSIngo Weinhold // return -1;
869ecf9d1cSIngo Weinhold // return a - b - 1;
879ecf9d1cSIngo Weinhold // }
889ecf9d1cSIngo Weinhold
89dd5ac13bSIngo Weinhold
909ecf9d1cSIngo Weinhold // SubtractSizesInt32
919ecf9d1cSIngo Weinhold int32
SubtractSizesInt32(int32 a,int32 b)929ecf9d1cSIngo Weinhold BLayoutUtils::SubtractSizesInt32(int32 a, int32 b)
939ecf9d1cSIngo Weinhold {
949ecf9d1cSIngo Weinhold if (a < b)
959ecf9d1cSIngo Weinhold return 0;
969ecf9d1cSIngo Weinhold return a - b;
979ecf9d1cSIngo Weinhold }
989ecf9d1cSIngo Weinhold
99dd5ac13bSIngo Weinhold
1009ecf9d1cSIngo Weinhold // SubtractDistances
1019ecf9d1cSIngo Weinhold float
SubtractDistances(float a,float b)1029ecf9d1cSIngo Weinhold BLayoutUtils::SubtractDistances(float a, float b)
1039ecf9d1cSIngo Weinhold {
1049ecf9d1cSIngo Weinhold if (a < b)
1059ecf9d1cSIngo Weinhold return -1;
1069ecf9d1cSIngo Weinhold return a - b - 1;
1079ecf9d1cSIngo Weinhold }
1089ecf9d1cSIngo Weinhold
109dd5ac13bSIngo Weinhold
110dd5ac13bSIngo Weinhold // FixSizeConstraints
111dd5ac13bSIngo Weinhold void
FixSizeConstraints(float & min,float & max,float & preferred)112dd5ac13bSIngo Weinhold BLayoutUtils::FixSizeConstraints(float& min, float& max, float& preferred)
113dd5ac13bSIngo Weinhold {
114dd5ac13bSIngo Weinhold if (max < min)
115dd5ac13bSIngo Weinhold max = min;
116dd5ac13bSIngo Weinhold if (preferred < min)
117dd5ac13bSIngo Weinhold preferred = min;
118dd5ac13bSIngo Weinhold else if (preferred > max)
119dd5ac13bSIngo Weinhold preferred = max;
120dd5ac13bSIngo Weinhold }
121dd5ac13bSIngo Weinhold
122dd5ac13bSIngo Weinhold
123dd5ac13bSIngo Weinhold // FixSizeConstraints
124dd5ac13bSIngo Weinhold void
FixSizeConstraints(BSize & min,BSize & max,BSize & preferred)125dd5ac13bSIngo Weinhold BLayoutUtils::FixSizeConstraints(BSize& min, BSize& max, BSize& preferred)
126dd5ac13bSIngo Weinhold {
127dd5ac13bSIngo Weinhold FixSizeConstraints(min.width, max.width, preferred.width);
128dd5ac13bSIngo Weinhold FixSizeConstraints(min.height, max.height, preferred.height);
129dd5ac13bSIngo Weinhold }
130dd5ac13bSIngo Weinhold
131dd5ac13bSIngo Weinhold
1329ecf9d1cSIngo Weinhold // ComposeSize
1339ecf9d1cSIngo Weinhold BSize
ComposeSize(BSize size,BSize layoutSize)1349ecf9d1cSIngo Weinhold BLayoutUtils::ComposeSize(BSize size, BSize layoutSize)
1359ecf9d1cSIngo Weinhold {
1369ecf9d1cSIngo Weinhold if (!size.IsWidthSet())
1379ecf9d1cSIngo Weinhold size.width = layoutSize.width;
1389ecf9d1cSIngo Weinhold if (!size.IsHeightSet())
1399ecf9d1cSIngo Weinhold size.height = layoutSize.height;
1409ecf9d1cSIngo Weinhold
1419ecf9d1cSIngo Weinhold return size;
1429ecf9d1cSIngo Weinhold }
1439ecf9d1cSIngo Weinhold
144dd5ac13bSIngo Weinhold
1459ecf9d1cSIngo Weinhold // ComposeAlignment
1469ecf9d1cSIngo Weinhold BAlignment
ComposeAlignment(BAlignment alignment,BAlignment layoutAlignment)1479ecf9d1cSIngo Weinhold BLayoutUtils::ComposeAlignment(BAlignment alignment, BAlignment layoutAlignment)
1489ecf9d1cSIngo Weinhold {
1499ecf9d1cSIngo Weinhold if (!alignment.IsHorizontalSet())
1509ecf9d1cSIngo Weinhold alignment.horizontal = layoutAlignment.horizontal;
1519ecf9d1cSIngo Weinhold if (!alignment.IsVerticalSet())
1529ecf9d1cSIngo Weinhold alignment.vertical = layoutAlignment.vertical;
1539ecf9d1cSIngo Weinhold
1549ecf9d1cSIngo Weinhold return alignment;
1559ecf9d1cSIngo Weinhold }
1569ecf9d1cSIngo Weinhold
157dd5ac13bSIngo Weinhold
1589ecf9d1cSIngo Weinhold // AlignInFrame
159e439b003SJohn Scipione // This method restricts the dimensions of the resulting rectangle according
160e439b003SJohn Scipione // to the available size specified by maxSize.
1619ecf9d1cSIngo Weinhold BRect
AlignInFrame(BRect frame,BSize maxSize,BAlignment alignment)1629ecf9d1cSIngo Weinhold BLayoutUtils::AlignInFrame(BRect frame, BSize maxSize, BAlignment alignment)
1639ecf9d1cSIngo Weinhold {
1649ecf9d1cSIngo Weinhold // align according to the given alignment
1659ecf9d1cSIngo Weinhold if (maxSize.width < frame.Width()
1669ecf9d1cSIngo Weinhold && alignment.horizontal != B_ALIGN_USE_FULL_WIDTH) {
1679ecf9d1cSIngo Weinhold frame.left += (int)((frame.Width() - maxSize.width)
1689ecf9d1cSIngo Weinhold * alignment.RelativeHorizontal());
1699ecf9d1cSIngo Weinhold frame.right = frame.left + maxSize.width;
1709ecf9d1cSIngo Weinhold }
1719ecf9d1cSIngo Weinhold if (maxSize.height < frame.Height()
1729ecf9d1cSIngo Weinhold && alignment.vertical != B_ALIGN_USE_FULL_HEIGHT) {
1739ecf9d1cSIngo Weinhold frame.top += (int)((frame.Height() - maxSize.height)
1749ecf9d1cSIngo Weinhold * alignment.RelativeVertical());
1759ecf9d1cSIngo Weinhold frame.bottom = frame.top + maxSize.height;
1769ecf9d1cSIngo Weinhold }
1779ecf9d1cSIngo Weinhold
1789ecf9d1cSIngo Weinhold return frame;
1799ecf9d1cSIngo Weinhold }
1809ecf9d1cSIngo Weinhold
181dd5ac13bSIngo Weinhold
1829ecf9d1cSIngo Weinhold // AlignInFrame
1839ecf9d1cSIngo Weinhold void
AlignInFrame(BView * view,BRect frame)1849ecf9d1cSIngo Weinhold BLayoutUtils::AlignInFrame(BView* view, BRect frame)
1859ecf9d1cSIngo Weinhold {
186dd5ac13bSIngo Weinhold BSize maxSize = view->MaxSize();
18752e06f98SStephan Aßmus BAlignment alignment = view->LayoutAlignment();
188dd5ac13bSIngo Weinhold if (view->HasHeightForWidth()) {
189dd5ac13bSIngo Weinhold // The view has height for width, so we do the horizontal alignment
190dd5ac13bSIngo Weinhold // ourselves and restrict the height max constraint respectively.
191dd5ac13bSIngo Weinhold if (maxSize.width < frame.Width()
192dd5ac13bSIngo Weinhold && alignment.horizontal != B_ALIGN_USE_FULL_WIDTH) {
193f0fdd7b9SJohn Scipione frame.OffsetBy(floorf((frame.Width() - maxSize.width)
194dd5ac13bSIngo Weinhold * alignment.RelativeHorizontal()), 0);
195dd5ac13bSIngo Weinhold frame.right = frame.left + maxSize.width;
196dd5ac13bSIngo Weinhold }
197dd5ac13bSIngo Weinhold alignment.horizontal = B_ALIGN_USE_FULL_WIDTH;
198dd5ac13bSIngo Weinhold float minHeight;
199dd5ac13bSIngo Weinhold float maxHeight;
200dd5ac13bSIngo Weinhold float preferredHeight;
201dd5ac13bSIngo Weinhold view->GetHeightForWidth(frame.Width(), &minHeight, &maxHeight,
202dd5ac13bSIngo Weinhold &preferredHeight);
2036ecc270fSJohn Scipione frame.bottom = frame.top + std::max(frame.Height(), minHeight);
204dd5ac13bSIngo Weinhold maxSize.height = minHeight;
205dd5ac13bSIngo Weinhold }
206dd5ac13bSIngo Weinhold frame = AlignInFrame(frame, maxSize, alignment);
207dd5ac13bSIngo Weinhold view->MoveTo(frame.LeftTop());
208dd5ac13bSIngo Weinhold view->ResizeTo(frame.Size());
2099ecf9d1cSIngo Weinhold }
2109ecf9d1cSIngo Weinhold
21139c1cc12SIngo Weinhold
212e439b003SJohn Scipione // AlignOnRect
213e439b003SJohn Scipione // This method, unlike AlignInFrame(), provides the possibility to return
214e439b003SJohn Scipione // a rectangle with dimensions greater than the available size.
215e439b003SJohn Scipione BRect
AlignOnRect(BRect rect,BSize size,BAlignment alignment)216e439b003SJohn Scipione BLayoutUtils::AlignOnRect(BRect rect, BSize size, BAlignment alignment)
217e439b003SJohn Scipione {
218e439b003SJohn Scipione rect.left += (int)((rect.Width() - size.width)
219e439b003SJohn Scipione * alignment.RelativeHorizontal());
220e439b003SJohn Scipione rect.top += (int)(((rect.Height() - size.height))
221e439b003SJohn Scipione * alignment.RelativeVertical());
222e439b003SJohn Scipione rect.right = rect.left + size.width;
223e439b003SJohn Scipione rect.bottom = rect.top + size.height;
224e439b003SJohn Scipione
225e439b003SJohn Scipione return rect;
226e439b003SJohn Scipione }
227e439b003SJohn Scipione
228e439b003SJohn Scipione
22939c1cc12SIngo Weinhold /*! Offsets a rectangle's location so that it lies fully in a given rectangular
23039c1cc12SIngo Weinhold frame.
23139c1cc12SIngo Weinhold
23239c1cc12SIngo Weinhold If the rectangle is too wide/high to fully fit in the frame, its left/top
23339c1cc12SIngo Weinhold edge is offset to 0. The rect's size always remains unchanged.
23439c1cc12SIngo Weinhold
23539c1cc12SIngo Weinhold \param rect The rectangle to be moved.
23639c1cc12SIngo Weinhold \param frameSize The size of the frame the rect shall be moved into. The
23739c1cc12SIngo Weinhold frame's left-top is (0, 0).
23839c1cc12SIngo Weinhold \return The modified rect.
23939c1cc12SIngo Weinhold */
24039c1cc12SIngo Weinhold /*static*/ BRect
MoveIntoFrame(BRect rect,BSize frameSize)24139c1cc12SIngo Weinhold BLayoutUtils::MoveIntoFrame(BRect rect, BSize frameSize)
24239c1cc12SIngo Weinhold {
24339c1cc12SIngo Weinhold BPoint leftTop(rect.LeftTop());
24439c1cc12SIngo Weinhold
24539c1cc12SIngo Weinhold // enforce horizontal limits; favor left edge
24639c1cc12SIngo Weinhold if (rect.right > frameSize.width)
24739c1cc12SIngo Weinhold leftTop.x -= rect.right - frameSize.width;
248df2b4726SIngo Weinhold if (leftTop.x < 0)
24939c1cc12SIngo Weinhold leftTop.x = 0;
25039c1cc12SIngo Weinhold
25139c1cc12SIngo Weinhold // enforce vertical limits; favor top edge
25239c1cc12SIngo Weinhold if (rect.bottom > frameSize.height)
25339c1cc12SIngo Weinhold leftTop.y -= rect.bottom - frameSize.height;
254df2b4726SIngo Weinhold if (leftTop.y < 0)
25539c1cc12SIngo Weinhold leftTop.y = 0;
25639c1cc12SIngo Weinhold
25739c1cc12SIngo Weinhold return rect.OffsetToSelf(leftTop);
25839c1cc12SIngo Weinhold }
2594a8da960SIngo Weinhold
2604a8da960SIngo Weinhold
2614a8da960SIngo Weinhold /*static*/ BString
GetLayoutTreeDump(BView * view)2624a8da960SIngo Weinhold BLayoutUtils::GetLayoutTreeDump(BView* view)
2634a8da960SIngo Weinhold {
2644a8da960SIngo Weinhold BString result;
2654a8da960SIngo Weinhold _GetLayoutTreeDump(view, 0, result);
2664a8da960SIngo Weinhold return result;
2674a8da960SIngo Weinhold }
2684a8da960SIngo Weinhold
2694a8da960SIngo Weinhold
2704a8da960SIngo Weinhold /*static*/ BString
GetLayoutTreeDump(BLayoutItem * item)2714a8da960SIngo Weinhold BLayoutUtils::GetLayoutTreeDump(BLayoutItem* item)
2724a8da960SIngo Weinhold {
2734a8da960SIngo Weinhold BString result;
2744a8da960SIngo Weinhold _GetLayoutTreeDump(item, 0, false, result);
2754a8da960SIngo Weinhold return result;
2764a8da960SIngo Weinhold }
2774a8da960SIngo Weinhold
2784a8da960SIngo Weinhold
2794a8da960SIngo Weinhold /*static*/ void
_GetLayoutTreeDump(BView * view,int level,BString & _output)2804a8da960SIngo Weinhold BLayoutUtils::_GetLayoutTreeDump(BView* view, int level, BString& _output)
2814a8da960SIngo Weinhold {
2824a8da960SIngo Weinhold BString indent;
283cfa65340SAdrien Destugues indent.SetTo(' ', level * 4);
2844a8da960SIngo Weinhold
2854a8da960SIngo Weinhold if (view == NULL) {
2864a8da960SIngo Weinhold _output << indent << "<null view>\n";
2874a8da960SIngo Weinhold return;
2884a8da960SIngo Weinhold }
2894a8da960SIngo Weinhold
2904a8da960SIngo Weinhold BRect frame = view->Frame();
2914a8da960SIngo Weinhold BSize min = view->MinSize();
292a43cf8d4SAdrien Destugues BSize max = view->MaxSize();
2934a8da960SIngo Weinhold BSize preferred = view->PreferredSize();
2944a8da960SIngo Weinhold _output << BString().SetToFormat(
295cfa65340SAdrien Destugues "%sview %p (%s %s):\n"
2964a8da960SIngo Weinhold "%s frame: (%f, %f, %f, %f)\n"
2974a8da960SIngo Weinhold "%s min: (%f, %f)\n"
2984a8da960SIngo Weinhold "%s max: (%f, %f)\n"
2994a8da960SIngo Weinhold "%s pref: (%f, %f)\n",
300cfa65340SAdrien Destugues indent.String(), view, class_name(view), view->Name(),
3014a8da960SIngo Weinhold indent.String(), frame.left, frame.top, frame.right, frame.bottom,
3024a8da960SIngo Weinhold indent.String(), min.width, min.height,
3034a8da960SIngo Weinhold indent.String(), max.width, max.height,
3044a8da960SIngo Weinhold indent.String(), preferred.width, preferred.height);
3054a8da960SIngo Weinhold
3064a8da960SIngo Weinhold if (BLayout* layout = view->GetLayout()) {
3074a8da960SIngo Weinhold _GetLayoutTreeDump(layout, level, true, _output);
3084a8da960SIngo Weinhold return;
3094a8da960SIngo Weinhold }
3104a8da960SIngo Weinhold
3114a8da960SIngo Weinhold int32 count = view->CountChildren();
3124a8da960SIngo Weinhold for (int32 i = 0; i < count; i++) {
3134a8da960SIngo Weinhold _output << indent << " ---\n";
3144a8da960SIngo Weinhold _GetLayoutTreeDump(view->ChildAt(i), level + 1, _output);
3154a8da960SIngo Weinhold }
3164a8da960SIngo Weinhold }
3174a8da960SIngo Weinhold
3184a8da960SIngo Weinhold
3194a8da960SIngo Weinhold /*static*/ void
_GetLayoutTreeDump(BLayoutItem * item,int level,bool isViewLayout,BString & _output)3204a8da960SIngo Weinhold BLayoutUtils::_GetLayoutTreeDump(BLayoutItem* item, int level,
3214a8da960SIngo Weinhold bool isViewLayout, BString& _output)
3224a8da960SIngo Weinhold {
3234a8da960SIngo Weinhold if (BViewLayoutItem* viewItem = dynamic_cast<BViewLayoutItem*>(item)) {
3244a8da960SIngo Weinhold _GetLayoutTreeDump(viewItem->View(), level, _output);
3254a8da960SIngo Weinhold return;
3264a8da960SIngo Weinhold }
3274a8da960SIngo Weinhold
3284a8da960SIngo Weinhold BString indent;
329cfa65340SAdrien Destugues indent.SetTo(' ', level * 4);
3304a8da960SIngo Weinhold
3314a8da960SIngo Weinhold if (item == NULL) {
3324a8da960SIngo Weinhold _output << indent << "<null item>\n";
3334a8da960SIngo Weinhold return;
3344a8da960SIngo Weinhold }
3354a8da960SIngo Weinhold
3364a8da960SIngo Weinhold BLayout* layout = dynamic_cast<BLayout*>(item);
3374a8da960SIngo Weinhold BRect frame = item->Frame();
3384a8da960SIngo Weinhold BSize min = item->MinSize();
339a43cf8d4SAdrien Destugues BSize max = item->MaxSize();
3404a8da960SIngo Weinhold BSize preferred = item->PreferredSize();
3414a8da960SIngo Weinhold if (isViewLayout) {
3424a8da960SIngo Weinhold _output << indent << BString().SetToFormat(" [layout %p (%s)]\n",
343cfa65340SAdrien Destugues layout, class_name(layout));
3444a8da960SIngo Weinhold } else {
3454a8da960SIngo Weinhold _output << indent << BString().SetToFormat("item %p (%s):\n",
346cfa65340SAdrien Destugues item, class_name(item));
3474a8da960SIngo Weinhold }
3484a8da960SIngo Weinhold _output << BString().SetToFormat(
3494a8da960SIngo Weinhold "%s frame: (%f, %f, %f, %f)\n"
3504a8da960SIngo Weinhold "%s min: (%f, %f)\n"
3514a8da960SIngo Weinhold "%s max: (%f, %f)\n"
3524a8da960SIngo Weinhold "%s pref: (%f, %f)\n",
3534a8da960SIngo Weinhold indent.String(), frame.left, frame.top, frame.right, frame.bottom,
3544a8da960SIngo Weinhold indent.String(), min.width, min.height,
3554a8da960SIngo Weinhold indent.String(), max.width, max.height,
3564a8da960SIngo Weinhold indent.String(), preferred.width, preferred.height);
3574a8da960SIngo Weinhold
3584a8da960SIngo Weinhold if (layout == NULL)
3594a8da960SIngo Weinhold return;
3604a8da960SIngo Weinhold
3614a8da960SIngo Weinhold int32 count = layout->CountItems();
3624a8da960SIngo Weinhold for (int32 i = 0; i < count; i++) {
3634a8da960SIngo Weinhold _output << indent << " ---\n";
3644a8da960SIngo Weinhold _GetLayoutTreeDump(layout->ItemAt(i), level + 1, false, _output);
3654a8da960SIngo Weinhold }
3664a8da960SIngo Weinhold }
367