xref: /haiku/headers/libs/alm/ALMLayoutBuilder.h (revision a25ffa4f046fb495c316d29f0645bd00c82751c8)
150cc24b3SAlex Wilson /*
250cc24b3SAlex Wilson  * Copyright 2012, Haiku, Inc. All rights reserved.
350cc24b3SAlex Wilson  * Distributed under the terms of the MIT License.
450cc24b3SAlex Wilson  */
550cc24b3SAlex Wilson #ifndef	ALM_LAYOUT_BUILDER_H
650cc24b3SAlex Wilson #define	ALM_LAYOUT_BUILDER_H
750cc24b3SAlex Wilson 
850cc24b3SAlex Wilson 
950cc24b3SAlex Wilson #include "ALMLayout.h"
1050cc24b3SAlex Wilson 
1150cc24b3SAlex Wilson 
12*a25ffa4fSAlex Wilson class BLayoutItem;
13*a25ffa4fSAlex Wilson class BView;
1450cc24b3SAlex Wilson class BWindow;
1550cc24b3SAlex Wilson 
1650cc24b3SAlex Wilson 
1750cc24b3SAlex Wilson namespace BALM {
1850cc24b3SAlex Wilson 
1950cc24b3SAlex Wilson 
2050cc24b3SAlex Wilson class BALMLayoutBuilder {
2150cc24b3SAlex Wilson public:
2250cc24b3SAlex Wilson 								BALMLayoutBuilder(BView* view, float hSpacing,
2350cc24b3SAlex Wilson 									float vSpacing,
2450cc24b3SAlex Wilson 									BALMLayout* friendLayout = NULL);
2550cc24b3SAlex Wilson 								BALMLayoutBuilder(BView* view,
2650cc24b3SAlex Wilson 									BALMLayout* layout);
2750cc24b3SAlex Wilson 								BALMLayoutBuilder(BWindow* window,
2850cc24b3SAlex Wilson 									float hSpacing, float vSpacing,
2950cc24b3SAlex Wilson 									BALMLayout* friendLayout = NULL);
3050cc24b3SAlex Wilson 								BALMLayoutBuilder(BWindow* window,
3150cc24b3SAlex Wilson 									BALMLayout* layout);
3250cc24b3SAlex Wilson 								BALMLayoutBuilder(BALMLayout* layout);
3350cc24b3SAlex Wilson 
3450cc24b3SAlex Wilson 	BALMLayoutBuilder&			Add(BView* view, XTab* left, YTab* top,
3550cc24b3SAlex Wilson 									XTab* right = NULL, YTab* bottom = NULL);
3650cc24b3SAlex Wilson 	BALMLayoutBuilder&			Add(BView* view, Row* row, Column* column);
3750cc24b3SAlex Wilson 
3850cc24b3SAlex Wilson 	BALMLayoutBuilder&			Add(BLayoutItem* item, XTab* left,
3950cc24b3SAlex Wilson 									YTab* top, XTab* right = NULL,
4050cc24b3SAlex Wilson 									YTab* bottom = NULL);
4150cc24b3SAlex Wilson 	BALMLayoutBuilder&			Add(BLayoutItem* item, Row* row,
4250cc24b3SAlex Wilson 									Column* column);
4350cc24b3SAlex Wilson 
4450cc24b3SAlex Wilson 	BALMLayoutBuilder&			SetInsets(float insets);
4550cc24b3SAlex Wilson 	BALMLayoutBuilder&			SetInsets(float horizontal, float vertical);
4650cc24b3SAlex Wilson 	BALMLayoutBuilder&			SetInsets(float left, float top, float right,
4750cc24b3SAlex Wilson 									float bottom);
4850cc24b3SAlex Wilson 
4950cc24b3SAlex Wilson 	BALMLayoutBuilder&			SetSpacing(float horizontal, float vertical);
5050cc24b3SAlex Wilson 
5150cc24b3SAlex Wilson 	struct Snake;
5250cc24b3SAlex Wilson 
5350cc24b3SAlex Wilson 	// context setters
5450cc24b3SAlex Wilson 	Snake	StartingAt(BView* view);
5550cc24b3SAlex Wilson 	Snake	StartingAt(BLayoutItem* item);
5650cc24b3SAlex Wilson 
5750cc24b3SAlex Wilson 	struct Snake {
5850cc24b3SAlex Wilson 		BALMLayoutBuilder::Snake& AddToLeft(BView* view,
5950cc24b3SAlex Wilson 									XTab* left = NULL, YTab* top = NULL,
6050cc24b3SAlex Wilson 									YTab* bottom = NULL);
6150cc24b3SAlex Wilson 		BALMLayoutBuilder::Snake& AddToRight(BView* view,
6250cc24b3SAlex Wilson 									XTab* right = NULL, YTab* top = NULL,
6350cc24b3SAlex Wilson 									YTab* bottom = NULL);
6450cc24b3SAlex Wilson 		BALMLayoutBuilder::Snake& AddAbove(BView* view,
6550cc24b3SAlex Wilson 									YTab* top = NULL, XTab* left = NULL,
6650cc24b3SAlex Wilson 									XTab* right = NULL);
6750cc24b3SAlex Wilson 		BALMLayoutBuilder::Snake& AddBelow(BView* view, YTab* bottom = NULL,
6850cc24b3SAlex Wilson 									XTab* left = NULL, XTab* right = NULL);
6950cc24b3SAlex Wilson 
7050cc24b3SAlex Wilson 		BALMLayoutBuilder::Snake& AddToLeft(BLayoutItem* item,
7150cc24b3SAlex Wilson 									XTab* left = NULL, YTab* top = NULL,
7250cc24b3SAlex Wilson 									YTab* bottom = NULL);
7350cc24b3SAlex Wilson 		BALMLayoutBuilder::Snake& AddToRight(BLayoutItem* item,
7450cc24b3SAlex Wilson 									XTab* right = NULL, YTab* top = NULL,
7550cc24b3SAlex Wilson 									YTab* bottom = NULL);
7650cc24b3SAlex Wilson 		BALMLayoutBuilder::Snake& AddAbove(BLayoutItem* item,
7750cc24b3SAlex Wilson 									YTab* top = NULL, XTab* left = NULL,
7850cc24b3SAlex Wilson 									XTab* right = NULL);
7950cc24b3SAlex Wilson 		BALMLayoutBuilder::Snake& AddBelow(BLayoutItem* item,
8050cc24b3SAlex Wilson 									YTab* bottom = NULL, XTab* left = NULL,
8150cc24b3SAlex Wilson 									XTab* right = NULL);
8250cc24b3SAlex Wilson 
8350cc24b3SAlex Wilson 
8450cc24b3SAlex Wilson 		// these methods throw away the stack
8550cc24b3SAlex Wilson 		Snake						StartingAt(BView* view);
8650cc24b3SAlex Wilson 		Snake						StartingAt(BLayoutItem* item);
8750cc24b3SAlex Wilson 
8850cc24b3SAlex Wilson 		Snake					Push();
8950cc24b3SAlex Wilson 		Snake&					Pop();
9050cc24b3SAlex Wilson 
9150cc24b3SAlex Wilson 		BALMLayoutBuilder&		End();
9250cc24b3SAlex Wilson 
9350cc24b3SAlex Wilson 	private:
9450cc24b3SAlex Wilson 		friend class BALMLayoutBuilder;
9550cc24b3SAlex Wilson 
9650cc24b3SAlex Wilson 								Snake(Area* area, BALMLayoutBuilder* root);
9750cc24b3SAlex Wilson 								Snake(Area* area, Snake* previous);
9850cc24b3SAlex Wilson 
9950cc24b3SAlex Wilson 		BALMLayout*				_Layout();
10050cc24b3SAlex Wilson 		Area*					_AddToLayout(BView* view, XTab* left, YTab* top,
10150cc24b3SAlex Wilson 									XTab* right, YTab* bottom);
10250cc24b3SAlex Wilson 		Area*					_AddToLayout(BLayoutItem* item, XTab* left,
10350cc24b3SAlex Wilson 									YTab* top, XTab* right, YTab* bottom);
10450cc24b3SAlex Wilson 
10550cc24b3SAlex Wilson 		BALMLayoutBuilder*		fRootBuilder;
10650cc24b3SAlex Wilson 		Snake*					fPreviousSnake;
10750cc24b3SAlex Wilson 		Area*					fCurrentArea;
10850cc24b3SAlex Wilson 	};
10950cc24b3SAlex Wilson 
11050cc24b3SAlex Wilson 
11150cc24b3SAlex Wilson private:
11250cc24b3SAlex Wilson 	friend struct Snake;
11350cc24b3SAlex Wilson 
11450cc24b3SAlex Wilson 		BALMLayout*				fLayout;
11550cc24b3SAlex Wilson };
11650cc24b3SAlex Wilson 
11750cc24b3SAlex Wilson 
11850cc24b3SAlex Wilson };
11950cc24b3SAlex Wilson 
12050cc24b3SAlex Wilson 
12150cc24b3SAlex Wilson #endif
122