xref: /haiku/src/libs/alm/ALMGroup.cpp (revision 25a7b01d15612846f332751841da3579db313082)
1*f0307e76SAlex Wilson /*
2*f0307e76SAlex Wilson  * Copyright 2010, Clemens Zeidler <haiku@clemens-zeidler.de>
3*f0307e76SAlex Wilson  * Distributed under the terms of the MIT License.
4*f0307e76SAlex Wilson  */
50da6f2e9SAlex Wilson #include "ALMGroup.h"
60da6f2e9SAlex Wilson 
70da6f2e9SAlex Wilson 
80da6f2e9SAlex Wilson #include <ALMLayout.h>
90da6f2e9SAlex Wilson #include <Tab.h>
100da6f2e9SAlex Wilson 
110da6f2e9SAlex Wilson 
ALMGroup(BLayoutItem * item)120da6f2e9SAlex Wilson ALMGroup::ALMGroup(BLayoutItem* item)
130da6f2e9SAlex Wilson {
140da6f2e9SAlex Wilson 	_Init(item, NULL);
150da6f2e9SAlex Wilson }
160da6f2e9SAlex Wilson 
170da6f2e9SAlex Wilson 
ALMGroup(BView * view)180da6f2e9SAlex Wilson ALMGroup::ALMGroup(BView* view)
190da6f2e9SAlex Wilson {
200da6f2e9SAlex Wilson 	_Init(NULL, view);
210da6f2e9SAlex Wilson }
220da6f2e9SAlex Wilson 
230da6f2e9SAlex Wilson 
240da6f2e9SAlex Wilson BLayoutItem*
LayoutItem() const250da6f2e9SAlex Wilson ALMGroup::LayoutItem() const
260da6f2e9SAlex Wilson {
270da6f2e9SAlex Wilson 	return fLayoutItem;
280da6f2e9SAlex Wilson }
290da6f2e9SAlex Wilson 
300da6f2e9SAlex Wilson 
310da6f2e9SAlex Wilson BView*
View() const320da6f2e9SAlex Wilson ALMGroup::View() const
330da6f2e9SAlex Wilson {
340da6f2e9SAlex Wilson 	return fView;
350da6f2e9SAlex Wilson }
360da6f2e9SAlex Wilson 
370da6f2e9SAlex Wilson 
380da6f2e9SAlex Wilson const std::vector<ALMGroup>&
Groups() const390da6f2e9SAlex Wilson ALMGroup::Groups() const
400da6f2e9SAlex Wilson {
410da6f2e9SAlex Wilson 	return fGroups;
420da6f2e9SAlex Wilson }
430da6f2e9SAlex Wilson 
440da6f2e9SAlex Wilson 
450da6f2e9SAlex Wilson enum orientation
Orientation() const460da6f2e9SAlex Wilson ALMGroup::Orientation() const
470da6f2e9SAlex Wilson {
480da6f2e9SAlex Wilson 	return fOrientation;
490da6f2e9SAlex Wilson }
500da6f2e9SAlex Wilson 
510da6f2e9SAlex Wilson 
520da6f2e9SAlex Wilson ALMGroup&
operator |(const ALMGroup & right)530da6f2e9SAlex Wilson ALMGroup::operator|(const ALMGroup& right)
540da6f2e9SAlex Wilson {
550da6f2e9SAlex Wilson 	return _AddItem(right, B_HORIZONTAL);
560da6f2e9SAlex Wilson }
570da6f2e9SAlex Wilson 
580da6f2e9SAlex Wilson 
590da6f2e9SAlex Wilson ALMGroup&
operator /(const ALMGroup & bottom)600da6f2e9SAlex Wilson ALMGroup::operator/(const ALMGroup& bottom)
610da6f2e9SAlex Wilson {
620da6f2e9SAlex Wilson 	return _AddItem(bottom, B_VERTICAL);
630da6f2e9SAlex Wilson }
640da6f2e9SAlex Wilson 
650da6f2e9SAlex Wilson 
660da6f2e9SAlex Wilson void
BuildLayout(BALMLayout * layout,XTab * left,YTab * top,XTab * right,YTab * bottom)670da6f2e9SAlex Wilson ALMGroup::BuildLayout(BALMLayout* layout, XTab* left, YTab* top, XTab* right,
680da6f2e9SAlex Wilson 	YTab* bottom)
690da6f2e9SAlex Wilson {
700da6f2e9SAlex Wilson 	if (left == NULL)
710da6f2e9SAlex Wilson 		left = layout->Left();
720da6f2e9SAlex Wilson 	if (top == NULL)
730da6f2e9SAlex Wilson 		top = layout->Top();
740da6f2e9SAlex Wilson 	if (right == NULL)
750da6f2e9SAlex Wilson 		right = layout->Right();
760da6f2e9SAlex Wilson 	if (bottom == NULL)
770da6f2e9SAlex Wilson 		bottom = layout->Bottom();
780da6f2e9SAlex Wilson 
790da6f2e9SAlex Wilson 	_Build(layout, left, top, right, bottom);
800da6f2e9SAlex Wilson }
810da6f2e9SAlex Wilson 
820da6f2e9SAlex Wilson 
ALMGroup()830da6f2e9SAlex Wilson ALMGroup::ALMGroup()
840da6f2e9SAlex Wilson {
850da6f2e9SAlex Wilson 	_Init(NULL, NULL);
860da6f2e9SAlex Wilson }
870da6f2e9SAlex Wilson 
880da6f2e9SAlex Wilson 
890da6f2e9SAlex Wilson void
_Init(BLayoutItem * item,BView * view,enum orientation orien)900da6f2e9SAlex Wilson ALMGroup::_Init(BLayoutItem* item, BView* view, enum orientation orien)
910da6f2e9SAlex Wilson {
920da6f2e9SAlex Wilson 	fLayoutItem = item;
930da6f2e9SAlex Wilson 	fView = view;
940da6f2e9SAlex Wilson 	fOrientation = orien;
950da6f2e9SAlex Wilson }
960da6f2e9SAlex Wilson 
970da6f2e9SAlex Wilson 
980da6f2e9SAlex Wilson void
_Build(BALMLayout * layout,BReference<XTab> left,BReference<YTab> top,BReference<XTab> right,BReference<YTab> bottom) const990da6f2e9SAlex Wilson ALMGroup::_Build(BALMLayout* layout, BReference<XTab> left,
1000da6f2e9SAlex Wilson 	BReference<YTab> top, BReference<XTab> right, BReference<YTab> bottom) const
1010da6f2e9SAlex Wilson {
1020da6f2e9SAlex Wilson 	if (LayoutItem())
1030da6f2e9SAlex Wilson 		layout->AddItem(LayoutItem(), left, top, right, bottom);
1040da6f2e9SAlex Wilson 	else if (View()) {
1050da6f2e9SAlex Wilson 		layout->AddView(View(), left, top, right, bottom);
1060da6f2e9SAlex Wilson 	} else {
1070da6f2e9SAlex Wilson 		for (unsigned int i = 0; i < Groups().size(); i++) {
1080da6f2e9SAlex Wilson 			const ALMGroup& current = Groups()[i];
1090da6f2e9SAlex Wilson 			if (Orientation() == B_HORIZONTAL) {
1100da6f2e9SAlex Wilson 				BReference<XTab> currentRight;
1110da6f2e9SAlex Wilson 				if (i == Groups().size() - 1)
1120da6f2e9SAlex Wilson 					currentRight = right;
1130da6f2e9SAlex Wilson 				else
1140da6f2e9SAlex Wilson 					currentRight = layout->AddXTab();
1150da6f2e9SAlex Wilson 				current._Build(layout, left, top, currentRight, bottom);
1160da6f2e9SAlex Wilson 				left = currentRight;
1170da6f2e9SAlex Wilson 			} else {
1180da6f2e9SAlex Wilson 				BReference<YTab> currentBottom;
1190da6f2e9SAlex Wilson 				if (i == Groups().size() - 1)
1200da6f2e9SAlex Wilson 					currentBottom = bottom;
1210da6f2e9SAlex Wilson 				else
1220da6f2e9SAlex Wilson 					currentBottom = layout->AddYTab();
1230da6f2e9SAlex Wilson 				current._Build(layout, left, top, right, currentBottom);
1240da6f2e9SAlex Wilson 				top = currentBottom;
1250da6f2e9SAlex Wilson 			}
1260da6f2e9SAlex Wilson 		}
1270da6f2e9SAlex Wilson 	}
1280da6f2e9SAlex Wilson }
1290da6f2e9SAlex Wilson 
1300da6f2e9SAlex Wilson 
1310da6f2e9SAlex Wilson ALMGroup&
_AddItem(const ALMGroup & item,enum orientation orien)1320da6f2e9SAlex Wilson ALMGroup::_AddItem(const ALMGroup& item, enum orientation orien)
1330da6f2e9SAlex Wilson {
1340da6f2e9SAlex Wilson 	if (fGroups.size() == 0)
1350da6f2e9SAlex Wilson 		fGroups.push_back(*this);
1360da6f2e9SAlex Wilson 	else if (fOrientation != orien) {
1370da6f2e9SAlex Wilson 		ALMGroup clone = *this;
1380da6f2e9SAlex Wilson 		fGroups.clear();
1390da6f2e9SAlex Wilson 		_Init(NULL, NULL, orien);
1400da6f2e9SAlex Wilson 		fGroups.push_back(clone);
1410da6f2e9SAlex Wilson 	}
1420da6f2e9SAlex Wilson 
1430da6f2e9SAlex Wilson 	_Init(NULL, NULL, orien);
1440da6f2e9SAlex Wilson 	fGroups.push_back(item);
1450da6f2e9SAlex Wilson 	return *this;
1460da6f2e9SAlex Wilson }
1470da6f2e9SAlex Wilson 
148