1/*
2 * Copyright 2009-2015, Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef	_LAYOUT_BUILDER_H
6#define	_LAYOUT_BUILDER_H
7
8
9#include <new>
10
11#include <CardLayout.h>
12#include <CardView.h>
13#include <GridLayout.h>
14#include <GridView.h>
15#include <GroupLayout.h>
16#include <GroupView.h>
17#include <Menu.h>
18#include <MenuField.h>
19#include <MenuItem.h>
20#include <SpaceLayoutItem.h>
21#include <SplitView.h>
22#include <TextControl.h>
23#include <Window.h>
24
25
26namespace BLayoutBuilder {
27
28template<typename ParentBuilder> class Base;
29template<typename ParentBuilder = void*> class Group;
30template<typename ParentBuilder = void*> class Grid;
31template<typename ParentBuilder = void*> class Split;
32template<typename ParentBuilder = void*> class Cards;
33template<typename ParentBuilder = void*> class Menu;
34template<typename ParentBuilder = void*> class MenuItem;
35
36
37template<typename ParentBuilder>
38class Base {
39protected:
40	inline						Base();
41
42public:
43	inline	void				SetParent(ParentBuilder* parent);
44		// conceptually private
45	inline	ParentBuilder&		End();
46
47protected:
48			ParentBuilder*		fParent;
49};
50
51
52template<typename ParentBuilder>
53class Group : public Base<ParentBuilder> {
54public:
55	typedef Group<ParentBuilder>	ThisBuilder;
56	typedef Group<ThisBuilder>		GroupBuilder;
57	typedef Grid<ThisBuilder>		GridBuilder;
58	typedef Split<ThisBuilder>		SplitBuilder;
59	typedef Cards<ThisBuilder>		CardBuilder;
60
61public:
62	inline						Group(orientation orientation = B_HORIZONTAL,
63									float spacing = B_USE_DEFAULT_SPACING);
64	inline						Group(BWindow* window,
65									orientation orientation = B_HORIZONTAL,
66									float spacing = B_USE_DEFAULT_SPACING);
67	inline						Group(BView* view,
68									orientation orientation = B_HORIZONTAL,
69									float spacing = B_USE_DEFAULT_SPACING);
70	inline						Group(BGroupLayout* layout);
71	inline						Group(BGroupView* view);
72
73	inline	BGroupLayout*		Layout() const;
74	inline	BView*				View() const;
75	inline	ThisBuilder&		GetLayout(BGroupLayout** _layout);
76	inline	ThisBuilder&		GetView(BView** _view);
77
78	inline	ThisBuilder&		Add(BView* view);
79	inline	ThisBuilder&		Add(BView* view, float weight);
80	inline	ThisBuilder&		Add(BLayoutItem* item);
81	inline	ThisBuilder&		Add(BLayoutItem* item, float weight);
82
83	inline	GroupBuilder		AddGroup(orientation orientation,
84									float spacing = B_USE_DEFAULT_SPACING,
85									float weight = 1.0f);
86	inline	GroupBuilder		AddGroup(BGroupView* groupView,
87									float weight = 1.0f);
88	inline	GroupBuilder		AddGroup(BGroupLayout* groupLayout,
89									float weight = 1.0f);
90
91	inline	GridBuilder			AddGrid(float horizontal
92										= B_USE_DEFAULT_SPACING,
93									float vertical = B_USE_DEFAULT_SPACING,
94									float weight = 1.0f);
95	inline	GridBuilder			AddGrid(BGridLayout* gridLayout,
96									float weight = 1.0f);
97	inline	GridBuilder			AddGrid(BGridView* gridView,
98									float weight = 1.0f);
99
100	inline	SplitBuilder		AddSplit(orientation orientation,
101									float spacing = B_USE_DEFAULT_SPACING,
102									float weight = 1.0f);
103	inline	SplitBuilder		AddSplit(BSplitView* splitView,
104									float weight = 1.0f);
105
106	inline	CardBuilder			AddCards(float weight = 1.0f);
107	inline	CardBuilder			AddCards(BCardLayout* cardLayout,
108									float weight = 1.0f);
109	inline	CardBuilder			AddCards(BCardView* cardView,
110									float weight = 1.0f);
111
112	inline	ThisBuilder&		AddGlue(float weight = 1.0f);
113	inline	ThisBuilder&		AddStrut(float size);
114
115	inline	ThisBuilder&		SetInsets(float left, float top, float right,
116									float bottom);
117	inline	ThisBuilder&		SetInsets(float horizontal, float vertical);
118	inline	ThisBuilder&		SetInsets(float insets);
119
120	inline	ThisBuilder&		SetExplicitMinSize(BSize size);
121	inline	ThisBuilder&		SetExplicitMaxSize(BSize size);
122	inline	ThisBuilder&		SetExplicitPreferredSize(BSize size);
123	inline	ThisBuilder&		SetExplicitAlignment(BAlignment alignment);
124
125	inline						operator BGroupLayout*();
126
127private:
128			BGroupLayout*		fLayout;
129};
130
131
132template<typename ParentBuilder>
133class Grid : public Base<ParentBuilder> {
134public:
135	typedef Grid<ParentBuilder>		ThisBuilder;
136	typedef Group<ThisBuilder>		GroupBuilder;
137	typedef Grid<ThisBuilder>		GridBuilder;
138	typedef Split<ThisBuilder>		SplitBuilder;
139	typedef Cards<ThisBuilder>		CardBuilder;
140
141public:
142	inline						Grid(float horizontal
143										= B_USE_DEFAULT_SPACING,
144									float vertical = B_USE_DEFAULT_SPACING);
145	inline						Grid(BWindow* window,
146									float horizontal = B_USE_DEFAULT_SPACING,
147									float vertical = B_USE_DEFAULT_SPACING);
148	inline						Grid(BView* view,
149									float horizontal = B_USE_DEFAULT_SPACING,
150									float vertical = B_USE_DEFAULT_SPACING);
151	inline						Grid(BGridLayout* layout);
152	inline						Grid(BGridView* view);
153
154	inline	BGridLayout*		Layout() const;
155	inline	BView*				View() const;
156	inline	ThisBuilder&		GetLayout(BGridLayout** _layout);
157	inline	ThisBuilder&		GetView(BView** _view);
158
159	inline	ThisBuilder&		Add(BView* view, int32 column, int32 row,
160									int32 columnCount = 1, int32 rowCount = 1);
161	inline	ThisBuilder&		Add(BLayoutItem* item, int32 column, int32 row,
162									int32 columnCount = 1, int32 rowCount = 1);
163	inline	ThisBuilder&		AddMenuField(BMenuField* menuField,
164									int32 column, int32 row,
165									alignment labelAlignment
166										= B_ALIGN_HORIZONTAL_UNSET,
167									int32 labelColumnCount = 1,
168									int32 fieldColumnCount = 1,
169									int32 rowCount = 1);
170	inline	ThisBuilder&		AddTextControl(BTextControl* textControl,
171									int32 column, int32 row,
172									alignment labelAlignment
173										= B_ALIGN_HORIZONTAL_UNSET,
174									int32 labelColumnCount = 1,
175									int32 textColumnCount = 1,
176									int32 rowCount = 1);
177
178	inline	GroupBuilder		AddGroup(orientation orientation,
179									float spacing, int32 column, int32 row,
180									int32 columnCount = 1, int32 rowCount = 1);
181	inline	GroupBuilder		AddGroup(BGroupView* groupView,	int32 column,
182									int32 row, int32 columnCount = 1,
183									int32 rowCount = 1);
184	inline	GroupBuilder		AddGroup(BGroupLayout* groupLayout,
185									int32 column, int32 row,
186									int32 columnCount = 1, int32 rowCount = 1);
187
188	inline	GridBuilder			AddGrid(float horizontalSpacing,
189									float verticalSpacing, int32 column,
190									int32 row, int32 columnCount = 1,
191									int32 rowCount = 1);
192	inline	GridBuilder			AddGrid(BGridLayout* gridLayout,
193									int32 column, int32 row,
194									int32 columnCount = 1, int32 rowCount = 1);
195	inline	GridBuilder			AddGrid(BGridView* gridView,
196									int32 column, int32 row,
197									int32 columnCount = 1, int32 rowCount = 1);
198
199	inline	SplitBuilder		AddSplit(orientation orientation,
200									float spacing, int32 column, int32 row,
201									int32 columnCount = 1, int32 rowCount = 1);
202	inline	SplitBuilder		AddSplit(BSplitView* splitView, int32 column,
203									int32 row, int32 columnCount = 1,
204									int32 rowCount = 1);
205
206	inline	CardBuilder			AddCards(int32 column, int32 row,
207									int32 columnCount = 1, int32 rowCount = 1);
208	inline	CardBuilder			AddCards(BCardLayout* cardLayout, int32 column,
209									int32 row, int32 columnCount = 1,
210									int32 rowCount = 1);
211	inline	CardBuilder			AddCards(BCardView* cardView, int32 column,
212									int32 row, int32 columnCount = 1,
213									int32 rowCount = 1);
214
215	inline	ThisBuilder&		AddGlue(int32 column, int32 row,
216									int32 columnCount = 1, int32 rowCount = 1);
217
218	inline	ThisBuilder&		SetHorizontalSpacing(float spacing);
219	inline	ThisBuilder&		SetVerticalSpacing(float spacing);
220	inline	ThisBuilder&		SetSpacing(float horizontal, float vertical);
221
222	inline	ThisBuilder&		SetColumnWeight(int32 column, float weight);
223	inline	ThisBuilder&		SetRowWeight(int32 row, float weight);
224
225	inline	ThisBuilder&		SetInsets(float left, float top, float right,
226									float bottom);
227	inline	ThisBuilder&		SetInsets(float horizontal, float vertical);
228	inline	ThisBuilder&		SetInsets(float insets);
229
230	inline	ThisBuilder&		SetExplicitMinSize(BSize size);
231	inline	ThisBuilder&		SetExplicitMaxSize(BSize size);
232	inline	ThisBuilder&		SetExplicitPreferredSize(BSize size);
233	inline	ThisBuilder&		SetExplicitAlignment(BAlignment alignment);
234
235	inline						operator BGridLayout*();
236
237private:
238			BGridLayout*		fLayout;
239};
240
241
242template<typename ParentBuilder>
243class Split : public Base<ParentBuilder> {
244public:
245	typedef Split<ParentBuilder>	ThisBuilder;
246	typedef Group<ThisBuilder>		GroupBuilder;
247	typedef Grid<ThisBuilder>		GridBuilder;
248	typedef Split<ThisBuilder>		SplitBuilder;
249	typedef Cards<ThisBuilder>		CardBuilder;
250
251public:
252	inline						Split(orientation orientation = B_HORIZONTAL,
253									float spacing = B_USE_DEFAULT_SPACING);
254	inline						Split(BSplitView* view);
255
256	inline	BSplitView*			View() const;
257	inline	ThisBuilder&		GetView(BView** _view);
258	inline	ThisBuilder&		GetSplitView(BSplitView** _view);
259
260	inline	ThisBuilder&		Add(BView* view);
261	inline	ThisBuilder&		Add(BView* view, float weight);
262	inline	ThisBuilder&		Add(BLayoutItem* item);
263	inline	ThisBuilder&		Add(BLayoutItem* item, float weight);
264
265	inline	GroupBuilder		AddGroup(orientation orientation,
266									float spacing = B_USE_DEFAULT_SPACING,
267									float weight = 1.0f);
268	inline	GroupBuilder		AddGroup(BGroupView* groupView,
269									float weight = 1.0f);
270	inline	GroupBuilder		AddGroup(BGroupLayout* groupLayout,
271									float weight = 1.0f);
272
273	inline	GridBuilder			AddGrid(float horizontal
274											= B_USE_DEFAULT_SPACING,
275									float vertical = B_USE_DEFAULT_SPACING,
276									float weight = 1.0f);
277	inline	GridBuilder			AddGrid(BGridView* gridView,
278									float weight = 1.0f);
279	inline	GridBuilder			AddGrid(BGridLayout* gridLayout,
280									float weight = 1.0f);
281
282	inline	SplitBuilder		AddSplit(orientation orientation,
283									float spacing = B_USE_DEFAULT_SPACING,
284									float weight = 1.0f);
285	inline	SplitBuilder		AddSplit(BSplitView* splitView,
286									float weight = 1.0f);
287
288	inline	CardBuilder			AddCards(float weight = 1.0f);
289	inline	CardBuilder			AddCards(BCardLayout* cardLayout,
290									float weight = 1.0f);
291	inline	CardBuilder			AddCards(BCardView* cardView,
292									float weight = 1.0f);
293
294	inline	ThisBuilder&		SetCollapsible(bool collapsible);
295	inline	ThisBuilder&		SetCollapsible(int32 index, bool collapsible);
296	inline	ThisBuilder&		SetCollapsible(int32 first, int32 last,
297									bool collapsible);
298
299	inline	ThisBuilder&		SetInsets(float left, float top, float right,
300									float bottom);
301	inline	ThisBuilder&		SetInsets(float horizontal, float vertical);
302	inline	ThisBuilder&		SetInsets(float insets);
303
304	inline						operator BSplitView*();
305
306private:
307			BSplitView*			fView;
308};
309
310template<typename ParentBuilder>
311class Cards : public Base<ParentBuilder> {
312public:
313	typedef Cards<ParentBuilder>	ThisBuilder;
314	typedef Group<ThisBuilder>		GroupBuilder;
315	typedef Grid<ThisBuilder>		GridBuilder;
316	typedef Split<ThisBuilder>		SplitBuilder;
317	typedef Cards<ThisBuilder>		CardBuilder;
318
319public:
320	inline						Cards();
321	inline						Cards(BWindow* window);
322	inline						Cards(BView* view);
323	inline						Cards(BCardLayout* layout);
324	inline						Cards(BCardView* view);
325
326	inline	BCardLayout*		Layout() const;
327	inline	BView*				View() const;
328	inline	ThisBuilder&		GetLayout(BCardLayout** _layout);
329	inline	ThisBuilder&		GetView(BView** _view);
330
331	inline	ThisBuilder&		Add(BView* view);
332	inline	ThisBuilder&		Add(BLayoutItem* item);
333
334	inline	GroupBuilder		AddGroup(orientation orientation,
335									float spacing = B_USE_DEFAULT_SPACING);
336	inline	GroupBuilder		AddGroup(BGroupView* groupView);
337	inline	GroupBuilder		AddGroup(BGroupLayout* groupLayout);
338
339	inline	GridBuilder			AddGrid(float horizontal
340										= B_USE_DEFAULT_SPACING,
341									float vertical = B_USE_DEFAULT_SPACING);
342	inline	GridBuilder			AddGrid(BGridLayout* gridLayout);
343	inline	GridBuilder			AddGrid(BGridView* gridView);
344
345	inline	SplitBuilder		AddSplit(orientation orientation,
346									float spacing = B_USE_DEFAULT_SPACING);
347	inline	SplitBuilder		AddSplit(BSplitView* splitView);
348
349	inline	CardBuilder			AddCards();
350	inline	CardBuilder			AddCards(BCardLayout* cardLayout);
351	inline	CardBuilder			AddCards(BCardView* cardView);
352
353	inline	ThisBuilder&		SetExplicitMinSize(BSize size);
354	inline	ThisBuilder&		SetExplicitMaxSize(BSize size);
355	inline	ThisBuilder&		SetExplicitPreferredSize(BSize size);
356	inline	ThisBuilder&		SetExplicitAlignment(BAlignment alignment);
357
358	inline	ThisBuilder&		SetVisibleItem(int32 index);
359
360	inline						operator BCardLayout*();
361
362private:
363			BCardLayout*		fLayout;
364};
365
366
367template<typename ParentBuilder>
368class Menu : public Base<ParentBuilder> {
369public:
370	typedef Menu<ParentBuilder>		ThisBuilder;
371	typedef MenuItem<ParentBuilder>	ItemBuilder;
372	typedef Menu<ThisBuilder>		MenuBuilder;
373
374public:
375	inline						Menu(BMenu* menu);
376
377	inline	ThisBuilder&		GetMenu(BMenu*& _menu);
378
379	inline	ItemBuilder			AddItem(BMenuItem* item);
380	inline	ItemBuilder			AddItem(BMenu* menu);
381	inline	ItemBuilder			AddItem(const char* label, BMessage* message,
382									char shortcut = 0, uint32 modifiers = 0);
383	inline	ItemBuilder			AddItem(const char* label, uint32 messageWhat,
384									char shortcut = 0, uint32 modifiers = 0);
385
386	inline	MenuBuilder			AddMenu(BMenu* menu);
387	inline	MenuBuilder			AddMenu(const char* title,
388									menu_layout layout = B_ITEMS_IN_COLUMN);
389
390	inline	ThisBuilder&		AddSeparator();
391
392private:
393			BMenu*				fMenu;
394};
395
396
397template<typename ParentBuilder>
398class MenuItem : public Menu<ParentBuilder> {
399public:
400	typedef MenuItem<ParentBuilder>	ThisBuilder;
401
402public:
403	inline						MenuItem(ParentBuilder* parentBuilder,
404									BMenu* menu, BMenuItem* item);
405
406	inline	ThisBuilder&		GetItem(BMenuItem*& _item);
407
408	inline	ThisBuilder&		SetEnabled(bool enabled);
409
410private:
411			BMenuItem*			fMenuItem;
412};
413
414
415// #pragma mark - Base
416
417
418template<typename ParentBuilder>
419Base<ParentBuilder>::Base()
420	:
421	fParent(NULL)
422{
423}
424
425
426template<typename ParentBuilder>
427void
428Base<ParentBuilder>::SetParent(ParentBuilder* parent)
429{
430	fParent = parent;
431}
432
433
434template<typename ParentBuilder>
435ParentBuilder&
436Base<ParentBuilder>::End()
437{
438	return *fParent;
439}
440
441
442// #pragma mark - Group
443
444
445template<typename ParentBuilder>
446Group<ParentBuilder>::Group(orientation orientation, float spacing)
447	:
448	fLayout((new BGroupView(orientation, spacing))->GroupLayout())
449{
450}
451
452
453template<typename ParentBuilder>
454Group<ParentBuilder>::Group(BWindow* window, orientation orientation,
455		float spacing)
456	:
457	fLayout(new BGroupLayout(orientation, spacing))
458{
459	window->SetLayout(fLayout);
460	fLayout->Owner()->AdoptSystemColors();
461}
462
463
464template<typename ParentBuilder>
465Group<ParentBuilder>::Group(BView* view, orientation orientation,
466		float spacing)
467	:
468	fLayout(new BGroupLayout(orientation, spacing))
469{
470
471	if (view->HasDefaultColors())
472		view->AdoptSystemColors();
473
474	view->SetLayout(fLayout);
475}
476
477
478template<typename ParentBuilder>
479Group<ParentBuilder>::Group(BGroupLayout* layout)
480	:
481	fLayout(layout)
482{
483}
484
485
486template<typename ParentBuilder>
487Group<ParentBuilder>::Group(BGroupView* view)
488	:
489	fLayout(view->GroupLayout())
490{
491}
492
493
494template<typename ParentBuilder>
495BGroupLayout*
496Group<ParentBuilder>::Layout() const
497{
498	return fLayout;
499}
500
501
502template<typename ParentBuilder>
503BView*
504Group<ParentBuilder>::View() const
505{
506	return fLayout->Owner();
507}
508
509
510template<typename ParentBuilder>
511typename Group<ParentBuilder>::ThisBuilder&
512Group<ParentBuilder>::GetLayout(BGroupLayout** _layout)
513{
514	*_layout = fLayout;
515	return *this;
516}
517
518
519template<typename ParentBuilder>
520typename Group<ParentBuilder>::ThisBuilder&
521Group<ParentBuilder>::GetView(BView** _view)
522{
523	*_view = fLayout->Owner();
524	return *this;
525}
526
527
528template<typename ParentBuilder>
529typename Group<ParentBuilder>::ThisBuilder&
530Group<ParentBuilder>::Add(BView* view)
531{
532	fLayout->AddView(view);
533	return *this;
534}
535
536
537template<typename ParentBuilder>
538typename Group<ParentBuilder>::ThisBuilder&
539Group<ParentBuilder>::Add(BView* view, float weight)
540{
541	fLayout->AddView(view, weight);
542	return *this;
543}
544
545
546template<typename ParentBuilder>
547typename Group<ParentBuilder>::ThisBuilder&
548Group<ParentBuilder>::Add(BLayoutItem* item)
549{
550	fLayout->AddItem(item);
551	return *this;
552}
553
554
555template<typename ParentBuilder>
556typename Group<ParentBuilder>::ThisBuilder&
557Group<ParentBuilder>::Add(BLayoutItem* item, float weight)
558{
559	fLayout->AddItem(item, weight);
560	return *this;
561}
562
563
564template<typename ParentBuilder>
565typename Group<ParentBuilder>::GroupBuilder
566Group<ParentBuilder>::AddGroup(orientation orientation, float spacing,
567		float weight)
568{
569	GroupBuilder builder(new BGroupLayout(orientation, spacing));
570	builder.SetParent(this);
571	fLayout->AddItem(builder.Layout(), weight);
572	return builder;
573}
574
575
576template<typename ParentBuilder>
577typename Group<ParentBuilder>::GroupBuilder
578Group<ParentBuilder>::AddGroup(BGroupView* groupView, float weight)
579{
580	GroupBuilder builder(groupView);
581	builder.SetParent(this);
582	fLayout->AddItem(builder.Layout(), weight);
583	return builder;
584}
585
586
587template<typename ParentBuilder>
588typename Group<ParentBuilder>::GroupBuilder
589Group<ParentBuilder>::AddGroup(BGroupLayout* groupLayout, float weight)
590{
591	GroupBuilder builder(groupLayout);
592	builder.SetParent(this);
593	fLayout->AddItem(builder.Layout(), weight);
594	return builder;
595}
596
597
598template<typename ParentBuilder>
599typename Group<ParentBuilder>::GridBuilder
600Group<ParentBuilder>::AddGrid(float horizontalSpacing,
601	float verticalSpacing, float weight)
602{
603	GridBuilder builder(new BGridLayout(horizontalSpacing, verticalSpacing));
604	builder.SetParent(this);
605	fLayout->AddItem(builder.Layout(), weight);
606	return builder;
607}
608
609
610template<typename ParentBuilder>
611typename Group<ParentBuilder>::GridBuilder
612Group<ParentBuilder>::AddGrid(BGridLayout* gridLayout, float weight)
613{
614	GridBuilder builder(gridLayout);
615	builder.SetParent(this);
616	fLayout->AddItem(builder.Layout(), weight);
617	return builder;
618}
619
620
621template<typename ParentBuilder>
622typename Group<ParentBuilder>::GridBuilder
623Group<ParentBuilder>::AddGrid(BGridView* gridView, float weight)
624{
625	GridBuilder builder(gridView);
626	builder.SetParent(this);
627	fLayout->AddItem(builder.Layout(), weight);
628	return builder;
629}
630
631
632template<typename ParentBuilder>
633typename Group<ParentBuilder>::SplitBuilder
634Group<ParentBuilder>::AddSplit(orientation orientation, float spacing,
635		float weight)
636{
637	SplitBuilder builder(orientation, spacing);
638	builder.SetParent(this);
639	fLayout->AddView(builder.View(), weight);
640	return builder;
641}
642
643
644template<typename ParentBuilder>
645typename Group<ParentBuilder>::SplitBuilder
646Group<ParentBuilder>::AddSplit(BSplitView* splitView, float weight)
647{
648	SplitBuilder builder(splitView);
649	builder.SetParent(this);
650	fLayout->AddView(builder.View(), weight);
651	return builder;
652}
653
654
655template<typename ParentBuilder>
656typename Group<ParentBuilder>::CardBuilder
657Group<ParentBuilder>::AddCards(float weight)
658{
659	CardBuilder builder;
660	builder.SetParent(this);
661	fLayout->AddView(builder.View(), weight);
662	return builder;
663}
664
665
666template<typename ParentBuilder>
667typename Group<ParentBuilder>::CardBuilder
668Group<ParentBuilder>::AddCards(BCardLayout* cardLayout, float weight)
669{
670	CardBuilder builder(cardLayout);
671	builder.SetParent(this);
672	fLayout->AddView(builder.View(), weight);
673	return builder;
674}
675
676
677template<typename ParentBuilder>
678typename Group<ParentBuilder>::CardBuilder
679Group<ParentBuilder>::AddCards(BCardView* cardView, float weight)
680{
681	CardBuilder builder(cardView);
682	builder.SetParent(this);
683	fLayout->AddView(builder.View(), weight);
684	return builder;
685}
686
687
688template<typename ParentBuilder>
689typename Group<ParentBuilder>::ThisBuilder&
690Group<ParentBuilder>::AddGlue(float weight)
691{
692	fLayout->AddItem(BSpaceLayoutItem::CreateGlue(), weight);
693	return *this;
694}
695
696
697template<typename ParentBuilder>
698typename Group<ParentBuilder>::ThisBuilder&
699Group<ParentBuilder>::AddStrut(float size)
700{
701	if (fLayout->Orientation() == B_HORIZONTAL)
702		fLayout->AddItem(BSpaceLayoutItem::CreateHorizontalStrut(size));
703	else
704		fLayout->AddItem(BSpaceLayoutItem::CreateVerticalStrut(size));
705
706	return *this;
707}
708
709
710template<typename ParentBuilder>
711typename Group<ParentBuilder>::ThisBuilder&
712Group<ParentBuilder>::SetInsets(float left, float top, float right,
713	float bottom)
714{
715	fLayout->SetInsets(left, top, right, bottom);
716	return *this;
717}
718
719
720template<typename ParentBuilder>
721typename Group<ParentBuilder>::ThisBuilder&
722Group<ParentBuilder>::SetInsets(float horizontal, float vertical)
723{
724	fLayout->SetInsets(horizontal, vertical);
725	return *this;
726}
727
728
729template<typename ParentBuilder>
730typename Group<ParentBuilder>::ThisBuilder&
731Group<ParentBuilder>::SetInsets(float insets)
732{
733	fLayout->SetInsets(insets);
734	return *this;
735}
736
737
738template<typename ParentBuilder>
739typename Group<ParentBuilder>::ThisBuilder&
740Group<ParentBuilder>::SetExplicitMinSize(BSize size)
741{
742	fLayout->SetExplicitMinSize(size);
743	return *this;
744}
745
746
747template<typename ParentBuilder>
748typename Group<ParentBuilder>::ThisBuilder&
749Group<ParentBuilder>::SetExplicitMaxSize(BSize size)
750{
751	fLayout->SetExplicitMaxSize(size);
752	return *this;
753}
754
755
756template<typename ParentBuilder>
757typename Group<ParentBuilder>::ThisBuilder&
758Group<ParentBuilder>::SetExplicitPreferredSize(BSize size)
759{
760	fLayout->SetExplicitPreferredSize(size);
761	return *this;
762}
763
764
765template<typename ParentBuilder>
766typename Group<ParentBuilder>::ThisBuilder&
767Group<ParentBuilder>::SetExplicitAlignment(BAlignment alignment)
768{
769	fLayout->SetExplicitAlignment(alignment);
770	return *this;
771}
772
773
774template<typename ParentBuilder>
775Group<ParentBuilder>::operator BGroupLayout*()
776{
777	return fLayout;
778}
779
780
781// #pragma mark - Grid
782
783
784template<typename ParentBuilder>
785Grid<ParentBuilder>::Grid(float horizontalSpacing, float verticalSpacing)
786	:
787	fLayout((new BGridView(horizontalSpacing, verticalSpacing))->GridLayout())
788{
789}
790
791
792template<typename ParentBuilder>
793Grid<ParentBuilder>::Grid(BWindow* window, float horizontalSpacing,
794	float verticalSpacing)
795	:
796	fLayout(new BGridLayout(horizontalSpacing, verticalSpacing))
797{
798	window->SetLayout(fLayout);
799	fLayout->Owner()->AdoptSystemColors();
800}
801
802
803template<typename ParentBuilder>
804Grid<ParentBuilder>::Grid(BView* view, float horizontalSpacing,
805	float verticalSpacing)
806	:
807	fLayout(new BGridLayout(horizontalSpacing, verticalSpacing))
808{
809	if (view->HasDefaultColors())
810		view->AdoptSystemColors();
811
812	view->SetLayout(fLayout);
813}
814
815
816template<typename ParentBuilder>
817Grid<ParentBuilder>::Grid(BGridLayout* layout)
818	:
819	fLayout(layout)
820{
821}
822
823
824template<typename ParentBuilder>
825Grid<ParentBuilder>::Grid(BGridView* view)
826	:
827	fLayout(view->GridLayout())
828{
829}
830
831
832template<typename ParentBuilder>
833BGridLayout*
834Grid<ParentBuilder>::Layout() const
835{
836	return fLayout;
837}
838
839
840template<typename ParentBuilder>
841BView*
842Grid<ParentBuilder>::View() const
843{
844	return fLayout->Owner();
845}
846
847
848template<typename ParentBuilder>
849typename Grid<ParentBuilder>::ThisBuilder&
850Grid<ParentBuilder>::GetLayout(BGridLayout** _layout)
851{
852	*_layout = fLayout;
853	return *this;
854}
855
856
857template<typename ParentBuilder>
858typename Grid<ParentBuilder>::ThisBuilder&
859Grid<ParentBuilder>::GetView(BView** _view)
860{
861	*_view = fLayout->Owner();
862	return *this;
863}
864
865
866template<typename ParentBuilder>
867typename Grid<ParentBuilder>::ThisBuilder&
868Grid<ParentBuilder>::Add(BView* view, int32 column, int32 row,
869	int32 columnCount, int32 rowCount)
870{
871	fLayout->AddView(view, column, row, columnCount, rowCount);
872	return *this;
873}
874
875
876template<typename ParentBuilder>
877typename Grid<ParentBuilder>::ThisBuilder&
878Grid<ParentBuilder>::Add(BLayoutItem* item, int32 column, int32 row,
879	int32 columnCount, int32 rowCount)
880{
881	fLayout->AddItem(item, column, row, columnCount, rowCount);
882	return *this;
883}
884
885
886template<typename ParentBuilder>
887typename Grid<ParentBuilder>::ThisBuilder&
888Grid<ParentBuilder>::AddMenuField(BMenuField* menuField, int32 column,
889	int32 row, alignment labelAlignment, int32 labelColumnCount,
890	int32 fieldColumnCount, int32 rowCount)
891{
892	BLayoutItem* item = menuField->CreateLabelLayoutItem();
893	item->SetExplicitAlignment(
894		BAlignment(labelAlignment, B_ALIGN_VERTICAL_UNSET));
895	fLayout->AddItem(item, column, row, labelColumnCount, rowCount);
896	fLayout->AddItem(menuField->CreateMenuBarLayoutItem(),
897		column + labelColumnCount, row, fieldColumnCount, rowCount);
898	return *this;
899}
900
901
902template<typename ParentBuilder>
903typename Grid<ParentBuilder>::ThisBuilder&
904Grid<ParentBuilder>::AddTextControl(BTextControl* textControl, int32 column,
905	int32 row, alignment labelAlignment, int32 labelColumnCount,
906	int32 textColumnCount, int32 rowCount)
907{
908	BLayoutItem* item = textControl->CreateLabelLayoutItem();
909	item->SetExplicitAlignment(
910		BAlignment(labelAlignment, B_ALIGN_VERTICAL_UNSET));
911	fLayout->AddItem(item, column, row, labelColumnCount, rowCount);
912	fLayout->AddItem(textControl->CreateTextViewLayoutItem(),
913		column + labelColumnCount, row, textColumnCount, rowCount);
914	return *this;
915}
916
917
918template<typename ParentBuilder>
919typename Grid<ParentBuilder>::GroupBuilder
920Grid<ParentBuilder>::AddGroup(orientation orientation, float spacing,
921		int32 column, int32 row, int32 columnCount, int32 rowCount)
922{
923	GroupBuilder builder(new BGroupLayout(orientation, spacing));
924	builder.SetParent(this);
925	fLayout->AddItem(builder.Layout(), column, row, columnCount, rowCount);
926	return builder;
927}
928
929
930template<typename ParentBuilder>
931typename Grid<ParentBuilder>::GroupBuilder
932Grid<ParentBuilder>::AddGroup(BGroupView* groupView, int32 column, int32 row,
933	int32 columnCount, int32 rowCount)
934{
935	GroupBuilder builder(groupView);
936	builder.SetParent(this);
937	fLayout->AddItem(builder.Layout(), column, row, columnCount, rowCount);
938	return builder;
939}
940
941
942template<typename ParentBuilder>
943typename Grid<ParentBuilder>::GroupBuilder
944Grid<ParentBuilder>::AddGroup(BGroupLayout* groupLayout, int32 column,
945	int32 row, int32 columnCount, int32 rowCount)
946{
947	GroupBuilder builder(groupLayout);
948	builder.SetParent(this);
949	fLayout->AddItem(builder.Layout(), column, row, columnCount, rowCount);
950	return builder;
951}
952
953
954template<typename ParentBuilder>
955typename Grid<ParentBuilder>::GridBuilder
956Grid<ParentBuilder>::AddGrid(float horizontalSpacing, float verticalSpacing,
957	int32 column, int32 row, int32 columnCount, int32 rowCount)
958{
959	GridBuilder builder(new BGridLayout(horizontalSpacing, verticalSpacing));
960	builder.SetParent(this);
961	fLayout->AddItem(builder.Layout(), column, row, columnCount, rowCount);
962	return builder;
963}
964
965
966template<typename ParentBuilder>
967typename Grid<ParentBuilder>::GridBuilder
968Grid<ParentBuilder>::AddGrid(BGridView* gridView, int32 column, int32 row,
969	int32 columnCount, int32 rowCount)
970{
971	GridBuilder builder(gridView);
972	builder.SetParent(this);
973	fLayout->AddView(builder.View(), column, row, columnCount, rowCount);
974	return builder;
975}
976
977
978template<typename ParentBuilder>
979typename Grid<ParentBuilder>::SplitBuilder
980Grid<ParentBuilder>::AddSplit(orientation orientation, float spacing,
981	int32 column, int32 row, int32 columnCount, int32 rowCount)
982{
983	SplitBuilder builder(orientation, spacing);
984	builder.SetParent(this);
985	fLayout->AddView(builder.View(), column, row, columnCount, rowCount);
986	return builder;
987}
988
989
990template<typename ParentBuilder>
991typename Grid<ParentBuilder>::SplitBuilder
992Grid<ParentBuilder>::AddSplit(BSplitView* splitView, int32 column, int32 row,
993	int32 columnCount, int32 rowCount)
994{
995	SplitBuilder builder(splitView);
996	builder.SetParent(this);
997	fLayout->AddView(builder.View(), column, row, columnCount, rowCount);
998	return builder;
999}
1000
1001
1002template<typename ParentBuilder>
1003typename Grid<ParentBuilder>::CardBuilder
1004Grid<ParentBuilder>::AddCards(int32 column, int32 row, int32 columnCount,
1005	int32 rowCount)
1006{
1007	CardBuilder builder;
1008	builder.SetParent(this);
1009	fLayout->AddView(builder.View(), column, row, columnCount, rowCount);
1010	return builder;
1011}
1012
1013
1014template<typename ParentBuilder>
1015typename Grid<ParentBuilder>::CardBuilder
1016Grid<ParentBuilder>::AddCards(BCardLayout* cardLayout, int32 column, int32 row,
1017	int32 columnCount, int32 rowCount)
1018{
1019	CardBuilder builder(cardLayout);
1020	builder.SetParent(this);
1021	fLayout->AddView(builder.View(), column, row, columnCount, rowCount);
1022	return builder;
1023}
1024
1025
1026template<typename ParentBuilder>
1027typename Grid<ParentBuilder>::CardBuilder
1028Grid<ParentBuilder>::AddCards(BCardView* cardView, int32 column, int32 row,
1029	int32 columnCount, int32 rowCount)
1030{
1031	CardBuilder builder(cardView);
1032	builder.SetParent(this);
1033	fLayout->AddView(builder.View(), column, row, columnCount, rowCount);
1034	return builder;
1035}
1036
1037
1038template<typename ParentBuilder>
1039typename Grid<ParentBuilder>::ThisBuilder&
1040Grid<ParentBuilder>::AddGlue(int32 column, int32 row, int32 columnCount,
1041	int32 rowCount)
1042{
1043	fLayout->AddItem(BSpaceLayoutItem::CreateGlue(), column, row, columnCount,
1044		rowCount);
1045	return *this;
1046}
1047
1048
1049template<typename ParentBuilder>
1050typename Grid<ParentBuilder>::ThisBuilder&
1051Grid<ParentBuilder>::SetHorizontalSpacing(float spacing)
1052{
1053	fLayout->SetHorizontalSpacing(spacing);
1054	return *this;
1055}
1056
1057
1058template<typename ParentBuilder>
1059typename Grid<ParentBuilder>::ThisBuilder&
1060Grid<ParentBuilder>::SetVerticalSpacing(float spacing)
1061{
1062	fLayout->SetVerticalSpacing(spacing);
1063	return *this;
1064}
1065
1066
1067template<typename ParentBuilder>
1068typename Grid<ParentBuilder>::ThisBuilder&
1069Grid<ParentBuilder>::SetSpacing(float horizontal, float vertical)
1070{
1071	fLayout->SetSpacing(horizontal, vertical);
1072	return *this;
1073}
1074
1075
1076template<typename ParentBuilder>
1077typename Grid<ParentBuilder>::ThisBuilder&
1078Grid<ParentBuilder>::SetColumnWeight(int32 column, float weight)
1079{
1080	fLayout->SetColumnWeight(column, weight);
1081	return *this;
1082}
1083
1084
1085template<typename ParentBuilder>
1086typename Grid<ParentBuilder>::ThisBuilder&
1087Grid<ParentBuilder>::SetRowWeight(int32 row, float weight)
1088{
1089	fLayout->SetRowWeight(row, weight);
1090	return *this;
1091}
1092
1093
1094template<typename ParentBuilder>
1095typename Grid<ParentBuilder>::ThisBuilder&
1096Grid<ParentBuilder>::SetInsets(float left, float top, float right,
1097	float bottom)
1098{
1099	fLayout->SetInsets(left, top, right, bottom);
1100	return *this;
1101}
1102
1103
1104template<typename ParentBuilder>
1105typename Grid<ParentBuilder>::ThisBuilder&
1106Grid<ParentBuilder>::SetInsets(float horizontal, float vertical)
1107{
1108	fLayout->SetInsets(horizontal, vertical);
1109	return *this;
1110}
1111
1112
1113template<typename ParentBuilder>
1114typename Grid<ParentBuilder>::ThisBuilder&
1115Grid<ParentBuilder>::SetInsets(float insets)
1116{
1117	fLayout->SetInsets(insets);
1118	return *this;
1119}
1120
1121
1122template<typename ParentBuilder>
1123typename Grid<ParentBuilder>::ThisBuilder&
1124Grid<ParentBuilder>::SetExplicitMinSize(BSize size)
1125{
1126	fLayout->SetExplicitMinSize(size);
1127	return *this;
1128}
1129
1130
1131template<typename ParentBuilder>
1132typename Grid<ParentBuilder>::ThisBuilder&
1133Grid<ParentBuilder>::SetExplicitMaxSize(BSize size)
1134{
1135	fLayout->SetExplicitMaxSize(size);
1136	return *this;
1137}
1138
1139
1140template<typename ParentBuilder>
1141typename Grid<ParentBuilder>::ThisBuilder&
1142Grid<ParentBuilder>::SetExplicitPreferredSize(BSize size)
1143{
1144	fLayout->SetExplicitPreferredSize(size);
1145	return *this;
1146}
1147
1148
1149template<typename ParentBuilder>
1150typename Grid<ParentBuilder>::ThisBuilder&
1151Grid<ParentBuilder>::SetExplicitAlignment(BAlignment alignment)
1152{
1153	fLayout->SetExplicitAlignment(alignment);
1154	return *this;
1155}
1156
1157
1158template<typename ParentBuilder>
1159Grid<ParentBuilder>::operator BGridLayout*()
1160{
1161	return fLayout;
1162}
1163
1164
1165// #pragma mark - Split
1166
1167
1168template<typename ParentBuilder>
1169Split<ParentBuilder>::Split(orientation orientation, float spacing)
1170	:
1171	fView(new BSplitView(orientation, spacing))
1172{
1173}
1174
1175
1176template<typename ParentBuilder>
1177Split<ParentBuilder>::Split(BSplitView* view)
1178	:
1179	fView(view)
1180{
1181}
1182
1183
1184template<typename ParentBuilder>
1185BSplitView*
1186Split<ParentBuilder>::View() const
1187{
1188	return fView;
1189}
1190
1191
1192template<typename ParentBuilder>
1193typename Split<ParentBuilder>::ThisBuilder&
1194Split<ParentBuilder>::GetView(BView** _view)
1195{
1196	*_view = fView;
1197	return *this;
1198}
1199
1200
1201template<typename ParentBuilder>
1202typename Split<ParentBuilder>::ThisBuilder&
1203Split<ParentBuilder>::GetSplitView(BSplitView** _view)
1204{
1205	*_view = fView;
1206	return *this;
1207}
1208
1209
1210template<typename ParentBuilder>
1211typename Split<ParentBuilder>::ThisBuilder&
1212Split<ParentBuilder>::Add(BView* view)
1213{
1214	fView->AddChild(view);
1215	return *this;
1216}
1217
1218
1219template<typename ParentBuilder>
1220typename Split<ParentBuilder>::ThisBuilder&
1221Split<ParentBuilder>::Add(BView* view, float weight)
1222{
1223	fView->AddChild(view, weight);
1224	return *this;
1225}
1226
1227
1228template<typename ParentBuilder>
1229typename Split<ParentBuilder>::ThisBuilder&
1230Split<ParentBuilder>::Add(BLayoutItem* item)
1231{
1232	fView->AddChild(item);
1233	return *this;
1234}
1235
1236
1237template<typename ParentBuilder>
1238typename Split<ParentBuilder>::ThisBuilder&
1239Split<ParentBuilder>::Add(BLayoutItem* item, float weight)
1240{
1241	fView->AddChild(item, weight);
1242	return *this;
1243}
1244
1245
1246template<typename ParentBuilder>
1247typename Split<ParentBuilder>::GroupBuilder
1248Split<ParentBuilder>::AddGroup(orientation orientation, float spacing,
1249		float weight)
1250{
1251	GroupBuilder builder(new BGroupLayout(orientation, spacing));
1252	builder.SetParent(this);
1253	fView->AddChild(builder.Layout(), weight);
1254	return builder;
1255}
1256
1257
1258template<typename ParentBuilder>
1259typename Split<ParentBuilder>::GroupBuilder
1260Split<ParentBuilder>::AddGroup(BGroupView* groupView, float weight)
1261{
1262	GroupBuilder builder(groupView);
1263	builder.SetParent(this);
1264	fView->AddChild(builder.Layout(), weight);
1265	return builder;
1266}
1267
1268
1269template<typename ParentBuilder>
1270typename Split<ParentBuilder>::GroupBuilder
1271Split<ParentBuilder>::AddGroup(BGroupLayout* groupLayout, float weight)
1272{
1273	GroupBuilder builder(groupLayout);
1274	builder.SetParent(this);
1275	fView->AddChild(builder.Layout(), weight);
1276	return builder;
1277}
1278
1279
1280template<typename ParentBuilder>
1281typename Split<ParentBuilder>::GridBuilder
1282Split<ParentBuilder>::AddGrid(float horizontalSpacing, float verticalSpacing,
1283	float weight)
1284{
1285	GridBuilder builder(new BGridLayout(horizontalSpacing, verticalSpacing));
1286	builder.SetParent(this);
1287	fView->AddChild(builder.Layout(), weight);
1288	return builder;
1289}
1290
1291
1292template<typename ParentBuilder>
1293typename Split<ParentBuilder>::GridBuilder
1294Split<ParentBuilder>::AddGrid(BGridView* gridView, float weight)
1295{
1296	GridBuilder builder(gridView);
1297	builder.SetParent(this);
1298	fView->AddChild(builder.Layout(), weight);
1299	return builder;
1300}
1301
1302
1303template<typename ParentBuilder>
1304typename Split<ParentBuilder>::GridBuilder
1305Split<ParentBuilder>::AddGrid(BGridLayout* layout, float weight)
1306{
1307	GridBuilder builder(layout);
1308	builder.SetParent(this);
1309	fView->AddChild(builder.Layout(), weight);
1310	return builder;
1311}
1312
1313
1314template<typename ParentBuilder>
1315typename Split<ParentBuilder>::SplitBuilder
1316Split<ParentBuilder>::AddSplit(orientation orientation, float spacing,
1317		float weight)
1318{
1319	SplitBuilder builder(orientation, spacing);
1320	builder.SetParent(this);
1321	fView->AddChild(builder.View(), weight);
1322	return builder;
1323}
1324
1325
1326template<typename ParentBuilder>
1327typename Split<ParentBuilder>::CardBuilder
1328Split<ParentBuilder>::AddCards(float weight)
1329{
1330	CardBuilder builder;
1331	builder.SetParent(this);
1332	fView->AddChild(builder.View(), weight);
1333	return builder;
1334}
1335
1336
1337template<typename ParentBuilder>
1338typename Split<ParentBuilder>::CardBuilder
1339Split<ParentBuilder>::AddCards(BCardLayout* cardLayout, float weight)
1340{
1341	CardBuilder builder(cardLayout);
1342	builder.SetParent(this);
1343	fView->AddChild(builder.View(), weight);
1344	return builder;
1345}
1346
1347
1348template<typename ParentBuilder>
1349typename Split<ParentBuilder>::CardBuilder
1350Split<ParentBuilder>::AddCards(BCardView* cardView, float weight)
1351{
1352	CardBuilder builder(cardView);
1353	builder.SetParent(this);
1354	fView->AddChild(builder.View(), weight);
1355	return builder;
1356}
1357
1358
1359template<typename ParentBuilder>
1360typename Split<ParentBuilder>::ThisBuilder&
1361Split<ParentBuilder>::SetCollapsible(bool collapsible)
1362{
1363	fView->SetCollapsible(collapsible);
1364	return *this;
1365}
1366
1367
1368template<typename ParentBuilder>
1369typename Split<ParentBuilder>::ThisBuilder&
1370Split<ParentBuilder>::SetCollapsible(int32 index, bool collapsible)
1371{
1372	fView->SetCollapsible(index, collapsible);
1373	return *this;
1374}
1375
1376
1377template<typename ParentBuilder>
1378typename Split<ParentBuilder>::ThisBuilder&
1379Split<ParentBuilder>::SetCollapsible(int32 first, int32 last, bool collapsible)
1380{
1381	fView->SetCollapsible(first, last, collapsible);
1382	return *this;
1383}
1384
1385
1386template<typename ParentBuilder>
1387typename Split<ParentBuilder>::ThisBuilder&
1388Split<ParentBuilder>::SetInsets(float left, float top, float right,
1389	float bottom)
1390{
1391	fView->SetInsets(left, top, right, bottom);
1392	return *this;
1393}
1394
1395
1396template<typename ParentBuilder>
1397typename Split<ParentBuilder>::ThisBuilder&
1398Split<ParentBuilder>::SetInsets(float horizontal, float vertical)
1399{
1400	fView->SetInsets(horizontal, vertical);
1401	return *this;
1402}
1403
1404
1405template<typename ParentBuilder>
1406typename Split<ParentBuilder>::ThisBuilder&
1407Split<ParentBuilder>::SetInsets(float insets)
1408{
1409	fView->SetInsets(insets);
1410	return *this;
1411}
1412
1413
1414template<typename ParentBuilder>
1415Split<ParentBuilder>::operator BSplitView*()
1416{
1417	return fView;
1418}
1419
1420
1421// #pragma mark - Cards
1422
1423
1424template<typename ParentBuilder>
1425Cards<ParentBuilder>::Cards()
1426	:
1427	fLayout((new BCardView())->CardLayout())
1428{
1429}
1430
1431
1432template<typename ParentBuilder>
1433Cards<ParentBuilder>::Cards(BWindow* window)
1434	:
1435	fLayout(new BCardLayout())
1436{
1437	window->SetLayout(fLayout);
1438
1439	fLayout->Owner()->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
1440}
1441
1442
1443template<typename ParentBuilder>
1444Cards<ParentBuilder>::Cards(BView* view)
1445	:
1446	fLayout(new BCardLayout())
1447{
1448	view->SetLayout(fLayout);
1449	view->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
1450}
1451
1452
1453template<typename ParentBuilder>
1454Cards<ParentBuilder>::Cards(BCardLayout* layout)
1455	:
1456	fLayout(layout)
1457{
1458}
1459
1460
1461template<typename ParentBuilder>
1462Cards<ParentBuilder>::Cards(BCardView* view)
1463	:
1464	fLayout(view->CardLayout())
1465{
1466}
1467
1468
1469template<typename ParentBuilder>
1470BCardLayout*
1471Cards<ParentBuilder>::Layout() const
1472{
1473	return fLayout;
1474}
1475
1476
1477template<typename ParentBuilder>
1478BView*
1479Cards<ParentBuilder>::View() const
1480{
1481	return fLayout->Owner();
1482}
1483
1484
1485template<typename ParentBuilder>
1486typename Cards<ParentBuilder>::ThisBuilder&
1487Cards<ParentBuilder>::GetLayout(BCardLayout** _layout)
1488{
1489	*_layout = fLayout;
1490	return *this;
1491}
1492
1493
1494template<typename ParentBuilder>
1495typename Cards<ParentBuilder>::ThisBuilder&
1496Cards<ParentBuilder>::GetView(BView** _view)
1497{
1498	*_view = fLayout->Owner();
1499	return *this;
1500}
1501
1502
1503template<typename ParentBuilder>
1504typename Cards<ParentBuilder>::ThisBuilder&
1505Cards<ParentBuilder>::Add(BView* view)
1506{
1507	fLayout->AddView(view);
1508	return *this;
1509}
1510
1511
1512template<typename ParentBuilder>
1513typename Cards<ParentBuilder>::ThisBuilder&
1514Cards<ParentBuilder>::Add(BLayoutItem* item)
1515{
1516	fLayout->AddItem(item);
1517	return *this;
1518}
1519
1520
1521template<typename ParentBuilder>
1522typename Cards<ParentBuilder>::GroupBuilder
1523Cards<ParentBuilder>::AddGroup(orientation orientation, float spacing)
1524{
1525	GroupBuilder builder(new BGroupLayout(orientation, spacing));
1526	builder.SetParent(this);
1527	fLayout->AddItem(builder.Layout());
1528	return builder;
1529}
1530
1531
1532template<typename ParentBuilder>
1533typename Cards<ParentBuilder>::GroupBuilder
1534Cards<ParentBuilder>::AddGroup(BGroupView* groupView)
1535{
1536	GroupBuilder builder(groupView);
1537	builder.SetParent(this);
1538	fLayout->AddItem(builder.Layout());
1539	return builder;
1540}
1541
1542
1543template<typename ParentBuilder>
1544typename Cards<ParentBuilder>::GroupBuilder
1545Cards<ParentBuilder>::AddGroup(BGroupLayout* groupLayout)
1546{
1547	GroupBuilder builder(groupLayout);
1548	builder.SetParent(this);
1549	fLayout->AddItem(builder.Layout());
1550	return builder;
1551}
1552
1553
1554template<typename ParentBuilder>
1555typename Cards<ParentBuilder>::GridBuilder
1556Cards<ParentBuilder>::AddGrid(float horizontal, float vertical)
1557{
1558	GridBuilder builder(horizontal, vertical);
1559	builder.SetParent(this);
1560	fLayout->AddItem(builder.Layout());
1561	return builder;
1562}
1563
1564
1565template<typename ParentBuilder>
1566typename Cards<ParentBuilder>::GridBuilder
1567Cards<ParentBuilder>::AddGrid(BGridLayout* gridLayout)
1568{
1569	GridBuilder builder(gridLayout);
1570	builder.SetParent(this);
1571	fLayout->AddItem(builder.Layout());
1572	return builder;
1573}
1574
1575
1576template<typename ParentBuilder>
1577typename Cards<ParentBuilder>::GridBuilder
1578Cards<ParentBuilder>::AddGrid(BGridView* gridView)
1579{
1580	GridBuilder builder(gridView);
1581	builder.SetParent(this);
1582	fLayout->AddItem(builder.Layout());
1583	return builder;
1584}
1585
1586
1587template<typename ParentBuilder>
1588typename Cards<ParentBuilder>::SplitBuilder
1589Cards<ParentBuilder>::AddSplit(orientation orientation, float spacing)
1590{
1591	SplitBuilder builder(orientation, spacing);
1592	builder.SetParent(this);
1593	fLayout->AddView(builder.View());
1594	return builder;
1595}
1596
1597
1598template<typename ParentBuilder>
1599typename Cards<ParentBuilder>::SplitBuilder
1600Cards<ParentBuilder>::AddSplit(BSplitView* splitView)
1601{
1602	SplitBuilder builder(splitView);
1603	builder.SetParent(this);
1604	fLayout->AddView(builder.View());
1605	return builder;
1606}
1607
1608
1609template<typename ParentBuilder>
1610typename Cards<ParentBuilder>::CardBuilder
1611Cards<ParentBuilder>::AddCards()
1612{
1613	CardBuilder builder;
1614	builder.SetParent(this);
1615	fLayout->AddView(builder.View());
1616	return builder;
1617}
1618
1619
1620template<typename ParentBuilder>
1621typename Cards<ParentBuilder>::CardBuilder
1622Cards<ParentBuilder>::AddCards(BCardLayout* cardLayout)
1623{
1624	CardBuilder builder(cardLayout);
1625	builder.SetParent(this);
1626	fLayout->AddView(builder.View());
1627	return builder;
1628}
1629
1630template<typename ParentBuilder>
1631typename Cards<ParentBuilder>::CardBuilder
1632Cards<ParentBuilder>::AddCards(BCardView* cardView)
1633{
1634	CardBuilder builder(cardView);
1635	builder.SetParent(this);
1636	fLayout->AddView(builder.View());
1637	return builder;
1638}
1639
1640
1641template<typename ParentBuilder>
1642typename Cards<ParentBuilder>::ThisBuilder&
1643Cards<ParentBuilder>::SetExplicitMinSize(BSize size)
1644{
1645	fLayout->SetExplicitMinSize(size);
1646	return *this;
1647}
1648
1649
1650template<typename ParentBuilder>
1651typename Cards<ParentBuilder>::ThisBuilder&
1652Cards<ParentBuilder>::SetExplicitMaxSize(BSize size)
1653{
1654	fLayout->SetExplicitMaxSize(size);
1655	return *this;
1656}
1657
1658
1659template<typename ParentBuilder>
1660typename Cards<ParentBuilder>::ThisBuilder&
1661Cards<ParentBuilder>::SetExplicitPreferredSize(BSize size)
1662{
1663	fLayout->SetExplicitPreferredSize(size);
1664	return *this;
1665}
1666
1667
1668template<typename ParentBuilder>
1669typename Cards<ParentBuilder>::ThisBuilder&
1670Cards<ParentBuilder>::SetExplicitAlignment(BAlignment alignment)
1671{
1672	fLayout->SetExplicitAlignment(alignment);
1673	return *this;
1674}
1675
1676
1677template<typename ParentBuilder>
1678typename Cards<ParentBuilder>::ThisBuilder&
1679Cards<ParentBuilder>::SetVisibleItem(int32 item)
1680{
1681	fLayout->SetVisibleItem(item);
1682	return *this;
1683}
1684
1685
1686template<typename ParentBuilder>
1687Cards<ParentBuilder>::operator BCardLayout*()
1688{
1689	return fLayout;
1690}
1691
1692
1693// #pragma mark - Menu
1694
1695
1696template<typename ParentBuilder>
1697Menu<ParentBuilder>::Menu(BMenu* menu)
1698	:
1699	fMenu(menu)
1700{
1701}
1702
1703
1704template<typename ParentBuilder>
1705typename Menu<ParentBuilder>::ThisBuilder&
1706Menu<ParentBuilder>::GetMenu(BMenu*& _menu)
1707{
1708	_menu = fMenu;
1709	return *this;
1710}
1711
1712
1713template<typename ParentBuilder>
1714typename Menu<ParentBuilder>::ItemBuilder
1715Menu<ParentBuilder>::AddItem(BMenuItem* item)
1716{
1717	fMenu->AddItem(item);
1718	return MenuItem<ParentBuilder>(this->fParent, fMenu, item);
1719}
1720
1721
1722template<typename ParentBuilder>
1723typename Menu<ParentBuilder>::ItemBuilder
1724Menu<ParentBuilder>::AddItem(BMenu* menu)
1725{
1726	if (!fMenu->AddItem(menu))
1727		throw std::bad_alloc();
1728
1729	return MenuItem<ParentBuilder>(this->fParent, fMenu,
1730		fMenu->ItemAt(fMenu->CountItems() - 1));
1731}
1732
1733
1734template<typename ParentBuilder>
1735typename Menu<ParentBuilder>::ItemBuilder
1736Menu<ParentBuilder>::AddItem(const char* label, BMessage* message,
1737	char shortcut, uint32 modifiers)
1738{
1739	BMenuItem* item = new BMenuItem(label, message, shortcut, modifiers);
1740	if (!fMenu->AddItem(item)) {
1741		delete item;
1742		item = NULL;
1743	}
1744
1745	return MenuItem<ParentBuilder>(this->fParent, fMenu, item);
1746}
1747
1748
1749template<typename ParentBuilder>
1750typename Menu<ParentBuilder>::ItemBuilder
1751Menu<ParentBuilder>::AddItem(const char* label, uint32 messageWhat,
1752	char shortcut, uint32 modifiers)
1753{
1754	BMessage* message = new BMessage(messageWhat);
1755	BMenuItem* item;
1756	try {
1757		item = new BMenuItem(label, message, shortcut, modifiers);
1758	} catch (...) {
1759		delete message;
1760		throw;
1761	}
1762
1763	if (!fMenu->AddItem(item)) {
1764		delete item;
1765		item = NULL;
1766	}
1767
1768	return MenuItem<ParentBuilder>(this->fParent, fMenu, item);
1769}
1770
1771
1772template<typename ParentBuilder>
1773typename Menu<ParentBuilder>::ThisBuilder&
1774Menu<ParentBuilder>::AddSeparator()
1775{
1776	fMenu->AddSeparatorItem();
1777	return *this;
1778}
1779
1780
1781template<typename ParentBuilder>
1782typename Menu<ParentBuilder>::MenuBuilder
1783Menu<ParentBuilder>::AddMenu(BMenu* menu)
1784{
1785	if (!fMenu->AddItem(menu))
1786		throw std::bad_alloc();
1787
1788	MenuBuilder builder(menu);
1789	builder.SetParent(this);
1790	return builder;
1791}
1792
1793
1794template<typename ParentBuilder>
1795typename Menu<ParentBuilder>::MenuBuilder
1796Menu<ParentBuilder>::AddMenu(const char* title, menu_layout layout)
1797{
1798	BMenu* menu = new BMenu(title, layout);
1799	if (!fMenu->AddItem(menu)) {
1800		delete menu;
1801		throw std::bad_alloc();
1802	}
1803
1804	MenuBuilder builder(menu);
1805	builder.SetParent(this);
1806	return builder;
1807}
1808
1809
1810// #pragma mark - MenuItem
1811
1812
1813template<typename ParentBuilder>
1814MenuItem<ParentBuilder>::MenuItem(ParentBuilder* parentBuilder, BMenu* menu,
1815	BMenuItem* item)
1816	:
1817	Menu<ParentBuilder>(menu),
1818	fMenuItem(item)
1819{
1820	this->SetParent(parentBuilder);
1821}
1822
1823
1824template<typename ParentBuilder>
1825typename MenuItem<ParentBuilder>::ThisBuilder&
1826MenuItem<ParentBuilder>::GetItem(BMenuItem*& _item)
1827{
1828	_item = fMenuItem;
1829	return *this;
1830}
1831
1832
1833template<typename ParentBuilder>
1834typename MenuItem<ParentBuilder>::ThisBuilder&
1835MenuItem<ParentBuilder>::SetEnabled(bool enabled)
1836{
1837	fMenuItem->SetEnabled(enabled);
1838	return *this;
1839}
1840
1841
1842}	// namespace BLayoutBuilder
1843
1844
1845#endif	// _LAYOUT_BUILDER_H
1846