/* * Copyright 2012, Haiku, Inc. All rights reserved. * Distributed under the terms of the MIT License. */ #include "ALMLayoutBuilder.h" #include #include "Area.h" namespace BALM { BALMLayoutBuilder::BALMLayoutBuilder(BView* view, float hSpacing, float vSpacing, BALMLayout* friendLayout) { fLayout = new BALMLayout(hSpacing, vSpacing, friendLayout); view->SetLayout(fLayout); } BALMLayoutBuilder::BALMLayoutBuilder(BView* view, BALMLayout* layout) { fLayout = layout; view->SetLayout(layout); } BALMLayoutBuilder::BALMLayoutBuilder(BWindow* window, float hSpacing, float vSpacing, BALMLayout* friendLayout) { fLayout = new BALMLayout(hSpacing, vSpacing, friendLayout); window->SetLayout(fLayout); fLayout->Owner()->SetViewUIColor(B_PANEL_BACKGROUND_COLOR); // TODO: we get a white background if we don't do this } BALMLayoutBuilder::BALMLayoutBuilder(BWindow* window, BALMLayout* layout) { fLayout = layout; window->SetLayout(fLayout); fLayout->Owner()->SetViewUIColor(B_PANEL_BACKGROUND_COLOR); // TODO: we get a white background if we don't do this } BALMLayoutBuilder::BALMLayoutBuilder(BALMLayout* layout) { fLayout = layout; } BALMLayoutBuilder& BALMLayoutBuilder::Add(BView* view, XTab* left, YTab* top, XTab* right, YTab* bottom) { Area* a = (fLayout->AddView(view, left, top, right, bottom)); _SetCurrentArea(a); return *this; } BALMLayoutBuilder& BALMLayoutBuilder::Add(BView* view, Row* row, Column* column) { _SetCurrentArea(fLayout->AddView(view, row, column)); return *this; } BALMLayoutBuilder& BALMLayoutBuilder::Add(BLayoutItem* item, XTab* left, YTab* top, XTab* right, YTab* bottom) { _SetCurrentArea(fLayout->AddItem(item, left, top, right, bottom)); return *this; } BALMLayoutBuilder& BALMLayoutBuilder::Add(BLayoutItem* item, Row* row, Column* column) { fLayout->AddItem(item, row, column); return *this; } BALMLayoutBuilder& BALMLayoutBuilder::SetInsets(float insets) { fLayout->SetInsets(insets); return *this; } BALMLayoutBuilder& BALMLayoutBuilder::SetInsets(float horizontal, float vertical) { fLayout->SetInsets(horizontal, vertical); return *this; } BALMLayoutBuilder& BALMLayoutBuilder::SetInsets(float left, float top, float right, float bottom) { fLayout->SetInsets(left, top, right, bottom); return *this; } BALMLayoutBuilder& BALMLayoutBuilder::SetSpacing(float horizontal, float vertical) { fLayout->SetSpacing(horizontal, vertical); return *this; } BALMLayoutBuilder& BALMLayoutBuilder::StartingAt(BView* view) { fAreaStack.MakeEmpty(); fAreaStack.AddItem(fLayout->AreaFor(view)); return *this; } BALMLayoutBuilder& BALMLayoutBuilder::StartingAt(BLayoutItem* item) { fAreaStack.MakeEmpty(); fAreaStack.AddItem(fLayout->AreaFor(item)); return *this; } BALMLayoutBuilder& BALMLayoutBuilder::AddToLeft(BView* view, XTab* _left, YTab* top, YTab* bottom) { Area* currentArea = _CurrentArea(); BReference left = _left; if (_left == NULL) left = fLayout->AddXTab(); XTab* right = currentArea->Left(); if (!top) top = currentArea->Top(); if (!bottom) bottom = currentArea->Bottom(); return Add(view, left, top, right, bottom); } BALMLayoutBuilder& BALMLayoutBuilder::AddToRight(BView* view, XTab* _right, YTab* top, YTab* bottom) { Area* currentArea = _CurrentArea(); XTab* left = currentArea->Right(); BReference right = _right; if (_right == NULL) right = fLayout->AddXTab(); if (!top) top = currentArea->Top(); if (!bottom) bottom = currentArea->Bottom(); return Add(view, left, top, right, bottom); } BALMLayoutBuilder& BALMLayoutBuilder::AddAbove(BView* view, YTab* _top, XTab* left, XTab* right) { Area* currentArea = _CurrentArea(); if (!left) left = currentArea->Left(); if (!right) right = currentArea->Right(); BReference top = _top; if (_top == NULL) top = fLayout->AddYTab(); YTab* bottom = currentArea->Top(); return Add(view, left, top, right, bottom); } BALMLayoutBuilder& BALMLayoutBuilder::AddBelow(BView* view, YTab* _bottom, XTab* left, XTab* right) { Area* currentArea = _CurrentArea(); if (!left) left = currentArea->Left(); if (!right) right = currentArea->Right(); YTab* top = currentArea->Bottom(); BReference bottom = _bottom; if (_bottom == NULL) bottom = fLayout->AddYTab(); return Add(view, left, top, right, bottom); } BALMLayoutBuilder& BALMLayoutBuilder::AddToLeft(BLayoutItem* item, XTab* _left, YTab* top, YTab* bottom) { Area* currentArea = _CurrentArea(); BReference left = _left; if (_left == NULL) left = fLayout->AddXTab(); XTab* right = currentArea->Left(); if (!top) top = currentArea->Top(); if (!bottom) bottom = currentArea->Bottom(); return Add(item, left, top, right, bottom); } BALMLayoutBuilder& BALMLayoutBuilder::AddToRight(BLayoutItem* item, XTab* _right, YTab* top, YTab* bottom) { Area* currentArea = _CurrentArea(); XTab* left = currentArea->Right(); BReference right = _right; if (_right == NULL) right = fLayout->AddXTab(); if (!top) top = currentArea->Top(); if (!bottom) bottom = currentArea->Bottom(); return Add(item, left, top, right, bottom); } BALMLayoutBuilder& BALMLayoutBuilder::AddAbove(BLayoutItem* item, YTab* _top, XTab* left, XTab* right) { Area* currentArea = _CurrentArea(); if (!left) left = currentArea->Left(); if (!right) right = currentArea->Right(); BReference top = _top; if (_top == NULL) top = fLayout->AddYTab(); YTab* bottom = currentArea->Top(); return Add(item, left, top, right, bottom); } BALMLayoutBuilder& BALMLayoutBuilder::AddBelow(BLayoutItem* item, YTab* _bottom, XTab* left, XTab* right) { Area* currentArea = _CurrentArea(); if (!left) left = currentArea->Left(); if (!right) right = currentArea->Right(); YTab* top = currentArea->Bottom(); BReference bottom = _bottom; if (_bottom == NULL) bottom = fLayout->AddYTab(); return Add(item, left, top, right, bottom); } BALMLayoutBuilder& BALMLayoutBuilder::Push() { fAreaStack.AddItem(_CurrentArea()); return *this; } BALMLayoutBuilder& BALMLayoutBuilder::Pop() { if (fAreaStack.CountItems() > 0) fAreaStack.RemoveItemAt(fAreaStack.CountItems() - 1); return *this; } void BALMLayoutBuilder::_SetCurrentArea(Area* area) { if (fAreaStack.CountItems() > 0) fAreaStack.ReplaceItem(fAreaStack.CountItems() - 1, area); else fAreaStack.AddItem(area); } Area* BALMLayoutBuilder::_CurrentArea() const { return fAreaStack.ItemAt(fAreaStack.CountItems() - 1); } };